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