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 11139b6..f959e1a 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()); @@ -629,6 +664,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; @@ -659,6 +696,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); } @@ -673,6 +716,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); } @@ -687,6 +736,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); } @@ -704,6 +759,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 8cbb1a8..d997dd0 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" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -