diff --git a/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java b/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java index c2f93f462..d83544470 100644 --- a/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java +++ b/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java @@ -2,11 +2,14 @@ import android.app.Activity; import android.app.DownloadManager; +import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.net.Uri; import android.os.Environment; import android.text.TextUtils; +import android.util.Log; import com.fastaccess.BuildConfig; import com.fastaccess.R; @@ -96,11 +99,18 @@ public static void downloadFile(@NonNull Context context, @NonNull String url) { downloadFile(context, url, null); } + /** AuthToken seems to be issue for not downloading any binary files. Source files seems to be downloaded fine. + * + * Suppose if we remove it then we fix the above but then downloading private releases seems to not work then. + * In such case we pass :open: as extension. + * + * @param extension If it is :open: then open the custom tab activity + */ public static void downloadFile(@NonNull Context context, @NonNull String url, @Nullable String extension) { try { if (InputHelper.isEmpty(url)) return; boolean isEnterprise = LinkParserHelper.isEnterprise(url); - if (url.endsWith(".apk")) { + if (extension != null && extension.equals(":open:")) { Activity activity = ActivityHelper.getActivity(context); if (activity != null) { ActivityHelper.startCustomTab(activity, url); @@ -111,10 +121,13 @@ public static void downloadFile(@NonNull Context context, @NonNull String url, @ DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); DownloadManager.Request request = new DownloadManager.Request(uri); String authToken = isEnterprise ? PrefGetter.getEnterpriseToken() : PrefGetter.getToken(); - if (!TextUtils.isEmpty(authToken)) { + // Do not set auth token for "releases" url. + if (!TextUtils.isEmpty(authToken) && !url.contains("releases/")) { request.addRequestHeader("Authorization", authToken.startsWith("Basic") ? authToken : "token " + authToken); } String fileName = new File(url).getName(); + // Remove the fileName which appends '?token=' + if (fileName.contains("?token=")) fileName = fileName.substring(0, fileName.indexOf("?token=")); if (!InputHelper.isEmpty(extension)) { fileName += extension; } diff --git a/app/src/main/java/com/fastaccess/provider/scheme/LinkParserHelper.kt b/app/src/main/java/com/fastaccess/provider/scheme/LinkParserHelper.kt index cec853ac0..4eb8ea041 100644 --- a/app/src/main/java/com/fastaccess/provider/scheme/LinkParserHelper.kt +++ b/app/src/main/java/com/fastaccess/provider/scheme/LinkParserHelper.kt @@ -11,6 +11,7 @@ import com.fastaccess.helper.PrefGetter /** * Created by Kosh on 11 Apr 2017, 10:02 PM + * Migrated by Kaustubh on 27th Dec 2020, 1:34 PM */ object LinkParserHelper { const val HOST_DEFAULT = "github.com" @@ -24,7 +25,7 @@ object LinkParserHelper { "explore", "dashboard", "repositories", "logout", "sessions", "site", "security", "contact", "about", "logos", "login", "pricing", "") - val escapeSymbols: Map = mapOf( + private val escapeSymbols: Map = mapOf( """ to "\"", "'" to "'", "<" to "<", ">" to ">", "&" to "&") @@ -88,14 +89,14 @@ object LinkParserHelper { @JvmStatic fun getEndpoint(url: String): String { - var url = url - if (url.startsWith("http://")) { - url = url.replace("http://", "https://") + var urlString = url + if (urlString.startsWith("http://")) { + urlString = urlString.replace("http://", "https://") } - if (!url.startsWith("https://")) { - url = "https://$url" + if (!urlString.startsWith("https://")) { + urlString = "https://$urlString" } - return getEnterpriseUrl(url) + return getEnterpriseUrl(urlString) } private fun getEnterpriseUrl(url: String): String { diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/code/releases/RepoReleasesFragment.java b/app/src/main/java/com/fastaccess/ui/modules/repos/code/releases/RepoReleasesFragment.java index 04a003c3c..a090fde68 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/code/releases/RepoReleasesFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/code/releases/RepoReleasesFragment.java @@ -1,6 +1,10 @@ package com.fastaccess.ui.modules.repos.code.releases; import android.app.Activity; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.net.Uri; import android.os.Bundle; import androidx.annotation.NonNull; @@ -33,6 +37,7 @@ import java.util.List; import butterknife.BindView; +import es.dmoral.toasty.Toasty; /** * Created by Kosh on 03 Dec 2016, 3:56 PM @@ -152,7 +157,9 @@ public static RepoReleasesFragment newInstance(@NonNull String repoId, @NonNull ArrayList mapped = Stream.of(item.getAssets()) .filter(value -> value != null && value.getBrowserDownloadUrl() != null) .map(assetsModel -> new SimpleUrlsModel(String.format("%s (%s)", assetsModel.getName(), assetsModel.getDownloadCount()), - assetsModel.getBrowserDownloadUrl())) + assetsModel.getBrowserDownloadUrl(), + // A filter tag to open this as customTab, see [RestProvider.downloadFile]. + ":open:")) .collect(Collectors.toCollection(ArrayList::new)); if (mapped != null && !mapped.isEmpty()) { models.addAll(mapped); @@ -188,6 +195,15 @@ public static RepoReleasesFragment newInstance(@NonNull String repoId, @NonNull } } + @Override + public void onItemLongSelected(SimpleUrlsModel item) { + Activity activity = getActivity(); + if (activity == null) return; + ClipboardManager clipboardManager = (ClipboardManager) activity.getSystemService(Context.CLIPBOARD_SERVICE); + clipboardManager.setPrimaryClip(ClipData.newRawUri(item.url, Uri.parse(item.url))); + Toasty.info(activity, activity.getString(R.string.success_copied)).show(); + } + @Override public void onScrollTop(int index) { super.onScrollTop(index); if (recycler != null) recycler.scrollToPosition(0); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/code/releases/RepoReleasesMvp.java b/app/src/main/java/com/fastaccess/ui/modules/repos/code/releases/RepoReleasesMvp.java index 2ddd9bf69..f03c97172 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/code/releases/RepoReleasesMvp.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/code/releases/RepoReleasesMvp.java @@ -22,7 +22,7 @@ interface RepoReleasesMvp { interface View extends BaseMvp.FAView, SwipeRefreshLayout.OnRefreshListener, - android.view.View.OnClickListener, ListDialogView.onSimpleItemSelection { + android.view.View.OnClickListener, ListDialogView.onSimpleItemLongSelection, ListDialogView.onSimpleItemSelection { void onNotifyAdapter(@Nullable List items, int page); @NonNull OnLoadMore getLoadMore(); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/projects/details/ProjectPagerActivity.kt b/app/src/main/java/com/fastaccess/ui/modules/repos/projects/details/ProjectPagerActivity.kt index ba19c2d4c..450fbe39b 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/projects/details/ProjectPagerActivity.kt +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/projects/details/ProjectPagerActivity.kt @@ -72,8 +72,8 @@ class ProjectPagerActivity : BaseActivity { val repoId = presenter.repoId if (repoId != null && !repoId.isNullOrBlank()) { diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/fullscreen/FullScreenFileChangeActivity.kt b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/fullscreen/FullScreenFileChangeActivity.kt index 7ad7685ca..89e0ea19d 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/fullscreen/FullScreenFileChangeActivity.kt +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/fullscreen/FullScreenFileChangeActivity.kt @@ -105,8 +105,8 @@ class FullScreenFileChangeActivity : BaseActivity { sendResult() true diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/wiki/WikiActivity.kt b/app/src/main/java/com/fastaccess/ui/modules/repos/wiki/WikiActivity.kt index ed869ea62..4a9cdb6ad 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/wiki/WikiActivity.kt +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/wiki/WikiActivity.kt @@ -93,7 +93,7 @@ class WikiActivity : BaseActivity(), WikiMvp.View { return super.onCreateOptionsMenu(menu) } - override fun onOptionsItemSelected(item: MenuItem?): Boolean { + override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item?.itemId) { R.id.menu -> { drawerLayout.openDrawer(Gravity.END) diff --git a/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingActivity.kt b/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingActivity.kt index 6567b4ffb..9e2c8efd9 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingActivity.kt +++ b/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingActivity.kt @@ -130,8 +130,8 @@ class TrendingActivity : BaseActivity(), Tr return super.onCreateOptionsMenu(menu) } - override fun onOptionsItemSelected(item: MenuItem?): Boolean { - return when (item?.itemId) { + override fun onOptionsItemSelected(item: MenuItem): Boolean { + return when (item.itemId) { R.id.menu -> { drawerLayout.openDrawer(Gravity.END) true diff --git a/app/src/main/java/com/fastaccess/ui/widgets/dialog/ListDialogView.java b/app/src/main/java/com/fastaccess/ui/widgets/dialog/ListDialogView.java index 348b06926..035b14bb4 100644 --- a/app/src/main/java/com/fastaccess/ui/widgets/dialog/ListDialogView.java +++ b/app/src/main/java/com/fastaccess/ui/widgets/dialog/ListDialogView.java @@ -43,7 +43,12 @@ public interface onSimpleItemSelection { void onItemSelected(O item); } + public interface onSimpleItemLongSelection { + void onItemLongSelected(O item); + } + @Nullable private onSimpleItemSelection onSimpleItemSelection; + @Nullable private onSimpleItemLongSelection onSimpleItemLongSelection; @Override protected int fragmentLayout() { return R.layout.simple_list_dialog; @@ -65,16 +70,24 @@ public interface onSimpleItemSelection { @Override public void onAttach(@NotNull Context context) { super.onAttach(context); - if (getParentFragment() != null && getParentFragment() instanceof onSimpleItemSelection) { - onSimpleItemSelection = (onSimpleItemSelection) getParentFragment(); - } else if (context instanceof onSimpleItemSelection) { - onSimpleItemSelection = (onSimpleItemSelection) context; + if (getParentFragment() != null) { + if (getParentFragment() instanceof onSimpleItemSelection) + onSimpleItemSelection = (onSimpleItemSelection) getParentFragment(); + if (getParentFragment() instanceof onSimpleItemLongSelection) + onSimpleItemLongSelection = (onSimpleItemLongSelection) getParentFragment(); + } else { + if (context instanceof onSimpleItemSelection) + onSimpleItemSelection = (onSimpleItemSelection) context; + if (context instanceof onSimpleItemLongSelection) + onSimpleItemLongSelection = (onSimpleItemLongSelection) context; } + } @Override public void onDetach() { super.onDetach(); onSimpleItemSelection = null; + onSimpleItemLongSelection = null; } @NonNull @Override public TiPresenter providePresenter() { @@ -88,7 +101,11 @@ public interface onSimpleItemSelection { dismiss(); } - @Override public void onItemLongClick(int position, View v, O item) {} + @SuppressWarnings("unchecked") @Override public void onItemLongClick(int position, View v, O item) { + if (onSimpleItemLongSelection != null) { + onSimpleItemLongSelection.onItemLongSelected(item); + } + } public void initArguments(@NonNull String title, @NonNull ArrayList objects) { setArguments(Bundler.start() diff --git a/app/src/main/res/layouts/row_layouts/layout/releases_row_item.xml b/app/src/main/res/layouts/row_layouts/layout/releases_row_item.xml index b88b332cd..eb96951ab 100644 --- a/app/src/main/res/layouts/row_layouts/layout/releases_row_item.xml +++ b/app/src/main/res/layouts/row_layouts/layout/releases_row_item.xml @@ -50,8 +50,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:textColor="?android:attr/textColorSecondary" - tools:text="1000" - tools:visibility="gone"/> + tools:text="1000"/>