package org.wikipedia.settings; import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceCategory; import android.support.v7.preference.PreferenceFragmentCompat; import android.support.v7.preference.TwoStatePreference; import org.wikipedia.R; import org.wikipedia.WikipediaApp; import org.wikipedia.crash.RemoteLogException; import org.wikipedia.useroption.ui.UserOptionRowActivity; import org.wikipedia.util.log.L; import java.util.List; /*package*/ class DeveloperSettingsPreferenceLoader extends BasePreferenceLoader { @NonNull private final Context context; @NonNull private final Preference.OnPreferenceChangeListener setRestBaseManuallyChangeListener = new Preference.OnPreferenceChangeListener() { /** * Called when the useRestBaseSetManually preference has been changed by the user. This is * called before the state of the Preference is about to be updated and * before the state is persisted. * * @param preference The changed Preference. * @param newValue The new value of the Preference. * @return True to update the state of the Preference with the new value. */ @Override public boolean onPreferenceChange(Preference preference, Object newValue) { setUseRestBasePreference((Boolean) newValue); return true; } }; /*package*/ DeveloperSettingsPreferenceLoader(@NonNull PreferenceFragmentCompat fragment) { super(fragment); this.context = fragment.getActivity(); } @Override public void loadPreferences() { loadPreferences(R.xml.developer_preferences); setUpRestBaseCheckboxes(); setUpCookies((PreferenceCategory) findPreference(R.string.preferences_developer_cookies_key)); setUpCrashButton(findPreference(getCrashButtonKey())); setUpUserOptionButton(findPreference(getUserOptionButtonKey())); setUpRemoteLogButton(findPreference(R.string.preference_key_remote_log)); } private void setUpRestBaseCheckboxes() { TwoStatePreference manualPreference = (TwoStatePreference) findPreference(getManualKey()); manualPreference.setOnPreferenceChangeListener(setRestBaseManuallyChangeListener); setUseRestBasePreference(manualPreference.isChecked()); } private String getManualKey() { return context.getString(R.string.preference_key_use_restbase_manual); } private void setUseRestBasePreference(boolean manualMode) { RbSwitch.INSTANCE.update(); TwoStatePreference useRestBasePref = getUseRestBasePreference(); useRestBasePref.setEnabled(manualMode); useRestBasePref.setChecked(RbSwitch.INSTANCE.isRestBaseEnabled()); } private TwoStatePreference getUseRestBasePreference() { return (TwoStatePreference) findPreference(getUseRestBaseKey()); } private String getUseRestBaseKey() { return context.getString(R.string.preference_key_use_restbase); } private String getCrashButtonKey() { return context.getString(R.string.preferences_developer_crash_key); } private String getUserOptionButtonKey() { return context.getString(R.string.preferences_developer_user_option_key); } private void setUpCrashButton(Preference button) { button.setOnPreferenceClickListener(buildCrashButtonClickListener()); } private void setUpUserOptionButton(Preference button) { button.setOnPreferenceClickListener(buildUserOptionButtonClickListener()); } private Preference.OnPreferenceClickListener buildCrashButtonClickListener() { return new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { throw new TestException("User tested crash functionality."); } }; } private Preference.OnPreferenceClickListener buildUserOptionButtonClickListener() { return new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { context.startActivity(UserOptionRowActivity.newIntent(context)); return true; } }; } private void setUpRemoteLogButton(Preference button) { button.setOnPreferenceChangeListener(buildRemoteLogPreferenceChangeListener()); } private Preference.OnPreferenceChangeListener buildRemoteLogPreferenceChangeListener() { return new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { L.logRemoteError(new RemoteLogException(newValue.toString())); WikipediaApp.getInstance().checkCrashes(getActivity()); return true; } }; } private void setUpCookies(@NonNull PreferenceCategory cat) { List<String> domains = Prefs.getCookieDomainsAsList(); for (String domain : domains) { String key = Prefs.getCookiesForDomainKey(domain); Preference pref = newDataStringPref(key, domain); cat.addPreference(pref); } } private EditTextAutoSummarizePreference newDataStringPref(String key, String title) { EditTextAutoSummarizePreference pref = new EditTextAutoSummarizePreference(context, null, R.attr.editTextAutoSummarizePreferenceStyle); pref.setKey(key); pref.setTitle(title); return pref; } private static class TestException extends RuntimeException { TestException(String message) { super(message); } } }