PreferenceManager.java revision 82e7bc11342547d1480ef89208ed06943650e201
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 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Activity; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.DialogInterface; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ResolveInfo; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.XmlResourceParser; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3282e7bc11342547d1480ef89208ed06943650e201Amith Yamasaniimport java.util.ArrayList; 3382e7bc11342547d1480ef89208ed06943650e201Amith Yamasaniimport java.util.HashSet; 3482e7bc11342547d1480ef89208ed06943650e201Amith Yamasaniimport java.util.List; 3582e7bc11342547d1480ef89208ed06943650e201Amith Yamasani 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to help create {@link Preference} hierarchies 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from activities or XML. 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In most cases, clients should use 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link PreferenceActivity#addPreferencesFromIntent} or 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link PreferenceActivity#addPreferencesFromResource(int)}. 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see PreferenceActivity 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PreferenceManager { 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "PreferenceManager"; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Activity meta-data key for its XML preference hierarchy. 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String METADATA_KEY_PREFERENCES = "android.preference"; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String KEY_HAS_SET_DEFAULT_VALUES = "_has_set_default_values"; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getActivity() 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Activity mActivity; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6382e7bc11342547d1480ef89208ed06943650e201Amith Yamasani * Fragment that owns this instance. 6482e7bc11342547d1480ef89208ed06943650e201Amith Yamasani */ 6582e7bc11342547d1480ef89208ed06943650e201Amith Yamasani private PreferenceFragment mFragment; 6682e7bc11342547d1480ef89208ed06943650e201Amith Yamasani 6782e7bc11342547d1480ef89208ed06943650e201Amith Yamasani /** 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The context to use. This should always be set. 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #mActivity 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mContext; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The counter for unique IDs. 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mNextId = 0; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The counter for unique request codes. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNextRequestCode; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Cached shared preferences. 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SharedPreferences mSharedPreferences; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If in no-commit mode, the shared editor to give out (which will be 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * committed when exiting no-commit mode). 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SharedPreferences.Editor mEditor; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Blocks commits from happening on the shared editor. This is used when 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inflating the hierarchy. Do not set this directly, use {@link #setNoCommit(boolean)} 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mNoCommit; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The SharedPreferences name that will be used for all {@link Preference}s 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * managed by this instance. 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mSharedPreferencesName; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The SharedPreferences mode that will be used for all {@link Preference}s 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * managed by this instance. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mSharedPreferencesMode; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The {@link PreferenceScreen} at the root of the preference hierarchy. 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PreferenceScreen mPreferenceScreen; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * List of activity result listeners. 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private List<OnActivityResultListener> mActivityResultListeners; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * List of activity stop listeners. 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private List<OnActivityStopListener> mActivityStopListeners; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * List of activity destroy listeners. 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private List<OnActivityDestroyListener> mActivityDestroyListeners; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * List of dialogs that should be dismissed when we receive onNewIntent in 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * our PreferenceActivity. 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private List<DialogInterface> mPreferencesScreens; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private OnPreferenceTreeClickListener mOnPreferenceTreeClickListener; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 141d6cc0343c92ba8da7800f54859f3717cc86c0f37Owen Lin PreferenceManager(Activity activity, int firstRequestCode) { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivity = activity; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextRequestCode = firstRequestCode; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(activity); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This constructor should ONLY be used when getting default values from 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an XML preference hierarchy. 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The {@link PreferenceManager#PreferenceManager(Activity)} 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should be used ANY time a preference will be displayed, since some preference 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * types need an Activity for managed queries. 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PreferenceManager(Context context) { 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(context); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void init(Context context) { 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setSharedPreferencesName(getDefaultSharedPreferencesName(context)); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16582e7bc11342547d1480ef89208ed06943650e201Amith Yamasani 16682e7bc11342547d1480ef89208ed06943650e201Amith Yamasani /** 16782e7bc11342547d1480ef89208ed06943650e201Amith Yamasani * Sets the owning preference fragment 16882e7bc11342547d1480ef89208ed06943650e201Amith Yamasani */ 16982e7bc11342547d1480ef89208ed06943650e201Amith Yamasani void setFragment(PreferenceFragment fragment) { 17082e7bc11342547d1480ef89208ed06943650e201Amith Yamasani mFragment = fragment; 17182e7bc11342547d1480ef89208ed06943650e201Amith Yamasani } 17282e7bc11342547d1480ef89208ed06943650e201Amith Yamasani 17382e7bc11342547d1480ef89208ed06943650e201Amith Yamasani /** 17482e7bc11342547d1480ef89208ed06943650e201Amith Yamasani * Returns the owning preference fragment, if any. 17582e7bc11342547d1480ef89208ed06943650e201Amith Yamasani */ 17682e7bc11342547d1480ef89208ed06943650e201Amith Yamasani PreferenceFragment getFragment() { 17782e7bc11342547d1480ef89208ed06943650e201Amith Yamasani return mFragment; 17882e7bc11342547d1480ef89208ed06943650e201Amith Yamasani } 17982e7bc11342547d1480ef89208ed06943650e201Amith Yamasani 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a list of {@link Activity} (indirectly) that match a given 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Intent}. 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param queryIntent The Intent to match. 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The list of {@link ResolveInfo} that point to the matched 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activities. 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private List<ResolveInfo> queryIntentActivities(Intent queryIntent) { 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContext.getPackageManager().queryIntentActivities(queryIntent, 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageManager.GET_META_DATA); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inflates a preference hierarchy from the preference hierarchies of 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Activity Activities} that match the given {@link Intent}. An 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Activity} defines its preference hierarchy with meta-data using 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #METADATA_KEY_PREFERENCES} key. 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If a preference hierarchy is given, the new preference hierarchies will 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be merged in. 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param queryIntent The intent to match activities. 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rootPreferences Optional existing hierarchy to merge the new 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * hierarchies into. 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The root hierarchy (if one was not provided, the new hierarchy's 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * root). 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PreferenceScreen inflateFromIntent(Intent queryIntent, PreferenceScreen rootPreferences) { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final List<ResolveInfo> activities = queryIntentActivities(queryIntent); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashSet<String> inflatedRes = new HashSet<String>(); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = activities.size() - 1; i >= 0; i--) { 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ActivityInfo activityInfo = activities.get(i).activityInfo; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Bundle metaData = activityInfo.metaData; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((metaData == null) || !metaData.containsKey(METADATA_KEY_PREFERENCES)) { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Need to concat the package with res ID since the same res ID 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // can be re-used across contexts 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String uniqueResId = activityInfo.packageName + ":" 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + activityInfo.metaData.getInt(METADATA_KEY_PREFERENCES); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!inflatedRes.contains(uniqueResId)) { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inflatedRes.add(uniqueResId); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Context context; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context = mContext.createPackageContext(activityInfo.packageName, 0); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NameNotFoundException e) { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Could not create context for " + activityInfo.packageName + ": " 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Log.getStackTraceString(e)); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final PreferenceInflater inflater = new PreferenceInflater(context, this); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final XmlResourceParser parser = activityInfo.loadXmlMetaData(context 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getPackageManager(), METADATA_KEY_PREFERENCES); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rootPreferences = (PreferenceScreen) inflater 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .inflate(parser, rootPreferences, true); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser.close(); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rootPreferences.onAttachedToHierarchy(this); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rootPreferences; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inflates a preference hierarchy from XML. If a preference hierarchy is 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given, the new preference hierarchies will be merged in. 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The context of the resource. 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resId The resource ID of the XML to inflate. 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rootPreferences Optional existing hierarchy to merge the new 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * hierarchies into. 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The root hierarchy (if one was not provided, the new hierarchy's 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * root). 261f9b702e212e7115a50161810c73014ce691f1186Owen Lin * @hide 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 263f9b702e212e7115a50161810c73014ce691f1186Owen Lin public PreferenceScreen inflateFromResource(Context context, int resId, 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PreferenceScreen rootPreferences) { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Block commits 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setNoCommit(true); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final PreferenceInflater inflater = new PreferenceInflater(context, this); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rootPreferences = (PreferenceScreen) inflater.inflate(resId, rootPreferences, true); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rootPreferences.onAttachedToHierarchy(this); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Unblock commits 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setNoCommit(false); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rootPreferences; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PreferenceScreen createPreferenceScreen(Context context) { 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final PreferenceScreen preferenceScreen = new PreferenceScreen(context, null); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preferenceScreen.onAttachedToHierarchy(this); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return preferenceScreen; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by a preference to get a unique ID in its hierarchy. 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A unique ID. 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getNextId() { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNextId++; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current name of the SharedPreferences file that preferences managed by 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this will use. 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The name that can be passed to {@link Context#getSharedPreferences(String, int)}. 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Context#getSharedPreferences(String, int) 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getSharedPreferencesName() { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSharedPreferencesName; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the name of the SharedPreferences file that preferences managed by this 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will use. 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sharedPreferencesName The name of the SharedPreferences file. 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Context#getSharedPreferences(String, int) 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSharedPreferencesName(String sharedPreferencesName) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSharedPreferencesName = sharedPreferencesName; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSharedPreferences = null; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current mode of the SharedPreferences file that preferences managed by 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this will use. 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The mode that can be passed to {@link Context#getSharedPreferences(String, int)}. 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Context#getSharedPreferences(String, int) 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSharedPreferencesMode() { 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSharedPreferencesMode; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the mode of the SharedPreferences file that preferences managed by this 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will use. 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sharedPreferencesMode The mode of the SharedPreferences file. 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Context#getSharedPreferences(String, int) 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSharedPreferencesMode(int sharedPreferencesMode) { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSharedPreferencesMode = sharedPreferencesMode; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSharedPreferences = null; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets a SharedPreferences instance that preferences managed by this will 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use. 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A SharedPreferences instance pointing to the file that contains 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the values of preferences that are managed by this. 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SharedPreferences getSharedPreferences() { 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSharedPreferences == null) { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSharedPreferences = mContext.getSharedPreferences(mSharedPreferencesName, 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSharedPreferencesMode); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSharedPreferences; 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets a SharedPreferences instance that points to the default file that is 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used by the preference framework in the given context. 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The context of the preferences whose values are wanted. 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A SharedPreferences instance that can be used to retrieve and 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * listen to values of the preferences. 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static SharedPreferences getDefaultSharedPreferences(Context context) { 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return context.getSharedPreferences(getDefaultSharedPreferencesName(context), 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getDefaultSharedPreferencesMode()); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String getDefaultSharedPreferencesName(Context context) { 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return context.getPackageName() + "_preferences"; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int getDefaultSharedPreferencesMode() { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Context.MODE_PRIVATE; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the root of the preference hierarchy managed by this class. 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The {@link PreferenceScreen} object that is at the root of the hierarchy. 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PreferenceScreen getPreferenceScreen() { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPreferenceScreen; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the root of the preference hierarchy. 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param preferenceScreen The root {@link PreferenceScreen} of the preference hierarchy. 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the {@link PreferenceScreen} given is different than the previous. 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean setPreferences(PreferenceScreen preferenceScreen) { 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (preferenceScreen != mPreferenceScreen) { 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferenceScreen = preferenceScreen; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Finds a {@link Preference} based on its key. 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param key The key of the preference to retrieve. 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The {@link Preference} with the key, or null. 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see PreferenceGroup#findPreference(CharSequence) 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Preference findPreference(CharSequence key) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferenceScreen == null) { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPreferenceScreen.findPreference(key); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the default values from a preference hierarchy in XML. This should 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be called by the application's main activity. 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If {@code readAgain} is false, this will only set the default values if this 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method has never been called in the past (or the 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #KEY_HAS_SET_DEFAULT_VALUES} in the default value shared 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preferences file is false). To attempt to set the default values again 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bypassing this check, set {@code readAgain} to true. 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The context of the shared preferences. 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resId The resource ID of the preference hierarchy XML file. 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param readAgain Whether to re-read the default values. 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note: this will NOT reset preferences back to their default 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values. For that functionality, use 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link PreferenceManager#getDefaultSharedPreferences(Context)} 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and clear it followed by a call to this method with this 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parameter set to true. 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void setDefaultValues(Context context, int resId, boolean readAgain) { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Use the default shared preferences name and mode 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDefaultValues(context, getDefaultSharedPreferencesName(context), 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getDefaultSharedPreferencesMode(), resId, readAgain); 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Similar to {@link #setDefaultValues(Context, int, boolean)} but allows 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the client to provide the filename and mode of the shared preferences 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * file. 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setDefaultValues(Context, int, boolean) 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setSharedPreferencesName(String) 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setSharedPreferencesMode(int) 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void setDefaultValues(Context context, String sharedPreferencesName, 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sharedPreferencesMode, int resId, boolean readAgain) { 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final SharedPreferences defaultValueSp = context.getSharedPreferences( 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project KEY_HAS_SET_DEFAULT_VALUES, Context.MODE_PRIVATE); 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readAgain || !defaultValueSp.getBoolean(KEY_HAS_SET_DEFAULT_VALUES, false)) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final PreferenceManager pm = new PreferenceManager(context); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pm.setSharedPreferencesName(sharedPreferencesName); 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pm.setSharedPreferencesMode(sharedPreferencesMode); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pm.inflateFromResource(context, resId, null); 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 464fa8e271636b9e9b86f247cdb4c91d9ebe9675c27Brad Fitzpatrick defaultValueSp.edit().putBoolean(KEY_HAS_SET_DEFAULT_VALUES, true).apply(); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns an editor to use when modifying the shared preferences. 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Do NOT commit unless {@link #shouldCommit()} returns true. 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return An editor to use to write to shared preferences. 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #shouldCommit() 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SharedPreferences.Editor getEditor() { 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNoCommit) { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mEditor == null) { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mEditor = getSharedPreferences().edit(); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mEditor; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getSharedPreferences().edit(); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether it is the client's responsibility to commit on the 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getEditor()}. This will return false in cases where the writes 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should be batched, for example when inflating preferences from XML. 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the client should commit. 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean shouldCommit() { 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return !mNoCommit; 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setNoCommit(boolean noCommit) { 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!noCommit && mEditor != null) { 502fa8e271636b9e9b86f247cdb4c91d9ebe9675c27Brad Fitzpatrick mEditor.apply(); 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoCommit = noCommit; 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the activity that shows the preferences. This is useful for doing 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * managed queries, but in most cases the use of {@link #getContext()} is 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preferred. 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This will return null if this class was instantiated with a Context 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instead of Activity. For example, when setting the default values. 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The activity that shows the preferences. 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #mContext 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity getActivity() { 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActivity; 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the context. This is preferred over {@link #getActivity()} when 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * possible. 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The context. 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context getContext() { 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContext; 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Registers a listener. 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see OnActivityResultListener 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void registerOnActivityResultListener(OnActivityResultListener listener) { 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityResultListeners == null) { 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityResultListeners = new ArrayList<OnActivityResultListener>(); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mActivityResultListeners.contains(listener)) { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityResultListeners.add(listener); 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unregisters a listener. 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see OnActivityResultListener 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void unregisterOnActivityResultListener(OnActivityResultListener listener) { 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityResultListeners != null) { 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityResultListeners.remove(listener); 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by the {@link PreferenceManager} to dispatch a subactivity result. 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dispatchActivityResult(int requestCode, int resultCode, Intent data) { 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<OnActivityResultListener> list; 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityResultListeners == null) return; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list = new ArrayList<OnActivityResultListener>(mActivityResultListeners); 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = list.size(); 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (list.get(i).onActivityResult(requestCode, resultCode, data)) { 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Registers a listener. 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see OnActivityStopListener 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void registerOnActivityStopListener(OnActivityStopListener listener) { 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityStopListeners == null) { 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityStopListeners = new ArrayList<OnActivityStopListener>(); 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mActivityStopListeners.contains(listener)) { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityStopListeners.add(listener); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unregisters a listener. 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see OnActivityStopListener 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void unregisterOnActivityStopListener(OnActivityStopListener listener) { 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityStopListeners != null) { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityStopListeners.remove(listener); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by the {@link PreferenceManager} to dispatch the activity stop 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * event. 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dispatchActivityStop() { 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<OnActivityStopListener> list; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityStopListeners == null) return; 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list = new ArrayList<OnActivityStopListener>(mActivityStopListeners); 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = list.size(); 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.get(i).onActivityStop(); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Registers a listener. 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see OnActivityDestroyListener 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void registerOnActivityDestroyListener(OnActivityDestroyListener listener) { 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityDestroyListeners == null) { 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityDestroyListeners = new ArrayList<OnActivityDestroyListener>(); 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mActivityDestroyListeners.contains(listener)) { 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityDestroyListeners.add(listener); 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unregisters a listener. 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see OnActivityDestroyListener 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void unregisterOnActivityDestroyListener(OnActivityDestroyListener listener) { 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityDestroyListeners != null) { 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityDestroyListeners.remove(listener); 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by the {@link PreferenceManager} to dispatch the activity destroy 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * event. 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dispatchActivityDestroy() { 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<OnActivityDestroyListener> list = null; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityDestroyListeners != null) { 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list = new ArrayList<OnActivityDestroyListener>(mActivityDestroyListeners); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (list != null) { 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = list.size(); 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.get(i).onActivityDestroy(); 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dismiss any PreferenceScreens still showing 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissAllScreens(); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a request code that is unique for the activity. Each subsequent 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * call to this method should return another unique request code. 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A unique request code that will never be used by anyone other 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * than the caller of this method. 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getNextRequestCode() { 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNextRequestCode++; 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void addPreferencesScreen(DialogInterface screen) { 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferencesScreens == null) { 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferencesScreens = new ArrayList<DialogInterface>(); 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferencesScreens.add(screen); 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void removePreferencesScreen(DialogInterface screen) { 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferencesScreens == null) { 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferencesScreens.remove(screen); 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by {@link PreferenceActivity} to dispatch the new Intent event. 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param intent The new Intent. 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dispatchNewIntent(Intent intent) { 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissAllScreens(); 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void dismissAllScreens() { 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove any of the previously shown preferences screens 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<DialogInterface> screensToDismiss; 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferencesScreens == null) { 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project screensToDismiss = new ArrayList<DialogInterface>(mPreferencesScreens); 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferencesScreens.clear(); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = screensToDismiss.size() - 1; i >= 0; i--) { 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project screensToDismiss.get(i).dismiss(); 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the callback to be invoked when a {@link Preference} in the 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * hierarchy rooted at this {@link PreferenceManager} is clicked. 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listener The callback to be invoked. 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setOnPreferenceTreeClickListener(OnPreferenceTreeClickListener listener) { 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnPreferenceTreeClickListener = listener; 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OnPreferenceTreeClickListener getOnPreferenceTreeClickListener() { 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOnPreferenceTreeClickListener; 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Interface definition for a callback to be invoked when a 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Preference} in the hierarchy rooted at this {@link PreferenceScreen} is 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clicked. 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface OnPreferenceTreeClickListener { 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when a preference in the tree rooted at this 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link PreferenceScreen} has been clicked. 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param preferenceScreen The {@link PreferenceScreen} that the 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preference is located in. 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param preference The preference that was clicked. 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the click was handled. 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference); 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Interface definition for a class that will be called when the container's activity 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receives an activity result. 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnActivityResultListener { 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See Activity's onActivityResult. 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the request code was handled (in which case 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * subsequent listeners will not be called. 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean onActivityResult(int requestCode, int resultCode, Intent data); 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Interface definition for a class that will be called when the container's activity 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is stopped. 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnActivityStopListener { 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See Activity's onStop. 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onActivityStop(); 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Interface definition for a class that will be called when the container's activity 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is destroyed. 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnActivityDestroyListener { 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See Activity's onDestroy. 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onActivityDestroy(); 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 819