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