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" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-