From 5550c153f2f5dcffed641dd2081933013b2235f8 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Fri, 17 Dec 2021 20:56:12 +0100 Subject: [PATCH] Add support for custom tabs and improve various things (#1019) Adds support for Custom Tabs (at laest supported by Chrome and Firefox). This is also useful if you set the app as default app for links from the supported Gitea instances. If you then try to use the "Open in browser" buttons, this will just open the link in GitNex itself. With Custom Tabs, the links are opened as Custom Tabs (only if the default browser supports them). I also deleted the unused `OpenRepoInBrowserActivity` and added the mechanism to open an URL in the browser to the `AppUtil`. I also improved the setting switches: * hide settings if required settings are disabled (only notification settings) * allow click on full layouts Co-authored-by: qwerty287 Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/1019 Reviewed-by: 6543 <6543@noreply.codeberg.org> Co-authored-by: qwerty287 Co-committed-by: qwerty287 --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 3 - .../gitnex/activities/DeepLinksActivity.java | 8 +-- .../activities/OpenRepoInBrowserActivity.java | 55 ------------------- .../gitnex/activities/RepoDetailActivity.java | 5 +- .../SettingsAppearanceActivity.java | 1 + .../activities/SettingsDraftsActivity.java | 2 + .../activities/SettingsGeneralActivity.java | 11 ++++ .../SettingsNotificationsActivity.java | 37 +++++++++++++ .../activities/SettingsReportsActivity.java | 2 + .../activities/SettingsSecurityActivity.java | 2 + .../SettingsTranslationActivity.java | 9 +-- .../mian/gitnex/adapters/CommitsAdapter.java | 3 +- .../gitnex/fragments/SettingsFragment.java | 18 +----- .../java/org/mian/gitnex/helpers/AppUtil.java | 32 +++++++++++ .../res/layout/activity_settings_general.xml | 32 +++++++++++ app/src/main/res/values/strings.xml | 1 + 17 files changed, 131 insertions(+), 91 deletions(-) delete mode 100644 app/src/main/java/org/mian/gitnex/activities/OpenRepoInBrowserActivity.java diff --git a/app/build.gradle b/app/build.gradle index e4083668..8bfe40eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -113,5 +113,6 @@ dependencies { coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5" implementation 'androidx.biometric:biometric:1.1.0' implementation 'com.github.chrisvest:stormpot:2.4.2' + implementation 'androidx.browser:browser:1.3.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b361a611..58fcc5d1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -105,9 +105,6 @@ - diff --git a/app/src/main/java/org/mian/gitnex/activities/DeepLinksActivity.java b/app/src/main/java/org/mian/gitnex/activities/DeepLinksActivity.java index bbf5cad2..b20dc743 100644 --- a/app/src/main/java/org/mian/gitnex/activities/DeepLinksActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/DeepLinksActivity.java @@ -346,13 +346,7 @@ public class DeepLinksActivity extends BaseActivity { .withPort(port) .toUri(); - Intent intentBrowser = new Intent(); - - intentBrowser.setAction(Intent.ACTION_VIEW); - intentBrowser.addCategory(Intent.CATEGORY_BROWSABLE); - intentBrowser.setData(Uri.parse(String.valueOf(host))); - - startActivity(intentBrowser); + AppUtil.openUrlInBrowser(this, String.valueOf(host)); finish(); }); diff --git a/app/src/main/java/org/mian/gitnex/activities/OpenRepoInBrowserActivity.java b/app/src/main/java/org/mian/gitnex/activities/OpenRepoInBrowserActivity.java deleted file mode 100644 index 175b4aea..00000000 --- a/app/src/main/java/org/mian/gitnex/activities/OpenRepoInBrowserActivity.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.mian.gitnex.activities; - -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import androidx.appcompat.app.AppCompatActivity; -import org.mian.gitnex.R; -import org.mian.gitnex.helpers.PathsHelper; -import org.mian.gitnex.helpers.TinyDB; -import org.mian.gitnex.helpers.Toasty; -import java.net.URI; -import java.net.URISyntaxException; -import io.mikael.urlbuilder.UrlBuilder; - -/** - * Author M M Arif - */ - -public class OpenRepoInBrowserActivity extends AppCompatActivity { - - private Context appCtx; - - @Override - protected void onCreate(Bundle savedInstanceState) { - - super.onCreate(savedInstanceState); - - appCtx = getApplicationContext(); - TinyDB tinyDb = TinyDB.getInstance(appCtx); - - try { - - URI instanceUrl = new URI(UrlBuilder.fromString(tinyDb.getString("instanceUrl")) - .withPath("/") - .toString()); - - String browserPath = PathsHelper.join(instanceUrl.getPath(), getIntent().getStringExtra("repoFullNameBrowser")); - - String browserUrl = UrlBuilder.fromUri(instanceUrl) - .withPath(browserPath) - .toString(); - - Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(browserUrl)); - startActivity(i); - finish(); - - } - catch(URISyntaxException e) { - - Toasty.error(appCtx, getString(R.string.genericError)); - } - } - -} diff --git a/app/src/main/java/org/mian/gitnex/activities/RepoDetailActivity.java b/app/src/main/java/org/mian/gitnex/activities/RepoDetailActivity.java index 6172e992..f1518f19 100644 --- a/app/src/main/java/org/mian/gitnex/activities/RepoDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/RepoDetailActivity.java @@ -46,6 +46,7 @@ import org.mian.gitnex.fragments.MilestonesFragment; import org.mian.gitnex.fragments.PullRequestsFragment; import org.mian.gitnex.fragments.ReleasesFragment; import org.mian.gitnex.fragments.RepoInfoFragment; +import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Version; @@ -419,9 +420,7 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe startActivity(new Intent(RepoDetailActivity.this, CreateReleaseActivity.class)); break; case "openWebRepo": - - Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(tinyDB.getString("repoHtmlUrl"))); - startActivity(i); + AppUtil.openUrlInBrowser(this, tinyDB.getString("repoHtmlUrl")); break; case "shareRepo": diff --git a/app/src/main/java/org/mian/gitnex/activities/SettingsAppearanceActivity.java b/app/src/main/java/org/mian/gitnex/activities/SettingsAppearanceActivity.java index 04aa0315..2f5bd2d2 100644 --- a/app/src/main/java/org/mian/gitnex/activities/SettingsAppearanceActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/SettingsAppearanceActivity.java @@ -98,6 +98,7 @@ public class SettingsAppearanceActivity extends BaseActivity { tinyDB.putBoolean("enableCounterBadges", isChecked); Toasty.success(appCtx, getResources().getString(R.string.settingsSave)); }); + activitySettingsAppearanceBinding.counterBadgeFrame.setOnClickListener(v -> counterBadgesSwitch.setChecked(!counterBadgesSwitch.isChecked())); // theme selection dialog themeFrame.setOnClickListener(view -> { diff --git a/app/src/main/java/org/mian/gitnex/activities/SettingsDraftsActivity.java b/app/src/main/java/org/mian/gitnex/activities/SettingsDraftsActivity.java index 34f580eb..f6fa3d76 100644 --- a/app/src/main/java/org/mian/gitnex/activities/SettingsDraftsActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/SettingsDraftsActivity.java @@ -36,6 +36,8 @@ public class SettingsDraftsActivity extends BaseActivity { tinyDB.putBoolean("draftsCommentsDeletionEnabled", isChecked); Toasty.success(appCtx, getResources().getString(R.string.settingsSave)); }); + activitySettingsDraftsBinding.enableDraftsCommentsDeletion.setOnClickListener( + v -> activitySettingsDraftsBinding.commentsDeletionSwitch.setChecked(!activitySettingsDraftsBinding.commentsDeletionSwitch.isChecked())); } diff --git a/app/src/main/java/org/mian/gitnex/activities/SettingsGeneralActivity.java b/app/src/main/java/org/mian/gitnex/activities/SettingsGeneralActivity.java index ae73243b..8f4213f3 100644 --- a/app/src/main/java/org/mian/gitnex/activities/SettingsGeneralActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/SettingsGeneralActivity.java @@ -2,7 +2,9 @@ package org.mian.gitnex.activities; import android.os.Bundle; import android.view.View; +import android.widget.CompoundButton; import androidx.appcompat.app.AlertDialog; +import com.google.android.material.switchmaterial.SwitchMaterial; import org.mian.gitnex.R; import org.mian.gitnex.databinding.ActivitySettingsGeneralBinding; import org.mian.gitnex.helpers.Toasty; @@ -139,6 +141,15 @@ public class SettingsGeneralActivity extends BaseActivity { dlDialog.show(); }); // link handler + + // custom tabs + viewBinding.switchTabs.setChecked(tinyDB.getBoolean("useCustomTabs")); + viewBinding.switchTabs.setOnCheckedChangeListener((buttonView, isChecked) -> { + tinyDB.putBoolean("useCustomTabs", isChecked); + Toasty.success(appCtx, getResources().getString(R.string.settingsSave)); + }); + viewBinding.customTabsFrame.setOnClickListener(v -> viewBinding.switchTabs.setChecked(!viewBinding.switchTabs.isChecked())); + // custom tabs } private void initCloseListener() { onClickListener = view -> finish(); } diff --git a/app/src/main/java/org/mian/gitnex/activities/SettingsNotificationsActivity.java b/app/src/main/java/org/mian/gitnex/activities/SettingsNotificationsActivity.java index 01d59a9c..7d431b9e 100644 --- a/app/src/main/java/org/mian/gitnex/activities/SettingsNotificationsActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/SettingsNotificationsActivity.java @@ -8,6 +8,7 @@ import androidx.appcompat.app.AlertDialog; import com.pes.androidmaterialcolorpickerdialog.ColorPicker; import org.mian.gitnex.R; import org.mian.gitnex.databinding.ActivitySettingsNotificationsBinding; +import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.notifications.Notifications; @@ -40,19 +41,46 @@ public class SettingsNotificationsActivity extends BaseActivity { viewBinding.enableLightsMode.setChecked(tinyDB.getBoolean("notificationsEnableLights", true)); viewBinding.enableVibrationMode.setChecked(tinyDB.getBoolean("notificationsEnableVibration", true)); + if(!viewBinding.enableNotificationsMode.isChecked()) { + AppUtil.setMultiVisibility(View.GONE, + viewBinding.chooseColorFrame, + viewBinding.enableLightsFrame, + viewBinding.enableVibrationFrame, + viewBinding.pollingDelayFrame + ); + } + + if(!viewBinding.enableLightsMode.isChecked()) { + viewBinding.chooseColorFrame.setVisibility(View.GONE); + } + viewBinding.enableNotificationsMode.setOnCheckedChangeListener((buttonView, isChecked) -> { tinyDB.putBoolean("notificationsEnabled", isChecked); if(isChecked) { Notifications.startWorker(ctx); + AppUtil.setMultiVisibility(View.VISIBLE, + viewBinding.chooseColorFrame, + viewBinding.enableLightsFrame, + viewBinding.enableVibrationFrame, + viewBinding.pollingDelayFrame + ); } else { Notifications.stopWorker(ctx); + AppUtil.setMultiVisibility(View.GONE, + viewBinding.chooseColorFrame, + viewBinding.enableLightsFrame, + viewBinding.enableVibrationFrame, + viewBinding.pollingDelayFrame + ); } Toasty.info(appCtx, getResources().getString(R.string.settingsSave)); }); + viewBinding.enableNotificationsFrame.setOnClickListener( + v -> viewBinding.enableNotificationsMode.setChecked(!viewBinding.enableNotificationsMode.isChecked())); // polling delay viewBinding.pollingDelayFrame.setOnClickListener(v -> { @@ -88,10 +116,17 @@ public class SettingsNotificationsActivity extends BaseActivity { // lights switcher viewBinding.enableLightsMode.setOnCheckedChangeListener((buttonView, isChecked) -> { + if(!isChecked) { + viewBinding.chooseColorFrame.setVisibility(View.GONE); + } else { + viewBinding.chooseColorFrame.setVisibility(View.VISIBLE); + } + tinyDB.putBoolean("notificationsEnableLights", isChecked); Toasty.info(appCtx, getResources().getString(R.string.settingsSave)); }); + viewBinding.enableLightsFrame.setOnClickListener(v -> viewBinding.enableLightsMode.setChecked(!viewBinding.enableLightsMode.isChecked())); // lights color chooser viewBinding.chooseColorFrame.setOnClickListener(v -> { @@ -117,6 +152,8 @@ public class SettingsNotificationsActivity extends BaseActivity { Toasty.info(appCtx, getResources().getString(R.string.settingsSave)); }); + viewBinding.enableVibrationFrame.setOnClickListener( + v -> viewBinding.enableVibrationMode.setChecked(!viewBinding.enableVibrationMode.isChecked())); } diff --git a/app/src/main/java/org/mian/gitnex/activities/SettingsReportsActivity.java b/app/src/main/java/org/mian/gitnex/activities/SettingsReportsActivity.java index ec97f84c..c6366225 100644 --- a/app/src/main/java/org/mian/gitnex/activities/SettingsReportsActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/SettingsReportsActivity.java @@ -36,6 +36,8 @@ public class SettingsReportsActivity extends BaseActivity { tinyDB.putBoolean("crashReportingEnabled", isChecked); Toasty.success(appCtx, getResources().getString(R.string.settingsSave)); }); + activitySettingsReportsBinding.enableSendReports.setOnClickListener( + v -> activitySettingsReportsBinding.crashReportsSwitch.setChecked(!activitySettingsReportsBinding.crashReportsSwitch.isChecked())); } private void initCloseListener() { diff --git a/app/src/main/java/org/mian/gitnex/activities/SettingsSecurityActivity.java b/app/src/main/java/org/mian/gitnex/activities/SettingsSecurityActivity.java index 1573198b..2c221015 100644 --- a/app/src/main/java/org/mian/gitnex/activities/SettingsSecurityActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/SettingsSecurityActivity.java @@ -148,6 +148,8 @@ public class SettingsSecurityActivity extends BaseActivity { }); + activitySettingsSecurityBinding.biometricFrame.setOnClickListener(v -> switchBiometric.setChecked(!switchBiometric.isChecked())); + // clear cache setter File cacheDir = appCtx.getCacheDir(); clearCacheSelected.setText(FileUtils.byteCountToDisplaySize((int) FileUtils.sizeOfDirectory(cacheDir))); diff --git a/app/src/main/java/org/mian/gitnex/activities/SettingsTranslationActivity.java b/app/src/main/java/org/mian/gitnex/activities/SettingsTranslationActivity.java index 8a40543d..f8df2174 100644 --- a/app/src/main/java/org/mian/gitnex/activities/SettingsTranslationActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/SettingsTranslationActivity.java @@ -10,6 +10,7 @@ import android.widget.TextView; import androidx.appcompat.app.AlertDialog; import org.mian.gitnex.R; import org.mian.gitnex.databinding.ActivitySettingsTranslationBinding; +import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.Toasty; import java.util.LinkedHashMap; import java.util.Locale; @@ -50,13 +51,7 @@ public class SettingsTranslationActivity extends BaseActivity { LinearLayout langFrame = activitySettingsTranslationBinding.langFrame; helpTranslate.setOnClickListener(v12 -> { - - Intent intent = new Intent(); - intent.setAction(Intent.ACTION_VIEW); - intent.addCategory(Intent.CATEGORY_BROWSABLE); - intent.setData(Uri.parse(getResources().getString(R.string.crowdInLink))); - startActivity(intent); - + AppUtil.openUrlInBrowser(this, getResources().getString(R.string.crowdInLink)); }); tvLanguageSelected.setText(tinyDB.getString("localeStr")); diff --git a/app/src/main/java/org/mian/gitnex/adapters/CommitsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/CommitsAdapter.java index e519eebe..fc056177 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/CommitsAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/CommitsAdapter.java @@ -14,6 +14,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.vdurmont.emoji.EmojiParser; import org.gitnex.tea4j.models.Commits; import org.mian.gitnex.R; +import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TinyDB; @@ -114,7 +115,7 @@ public class CommitsAdapter extends RecyclerView.Adapter context.startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse(commitsModel.getHtml_url())))); + commitHtmlUrl.setOnClickListener(v -> AppUtil.openUrlInBrowser(context, commitsModel.getHtml_url())); } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/SettingsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/SettingsFragment.java index a28c03b7..bf015f18 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/SettingsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/SettingsFragment.java @@ -91,27 +91,15 @@ public class SettingsFragment extends Fragment { aboutAppDialogBinding.userServerVersion.setText(tinyDB.getString("giteaVersion")); aboutAppDialogBinding.donationLinkPatreon.setOnClickListener(v12 -> { - Intent intent = new Intent(); - intent.setAction(Intent.ACTION_VIEW); - intent.addCategory(Intent.CATEGORY_BROWSABLE); - intent.setData(Uri.parse(getResources().getString(R.string.supportLinkPatreon))); - startActivity(intent); + AppUtil.openUrlInBrowser(requireContext(), getResources().getString(R.string.supportLinkPatreon)); }); aboutAppDialogBinding.translateLink.setOnClickListener(v13 -> { - Intent intent = new Intent(); - intent.setAction(Intent.ACTION_VIEW); - intent.addCategory(Intent.CATEGORY_BROWSABLE); - intent.setData(Uri.parse(getResources().getString(R.string.crowdInLink))); - startActivity(intent); + AppUtil.openUrlInBrowser(requireContext(), getResources().getString(R.string.crowdInLink)); }); aboutAppDialogBinding.appWebsite.setOnClickListener(v14 -> { - Intent intent = new Intent(); - intent.setAction(Intent.ACTION_VIEW); - intent.addCategory(Intent.CATEGORY_BROWSABLE); - intent.setData(Uri.parse(getResources().getString(R.string.appWebsiteLink))); - startActivity(intent); + AppUtil.openUrlInBrowser(requireContext(), getResources().getString(R.string.appWebsiteLink)); }); if(AppUtil.isPro(requireContext())) { diff --git a/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java index c714b294..56932528 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java +++ b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java @@ -3,16 +3,22 @@ package org.mian.gitnex.helpers; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; +import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; +import android.graphics.Color; +import android.net.Uri; import android.util.Base64; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.View; import androidx.annotation.ColorInt; +import androidx.browser.customtabs.CustomTabColorSchemeParams; +import androidx.browser.customtabs.CustomTabsIntent; import androidx.core.content.pm.PackageInfoCompat; +import org.mian.gitnex.R; import org.mian.gitnex.database.models.UserAccount; import java.io.IOException; import java.io.InputStream; @@ -343,4 +349,30 @@ public class AppUtil { } + public static void openUrlInBrowser(Context context, String url) { + TinyDB tinyDB = TinyDB.getInstance(context); + + try { + if(tinyDB.getBoolean("useCustomTabs")) { + new CustomTabsIntent + .Builder() + .setDefaultColorSchemeParams( + new CustomTabColorSchemeParams.Builder() + .setToolbarColor(getColorFromAttribute(context, R.attr.primaryBackgroundColor)) + .setNavigationBarColor(getColorFromAttribute(context, R.attr.primaryBackgroundColor)) + .setSecondaryToolbarColor(R.attr.primaryTextColor) + .build() + ) + .build() + .launchUrl(context, Uri.parse(url)); + } else { + Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(tinyDB.getString("repoHtmlUrl"))); + i.addCategory(Intent.CATEGORY_BROWSABLE); + context.startActivity(i); + } + } catch(Exception e) { + Toasty.error(context, context.getString(R.string.genericError)); + } + } + } diff --git a/app/src/main/res/layout/activity_settings_general.xml b/app/src/main/res/layout/activity_settings_general.xml index 7552e8b7..1e0a7e2f 100644 --- a/app/src/main/res/layout/activity_settings_general.xml +++ b/app/src/main/res/layout/activity_settings_general.xml @@ -123,4 +123,36 @@ + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7ccb5e97..74c6a456 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -750,4 +750,5 @@ Rebase Select Update Strategy Avatar + Use Custom Tabs