Skip to content
This repository was archived by the owner on May 4, 2023. It is now read-only.

Commit 0f0f579

Browse files
committed
Allow copying links from the settings by long clicking
1 parent d4ab506 commit 0f0f579

File tree

5 files changed

+173
-47
lines changed

5 files changed

+173
-47
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.fox2code.mmm.settings;
2+
3+
import android.content.Context;
4+
import android.util.AttributeSet;
5+
6+
import androidx.annotation.NonNull;
7+
import androidx.annotation.Nullable;
8+
import androidx.preference.Preference;
9+
import androidx.preference.PreferenceViewHolder;
10+
11+
public class LongClickablePreference extends Preference {
12+
private OnPreferenceLongClickListener onPreferenceLongClickListener;
13+
14+
public LongClickablePreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
15+
super(context, attrs, defStyleAttr, defStyleRes);
16+
}
17+
18+
public LongClickablePreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
19+
super(context, attrs, defStyleAttr);
20+
}
21+
22+
public LongClickablePreference(@NonNull Context context, @Nullable AttributeSet attrs) {
23+
super(context, attrs);
24+
}
25+
26+
public LongClickablePreference(@NonNull Context context) {
27+
super(context);
28+
}
29+
30+
@Override
31+
public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
32+
super.onBindViewHolder(holder);
33+
holder.itemView.setOnLongClickListener(v -> performLongClick());
34+
}
35+
36+
private boolean performLongClick() {
37+
if (!this.isEnabled() || !this.isSelectable()) {
38+
return false;
39+
}
40+
if (this.onPreferenceLongClickListener != null) {
41+
return this.onPreferenceLongClickListener.onPreferenceLongClick(this);
42+
}
43+
return false;
44+
}
45+
46+
public void setOnPreferenceLongClickListener(OnPreferenceLongClickListener onPreferenceLongClickListener) {
47+
this.onPreferenceLongClickListener = onPreferenceLongClickListener;
48+
}
49+
50+
public OnPreferenceLongClickListener getOnPreferenceLongClickListener() {
51+
return this.onPreferenceLongClickListener;
52+
}
53+
54+
@FunctionalInterface
55+
public interface OnPreferenceLongClickListener {
56+
/**
57+
* Called when a preference has been clicked.
58+
*
59+
* @param preference The preference that was clicked
60+
* @return {@code true} if the click was handled
61+
*/
62+
boolean onPreferenceLongClick(@NonNull Preference preference);
63+
}
64+
}

app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java

Lines changed: 67 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import android.app.AlarmManager;
55
import android.app.Application;
66
import android.app.PendingIntent;
7+
import android.content.ClipData;
8+
import android.content.ClipboardManager;
79
import android.content.Context;
810
import android.content.Intent;
911
import android.content.SharedPreferences;
@@ -276,24 +278,42 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
276278
});
277279

