19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.preference; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkeyimport android.annotation.SystemApi; 207b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.XmlRes; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Activity; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.DialogInterface; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException; 29fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkeyimport android.content.pm.ResolveInfo; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.XmlResourceParser; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3482e7bc11342547d1480ef89208ed06943650e201Amith Yamasaniimport java.util.ArrayList; 3582e7bc11342547d1480ef89208ed06943650e201Amith Yamasaniimport java.util.HashSet; 3682e7bc11342547d1480ef89208ed06943650e201Amith Yamasaniimport java.util.List; 3782e7bc11342547d1480ef89208ed06943650e201Amith Yamasani 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to help create {@link Preference} hierarchies 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from activities or XML. 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In most cases, clients should use 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link PreferenceActivity#addPreferencesFromIntent} or 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link PreferenceActivity#addPreferencesFromResource(int)}. 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see PreferenceActivity 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PreferenceManager { 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "PreferenceManager"; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Activity meta-data key for its XML preference hierarchy. 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String METADATA_KEY_PREFERENCES = "android.preference"; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String KEY_HAS_SET_DEFAULT_VALUES = "_has_set_default_values"; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getActivity() 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Activity mActivity; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6582e7bc11342547d1480ef89208ed06943650e201Amith Yamasani * Fragment that owns this instance. 6682e7bc11342547d1480ef89208ed06943650e201Amith Yamasani */ 6782e7bc11342547d1480ef89208ed06943650e201Amith Yamasani private PreferenceFragment mFragment; 6882e7bc11342547d1480ef89208ed06943650e201Amith Yamasani 6982e7bc11342547d1480ef89208ed06943650e201Amith Yamasani /** 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The context to use. This should always be set. 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #mActivity 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mContext; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The counter for unique IDs. 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mNextId = 0; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The counter for unique request codes. 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNextRequestCode; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Cached shared preferences. 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SharedPreferences mSharedPreferences; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If in no-commit mode, the shared editor to give out (which will be 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * committed when exiting no-commit mode). 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SharedPreferences.Editor mEditor; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Blocks commits from happening on the shared editor. This is used when 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inflating the hierarchy. Do not set this directly, use {@link #setNoCommit(boolean)} 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mNoCommit; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The SharedPreferences name that will be used for all {@link Preference}s 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * managed by this instance. 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mSharedPreferencesName; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The SharedPreferences mode that will be used for all {@link Preference}s 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * managed by this instance. 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mSharedPreferencesMode; 114fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey 115fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey private static final int STORAGE_DEFAULT = 0; 1168a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey private static final int STORAGE_DEVICE_PROTECTED = 1; 1178a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey private static final int STORAGE_CREDENTIAL_PROTECTED = 2; 118fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey 119fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey private int mStorage = STORAGE_DEFAULT; 120fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The {@link PreferenceScreen} at the root of the preference hierarchy. 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PreferenceScreen mPreferenceScreen; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * List of activity result listeners. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private List<OnActivityResultListener> mActivityResultListeners; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * List of activity stop listeners. 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private List<OnActivityStopListener> mActivityStopListeners; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * List of activity destroy listeners. 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private List<OnActivityDestroyListener> mActivityDestroyListeners; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * List of dialogs that should be dismissed when we receive onNewIntent in 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * our PreferenceActivity. 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private List<DialogInterface> mPreferencesScreens; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private OnPreferenceTreeClickListener mOnPreferenceTreeClickListener; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14937ae5586761993a5e9cede6f6c41609b5c63cc29Justin Koh /** 15037ae5586761993a5e9cede6f6c41609b5c63cc29Justin Koh * @hide 15137ae5586761993a5e9cede6f6c41609b5c63cc29Justin Koh */ 15237ae5586761993a5e9cede6f6c41609b5c63cc29Justin Koh public PreferenceManager(Activity activity, int firstRequestCode) { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivity = activity; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextRequestCode = firstRequestCode; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(activity); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This constructor should ONLY be used when getting default values from 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an XML preference hierarchy. 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The {@link PreferenceManager#PreferenceManager(Activity)} 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should be used ANY time a preference will be displayed, since some preference 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * types need an Activity for managed queries. 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16710bb1371dca38b5b59f083ee963f7987da6511f2Deepanshu Gupta /*package*/ PreferenceManager(Context context) { 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(context); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void init(Context context) { 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setSharedPreferencesName(getDefaultSharedPreferencesName(context)); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17682e7bc11342547d1480ef89208ed06943650e201Amith Yamasani 17782e7bc11342547d1480ef89208ed06943650e201Amith Yamasani /** 17882e7bc11342547d1480ef89208ed06943650e201Amith Yamasani * Sets the owning preference fragment 17982e7bc11342547d1480ef89208ed06943650e201Amith Yamasani */ 18082e7bc11342547d1480ef89208ed06943650e201Amith Yamasani void setFragment(PreferenceFragment fragment) { 18182e7bc11342547d1480ef89208ed06943650e201Amith Yamasani mFragment = fragment; 18282e7bc11342547d1480ef89208ed06943650e201Amith Yamasani } 18382e7bc11342547d1480ef89208ed06943650e201Amith Yamasani 18482e7bc11342547d1480ef89208ed06943650e201Amith Yamasani /** 18582e7bc11342547d1480ef89208ed06943650e201Amith Yamasani * Returns the owning preference fragment, if any. 18682e7bc11342547d1480ef89208ed06943650e201Amith Yamasani */ 18782e7bc11342547d1480ef89208ed06943650e201Amith Yamasani PreferenceFragment getFragment() { 18882e7bc11342547d1480ef89208ed06943650e201Amith Yamasani return mFragment; 18982e7bc11342547d1480ef89208ed06943650e201Amith Yamasani } 19082e7bc11342547d1480ef89208ed06943650e201Amith Yamasani 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a list of {@link Activity} (indirectly) that match a given 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Intent}. 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param queryIntent The Intent to match. 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The list of {@link ResolveInfo} that point to the matched 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activities. 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private List<ResolveInfo> queryIntentActivities(Intent queryIntent) { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContext.getPackageManager().queryIntentActivities(queryIntent, 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageManager.GET_META_DATA); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inflates a preference hierarchy from the preference hierarchies of 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Activity Activities} that match the given {@link Intent}. An 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Activity} defines its preference hierarchy with meta-data using 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #METADATA_KEY_PREFERENCES} key. 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If a preference hierarchy is given, the new preference hierarchies will 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be merged in. 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param queryIntent The intent to match activities. 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rootPreferences Optional existing hierarchy to merge the new 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * hierarchies into. 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The root hierarchy (if one was not provided, the new hierarchy's 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * root). 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PreferenceScreen inflateFromIntent(Intent queryIntent, PreferenceScreen rootPreferences) { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final List<ResolveInfo> activities = queryIntentActivities(queryIntent); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashSet<String> inflatedRes = new HashSet<String>(); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = activities.size() - 1; i >= 0; i--) { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ActivityInfo activityInfo = activities.get(i).activityInfo; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Bundle metaData = activityInfo.metaData; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((metaData == null) || !metaData.containsKey(METADATA_KEY_PREFERENCES)) { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Need to concat the package with res ID since the same res ID 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // can be re-used across contexts 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String uniqueResId = activityInfo.packageName + ":" 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + activityInfo.metaData.getInt(METADATA_KEY_PREFERENCES); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!inflatedRes.contains(uniqueResId)) { 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inflatedRes.add(uniqueResId); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Context context; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context = mContext.createPackageContext(activityInfo.packageName, 0); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NameNotFoundException e) { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Could not create context for " + activityInfo.packageName + ": " 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Log.getStackTraceString(e)); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final PreferenceInflater inflater = new PreferenceInflater(context, this); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final XmlResourceParser parser = activityInfo.loadXmlMetaData(context 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getPackageManager(), METADATA_KEY_PREFERENCES); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rootPreferences = (PreferenceScreen) inflater 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .inflate(parser, rootPreferences, true); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser.close(); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rootPreferences.onAttachedToHierarchy(this); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rootPreferences; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inflates a preference hierarchy from XML. If a preference hierarchy is 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given, the new preference hierarchies will be merged in. 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The context of the resource. 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resId The resource ID of the XML to inflate. 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rootPreferences Optional existing hierarchy to merge the new 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * hierarchies into. 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The root hierarchy (if one was not provided, the new hierarchy's 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * root). 272f9b702e212e7115a50161810c73014ce691f1186Owen Lin * @hide 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2747b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye public PreferenceScreen inflateFromResource(Context context, @XmlRes int resId, 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PreferenceScreen rootPreferences) { 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Block commits 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setNoCommit(true); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final PreferenceInflater inflater = new PreferenceInflater(context, this); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rootPreferences = (PreferenceScreen) inflater.inflate(resId, rootPreferences, true); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rootPreferences.onAttachedToHierarchy(this); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Unblock commits 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setNoCommit(false); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rootPreferences; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PreferenceScreen createPreferenceScreen(Context context) { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final PreferenceScreen preferenceScreen = new PreferenceScreen(context, null); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preferenceScreen.onAttachedToHierarchy(this); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return preferenceScreen; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by a preference to get a unique ID in its hierarchy. 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A unique ID. 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getNextId() { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNextId++; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current name of the SharedPreferences file that preferences managed by 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this will use. 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The name that can be passed to {@link Context#getSharedPreferences(String, int)}. 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Context#getSharedPreferences(String, int) 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getSharedPreferencesName() { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSharedPreferencesName; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the name of the SharedPreferences file that preferences managed by this 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will use. 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sharedPreferencesName The name of the SharedPreferences file. 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Context#getSharedPreferences(String, int) 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSharedPreferencesName(String sharedPreferencesName) { 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSharedPreferencesName = sharedPreferencesName; 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSharedPreferences = null; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current mode of the SharedPreferences file that preferences managed by 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this will use. 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The mode that can be passed to {@link Context#getSharedPreferences(String, int)}. 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Context#getSharedPreferences(String, int) 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSharedPreferencesMode() { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSharedPreferencesMode; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the mode of the SharedPreferences file that preferences managed by this 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will use. 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sharedPreferencesMode The mode of the SharedPreferences file. 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Context#getSharedPreferences(String, int) 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSharedPreferencesMode(int sharedPreferencesMode) { 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSharedPreferencesMode = sharedPreferencesMode; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSharedPreferences = null; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 353fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey * Sets the storage location used internally by this class to be the default 354fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey * provided by the hosting {@link Context}. 355fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey */ 356fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey public void setStorageDefault() { 357fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey mStorage = STORAGE_DEFAULT; 358fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey mSharedPreferences = null; 359fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey } 360fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey 361fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey /** 362fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey * Explicitly set the storage location used internally by this class to be 3638a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * device-protected storage. 364fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey * <p> 365cf3f0a11a83e7a798e0586a78efdafc82a7f3d08Jeff Sharkey * On devices with direct boot, data stored in this location is encrypted 3668a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * with a key tied to the physical device, and it can be accessed 3678a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * immediately after the device has booted successfully, both 3688a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * <em>before and after</em> the user has authenticated with their 3698a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * credentials (such as a lock pattern or PIN). 3708a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * <p> 3718a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * Because device-protected data is available without user authentication, 3728a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * you should carefully limit the data you store using this Context. For 3738a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * example, storing sensitive authentication tokens or passwords in the 3748a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * device-protected area is strongly discouraged. 375fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey * 3768a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * @see Context#createDeviceProtectedStorageContext() 377fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey */ 3788a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey public void setStorageDeviceProtected() { 3798a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey mStorage = STORAGE_DEVICE_PROTECTED; 380fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey mSharedPreferences = null; 381fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey } 382fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey 3838a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey /** @removed */ 3848a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey @Deprecated 3858a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey public void setStorageDeviceEncrypted() { 3868a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey setStorageDeviceProtected(); 3878a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey } 3888a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey 389fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey /** 390fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey * Explicitly set the storage location used internally by this class to be 3918a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * credential-protected storage. This is the default storage area for apps 3928a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * unless {@code forceDeviceProtectedStorage} was requested. 3938a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * <p> 394cf3f0a11a83e7a798e0586a78efdafc82a7f3d08Jeff Sharkey * On devices with direct boot, data stored in this location is encrypted 3958a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * with a key tied to user credentials, which can be accessed 3968a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * <em>only after</em> the user has entered their credentials (such as a 3978a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * lock pattern or PIN). 398fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey * 3998a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey * @see Context#createCredentialProtectedStorageContext() 400fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey * @hide 401fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey */ 402fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey @SystemApi 4038a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey public void setStorageCredentialProtected() { 4048a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey mStorage = STORAGE_CREDENTIAL_PROTECTED; 405fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey mSharedPreferences = null; 406fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey } 407fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey 4088a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey /** @removed */ 4098a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey @Deprecated 4108a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey public void setStorageCredentialEncrypted() { 4118a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey setStorageCredentialProtected(); 4128a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey } 4138a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey 414fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey /** 415c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey * Indicates if the storage location used internally by this class is the 416c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey * default provided by the hosting {@link Context}. 417c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey * 418c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey * @see #setStorageDefault() 419c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey * @see #setStorageDeviceProtected() 420c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey */ 421c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey public boolean isStorageDefault() { 422c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey return mStorage == STORAGE_DEFAULT; 423c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey } 424c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey 425c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey /** 426c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey * Indicates if the storage location used internally by this class is backed 427c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey * by device-protected storage. 428c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey * 429c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey * @see #setStorageDefault() 430c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey * @see #setStorageDeviceProtected() 431c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey */ 432c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey public boolean isStorageDeviceProtected() { 433c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey return mStorage == STORAGE_DEVICE_PROTECTED; 434c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey } 435c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey 436c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey /** 437c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey * Indicates if the storage location used internally by this class is backed 438c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey * by credential-protected storage. 439c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey * 440c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey * @see #setStorageDefault() 441c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey * @see #setStorageDeviceProtected() 442c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey * @hide 443c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey */ 444c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey @SystemApi 445c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey public boolean isStorageCredentialProtected() { 446c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey return mStorage == STORAGE_CREDENTIAL_PROTECTED; 447c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey } 448c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey 449c9a40cd8448410316716e45ce051c9f1a3fc7054Jeff Sharkey /** 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets a SharedPreferences instance that preferences managed by this will 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use. 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A SharedPreferences instance pointing to the file that contains 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the values of preferences that are managed by this. 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SharedPreferences getSharedPreferences() { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSharedPreferences == null) { 458fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey final Context storageContext; 459fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey switch (mStorage) { 4608a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey case STORAGE_DEVICE_PROTECTED: 4618a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey storageContext = mContext.createDeviceProtectedStorageContext(); 462fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey break; 4638a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey case STORAGE_CREDENTIAL_PROTECTED: 4648a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey storageContext = mContext.createCredentialProtectedStorageContext(); 465fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey break; 466fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey default: 467fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey storageContext = mContext; 468fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey break; 469fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey } 470fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey 471fd37abe9d5469f2b0d640c625f14b75cfe609711Jeff Sharkey mSharedPreferences = storageContext.getSharedPreferences(mSharedPreferencesName, 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSharedPreferencesMode); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSharedPreferences; 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets a SharedPreferences instance that points to the default file that is 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used by the preference framework in the given context. 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The context of the preferences whose values are wanted. 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A SharedPreferences instance that can be used to retrieve and 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * listen to values of the preferences. 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static SharedPreferences getDefaultSharedPreferences(Context context) { 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return context.getSharedPreferences(getDefaultSharedPreferencesName(context), 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getDefaultSharedPreferencesMode()); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4916a6cdafaec56fcd793214678c7fcc52f0b860cfcJeff Sharkey /** 4926a6cdafaec56fcd793214678c7fcc52f0b860cfcJeff Sharkey * Returns the name used for storing default shared preferences. 4936a6cdafaec56fcd793214678c7fcc52f0b860cfcJeff Sharkey * 4946a6cdafaec56fcd793214678c7fcc52f0b860cfcJeff Sharkey * @see #getDefaultSharedPreferences(Context) 4956a6cdafaec56fcd793214678c7fcc52f0b860cfcJeff Sharkey * @see Context#getSharedPreferencesPath(String) 4966a6cdafaec56fcd793214678c7fcc52f0b860cfcJeff Sharkey */ 4976a6cdafaec56fcd793214678c7fcc52f0b860cfcJeff Sharkey public static String getDefaultSharedPreferencesName(Context context) { 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return context.getPackageName() + "_preferences"; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int getDefaultSharedPreferencesMode() { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Context.MODE_PRIVATE; 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the root of the preference hierarchy managed by this class. 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The {@link PreferenceScreen} object that is at the root of the hierarchy. 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PreferenceScreen getPreferenceScreen() { 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPreferenceScreen; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the root of the preference hierarchy. 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param preferenceScreen The root {@link PreferenceScreen} of the preference hierarchy. 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the {@link PreferenceScreen} given is different than the previous. 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean setPreferences(PreferenceScreen preferenceScreen) { 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (preferenceScreen != mPreferenceScreen) { 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferenceScreen = preferenceScreen; 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Finds a {@link Preference} based on its key. 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param key The key of the preference to retrieve. 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The {@link Preference} with the key, or null. 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see PreferenceGroup#findPreference(CharSequence) 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Preference findPreference(CharSequence key) { 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferenceScreen == null) { 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPreferenceScreen.findPreference(key); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 545bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * Sets the default values from an XML preference file by reading the values defined 546bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * by each {@link Preference} item's {@code android:defaultValue} attribute. This should 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be called by the application's main activity. 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The context of the shared preferences. 551bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * @param resId The resource ID of the preference XML file. 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param readAgain Whether to re-read the default values. 553bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * If false, this method sets the default values only if this 554bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * method has never been called in the past (or if the 555bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * {@link #KEY_HAS_SET_DEFAULT_VALUES} in the default value shared 556bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * preferences file is false). To attempt to set the default values again 557bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * bypassing this check, set {@code readAgain} to true. 558bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * <p class="note"> 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note: this will NOT reset preferences back to their default 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values. For that functionality, use 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link PreferenceManager#getDefaultSharedPreferences(Context)} 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and clear it followed by a call to this method with this 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parameter set to true. 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5657b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye public static void setDefaultValues(Context context, @XmlRes int resId, boolean readAgain) { 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Use the default shared preferences name and mode 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDefaultValues(context, getDefaultSharedPreferencesName(context), 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getDefaultSharedPreferencesMode(), resId, readAgain); 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Similar to {@link #setDefaultValues(Context, int, boolean)} but allows 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the client to provide the filename and mode of the shared preferences 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * file. 576bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * 577bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * @param context The context of the shared preferences. 578bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * @param sharedPreferencesName A custom name for the shared preferences file. 579bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * @param sharedPreferencesMode The file creation mode for the shared preferences file, such 580bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * as {@link android.content.Context#MODE_PRIVATE} or {@link 581bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * android.content.Context#MODE_PRIVATE} 582bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * @param resId The resource ID of the preference XML file. 583bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * @param readAgain Whether to re-read the default values. 584bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * If false, this method will set the default values only if this 585bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * method has never been called in the past (or if the 586bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * {@link #KEY_HAS_SET_DEFAULT_VALUES} in the default value shared 587bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * preferences file is false). To attempt to set the default values again 588bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * bypassing this check, set {@code readAgain} to true. 589bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * <p class="note"> 590bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * Note: this will NOT reset preferences back to their default 591bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * values. For that functionality, use 592bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * {@link PreferenceManager#getDefaultSharedPreferences(Context)} 593bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * and clear it followed by a call to this method with this 594bbb3f41e26ac5a996913907dc63786146132b4ceScott Main * parameter set to true. 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setDefaultValues(Context, int, boolean) 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setSharedPreferencesName(String) 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setSharedPreferencesMode(int) 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void setDefaultValues(Context context, String sharedPreferencesName, 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sharedPreferencesMode, int resId, boolean readAgain) { 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final SharedPreferences defaultValueSp = context.getSharedPreferences( 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project KEY_HAS_SET_DEFAULT_VALUES, Context.MODE_PRIVATE); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readAgain || !defaultValueSp.getBoolean(KEY_HAS_SET_DEFAULT_VALUES, false)) { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final PreferenceManager pm = new PreferenceManager(context); 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pm.setSharedPreferencesName(sharedPreferencesName); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pm.setSharedPreferencesMode(sharedPreferencesMode); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pm.inflateFromResource(context, resId, null); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 611dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick SharedPreferences.Editor editor = 612dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick defaultValueSp.edit().putBoolean(KEY_HAS_SET_DEFAULT_VALUES, true); 613dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick try { 614dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick editor.apply(); 615dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick } catch (AbstractMethodError unused) { 616dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick // The app injected its own pre-Gingerbread 617dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick // SharedPreferences.Editor implementation without 618dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick // an apply method. 619dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick editor.commit(); 620dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick } 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns an editor to use when modifying the shared preferences. 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Do NOT commit unless {@link #shouldCommit()} returns true. 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return An editor to use to write to shared preferences. 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #shouldCommit() 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SharedPreferences.Editor getEditor() { 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNoCommit) { 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mEditor == null) { 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mEditor = getSharedPreferences().edit(); 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mEditor; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getSharedPreferences().edit(); 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether it is the client's responsibility to commit on the 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getEditor()}. This will return false in cases where the writes 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should be batched, for example when inflating preferences from XML. 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the client should commit. 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean shouldCommit() { 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return !mNoCommit; 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 655dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setNoCommit(boolean noCommit) { 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!noCommit && mEditor != null) { 658dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick try { 659dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick mEditor.apply(); 660dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick } catch (AbstractMethodError unused) { 661dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick // The app injected its own pre-Gingerbread 662dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick // SharedPreferences.Editor implementation without 663dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick // an apply method. 664dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick mEditor.commit(); 665dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick } 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoCommit = noCommit; 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 669dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the activity that shows the preferences. This is useful for doing 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * managed queries, but in most cases the use of {@link #getContext()} is 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preferred. 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This will return null if this class was instantiated with a Context 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instead of Activity. For example, when setting the default values. 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The activity that shows the preferences. 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #mContext 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity getActivity() { 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActivity; 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the context. This is preferred over {@link #getActivity()} when 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * possible. 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The context. 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context getContext() { 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContext; 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Registers a listener. 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see OnActivityResultListener 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void registerOnActivityResultListener(OnActivityResultListener listener) { 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityResultListeners == null) { 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityResultListeners = new ArrayList<OnActivityResultListener>(); 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mActivityResultListeners.contains(listener)) { 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityResultListeners.add(listener); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unregisters a listener. 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see OnActivityResultListener 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void unregisterOnActivityResultListener(OnActivityResultListener listener) { 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityResultListeners != null) { 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityResultListeners.remove(listener); 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by the {@link PreferenceManager} to dispatch a subactivity result. 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dispatchActivityResult(int requestCode, int resultCode, Intent data) { 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<OnActivityResultListener> list; 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityResultListeners == null) return; 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list = new ArrayList<OnActivityResultListener>(mActivityResultListeners); 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = list.size(); 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (list.get(i).onActivityResult(requestCode, resultCode, data)) { 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Registers a listener. 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see OnActivityStopListener 74874a2e06d831432f27ebd17cf6f1d0086356e7ee0John Spurlock * @hide 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 75074a2e06d831432f27ebd17cf6f1d0086356e7ee0John Spurlock public void registerOnActivityStopListener(OnActivityStopListener listener) { 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityStopListeners == null) { 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityStopListeners = new ArrayList<OnActivityStopListener>(); 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mActivityStopListeners.contains(listener)) { 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityStopListeners.add(listener); 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unregisters a listener. 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see OnActivityStopListener 76674a2e06d831432f27ebd17cf6f1d0086356e7ee0John Spurlock * @hide 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 76874a2e06d831432f27ebd17cf6f1d0086356e7ee0John Spurlock public void unregisterOnActivityStopListener(OnActivityStopListener listener) { 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityStopListeners != null) { 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityStopListeners.remove(listener); 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by the {@link PreferenceManager} to dispatch the activity stop 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * event. 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dispatchActivityStop() { 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<OnActivityStopListener> list; 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityStopListeners == null) return; 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list = new ArrayList<OnActivityStopListener>(mActivityStopListeners); 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = list.size(); 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.get(i).onActivityStop(); 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Registers a listener. 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see OnActivityDestroyListener 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void registerOnActivityDestroyListener(OnActivityDestroyListener listener) { 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityDestroyListeners == null) { 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityDestroyListeners = new ArrayList<OnActivityDestroyListener>(); 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mActivityDestroyListeners.contains(listener)) { 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityDestroyListeners.add(listener); 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unregisters a listener. 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see OnActivityDestroyListener 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void unregisterOnActivityDestroyListener(OnActivityDestroyListener listener) { 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityDestroyListeners != null) { 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityDestroyListeners.remove(listener); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by the {@link PreferenceManager} to dispatch the activity destroy 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * event. 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dispatchActivityDestroy() { 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<OnActivityDestroyListener> list = null; 830b65b7105cd5d20bf8a9f9c1b10afd6df968bc442Jason Monk 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityDestroyListeners != null) { 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list = new ArrayList<OnActivityDestroyListener>(mActivityDestroyListeners); 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (list != null) { 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = list.size(); 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.get(i).onActivityDestroy(); 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dismiss any PreferenceScreens still showing 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissAllScreens(); 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a request code that is unique for the activity. Each subsequent 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * call to this method should return another unique request code. 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A unique request code that will never be used by anyone other 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * than the caller of this method. 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getNextRequestCode() { 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNextRequestCode++; 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void addPreferencesScreen(DialogInterface screen) { 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferencesScreens == null) { 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferencesScreens = new ArrayList<DialogInterface>(); 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferencesScreens.add(screen); 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void removePreferencesScreen(DialogInterface screen) { 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferencesScreens == null) { 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferencesScreens.remove(screen); 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by {@link PreferenceActivity} to dispatch the new Intent event. 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param intent The new Intent. 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dispatchNewIntent(Intent intent) { 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissAllScreens(); 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void dismissAllScreens() { 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove any of the previously shown preferences screens 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<DialogInterface> screensToDismiss; 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferencesScreens == null) { 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project screensToDismiss = new ArrayList<DialogInterface>(mPreferencesScreens); 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferencesScreens.clear(); 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = screensToDismiss.size() - 1; i >= 0; i--) { 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project screensToDismiss.get(i).dismiss(); 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the callback to be invoked when a {@link Preference} in the 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * hierarchy rooted at this {@link PreferenceManager} is clicked. 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listener The callback to be invoked. 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setOnPreferenceTreeClickListener(OnPreferenceTreeClickListener listener) { 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnPreferenceTreeClickListener = listener; 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OnPreferenceTreeClickListener getOnPreferenceTreeClickListener() { 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOnPreferenceTreeClickListener; 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Interface definition for a callback to be invoked when a 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Preference} in the hierarchy rooted at this {@link PreferenceScreen} is 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clicked. 929ad2fcfe1b674fc468edf01f26b0a0bb4784b68efFabrice Di Meglio * 930ad2fcfe1b674fc468edf01f26b0a0bb4784b68efFabrice Di Meglio * @hide 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 932ad2fcfe1b674fc468edf01f26b0a0bb4784b68efFabrice Di Meglio public interface OnPreferenceTreeClickListener { 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when a preference in the tree rooted at this 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link PreferenceScreen} has been clicked. 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param preferenceScreen The {@link PreferenceScreen} that the 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preference is located in. 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param preference The preference that was clicked. 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the click was handled. 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference); 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Interface definition for a class that will be called when the container's activity 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receives an activity result. 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnActivityResultListener { 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See Activity's onActivityResult. 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the request code was handled (in which case 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * subsequent listeners will not be called. 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean onActivityResult(int requestCode, int resultCode, Intent data); 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Interface definition for a class that will be called when the container's activity 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is stopped. 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnActivityStopListener { 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See Activity's onStop. 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onActivityStop(); 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Interface definition for a class that will be called when the container's activity 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is destroyed. 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnActivityDestroyListener { 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See Activity's onDestroy. 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onActivityDestroy(); 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 985