16904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler/*
2ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * Copyright 2018 The Android Open Source Project
36904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *
46904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Licensed under the Apache License, Version 2.0 (the "License");
56904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * you may not use this file except in compliance with the License.
66904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * You may obtain a copy of the License at
76904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *
86904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *      http://www.apache.org/licenses/LICENSE-2.0
96904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *
106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Unless required by applicable law or agreed to in writing, software
116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * distributed under the License is distributed on an "AS IS" BASIS,
126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * See the License for the specific language governing permissions and
14ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * limitations under the License.
156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */
166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.preference;
186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
19ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
208e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas
216904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.content.Context;
226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.content.SharedPreferences;
2384352192fbccf572473bb953ba3e9ebede60fbcaTony Mantlerimport android.graphics.drawable.Drawable;
244867e99525d200f9aacf7508ee047054396a4870Aurimas Liutikasimport android.os.Build;
25ca95d1c53dd086c368cd21685179517d4dadabcdAurimas Liutikasimport android.text.TextUtils;
26ca95d1c53dd086c368cd21685179517d4dadabcdAurimas Liutikas
27ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.annotation.Nullable;
28ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.annotation.RestrictTo;
29ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.core.content.ContextCompat;
30ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas
316904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler/**
326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Used to help create {@link Preference} hierarchies
336904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * from activities or XML.
346904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * <p>
356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * In most cases, clients should use
36ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * {@link androidx.preference.PreferenceFragment#addPreferencesFromResource(int)}, or
376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * {@link PreferenceFragmentCompat#addPreferencesFromResource(int)}.
386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *
39ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * @see androidx.preference.PreferenceFragment
406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @see PreferenceFragmentCompat
416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */
426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerpublic class PreferenceManager {
436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
446904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public static final String KEY_HAS_SET_DEFAULT_VALUES = "_has_set_default_values";
456904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
466904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
476904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * The context to use. This should always be set.
486904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
496904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private Context mContext;
506904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
516904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
526904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * The counter for unique IDs.
536904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
546904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private long mNextId = 0;
556904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
566904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
576904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Cached shared preferences.
586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
597c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis    @Nullable
606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private SharedPreferences mSharedPreferences;
616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
637c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * Data store to be used by the Preferences or null if {@link android.content.SharedPreferences}
647c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * should be used.
657c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     */
667c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis    @Nullable
677c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis    private PreferenceDataStore mPreferenceDataStore;
687c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis
697c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis    /**
706904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * If in no-commit mode, the shared editor to give out (which will be
716904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * committed when exiting no-commit mode).
726904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
737c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis    @Nullable
746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private SharedPreferences.Editor mEditor;
756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
766904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
776904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Blocks commits from happening on the shared editor. This is used when
786904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * inflating the hierarchy. Do not set this directly, use {@link #setNoCommit(boolean)}
796904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private boolean mNoCommit;
816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
826904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
836904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * The SharedPreferences name that will be used for all {@link Preference}s
846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * managed by this instance.
856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private String mSharedPreferencesName;
876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
886904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * The SharedPreferences mode that will be used for all {@link Preference}s
906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * managed by this instance.
916904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private int mSharedPreferencesMode;
936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
94ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey    private static final int STORAGE_DEFAULT = 0;
95b458fb60ed7b60ade0b7ece1322f1d809fce3a54Jeff Sharkey    private static final int STORAGE_DEVICE_PROTECTED = 1;
96ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey
97ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey    private int mStorage = STORAGE_DEFAULT;
98ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey
996904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1006904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * The {@link PreferenceScreen} at the root of the preference hierarchy.
1016904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1026904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private PreferenceScreen mPreferenceScreen;
1036904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
10484352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler    private PreferenceComparisonCallback mPreferenceComparisonCallback;
1056904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private OnPreferenceTreeClickListener mOnPreferenceTreeClickListener;
1066904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private OnDisplayPreferenceDialogListener mOnDisplayPreferenceDialogListener;
1076904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private OnNavigateToScreenListener mOnNavigateToScreenListener;
1086904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1096904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @hide
1116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1128e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas    @RestrictTo(LIBRARY_GROUP)
1136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public PreferenceManager(Context context) {
1146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        mContext = context;
1156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        setSharedPreferencesName(getDefaultSharedPreferencesName(context));
1176904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1196904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1206904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Inflates a preference hierarchy from XML. If a preference hierarchy is
1216904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * given, the new preference hierarchies will be merged in.
1226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
1236904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param context The context of the resource.
1246904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param resId The resource ID of the XML to inflate.
1256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param rootPreferences Optional existing hierarchy to merge the new
1266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *            hierarchies into.
1276904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return The root hierarchy (if one was not provided, the new hierarchy's
1286904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *         root).
1296904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @hide
1306904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1318e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas    @RestrictTo(LIBRARY_GROUP)
1326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public PreferenceScreen inflateFromResource(Context context, int resId,
1336904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            PreferenceScreen rootPreferences) {
1346904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        // Block commits
1356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        setNoCommit(true);
1366904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        final PreferenceInflater inflater = new PreferenceInflater(context, this);
1386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        rootPreferences = (PreferenceScreen) inflater.inflate(resId, rootPreferences);
1396904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        rootPreferences.onAttachedToHierarchy(this);
1406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        // Unblock commits
1426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        setNoCommit(false);
1436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1446904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return rootPreferences;
1456904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1466904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1476904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public PreferenceScreen createPreferenceScreen(Context context) {
1486904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        final PreferenceScreen preferenceScreen = new PreferenceScreen(context, null);
1496904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        preferenceScreen.onAttachedToHierarchy(this);
1506904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return preferenceScreen;
1516904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1526904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1536904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1546904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Called by a preference to get a unique ID in its hierarchy.
1556904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
1566904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return A unique ID.
1576904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    long getNextId() {
1596904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        synchronized (this) {
1606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            return mNextId++;
1616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
1626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1646904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1657c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * Returns the current name of the {@link SharedPreferences} file that preferences managed by
1666904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * this will use.
1676904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
1686904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return The name that can be passed to {@link Context#getSharedPreferences(String, int)}.
1696904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @see Context#getSharedPreferences(String, int)
1706904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1716904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public String getSharedPreferencesName() {
1726904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return mSharedPreferencesName;
1736904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1767c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * Sets the name of the {@link SharedPreferences} file that preferences managed by this
1776904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * will use.
1786904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
1797c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * <p>If custom {@link PreferenceDataStore} is set, this won't override its usage.
1807c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     *
1816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param sharedPreferencesName The name of the SharedPreferences file.
1826904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @see Context#getSharedPreferences(String, int)
1837c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * @see #setPreferenceDataStore(PreferenceDataStore)
1846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void setSharedPreferencesName(String sharedPreferencesName) {
1866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        mSharedPreferencesName = sharedPreferencesName;
1876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        mSharedPreferences = null;
1886904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1916904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Returns the current mode of the SharedPreferences file that preferences managed by
1926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * this will use.
1936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
1946904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return The mode that can be passed to {@link Context#getSharedPreferences(String, int)}.
1956904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @see Context#getSharedPreferences(String, int)
1966904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1976904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public int getSharedPreferencesMode() {
1986904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return mSharedPreferencesMode;
1996904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
2006904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2016904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
2026904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Sets the mode of the SharedPreferences file that preferences managed by this
2036904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * will use.
2046904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
2056904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param sharedPreferencesMode The mode of the SharedPreferences file.
2066904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @see Context#getSharedPreferences(String, int)
2076904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
2086904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void setSharedPreferencesMode(int sharedPreferencesMode) {
2096904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        mSharedPreferencesMode = sharedPreferencesMode;
2106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        mSharedPreferences = null;
2116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
2126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
214ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey     * Sets the storage location used internally by this class to be the default
215ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey     * provided by the hosting {@link Context}.
216ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey     */
217ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey    public void setStorageDefault() {
2184867e99525d200f9aacf7508ee047054396a4870Aurimas Liutikas        if (Build.VERSION.SDK_INT >= 24) {
219ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey            mStorage = STORAGE_DEFAULT;
220ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey            mSharedPreferences = null;
221ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey        }
222ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey    }
223ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey
224ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey    /**
225ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey     * Explicitly set the storage location used internally by this class to be
226b458fb60ed7b60ade0b7ece1322f1d809fce3a54Jeff Sharkey     * device-protected storage.
227ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey     * <p>
228ba262d95ff06a9eecffc7311c7b9708d2715059cJeff Sharkey     * On devices with direct boot, data stored in this location is encrypted
229b458fb60ed7b60ade0b7ece1322f1d809fce3a54Jeff Sharkey     * with a key tied to the physical device, and it can be accessed
230b458fb60ed7b60ade0b7ece1322f1d809fce3a54Jeff Sharkey     * immediately after the device has booted successfully, both
231b458fb60ed7b60ade0b7ece1322f1d809fce3a54Jeff Sharkey     * <em>before and after</em> the user has authenticated with their
232b458fb60ed7b60ade0b7ece1322f1d809fce3a54Jeff Sharkey     * credentials (such as a lock pattern or PIN).
233b458fb60ed7b60ade0b7ece1322f1d809fce3a54Jeff Sharkey     * <p>
234b458fb60ed7b60ade0b7ece1322f1d809fce3a54Jeff Sharkey     * Because device-protected data is available without user authentication,
235b458fb60ed7b60ade0b7ece1322f1d809fce3a54Jeff Sharkey     * you should carefully limit the data you store using this Context. For
236b458fb60ed7b60ade0b7ece1322f1d809fce3a54Jeff Sharkey     * example, storing sensitive authentication tokens or passwords in the
237b458fb60ed7b60ade0b7ece1322f1d809fce3a54Jeff Sharkey     * device-protected area is strongly discouraged.
238ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey     * <p>
2394867e99525d200f9aacf7508ee047054396a4870Aurimas Liutikas     * Prior to API 24 this method has no effect,
240b458fb60ed7b60ade0b7ece1322f1d809fce3a54Jeff Sharkey     * since device-protected storage is not available.
241ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey     *
242b458fb60ed7b60ade0b7ece1322f1d809fce3a54Jeff Sharkey     * @see Context#createDeviceProtectedStorageContext()
243ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey     */
244ba262d95ff06a9eecffc7311c7b9708d2715059cJeff Sharkey    public void setStorageDeviceProtected() {
2454867e99525d200f9aacf7508ee047054396a4870Aurimas Liutikas        if (Build.VERSION.SDK_INT >= 24) {
246b458fb60ed7b60ade0b7ece1322f1d809fce3a54Jeff Sharkey            mStorage = STORAGE_DEVICE_PROTECTED;
247ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey            mSharedPreferences = null;
248ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey        }
249ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey    }
250ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey
251d805095048f6be52cddbd572ee343c4639ba8187Alan Viverette    /**
252a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey     * Indicates if the storage location used internally by this class is the
253a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey     * default provided by the hosting {@link Context}.
254a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey     *
255a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey     * @see #setStorageDefault()
256a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey     * @see #setStorageDeviceProtected()
257a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey     */
258a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey    public boolean isStorageDefault() {
2594867e99525d200f9aacf7508ee047054396a4870Aurimas Liutikas        if (Build.VERSION.SDK_INT >= 24) {
260a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey            return mStorage == STORAGE_DEFAULT;
261a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey        } else {
262a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey            return true;
263a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey        }
264a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey    }
265a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey
266a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey    /**
267a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey     * Indicates if the storage location used internally by this class is backed
268a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey     * by device-protected storage.
269a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey     *
270a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey     * @see #setStorageDefault()
271a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey     * @see #setStorageDeviceProtected()
272a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey     */
273a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey    public boolean isStorageDeviceProtected() {
2744867e99525d200f9aacf7508ee047054396a4870Aurimas Liutikas        if (Build.VERSION.SDK_INT >= 24) {
275a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey            return mStorage == STORAGE_DEVICE_PROTECTED;
276a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey        } else {
277a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey            return false;
278a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey        }
279a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey    }
280a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey
281a8ed73fa46d66350ad4e3499fbbebcfc8c20be6aJeff Sharkey    /**
2827c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * Sets a {@link PreferenceDataStore} to be used by all Preferences associated with this manager
2837c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * that don't have a custom {@link PreferenceDataStore} assigned via
2847c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * {@link Preference#setPreferenceDataStore(PreferenceDataStore)}. Also if the data store is
2857c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * set, the child preferences won't use {@link android.content.SharedPreferences} as long as
2867c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * they are assigned to this manager.
2877c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     *
2887c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * @param dataStore the {@link PreferenceDataStore} to be used by this manager
2897c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * @see Preference#setPreferenceDataStore(PreferenceDataStore)
2907c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     */
2917c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis    public void setPreferenceDataStore(PreferenceDataStore dataStore) {
2927c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis        mPreferenceDataStore = dataStore;
2937c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis    }
2947c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis
2957c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis    /**
2967c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * Returns the {@link PreferenceDataStore} associated with this manager or {@code null} if
2977c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * the default {@link android.content.SharedPreferences} are used instead.
2987c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     *
2997c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * @return The {@link PreferenceDataStore} associated with this manager or {@code null} if none.
3007c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * @see #setPreferenceDataStore(PreferenceDataStore)
3017c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     */
3027c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis    @Nullable
3037c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis    public PreferenceDataStore getPreferenceDataStore() {
3047c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis        return mPreferenceDataStore;
3057c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis    }
3067c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis
3077c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis    /**
3087c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * Gets a {@link SharedPreferences} instance that preferences managed by this will
3096904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * use.
3106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
3117c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * @return a {@link SharedPreferences} instance pointing to the file that contain the values of
3127c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     *         preferences that are managed by this PreferenceManager. If
3137c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     *         a {@link PreferenceDataStore} has been set, this method returns {@code null}.
3146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
3156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public SharedPreferences getSharedPreferences() {
3167c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis        if (getPreferenceDataStore() != null) {
3177c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis            return null;
3187c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis        }
3197c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis
3206904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (mSharedPreferences == null) {
321ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey            final Context storageContext;
322ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey            switch (mStorage) {
323b458fb60ed7b60ade0b7ece1322f1d809fce3a54Jeff Sharkey                case STORAGE_DEVICE_PROTECTED:
324b458fb60ed7b60ade0b7ece1322f1d809fce3a54Jeff Sharkey                    storageContext = ContextCompat.createDeviceProtectedStorageContext(mContext);
325ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey                    break;
326ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey                default:
327ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey                    storageContext = mContext;
328ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey                    break;
329ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey            }
330ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey
331ac798ef1fe320099a344384b73feedeff345d9fdJeff Sharkey            mSharedPreferences = storageContext.getSharedPreferences(mSharedPreferencesName,
3326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                    mSharedPreferencesMode);
3336904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
3346904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
3356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return mSharedPreferences;
3366904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
3376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
3386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
3396904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Gets a SharedPreferences instance that points to the default file that is
3406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * used by the preference framework in the given context.
3416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
3426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param context The context of the preferences whose values are wanted.
3436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return A SharedPreferences instance that can be used to retrieve and
3446904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *         listen to values of the preferences.
3456904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
3466904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public static SharedPreferences getDefaultSharedPreferences(Context context) {
3476904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
3486904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                getDefaultSharedPreferencesMode());
3496904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
3506904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
3516904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private static String getDefaultSharedPreferencesName(Context context) {
3526904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return context.getPackageName() + "_preferences";
3536904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
3546904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
3556904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private static int getDefaultSharedPreferencesMode() {
3566904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return Context.MODE_PRIVATE;
3576904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
3586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
3596904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
3606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Returns the root of the preference hierarchy managed by this class.
3616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
3626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return The {@link PreferenceScreen} object that is at the root of the hierarchy.
3636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
3646904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public PreferenceScreen getPreferenceScreen() {
3656904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return mPreferenceScreen;
3666904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
3676904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
3686904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
3696904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Sets the root of the preference hierarchy.
3706904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
3716904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param preferenceScreen The root {@link PreferenceScreen} of the preference hierarchy.
3726904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return Whether the {@link PreferenceScreen} given is different than the previous.
3736904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
3746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public boolean setPreferences(PreferenceScreen preferenceScreen) {
3756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (preferenceScreen != mPreferenceScreen) {
3768f7f0d48fac8f83e90a04ba67f9a03f93c6ed262Jason Monk            if (mPreferenceScreen != null) {
3778f7f0d48fac8f83e90a04ba67f9a03f93c6ed262Jason Monk                mPreferenceScreen.onDetached();
3788f7f0d48fac8f83e90a04ba67f9a03f93c6ed262Jason Monk            }
3796904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            mPreferenceScreen = preferenceScreen;
3806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            return true;
3816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
3826904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
3836904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return false;
3846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
3856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
3866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
3876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Finds a {@link Preference} based on its key.
3886904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
3896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param key The key of the preference to retrieve.
3906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return The {@link Preference} with the key, or null.
3916904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @see PreferenceGroup#findPreference(CharSequence)
3926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
3936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public Preference findPreference(CharSequence key) {
3946904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (mPreferenceScreen == null) {
3956904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            return null;
3966904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
3976904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
3986904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return mPreferenceScreen.findPreference(key);
3996904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
4006904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
4016904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
4026904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Sets the default values from an XML preference file by reading the values defined
4036904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * by each {@link Preference} item's {@code android:defaultValue} attribute. This should
4046904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * be called by the application's main activity.
4056904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * <p>
4066904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
4076904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param context The context of the shared preferences.
4086904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param resId The resource ID of the preference XML file.
4096904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param readAgain Whether to re-read the default values.
4106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * If false, this method sets the default values only if this
4116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * method has never been called in the past (or if the
4126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * {@link #KEY_HAS_SET_DEFAULT_VALUES} in the default value shared
4136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * preferences file is false). To attempt to set the default values again
4146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * bypassing this check, set {@code readAgain} to true.
4156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *            <p class="note">
4166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *            Note: this will NOT reset preferences back to their default
4176904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *            values. For that functionality, use
4186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *            {@link PreferenceManager#getDefaultSharedPreferences(Context)}
4196904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *            and clear it followed by a call to this method with this
4206904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *            parameter set to true.
4216904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
4226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public static void setDefaultValues(Context context, int resId, boolean readAgain) {
4236904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        // Use the default shared preferences name and mode
4246904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        setDefaultValues(context, getDefaultSharedPreferencesName(context),
4256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                getDefaultSharedPreferencesMode(), resId, readAgain);
4266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
4276904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
4286904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
4296904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Similar to {@link #setDefaultValues(Context, int, boolean)} but allows
4306904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * the client to provide the filename and mode of the shared preferences
4316904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * file.
4326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
4336904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param context The context of the shared preferences.
4346904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param sharedPreferencesName A custom name for the shared preferences file.
4356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param sharedPreferencesMode The file creation mode for the shared preferences file, such
4366904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * as {@link android.content.Context#MODE_PRIVATE} or {@link
4376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * android.content.Context#MODE_PRIVATE}
4386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param resId The resource ID of the preference XML file.
4396904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param readAgain Whether to re-read the default values.
4406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * If false, this method will set the default values only if this
4416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * method has never been called in the past (or if the
4426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * {@link #KEY_HAS_SET_DEFAULT_VALUES} in the default value shared
4436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * preferences file is false). To attempt to set the default values again
4446904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * bypassing this check, set {@code readAgain} to true.
4456904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *            <p class="note">
4466904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *            Note: this will NOT reset preferences back to their default
4476904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *            values. For that functionality, use
4486904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *            {@link PreferenceManager#getDefaultSharedPreferences(Context)}
4496904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *            and clear it followed by a call to this method with this
4506904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *            parameter set to true.
4516904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
4526904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @see #setDefaultValues(Context, int, boolean)
4536904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @see #setSharedPreferencesName(String)
4546904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @see #setSharedPreferencesMode(int)
4556904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
4566904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public static void setDefaultValues(Context context, String sharedPreferencesName,
4576904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            int sharedPreferencesMode, int resId, boolean readAgain) {
4586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        final SharedPreferences defaultValueSp = context.getSharedPreferences(
4596904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                KEY_HAS_SET_DEFAULT_VALUES, Context.MODE_PRIVATE);
4606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
4616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (readAgain || !defaultValueSp.getBoolean(KEY_HAS_SET_DEFAULT_VALUES, false)) {
4626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            final PreferenceManager pm = new PreferenceManager(context);
4636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            pm.setSharedPreferencesName(sharedPreferencesName);
4646904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            pm.setSharedPreferencesMode(sharedPreferencesMode);
4656904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            pm.inflateFromResource(context, resId, null);
4666904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
46757ed4bb237eb0f942398ba29e1fd49af5891a6c1Jake Wharton            defaultValueSp.edit()
46857ed4bb237eb0f942398ba29e1fd49af5891a6c1Jake Wharton                    .putBoolean(KEY_HAS_SET_DEFAULT_VALUES, true)
46957ed4bb237eb0f942398ba29e1fd49af5891a6c1Jake Wharton                    .apply();
4706904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
4716904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
4726904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
4736904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
4746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Returns an editor to use when modifying the shared preferences.
4756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
4767c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * <p>Do NOT commit unless {@link #shouldCommit()} returns true.
4777c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     *
4787c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * @return an editor to use to write to shared preferences. If a {@link PreferenceDataStore} has
4797c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     *         been set, this method returns {@code null}.
4806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @see #shouldCommit()
4816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
4826904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    SharedPreferences.Editor getEditor() {
4837c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis        if (mPreferenceDataStore != null) {
4847c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis            return null;
4857c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis        }
4866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
4876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (mNoCommit) {
4886904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            if (mEditor == null) {
4896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                mEditor = getSharedPreferences().edit();
4906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            }
4916904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
4926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            return mEditor;
4936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        } else {
4946904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            return getSharedPreferences().edit();
4956904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
4966904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
4976904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
4986904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
4996904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Whether it is the client's responsibility to commit on the
5006904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * {@link #getEditor()}. This will return false in cases where the writes
5016904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * should be batched, for example when inflating preferences from XML.
5026904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
5037c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     * <p>If preferences are using {@link PreferenceDataStore} this value is irrelevant.
5047c67889a8c2d018fae37e30984873bcd984773cfFilip Pavlis     *
5056904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return Whether the client should commit.
5066904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
5076904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    boolean shouldCommit() {
5086904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return !mNoCommit;
5096904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
5106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
5116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private void setNoCommit(boolean noCommit) {
5126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (!noCommit && mEditor != null) {
51357ed4bb237eb0f942398ba29e1fd49af5891a6c1Jake Wharton            mEditor.apply();
5146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
5156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        mNoCommit = noCommit;
5166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
5176904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
5186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
5196904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Returns the context.
5206904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
5216904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return The context.
5226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
523d1be3655c1de9af3174d285d42f9bd5b47ce9020Todd Volkert    public Context getContext() {
5246904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return mContext;
5256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
5266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
52784352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler    public PreferenceComparisonCallback getPreferenceComparisonCallback() {
52884352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler        return mPreferenceComparisonCallback;
52984352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler    }
53084352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler
53184352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler    public void setPreferenceComparisonCallback(
53284352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            PreferenceComparisonCallback preferenceComparisonCallback) {
53384352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler        mPreferenceComparisonCallback = preferenceComparisonCallback;
53484352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler    }
53584352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler
5366904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public OnDisplayPreferenceDialogListener getOnDisplayPreferenceDialogListener() {
5376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return mOnDisplayPreferenceDialogListener;
5386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
5396904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
5406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void setOnDisplayPreferenceDialogListener(
5416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            OnDisplayPreferenceDialogListener onDisplayPreferenceDialogListener) {
5426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        mOnDisplayPreferenceDialogListener = onDisplayPreferenceDialogListener;
5436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
5446904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
5456904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
5466904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Called when a preference requests that a dialog be shown to complete a user interaction.
5476904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
5486904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param preference The preference requesting the dialog.
5496904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
5506904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void showDialog(Preference preference) {
5516904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (mOnDisplayPreferenceDialogListener != null) {
5526904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            mOnDisplayPreferenceDialogListener.onDisplayPreferenceDialog(preference);
5536904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
5546904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
5556904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
5566904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
5576904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Sets the callback to be invoked when a {@link Preference} in the
5586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * hierarchy rooted at this {@link PreferenceManager} is clicked.
5596904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
5606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param listener The callback to be invoked.
5616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
5626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void setOnPreferenceTreeClickListener(OnPreferenceTreeClickListener listener) {
5636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        mOnPreferenceTreeClickListener = listener;
5646904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
5656904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
5666904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public OnPreferenceTreeClickListener getOnPreferenceTreeClickListener() {
5676904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return mOnPreferenceTreeClickListener;
5686904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
5696904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
5706904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
5716904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Sets the callback to be invoked when a {@link PreferenceScreen} in the hierarchy rooted at
5726904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * this {@link PreferenceManager} is clicked.
5736904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
5746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param listener The callback to be invoked.
5756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
5766904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void setOnNavigateToScreenListener(OnNavigateToScreenListener listener) {
5776904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        mOnNavigateToScreenListener = listener;
5786904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
5796904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
5806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
5816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Returns the {@link PreferenceManager.OnNavigateToScreenListener}, if one has been set.
5826904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
5836904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public OnNavigateToScreenListener getOnNavigateToScreenListener() {
5846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return mOnNavigateToScreenListener;
5856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
5866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
5876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
588ca95d1c53dd086c368cd21685179517d4dadabcdAurimas Liutikas     * Callback class to be used by the {@link androidx.recyclerview.widget.RecyclerView.Adapter}
58984352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler     * associated with the {@link PreferenceScreen}, used to determine when two {@link Preference}
59084352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler     * objects are semantically and visually the same.
59184352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler     */
59284352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler    public static abstract class PreferenceComparisonCallback {
59384352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler        /**
59484352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * Called to determine if two {@link Preference} objects represent the same item
59584352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         *
59684352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * @param p1 {@link Preference} object to compare
59784352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * @param p2 {@link Preference} object to compare
59884352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * @return {@code true} if the objects represent the same item
59984352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         */
60084352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler        public abstract boolean arePreferenceItemsTheSame(Preference p1, Preference p2);
60184352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler
60284352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler        /**
60384352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * Called to determine if two {@link Preference} objects will display the same data
60484352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         *
60584352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * @param p1 {@link Preference} object to compare
60684352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * @param p2 {@link Preference} object to compare
60784352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * @return {@code true} if the objects are visually identical
60884352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         */
60984352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler        public abstract boolean arePreferenceContentsTheSame(Preference p1, Preference p2);
61084352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler    }
61184352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler
61284352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler    /**
61384352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler     * A basic implementation of {@link PreferenceComparisonCallback} suitable for use with the
61484352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler     * default {@link Preference} classes. If the {@link PreferenceScreen} contains custom
61584352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler     * {@link Preference} subclasses, you must override
61684352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler     * {@link #arePreferenceContentsTheSame(Preference, Preference)}
61784352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler     */
61884352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler    public static class SimplePreferenceComparisonCallback extends PreferenceComparisonCallback {
61984352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler        /**
62084352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * {@inheritDoc}
62184352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         *
62284352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * <p>This method will not be able to track replaced {@link Preference} objects if they
62384352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * do not have a unique key.</p>
62484352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         *
62584352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * @see Preference#setKey(String)
62684352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         */
62784352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler        @Override
62884352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler        public boolean arePreferenceItemsTheSame(Preference p1, Preference p2) {
62984352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            return p1.getId() == p2.getId();
63084352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler        }
63184352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler
63284352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler        /**
63384352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * {@inheritDoc}
63484352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         *
63584352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * <p>The result of this method is only valid for the default {@link Preference} objects,
63684352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * and custom subclasses which do not override
63784352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * {@link Preference#onBindViewHolder(PreferenceViewHolder)}. This method also assumes
63884352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * that if a preference object is being replaced by a new instance, the old instance was
63984352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         * not modified after being removed from its containing {@link PreferenceGroup}.</p>
64084352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler         */
64184352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler        @Override
64284352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler        public boolean arePreferenceContentsTheSame(Preference p1, Preference p2) {
64384352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            if (p1.getClass() != p2.getClass()) {
64484352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler                return false;
64584352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            }
64684352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            if (p1 == p2 && p1.wasDetached()) {
64784352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler                // Defensively handle the case where a preference was removed, updated and re-added.
64884352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler                // Hopefully this is rare.
64984352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler                return false;
65084352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            }
65184352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            if (!TextUtils.equals(p1.getTitle(), p2.getTitle())) {
65284352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler                return false;
65384352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            }
65484352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            if (!TextUtils.equals(p1.getSummary(), p2.getSummary())) {
65584352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler                return false;
65684352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            }
65784352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            final Drawable p1Icon = p1.getIcon();
65884352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            final Drawable p2Icon = p2.getIcon();
65984352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            if (p1Icon != p2Icon && (p1Icon == null || !p1Icon.equals(p2Icon))) {
66084352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler                return false;
66184352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            }
66284352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            if (p1.isEnabled() != p2.isEnabled()) {
66384352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler                return false;
66484352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            }
66584352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            if (p1.isSelectable() != p2.isSelectable()) {
66684352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler                return false;
66784352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            }
66884352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            if (p1 instanceof TwoStatePreference) {
66984352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler                if (((TwoStatePreference) p1).isChecked()
67084352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler                        != ((TwoStatePreference) p2).isChecked()) {
67184352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler                    return false;
67284352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler                }
67384352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            }
67484352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            if (p1 instanceof DropDownPreference && p1 != p2) {
67584352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler                // Different object, must re-bind spinner adapter
67684352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler                return false;
67784352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            }
67884352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler
67984352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler            return true;
68084352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler        }
68184352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler    }
68284352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler
68384352192fbccf572473bb953ba3e9ebede60fbcaTony Mantler    /**
6846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Interface definition for a callback to be invoked when a
6856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * {@link Preference} in the hierarchy rooted at this {@link PreferenceScreen} is
6866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * clicked.
6876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
6886904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public interface OnPreferenceTreeClickListener {
6896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        /**
6906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         * Called when a preference in the tree rooted at this
6916904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         * {@link PreferenceScreen} has been clicked.
6926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         *
6936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         * @param preference The preference that was clicked.
6946904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         * @return Whether the click was handled.
6956904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         */
6966904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        boolean onPreferenceTreeClick(Preference preference);
6976904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
6986904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
6996904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
7006904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Interface definition for a class that will be called when a
701ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas     * {@link androidx.preference.Preference} requests to display a dialog.
7026904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
7036904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public interface OnDisplayPreferenceDialogListener {
7046904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
7056904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        /**
7066904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         * Called when a preference in the tree requests to display a dialog.
7076904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         *
7086904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         * @param preference The Preference object requesting the dialog.
7096904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         */
7106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        void onDisplayPreferenceDialog(Preference preference);
7116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
7126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
7136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
7146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Interface definition for a class that will be called when a
715ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas     * {@link androidx.preference.PreferenceScreen} requests navigation.
7166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
7176904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public interface OnNavigateToScreenListener {
7186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
7196904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        /**
7206904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         * Called when a PreferenceScreen in the tree requests to navigate to its contents.
7216904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         *
7226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         * @param preferenceScreen The PreferenceScreen requesting navigation.
7236904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         */
7246904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        void onNavigateToScreen(PreferenceScreen preferenceScreen);
7256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
7266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
7276904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler}
728