diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java index 5d8a6bd2dd..7e47a5e8c0 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java @@ -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);