278280
final LibsBuilder libsBuilder = new LibsBuilder().withShowLoadingProgress(false).withLicenseShown(true).withAboutMinimalDesign(false);
279-
Preference update = findPreference("pref_update");
280-
update.setVisible(BuildConfig.ENABLE_AUTO_UPDATER && (BuildConfig.DEBUG || AppUpdateManager.getAppUpdateManager().peekHasUpdate()));
281-
update.setOnPreferenceClickListener(p -> {
281+
ClipboardManager clipboard = (ClipboardManager) requireContext().getSystemService(Context.CLIPBOARD_SERVICE);
282+
LongClickablePreference linkClickable = findPreference("pref_update");
283+
linkClickable.setVisible(BuildConfig.ENABLE_AUTO_UPDATER &&
284+
(BuildConfig.DEBUG || AppUpdateManager.getAppUpdateManager().peekHasUpdate()));
285+
linkClickable.setOnPreferenceClickListener(p -> {
282286
devModeStep = 0;
283287
IntentHelper.openUrl(p.getContext(), "https://github.com/Fox2Code/FoxMagiskModuleManager/releases");
284288
return true;
285289
});
290+
linkClickable.setOnPreferenceLongClickListener(p -> {
291+
String toastText = requireContext().getString(R.string.link_copied);
292+
clipboard.setPrimaryClip(ClipData.newPlainText(toastText,
293+
"https://github.com/Fox2Code/FoxMagiskModuleManager/releases"));
294+
Toast.makeText(requireContext(), toastText, Toast.LENGTH_SHORT).show();
295+
return true;
296+
});
286297
if (BuildConfig.DEBUG || BuildConfig.ENABLE_AUTO_UPDATER) {
287-
findPreference("pref_report_bug").setOnPreferenceClickListener(p -> {
298+
linkClickable = findPreference("pref_report_bug");
299+
linkClickable.setOnPreferenceClickListener(p -> {
288300
devModeStep = 0;
289301
devModeStepFirstBootIgnore = true;
290302
IntentHelper.openUrl(p.getContext(), "https://github.com/Fox2Code/FoxMagiskModuleManager/issues");
291303
return true;
292304
});
305+
linkClickable.setOnPreferenceLongClickListener(p -> {
306+
String toastText = requireContext().getString(R.string.link_copied);
307+
clipboard.setPrimaryClip(ClipData.newPlainText(toastText,
308+
"https://github.com/Fox2Code/FoxMagiskModuleManager/issues"));
309+
Toast.makeText(requireContext(), toastText, Toast.LENGTH_SHORT).show();
310+
return true;
311+
});
293312
} else {
294313
findPreference("pref_report_bug").setVisible(false);
295314
}
296-
findPreference("pref_source_code").setOnPreferenceClickListener(p -> {
315+
linkClickable = findPreference("pref_source_code");
316+
linkClickable.setOnPreferenceClickListener(p -> {
297317
if (devModeStep == 2) {
298318
devModeStep = 0;
299319
if (MainApplication.isDeveloper() && !BuildConfig.DEBUG) {
@@ -311,11 +331,26 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
311331
IntentHelper.openUrl(p.getContext(), "https://github.com/Fox2Code/FoxMagiskModuleManager");
312332
return true;
313333
});
314-
findPreference("pref_support").setOnPreferenceClickListener(p -> {
334+
linkClickable.setOnPreferenceLongClickListener(p -> {
335+
String toastText = requireContext().getString(R.string.link_copied);
336+
clipboard.setPrimaryClip(ClipData.newPlainText(toastText,
337+
"https://github.com/Fox2Code/FoxMagiskModuleManager"));
338+
Toast.makeText(requireContext(), toastText, Toast.LENGTH_SHORT).show();
339+
return true;
340+
});
341+
linkClickable = findPreference("pref_support");
342+
linkClickable.setOnPreferenceClickListener(p -> {
315343
devModeStep = 0;
316344
IntentHelper.openUrl(p.getContext(), "https://t.me/Fox2Code_Chat");
317345
return true;
318346
});
347+
linkClickable.setOnPreferenceLongClickListener(p -> {
348+
String toastText = requireContext().getString(R.string.link_copied);
349+
clipboard.setPrimaryClip(ClipData.newPlainText(toastText,
350+
"https://t.me/Fox2Code_Chat"));
351+
Toast.makeText(requireContext(), toastText, Toast.LENGTH_SHORT).show();
352+
return true;
353+
});
319354
findPreference("pref_show_licenses").setOnPreferenceClickListener(p -> {
320355
devModeStep = devModeStep == 1 ? 2 : 0;
321356
BackgroundUpdateChecker.onMainActivityResume(this.requireContext());
@@ -629,6 +664,8 @@ private void setRepoData(String url) {
629664
}
630665

631666
private void setRepoData(final RepoData repoData, String preferenceName) {
667+
ClipboardManager clipboard = (ClipboardManager)
668+
requireContext().getSystemService(Context.CLIPBOARD_SERVICE);
632669
if (repoData == null || repoData.isForceHide()) {
633670
hideRepoData(preferenceName);
634671
return;
@@ -659,6 +696,12 @@ private void setRepoData(final RepoData repoData, String preferenceName) {
659696
}
660697
return true;
661698
});
699+
((LongClickablePreference) preference).setOnPreferenceLongClickListener(p -> {
700+
String toastText = requireContext().getString(R.string.link_copied);
701+
clipboard.setPrimaryClip(ClipData.newPlainText(toastText, homepage));
702+
Toast.makeText(requireContext(), toastText, Toast.LENGTH_SHORT).show();
703+
return true;
704+
});
662705
} else {
663706
preference.setVisible(false);
664707
}
@@ -673,6 +716,12 @@ private void setRepoData(final RepoData repoData, String preferenceName) {
673716
IntentHelper.openUrl(getFoxActivity(this), supportUrl);
674717
return true;
675718
});
719+
((LongClickablePreference) preference).setOnPreferenceLongClickListener(p -> {
720+
String toastText = requireContext().getString(R.string.link_copied);
721+
clipboard.setPrimaryClip(ClipData.newPlainText(toastText, supportUrl));
722+
Toast.makeText(requireContext(), toastText, Toast.LENGTH_SHORT).show();
723+
return true;
724+
});
676725
} else {
677726
preference.setVisible(false);
678727
}
@@ -687,6 +736,12 @@ private void setRepoData(final RepoData repoData, String preferenceName) {
687736
IntentHelper.openUrl(getFoxActivity(this), donateUrl);
688737
return true;
689738
});
739+
((LongClickablePreference) preference).setOnPreferenceLongClickListener(p -> {
740+
String toastText = requireContext().getString(R.string.link_copied);
741+
clipboard.setPrimaryClip(ClipData.newPlainText(toastText, donateUrl));
742+
Toast.makeText(requireContext(), toastText, Toast.LENGTH_SHORT).show();
743+
return true;
744+
});
690745
} else {
691746
preference.setVisible(false);
692747
}
@@ -704,6 +759,12 @@ private void setRepoData(final RepoData repoData, String preferenceName) {
704759
}
705760
return true;
706761
});
762+
((LongClickablePreference) preference).setOnPreferenceLongClickListener(p -> {
763+
String toastText = requireContext().getString(R.string.link_copied);
764+
clipboard.setPrimaryClip(ClipData.newPlainText(toastText, submissionUrl));
765+
Toast.makeText(requireContext(), toastText, Toast.LENGTH_SHORT).show();
766+
return true;
767+
});
707768
} else {
708769
preference.setVisible(false);
709770
}

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@
131131
<string name="add_repo">Add Repo</string>
132132
<string name="remove_repo">Remove Repo</string>
133133
<string name="custom_url">Custom url</string>
134+
<string name="link_copied">Link copied</string>
134135
<string name="androidacy_repo_info">This repository may display some non-intrusive advertising to cover server and development costs.</string>
135136
<string name="backup_module_list">Backup modules</string>
136137
<string name="restore_module_list">Restore modules</string>

0 commit comments

Comments
 (0)