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