diff --git a/app/build.gradle b/app/build.gradle index 98dc757..dab0edc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.fox2code.mmm" minSdk 21 targetSdk 33 - versionCode 58 - versionName "0.6.6" + versionCode 59 + versionName "0.6.7" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -162,7 +162,7 @@ dependencies { implementation 'androidx.recyclerview:recyclerview:1.2.1' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation 'androidx.webkit:webkit:1.5.0' - implementation 'com.google.android.material:material:1.6.1' + implementation 'com.google.android.material:material:1.7.0' implementation "dev.rikka.rikkax.layoutinflater:layoutinflater:1.2.0" implementation "dev.rikka.rikkax.insets:insets:1.3.0" implementation 'com.github.Dimezis:BlurView:version-2.0.2' diff --git a/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyRepoData.java b/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyRepoData.java index 57bccf0..961c170 100644 --- a/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyRepoData.java +++ b/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyRepoData.java @@ -103,10 +103,10 @@ public final class AndroidacyRepoData extends RepoData { } catch (Exception e) { Log.e(TAG, "Failed to ping server", e); // Inform user - if (!HttpException.shouldTimeout(e)) { + /*if (!HttpException.shouldTimeout(e)) { UiThreadHandler.run(() -> Toast.makeText(MainApplication.getINSTANCE(), R.string.androidacy_server_down, Toast.LENGTH_SHORT).show()); - } + }*/ return false; } long time = System.currentTimeMillis(); diff --git a/app/src/main/java/com/fox2code/mmm/settings/LongClickablePreference.java b/app/src/main/java/com/fox2code/mmm/settings/LongClickablePreference.java new file mode 100644 index 0000000..12b48cf --- /dev/null +++ b/app/src/main/java/com/fox2code/mmm/settings/LongClickablePreference.java @@ -0,0 +1,64 @@ +package com.fox2code.mmm.settings; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.preference.Preference; +import androidx.preference.PreferenceViewHolder; + +public class LongClickablePreference extends Preference { + private OnPreferenceLongClickListener onPreferenceLongClickListener; + + public LongClickablePreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + public LongClickablePreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public LongClickablePreference(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public LongClickablePreference(@NonNull Context context) { + super(context); + } + + @Override + public void onBindViewHolder(@NonNull PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + holder.itemView.setOnLongClickListener(v -> performLongClick()); + } + + private boolean performLongClick() { + if (!this.isEnabled() || !this.isSelectable()) { + return false; + } + if (this.onPreferenceLongClickListener != null) { + return this.onPreferenceLongClickListener.onPreferenceLongClick(this); + } + return false; + } + + public void setOnPreferenceLongClickListener(OnPreferenceLongClickListener onPreferenceLongClickListener) { + this.onPreferenceLongClickListener = onPreferenceLongClickListener; + } + + public OnPreferenceLongClickListener getOnPreferenceLongClickListener() { + return this.onPreferenceLongClickListener; + } + + @FunctionalInterface + public interface OnPreferenceLongClickListener { + /** + * Called when a preference has been clicked. + * + * @param preference The preference that was clicked + * @return {@code true} if the click was handled + */ + boolean onPreferenceLongClick(@NonNull Preference preference); + } +} diff --git a/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java b/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java index 79e54bf..b07dcc4 100644 --- a/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java +++ b/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java @@ -4,6 +4,8 @@ import android.annotation.SuppressLint; import android.app.AlarmManager; import android.app.Application; import android.app.PendingIntent; +import android.content.ClipData; +import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -276,24 +278,42 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity { }); final LibsBuilder libsBuilder = new LibsBuilder().withShowLoadingProgress(false).withLicenseShown(true).withAboutMinimalDesign(false); - Preference update = findPreference("pref_update"); - update.setVisible(BuildConfig.ENABLE_AUTO_UPDATER && (BuildConfig.DEBUG || AppUpdateManager.getAppUpdateManager().peekHasUpdate())); - update.setOnPreferenceClickListener(p -> { + ClipboardManager clipboard = (ClipboardManager) requireContext().getSystemService(Context.CLIPBOARD_SERVICE); + LongClickablePreference linkClickable = findPreference("pref_update"); + linkClickable.setVisible(BuildConfig.ENABLE_AUTO_UPDATER && + (BuildConfig.DEBUG || AppUpdateManager.getAppUpdateManager().peekHasUpdate())); + linkClickable.setOnPreferenceClickListener(p -> { devModeStep = 0; IntentHelper.openUrl(p.getContext(), "https://github.com/Fox2Code/FoxMagiskModuleManager/releases"); return true; }); + linkClickable.setOnPreferenceLongClickListener(p -> { + String toastText = requireContext().getString(R.string.link_copied); + clipboard.setPrimaryClip(ClipData.newPlainText(toastText, + "https://github.com/Fox2Code/FoxMagiskModuleManager/releases")); + Toast.makeText(requireContext(), toastText, Toast.LENGTH_SHORT).show(); + return true; + }); if (BuildConfig.DEBUG || BuildConfig.ENABLE_AUTO_UPDATER) { - findPreference("pref_report_bug").setOnPreferenceClickListener(p -> { + linkClickable = findPreference("pref_report_bug"); + linkClickable.setOnPreferenceClickListener(p -> { devModeStep = 0; devModeStepFirstBootIgnore = true; IntentHelper.openUrl(p.getContext(), "https://github.com/Fox2Code/FoxMagiskModuleManager/issues"); return true; }); + linkClickable.setOnPreferenceLongClickListener(p -> { + String toastText = requireContext().getString(R.string.link_copied); + clipboard.setPrimaryClip(ClipData.newPlainText(toastText, + "https://github.com/Fox2Code/FoxMagiskModuleManager/issues")); + Toast.makeText(requireContext(), toastText, Toast.LENGTH_SHORT).show(); + return true; + }); } else { findPreference("pref_report_bug").setVisible(false); } - findPreference("pref_source_code").setOnPreferenceClickListener(p -> { + linkClickable = findPreference("pref_source_code"); + linkClickable.setOnPreferenceClickListener(p -> { if (devModeStep == 2) { devModeStep = 0; if (MainApplication.isDeveloper() && !BuildConfig.DEBUG) { @@ -311,11 +331,26 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity { IntentHelper.openUrl(p.getContext(), "https://github.com/Fox2Code/FoxMagiskModuleManager"); return true; }); - findPreference("pref_support").setOnPreferenceClickListener(p -> { + linkClickable.setOnPreferenceLongClickListener(p -> { + String toastText = requireContext().getString(R.string.link_copied); + clipboard.setPrimaryClip(ClipData.newPlainText(toastText, + "https://github.com/Fox2Code/FoxMagiskModuleManager")); + Toast.makeText(requireContext(), toastText, Toast.LENGTH_SHORT).show(); + return true; + }); + linkClickable = findPreference("pref_support"); + linkClickable.setOnPreferenceClickListener(p -> { devModeStep = 0; IntentHelper.openUrl(p.getContext(), "https://t.me/Fox2Code_Chat"); return true; }); + linkClickable.setOnPreferenceLongClickListener(p -> { + String toastText = requireContext().getString(R.string.link_copied); + clipboard.setPrimaryClip(ClipData.newPlainText(toastText, + "https://t.me/Fox2Code_Chat")); + Toast.makeText(requireContext(), toastText, Toast.LENGTH_SHORT).show(); + return true; + }); findPreference("pref_show_licenses").setOnPreferenceClickListener(p -> { devModeStep = devModeStep == 1 ? 2 : 0; BackgroundUpdateChecker.onMainActivityResume(this.requireContext()); @@ -631,6 +666,8 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity { } private void setRepoData(final RepoData repoData, String preferenceName) { + ClipboardManager clipboard = (ClipboardManager) + requireContext().getSystemService(Context.CLIPBOARD_SERVICE); if (repoData == null || repoData.isForceHide()) { hideRepoData(preferenceName); return; @@ -661,6 +698,12 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity { } return true; }); + ((LongClickablePreference) preference).setOnPreferenceLongClickListener(p -> { + String toastText = requireContext().getString(R.string.link_copied); + clipboard.setPrimaryClip(ClipData.newPlainText(toastText, homepage)); + Toast.makeText(requireContext(), toastText, Toast.LENGTH_SHORT).show(); + return true; + }); } else { preference.setVisible(false); } @@ -675,6 +718,12 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity { IntentHelper.openUrl(getFoxActivity(this), supportUrl); return true; }); + ((LongClickablePreference) preference).setOnPreferenceLongClickListener(p -> { + String toastText = requireContext().getString(R.string.link_copied); + clipboard.setPrimaryClip(ClipData.newPlainText(toastText, supportUrl)); + Toast.makeText(requireContext(), toastText, Toast.LENGTH_SHORT).show(); + return true; + }); } else { preference.setVisible(false); } @@ -689,6 +738,12 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity { IntentHelper.openUrl(getFoxActivity(this), donateUrl); return true; }); + ((LongClickablePreference) preference).setOnPreferenceLongClickListener(p -> { + String toastText = requireContext().getString(R.string.link_copied); + clipboard.setPrimaryClip(ClipData.newPlainText(toastText, donateUrl)); + Toast.makeText(requireContext(), toastText, Toast.LENGTH_SHORT).show(); + return true; + }); } else { preference.setVisible(false); } @@ -706,6 +761,12 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity { } return true; }); + ((LongClickablePreference) preference).setOnPreferenceLongClickListener(p -> { + String toastText = requireContext().getString(R.string.link_copied); + clipboard.setPrimaryClip(ClipData.newPlainText(toastText, submissionUrl)); + Toast.makeText(requireContext(), toastText, Toast.LENGTH_SHORT).show(); + return true; + }); } else { preference.setVisible(false); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b72f45e..6be519d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -131,6 +131,7 @@ Add Repo Remove Repo Custom url + Link copied This repository may display some non-intrusive advertising to cover server and development costs. Backup modules Restore modules diff --git a/app/src/main/res/xml/repo_preferences.xml b/app/src/main/res/xml/repo_preferences.xml index 0e43d3d..8d3931f 100644 --- a/app/src/main/res/xml/repo_preferences.xml +++ b/app/src/main/res/xml/repo_preferences.xml @@ -10,22 +10,22 @@ app:switchTextOn="@string/repo_enabled" app:switchTextOff="@string/repo_disabled" app:singleLineTitle="false" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -