fix(Settings): Prevent duplicate dialogs on rapid preference clicks

Co-authored-by: ILoveOpenSourceApplications <117499019+iloveopensourceapplications@users.noreply.github.com>
This commit is contained in:
oSumAtrIX 2026-03-21 19:56:43 +01:00
parent 1ebd990051
commit 0371f7164f
No known key found for this signature in database
GPG key ID: A9B3094ACDB604B4

View file

@ -9,19 +9,24 @@ import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.SystemClock;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceGroup;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.preference.SwitchPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -42,6 +47,33 @@ import app.revanced.extension.shared.ui.CustomDialog;
@SuppressWarnings("deprecation")
public abstract class AbstractPreferenceFragment extends PreferenceFragment {
private static class DebouncedListView extends ListView {
private long lastClick;
public DebouncedListView(Context context) {
super(context);
setId(android.R.id.list); // Required so PreferenceFragment recognizes it.
// Match the default layout params
setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
));
}
@Override
public boolean performItemClick(View view, int position, long id) {
final long now = SystemClock.elapsedRealtime();
if (now - lastClick < 500) {
return true; // Ignore fast double click.
}
lastClick = now;
return super.performItemClick(view, position, id);
}
}
@SuppressLint("StaticFieldLeak")
public static AbstractPreferenceFragment instance;
@ -491,6 +523,11 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment {
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return new DebouncedListView(getActivity());
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
@ -502,7 +539,7 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment {
}
protected static void showLocalizedToast(String resourceKey, String fallbackMessage) {
if (ResourceUtils.getIdentifier(ResourceType.STRING, resourceKey) != 0) {
if (Utils.getResourceIdentifier(ResourceType.STRING, resourceKey) != 0) {
Utils.showToastLong(str(resourceKey));
} else {
Utils.showToastLong(fallbackMessage);