mirror of
https://github.com/revanced/revanced-integrations.git
synced 2025-05-01 23:24:29 +02:00
197 lines
8.5 KiB
Java
197 lines
8.5 KiB
Java
package app.revanced.integrations.settingsmenu;
|
|
|
|
import static app.revanced.integrations.utils.StringRef.str;
|
|
|
|
import android.annotation.SuppressLint;
|
|
import android.app.AlertDialog;
|
|
import android.content.Context;
|
|
import android.content.SharedPreferences;
|
|
import android.os.Bundle;
|
|
import android.preference.EditTextPreference;
|
|
import android.preference.ListPreference;
|
|
import android.preference.Preference;
|
|
import android.preference.PreferenceFragment;
|
|
import android.preference.PreferenceManager;
|
|
import android.preference.SwitchPreference;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
|
|
import app.revanced.integrations.patches.playback.speed.CustomPlaybackSpeedPatch;
|
|
import app.revanced.integrations.settings.SettingsEnum;
|
|
import app.revanced.integrations.settings.SharedPrefCategory;
|
|
import app.revanced.integrations.utils.LogHelper;
|
|
import app.revanced.integrations.utils.ReVancedUtils;
|
|
import app.revanced.shared.settings.SettingsUtils;
|
|
|
|
public class ReVancedSettingsFragment extends PreferenceFragment {
|
|
/**
|
|
* Indicates that if a preference changes,
|
|
* to apply the change from the Setting to the UI component.
|
|
*/
|
|
static boolean settingImportInProgress;
|
|
|
|
static void showRestartDialog(@NonNull Context contxt) {
|
|
String positiveButton = str("in_app_update_restart_button");
|
|
new AlertDialog.Builder(contxt).setMessage(str("pref_refresh_config"))
|
|
.setPositiveButton(positiveButton, (dialog, id) -> {
|
|
SettingsUtils.restartApp(contxt);
|
|
})
|
|
.setNegativeButton(android.R.string.cancel, null)
|
|
.setCancelable(false)
|
|
.show();
|
|
}
|
|
|
|
/**
|
|
* Used to prevent showing reboot dialog, if user cancels a setting user dialog.
|
|
*/
|
|
private boolean showingUserDialogMessage;
|
|
|
|
SharedPreferences.OnSharedPreferenceChangeListener listener = (sharedPreferences, str) -> {
|
|
try {
|
|
SettingsEnum setting = SettingsEnum.settingFromPath(str);
|
|
if (setting == null) {
|
|
return;
|
|
}
|
|
Preference pref = findPreference(str);
|
|
LogHelper.printDebug(() -> setting.name() + ": " + " setting value:" + setting.getObjectValue() + " pref:" + pref);
|
|
if (pref == null) {
|
|
return;
|
|
}
|
|
|
|
if (pref instanceof SwitchPreference) {
|
|
SwitchPreference switchPref = (SwitchPreference) pref;
|
|
if (settingImportInProgress) {
|
|
switchPref.setChecked(setting.getBoolean());
|
|
} else {
|
|
SettingsEnum.setValue(setting, switchPref.isChecked());
|
|
}
|
|
} else if (pref instanceof EditTextPreference) {
|
|
EditTextPreference editPreference = (EditTextPreference) pref;
|
|
if (settingImportInProgress) {
|
|
editPreference.getEditText().setText(setting.getObjectValue().toString());
|
|
} else {
|
|
SettingsEnum.setValue(setting, editPreference.getText());
|
|
}
|
|
} else if (pref instanceof ListPreference) {
|
|
ListPreference listPref = (ListPreference) pref;
|
|
if (settingImportInProgress) {
|
|
listPref.setValue(setting.getObjectValue().toString());
|
|
} else {
|
|
SettingsEnum.setValue(setting, listPref.getValue());
|
|
}
|
|
updateListPreferenceSummary((ListPreference) pref, setting);
|
|
} else {
|
|
LogHelper.printException(() -> "Setting cannot be handled: " + pref.getClass() + " " + pref);
|
|
return;
|
|
}
|
|
|
|
enableDisablePreferences();
|
|
|
|
if (settingImportInProgress) {
|
|
return;
|
|
}
|
|
|
|
if (!showingUserDialogMessage) {
|
|
if (setting.userDialogMessage != null && ((SwitchPreference) pref).isChecked() != (Boolean) setting.defaultValue) {
|
|
showSettingUserDialogConfirmation(getContext(), (SwitchPreference) pref, setting);
|
|
} else if (setting.rebootApp) {
|
|
showRestartDialog(getContext());
|
|
}
|
|
}
|
|
|
|
} catch (Exception ex) {
|
|
LogHelper.printException(() -> "OnSharedPreferenceChangeListener failure", ex);
|
|
}
|
|
};
|
|
|
|
@SuppressLint("ResourceType")
|
|
@Override
|
|
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
|
|
super.onActivityCreated(savedInstanceState);
|
|
try {
|
|
PreferenceManager preferenceManager = getPreferenceManager();
|
|
preferenceManager.setSharedPreferencesName(SharedPrefCategory.YOUTUBE.prefName);
|
|
addPreferencesFromResource(ReVancedUtils.getResourceIdentifier("revanced_prefs", "xml"));
|
|
|
|
enableDisablePreferences();
|
|
|
|
// if the preference was included, then initialize it based on the available playback speed
|
|
Preference defaultSpeedPreference = findPreference(SettingsEnum.PLAYBACK_SPEED_DEFAULT.path);
|
|
if (defaultSpeedPreference instanceof ListPreference) {
|
|
CustomPlaybackSpeedPatch.initializeListPreference((ListPreference) defaultSpeedPreference);
|
|
}
|
|
|
|
// Set current value from SettingsEnum
|
|
for (SettingsEnum setting : SettingsEnum.values()) {
|
|
Preference preference = findPreference(setting.path);
|
|
if (preference instanceof SwitchPreference) {
|
|
((SwitchPreference) preference).setChecked(setting.getBoolean());
|
|
} else if (preference instanceof EditTextPreference) {
|
|
((EditTextPreference) preference).setText(setting.getObjectValue().toString());
|
|
} else if (preference instanceof ListPreference) {
|
|
updateListPreferenceSummary((ListPreference) preference, setting);
|
|
}
|
|
}
|
|
|
|
preferenceManager.getSharedPreferences().registerOnSharedPreferenceChangeListener(listener);
|
|
} catch (Exception ex) {
|
|
LogHelper.printException(() -> "onActivityCreated() failure", ex);
|
|
}
|
|
}
|
|
|
|
@Override // android.preference.PreferenceFragment, android.app.Fragment
|
|
public void onDestroy() {
|
|
getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(listener);
|
|
super.onDestroy();
|
|
}
|
|
|
|
private void enableDisablePreferences() {
|
|
for (SettingsEnum setting : SettingsEnum.values()) {
|
|
Preference preference = this.findPreference(setting.path);
|
|
if (preference != null) {
|
|
preference.setEnabled(setting.isAvailable());
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sets summary text to the currently selected list option.
|
|
*/
|
|
private void updateListPreferenceSummary(ListPreference listPreference, SettingsEnum setting) {
|
|
String objectStringValue = setting.getObjectValue().toString();
|
|
final int entryIndex = listPreference.findIndexOfValue(objectStringValue);
|
|
if (entryIndex >= 0) {
|
|
listPreference.setSummary(listPreference.getEntries()[entryIndex]);
|
|
listPreference.setValue(objectStringValue);
|
|
} else {
|
|
// Value is not an available option.
|
|
// User manually edited import data, or options changed and current selection is no longer available.
|
|
// Still show the value in the summary so it's clear that something is selected.
|
|
listPreference.setSummary(objectStringValue);
|
|
}
|
|
}
|
|
|
|
private void showSettingUserDialogConfirmation(@NonNull Context context, SwitchPreference switchPref, SettingsEnum setting) {
|
|
showingUserDialogMessage = true;
|
|
new AlertDialog.Builder(context)
|
|
.setTitle(str("revanced_settings_confirm_user_dialog_title"))
|
|
.setMessage(setting.userDialogMessage.toString())
|
|
.setPositiveButton(android.R.string.ok, (dialog, id) -> {
|
|
if (setting.rebootApp) {
|
|
showRestartDialog(context);
|
|
}
|
|
})
|
|
.setNegativeButton(android.R.string.cancel, (dialog, id) -> {
|
|
Boolean defaultBooleanValue = (Boolean) setting.defaultValue;
|
|
SettingsEnum.setValue(setting, defaultBooleanValue);
|
|
switchPref.setChecked(defaultBooleanValue);
|
|
})
|
|
.setOnDismissListener(dialog -> {
|
|
showingUserDialogMessage = false;
|
|
})
|
|
.setCancelable(false)
|
|
.show();
|
|
}
|
|
}
|