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
19c615c6fc9caca76cd96998f86e1f1e6393aeadbbTor Norbyeimport android.annotation.CallSuper;
20212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport com.android.internal.util.CharSequences;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
227b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.DrawableRes;
237b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.LayoutRes;
247b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.StringRes;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
29b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasaniimport android.graphics.drawable.Drawable;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.AbsSavedState;
36014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reckimport android.view.KeyEvent;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup;
40b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasaniimport android.widget.ImageView;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ListView;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.TextView;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport java.util.ArrayList;
45212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport java.util.List;
46212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport java.util.Set;
47212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Represents the basic Preference UI building
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * block displayed by a {@link PreferenceActivity} in the form of a
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ListView}. This class provides the {@link View} to be displayed in
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the activity and associates with a {@link SharedPreferences} to
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * store/retrieve the preference data.
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When specifying a preference hierarchy in XML, each element can point to a
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * subclass of {@link Preference}, similar to the view hierarchy and layouts.
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class contains a {@code key} that will be used as the key into the
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SharedPreferences}. It is up to the subclass to decide how to store
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the value.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
62cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * <div class="special reference">
63cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * <h3>Developer Guides</h3>
64cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * <p>For information about building a settings UI with Preferences,
65cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * read the <a href="{@docRoot}guide/topics/ui/settings.html">Settings</a>
66cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * guide.</p>
67cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * </div>
68cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main *
69b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani * @attr ref android.R.styleable#Preference_icon
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Preference_key
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Preference_title
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Preference_summary
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Preference_order
74b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * @attr ref android.R.styleable#Preference_fragment
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Preference_layout
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Preference_widgetLayout
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Preference_enabled
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Preference_selectable
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Preference_dependency
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Preference_persistent
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Preference_defaultValue
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Preference_shouldDisableView
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
8402f56803632051c202407cec01406781993752a1Alan Viverettepublic class Preference implements Comparable<Preference> {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specify for {@link #setOrder(int)} if a specific order is not required.
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int DEFAULT_ORDER = Integer.MAX_VALUE;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mContext;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PreferenceManager mPreferenceManager;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set when added to hierarchy since we need a unique ID within that
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * hierarchy.
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mId;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnPreferenceChangeListener mOnChangeListener;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnPreferenceClickListener mOnClickListener;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mOrder = DEFAULT_ORDER;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence mTitle;
104e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn    private int mTitleRes;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence mSummary;
106b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani    /**
107b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     * mIconResId is overridden by mIcon, if mIcon is specified.
108b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     */
109b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani    private int mIconResId;
110b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani    private Drawable mIcon;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mKey;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Intent mIntent;
113b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn    private String mFragment;
114def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    private Bundle mExtras;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mEnabled = true;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mSelectable = true;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mRequiresKey;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mPersistent = true;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mDependencyKey;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Object mDefaultValue;
121da53eca79e02ac70761c379f9f2cb3babce9e79dMichael Chan    private boolean mDependencyMet = true;
12202f56803632051c202407cec01406781993752a1Alan Viverette    private boolean mParentDependencyMet = true;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setShouldDisableView(boolean)
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mShouldDisableView = true;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mLayoutResId = com.android.internal.R.layout.preference;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mWidgetLayoutResId;
131791b37e0d9375789c2930ed170d202ea728390fdAlan Viverette    private boolean mCanRecycleLayout = true;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnPreferenceChangeInternalListener mListener;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private List<Preference> mDependents;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mBaseMethodCalled;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Interface definition for a callback to be invoked when the value of this
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Preference} has been changed by the user and is
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * about to be set and/or persisted.  This gives the client a chance
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to prevent setting and/or persisting the value.
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnPreferenceChangeListener {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when a Preference has been changed by the user. This is
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * called before the state of the Preference is about to be updated and
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * before the state is persisted.
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param preference The changed Preference.
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param newValue The new value of the Preference.
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return True to update the state of the Preference with the new value.
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onPreferenceChange(Preference preference, Object newValue);
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Interface definition for a callback to be invoked when a {@link Preference} is
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * clicked.
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnPreferenceClickListener {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when a Preference has been clicked.
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param preference The Preference that was clicked.
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return True if the click was handled.
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onPreferenceClick(Preference preference);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Interface definition for a callback to be invoked when this
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Preference} is changed or, if this is a group, there is an
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * addition/removal of {@link Preference}(s). This is used internally.
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    interface OnPreferenceChangeInternalListener {
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when this Preference has changed.
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param preference This preference.
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onPreferenceChange(Preference preference);
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when this group has added/removed {@link Preference}(s).
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param preference This Preference.
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onPreferenceHierarchyChange(Preference preference);
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform inflation from XML and apply a class-specific base style. This
195617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * constructor of Preference allows subclasses to use their own base style
196617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * when they are inflating. For example, a {@link CheckBoxPreference}
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * constructor calls this version of the super class constructor and
198617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * supplies {@code android.R.attr.checkBoxPreferenceStyle} for
199617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * <var>defStyleAttr</var>. This allows the theme's checkbox preference
200617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * style to modify all of the base preference attributes as well as the
201617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * {@link CheckBoxPreference} class's attributes.
202617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     *
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The Context this is associated with, through which it can
204617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     *            access the current theme, resources,
205617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     *            {@link SharedPreferences}, etc.
206617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * @param attrs The attributes of the XML tag that is inflating the
207617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     *            preference.
208617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * @param defStyleAttr An attribute in the current theme that contains a
209617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     *            reference to a style resource that supplies default values for
210617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     *            the view. Can be 0 to not look for defaults.
211617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * @param defStyleRes A resource identifier of a style resource that
212617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     *            supplies default values for the view, used only if
213617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     *            defStyleAttr is 0 or can not be found in the theme. Can be 0
214617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     *            to not look for defaults.
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #Preference(Context, AttributeSet)
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
217617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    public Preference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
220617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        final TypedArray a = context.obtainStyledAttributes(
221617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette                attrs, com.android.internal.R.styleable.Preference, defStyleAttr, defStyleRes);
22210bb1371dca38b5b59f083ee963f7987da6511f2Deepanshu Gupta        for (int i = a.getIndexCount() - 1; i >= 0; i--) {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int attr = a.getIndex(i);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (attr) {
225b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani                case com.android.internal.R.styleable.Preference_icon:
226b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani                    mIconResId = a.getResourceId(attr, 0);
227b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani                    break;
228b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.Preference_key:
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mKey = a.getString(attr);
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.Preference_title:
234e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn                    mTitleRes = a.getResourceId(attr, 0);
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTitle = a.getString(attr);
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.Preference_summary:
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSummary = a.getString(attr);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.Preference_order:
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mOrder = a.getInt(attr, mOrder);
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
246b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                case com.android.internal.R.styleable.Preference_fragment:
247b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                    mFragment = a.getString(attr);
248b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn                    break;
249b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.Preference_layout:
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLayoutResId = a.getResourceId(attr, mLayoutResId);
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.Preference_widgetLayout:
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mWidgetLayoutResId = a.getResourceId(attr, mWidgetLayoutResId);
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.Preference_enabled:
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mEnabled = a.getBoolean(attr, true);
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.Preference_selectable:
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSelectable = a.getBoolean(attr, true);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.Preference_persistent:
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mPersistent = a.getBoolean(attr, mPersistent);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.Preference_dependency:
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mDependencyKey = a.getString(attr);
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.Preference_defaultValue:
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mDefaultValue = onGetDefaultValue(a, attr);
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.Preference_shouldDisableView:
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mShouldDisableView = a.getBoolean(attr, mShouldDisableView);
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
284a98129b9110371aa036d8fcf23fff709595b16ffAmith Yamasani
285791b37e0d9375789c2930ed170d202ea728390fdAlan Viverette        if (!getClass().getName().startsWith("android.preference")
286791b37e0d9375789c2930ed170d202ea728390fdAlan Viverette                && !getClass().getName().startsWith("com.android")) {
287791b37e0d9375789c2930ed170d202ea728390fdAlan Viverette            // For non-framework subclasses, assume the worst and don't cache views.
288791b37e0d9375789c2930ed170d202ea728390fdAlan Viverette            mCanRecycleLayout = false;
289a98129b9110371aa036d8fcf23fff709595b16ffAmith Yamasani        }
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
291617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette
292617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    /**
293617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * Perform inflation from XML and apply a class-specific base style. This
294617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * constructor of Preference allows subclasses to use their own base style
295617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * when they are inflating. For example, a {@link CheckBoxPreference}
296617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * constructor calls this version of the super class constructor and
297617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * supplies {@code android.R.attr.checkBoxPreferenceStyle} for
298617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * <var>defStyleAttr</var>. This allows the theme's checkbox preference
299617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * style to modify all of the base preference attributes as well as the
300617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * {@link CheckBoxPreference} class's attributes.
301617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     *
302617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * @param context The Context this is associated with, through which it can
303617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     *            access the current theme, resources,
304617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     *            {@link SharedPreferences}, etc.
305617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * @param attrs The attributes of the XML tag that is inflating the
306617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     *            preference.
307617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * @param defStyleAttr An attribute in the current theme that contains a
308617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     *            reference to a style resource that supplies default values for
309617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     *            the view. Can be 0 to not look for defaults.
310617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     * @see #Preference(Context, AttributeSet)
311617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette     */
312617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    public Preference(Context context, AttributeSet attrs, int defStyleAttr) {
313617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        this(context, attrs, defStyleAttr, 0);
314617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    }
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constructor that is called when inflating a Preference from XML. This is
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called when a Preference is being constructed from an XML file, supplying
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * attributes that were specified in the XML file. This version uses a
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default style of 0, so the only attribute values applied are those in the
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Context's Theme and the given AttributeSet.
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The Context this is associated with, through which it can
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            access the current theme, resources, {@link SharedPreferences},
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            etc.
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param attrs The attributes of the XML tag that is inflating the
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            preference.
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #Preference(Context, AttributeSet, int)
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Preference(Context context, AttributeSet attrs) {
331e494662c9998b9bb06d0850ec9df9239c8803d27Amith Yamasani        this(context, attrs, com.android.internal.R.attr.preferenceStyle);
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constructor to create a Preference.
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The Context in which to store Preference values.
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Preference(Context context) {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context, null);
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a Preference is being inflated and the default value
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * attribute needs to be read. Since different Preference types have
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * different value types, the subclass should get and return the default
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value which will be its value type.
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For example, if the value type is String, the body of the method would
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * proxy to {@link TypedArray#getString(int)}.
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param a The set of attributes.
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param index The index of the default value attribute.
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The default value of this preference type.
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Object onGetDefaultValue(TypedArray a, int index) {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets an {@link Intent} to be used for
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Context#startActivity(Intent)} when this Preference is clicked.
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent associated with this Preference.
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setIntent(Intent intent) {
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIntent = intent;
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the {@link Intent} associated with this Preference.
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The {@link Intent} last set via {@link #setIntent(Intent)} or XML.
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent getIntent() {
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mIntent;
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
380b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn     * Sets the class name of a fragment to be shown when this Preference is clicked.
381b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn     *
382b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn     * @param fragment The class name of the fragment associated with this Preference.
383b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn     */
384b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn    public void setFragment(String fragment) {
385b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn        mFragment = fragment;
386b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn    }
387b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn
388b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn    /**
389b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn     * Return the fragment class name associated with this Preference.
390b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn     *
391b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn     * @return The fragment class name last set via {@link #setFragment} or XML.
392b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn     */
393b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn    public String getFragment() {
394b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn        return mFragment;
395b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn    }
396b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn
397b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn    /**
398def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * Return the extras Bundle object associated with this preference, creating
399def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * a new Bundle if there currently isn't one.  You can use this to get and
400def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * set individual extra key/value pairs.
401def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     */
402def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    public Bundle getExtras() {
403def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        if (mExtras == null) {
404def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            mExtras = new Bundle();
405def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        }
406def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        return mExtras;
407def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    }
408def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn
409def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    /**
410def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * Return the extras Bundle object associated with this preference,
411def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     * returning null if there is not currently one.
412def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn     */
413def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    public Bundle peekExtras() {
414def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        return mExtras;
415def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    }
416def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn
417def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn    /**
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the layout resource that is inflated as the {@link View} to be shown
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for this Preference. In most cases, the default layout is sufficient for
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * custom Preference objects and only the widget layout needs to be changed.
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This layout should contain a {@link ViewGroup} with ID
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.id#widget_frame} to be the parent of the specific widget
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for this Preference. It should similarly contain
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.id#title} and {@link android.R.id#summary}.
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param layoutResId The layout resource ID to be inflated and returned as
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            a {@link View}.
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setWidgetLayoutResource(int)
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4317b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye    public void setLayoutResource(@LayoutRes int layoutResId) {
432a98129b9110371aa036d8fcf23fff709595b16ffAmith Yamasani        if (layoutResId != mLayoutResId) {
433a98129b9110371aa036d8fcf23fff709595b16ffAmith Yamasani            // Layout changed
434791b37e0d9375789c2930ed170d202ea728390fdAlan Viverette            mCanRecycleLayout = false;
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
436a98129b9110371aa036d8fcf23fff709595b16ffAmith Yamasani
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLayoutResId = layoutResId;
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the layout resource that will be shown as the {@link View} for this Preference.
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The layout resource ID.
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4457b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye    @LayoutRes
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getLayoutResource() {
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLayoutResId;
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
451791b37e0d9375789c2930ed170d202ea728390fdAlan Viverette     * Sets the layout for the controllable widget portion of this Preference. This
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is inflated into the main layout. For example, a {@link CheckBoxPreference}
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * would specify a custom layout (consisting of just the CheckBox) here,
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instead of creating its own main layout.
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param widgetLayoutResId The layout resource ID to be inflated into the
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            main layout.
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setLayoutResource(int)
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4607b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye    public void setWidgetLayoutResource(@LayoutRes int widgetLayoutResId) {
461a98129b9110371aa036d8fcf23fff709595b16ffAmith Yamasani        if (widgetLayoutResId != mWidgetLayoutResId) {
462a98129b9110371aa036d8fcf23fff709595b16ffAmith Yamasani            // Layout changed
463791b37e0d9375789c2930ed170d202ea728390fdAlan Viverette            mCanRecycleLayout = false;
464a98129b9110371aa036d8fcf23fff709595b16ffAmith Yamasani        }
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWidgetLayoutResId = widgetLayoutResId;
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the layout resource for the controllable widget portion of this Preference.
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The layout resource ID.
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4737b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye    @LayoutRes
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWidgetLayoutResource() {
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWidgetLayoutResId;
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the View that will be shown in the {@link PreferenceActivity}.
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param convertView The old View to reuse, if possible. Note: You should
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            check that this View is non-null and of an appropriate type
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            before using. If it is not possible to convert this View to
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            display the correct data, this method can create a new View.
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param parent The parent that this View will eventually be attached to.
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the same Preference object, for chaining multiple calls
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         into a single statement.
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateView(ViewGroup)
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onBindView(View)
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View getView(View convertView, ViewGroup parent) {
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (convertView == null) {
493bae6fc244732476d6e6b565e64518e1beafd66c6Amith Yamasani            convertView = onCreateView(parent);
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onBindView(convertView);
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return convertView;
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates the View to be shown for this Preference in the
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PreferenceActivity}. The default behavior is to inflate the main
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * layout of this Preference (see {@link #setLayoutResource(int)}. If
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * changing this behavior, please specify a {@link ViewGroup} with ID
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.id#widget_frame}.
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Make sure to call through to the superclass's implementation.
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param parent The parent that this View will eventually be attached to.
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The View that displays this Preference.
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onBindView(View)
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
512c615c6fc9caca76cd96998f86e1f1e6393aeadbbTor Norbye    @CallSuper
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected View onCreateView(ViewGroup parent) {
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final LayoutInflater layoutInflater =
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final View layout = layoutInflater.inflate(mLayoutResId, parent, false);
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani        final ViewGroup widgetFrame = (ViewGroup) layout
520405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani                .findViewById(com.android.internal.R.id.widget_frame);
521405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani        if (widgetFrame != null) {
522405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani            if (mWidgetLayoutResId != 0) {
523405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani                layoutInflater.inflate(mWidgetLayoutResId, widgetFrame);
524405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani            } else {
525405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani                widgetFrame.setVisibility(View.GONE);
526405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani            }
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return layout;
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Binds the created View to the data for this Preference.
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a good place to grab references to custom Views in the layout and
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set properties on them.
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Make sure to call through to the superclass's implementation.
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param view The View that shows this Preference.
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateView(ViewGroup)
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
542c615c6fc9caca76cd96998f86e1f1e6393aeadbbTor Norbye    @CallSuper
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onBindView(View view) {
54455565ecd46ceef91abba8bda8eddb73e75300ca3Alan Viverette        final TextView titleView = (TextView) view.findViewById(com.android.internal.R.id.title);
5450f1c3af76b719a728ed567435ea4db30a33364d2Jeff Sharkey        if (titleView != null) {
5460f1c3af76b719a728ed567435ea4db30a33364d2Jeff Sharkey            final CharSequence title = getTitle();
5470f1c3af76b719a728ed567435ea4db30a33364d2Jeff Sharkey            if (!TextUtils.isEmpty(title)) {
5480f1c3af76b719a728ed567435ea4db30a33364d2Jeff Sharkey                titleView.setText(title);
5490f1c3af76b719a728ed567435ea4db30a33364d2Jeff Sharkey                titleView.setVisibility(View.VISIBLE);
5500f1c3af76b719a728ed567435ea4db30a33364d2Jeff Sharkey            } else {
5510f1c3af76b719a728ed567435ea4db30a33364d2Jeff Sharkey                titleView.setVisibility(View.GONE);
5520f1c3af76b719a728ed567435ea4db30a33364d2Jeff Sharkey            }
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5540f1c3af76b719a728ed567435ea4db30a33364d2Jeff Sharkey
5550f1c3af76b719a728ed567435ea4db30a33364d2Jeff Sharkey        final TextView summaryView = (TextView) view.findViewById(
5560f1c3af76b719a728ed567435ea4db30a33364d2Jeff Sharkey                com.android.internal.R.id.summary);
5570f1c3af76b719a728ed567435ea4db30a33364d2Jeff Sharkey        if (summaryView != null) {
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final CharSequence summary = getSummary();
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!TextUtils.isEmpty(summary)) {
5600f1c3af76b719a728ed567435ea4db30a33364d2Jeff Sharkey                summaryView.setText(summary);
5610f1c3af76b719a728ed567435ea4db30a33364d2Jeff Sharkey                summaryView.setVisibility(View.VISIBLE);
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5630f1c3af76b719a728ed567435ea4db30a33364d2Jeff Sharkey                summaryView.setVisibility(View.GONE);
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5660f1c3af76b719a728ed567435ea4db30a33364d2Jeff Sharkey
56755565ecd46ceef91abba8bda8eddb73e75300ca3Alan Viverette        final ImageView imageView = (ImageView) view.findViewById(com.android.internal.R.id.icon);
568405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani        if (imageView != null) {
569405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani            if (mIconResId != 0 || mIcon != null) {
570405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani                if (mIcon == null) {
5718eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette                    mIcon = getContext().getDrawable(mIconResId);
572405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani                }
573405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani                if (mIcon != null) {
574405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani                    imageView.setImageDrawable(mIcon);
575405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani                }
576b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani            }
577405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani            imageView.setVisibility(mIcon != null ? View.VISIBLE : View.GONE);
578b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani        }
579405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani
58055565ecd46ceef91abba8bda8eddb73e75300ca3Alan Viverette        final View imageFrame = view.findViewById(com.android.internal.R.id.icon_frame);
58155565ecd46ceef91abba8bda8eddb73e75300ca3Alan Viverette        if (imageFrame != null) {
58255565ecd46ceef91abba8bda8eddb73e75300ca3Alan Viverette            imageFrame.setVisibility(mIcon != null ? View.VISIBLE : View.GONE);
58355565ecd46ceef91abba8bda8eddb73e75300ca3Alan Viverette        }
58455565ecd46ceef91abba8bda8eddb73e75300ca3Alan Viverette
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mShouldDisableView) {
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setEnabledStateOnViews(view, isEnabled());
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
589b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Makes sure the view (and any children) get the enabled state changed.
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void setEnabledStateOnViews(View v, boolean enabled) {
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        v.setEnabled(enabled);
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v instanceof ViewGroup) {
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ViewGroup vg = (ViewGroup) v;
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = vg.getChildCount() - 1; i >= 0; i--) {
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setEnabledStateOnViews(vg.getChildAt(i), enabled);
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the order of this Preference with respect to other
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Preference objects on the same level. If this is not specified, the
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default behavior is to sort alphabetically. The
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PreferenceGroup#setOrderingAsAdded(boolean)} can be used to order
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Preference objects based on the order they appear in the XML.
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param order The order for this Preference. A lower value will be shown
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            first. Use {@link #DEFAULT_ORDER} to sort alphabetically or
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            allow ordering from XML.
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see PreferenceGroup#setOrderingAsAdded(boolean)
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #DEFAULT_ORDER
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOrder(int order) {
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (order != mOrder) {
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOrder = order;
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Reorder the list
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            notifyHierarchyChanged();
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the order of this Preference with respect to other Preference objects
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on the same level.
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The order of this Preference.
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setOrder(int)
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getOrder() {
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOrder;
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the title for this Preference with a CharSequence.
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This title will be placed into the ID
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.id#title} within the View created by
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreateView(ViewGroup)}.
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param title The title for this Preference.
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitle(CharSequence title) {
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (title == null && mTitle != null || title != null && !title.equals(mTitle)) {
647e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn            mTitleRes = 0;
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTitle = title;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            notifyChanged();
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the title for this Preference with a resource ID.
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setTitle(CharSequence)
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param titleResId The title as a resource ID.
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6597b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye    public void setTitle(@StringRes int titleResId) {
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setTitle(mContext.getString(titleResId));
661e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn        mTitleRes = titleResId;
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
665e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn     * Returns the title resource ID of this Preference.  If the title did
666e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn     * not come from a resource, 0 is returned.
667e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn     *
668e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn     * @return The title resource.
669e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn     * @see #setTitle(int)
670e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn     */
6717b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye    @StringRes
672e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn    public int getTitleRes() {
673e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn        return mTitleRes;
674e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn    }
675e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn
676e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn    /**
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the title of this Preference.
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The title.
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setTitle(CharSequence)
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence getTitle() {
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTitle;
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
687b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     * Sets the icon for this Preference with a Drawable.
688b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     * This icon will be placed into the ID
689b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     * {@link android.R.id#icon} within the View created by
690b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     * {@link #onCreateView(ViewGroup)}.
691b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     *
692b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     * @param icon The optional icon for this Preference.
693b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     */
694b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani    public void setIcon(Drawable icon) {
695b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani        if ((icon == null && mIcon != null) || (icon != null && mIcon != icon)) {
696b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani            mIcon = icon;
697405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani
698b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani            notifyChanged();
699b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani        }
700b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani    }
701b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani
702b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani    /**
703b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     * Sets the icon for this Preference with a resource ID.
704b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     *
705b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     * @see #setIcon(Drawable)
706b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     * @param iconResId The icon as a resource ID.
707b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     */
7087b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye    public void setIcon(@DrawableRes int iconResId) {
7093695b8a1488a6cc331feba1c2ab359888656bf7cSvet Ganov        if (mIconResId != iconResId) {
7103695b8a1488a6cc331feba1c2ab359888656bf7cSvet Ganov            mIconResId = iconResId;
7113695b8a1488a6cc331feba1c2ab359888656bf7cSvet Ganov            setIcon(mContext.getDrawable(iconResId));
7123695b8a1488a6cc331feba1c2ab359888656bf7cSvet Ganov        }
713b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani    }
714b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani
715b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani    /**
716b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     * Returns the icon of this Preference.
717b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     *
718b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     * @return The icon.
719b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     * @see #setIcon(Drawable)
720b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani     */
721b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani    public Drawable getIcon() {
722b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani        return mIcon;
723b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani    }
724b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani
725b65897ba50c76e2110f5b5de455c14ca53d4069bAmith Yamasani    /**
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the summary of this Preference.
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The summary.
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setSummary(CharSequence)
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence getSummary() {
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSummary;
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the summary for this Preference with a CharSequence.
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param summary The summary for the preference.
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSummary(CharSequence summary) {
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (summary == null && mSummary != null || summary != null && !summary.equals(mSummary)) {
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSummary = summary;
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            notifyChanged();
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the summary for this Preference with a resource ID.
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setSummary(CharSequence)
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param summaryResId The summary as a resource.
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7537b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye    public void setSummary(@StringRes int summaryResId) {
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setSummary(mContext.getString(summaryResId));
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets whether this Preference is enabled. If disabled, it will
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not handle clicks.
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param enabled Set true to enable it.
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setEnabled(boolean enabled) {
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mEnabled != enabled) {
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mEnabled = enabled;
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Enabled state can change dependent preferences' states, so notify
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            notifyDependencyChange(shouldDisableDependents());
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            notifyChanged();
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checks whether this Preference should be enabled in the list.
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this Preference is enabled, false otherwise.
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isEnabled() {
78002f56803632051c202407cec01406781993752a1Alan Viverette        return mEnabled && mDependencyMet && mParentDependencyMet;
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets whether this Preference is selectable.
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selectable Set true to make it selectable.
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSelectable(boolean selectable) {
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSelectable != selectable) {
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSelectable = selectable;
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            notifyChanged();
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checks whether this Preference should be selectable in the list.
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if it is selectable, false otherwise.
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isSelectable() {
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSelectable;
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets whether this Preference should disable its view when it gets
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * disabled.
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For example, set this and {@link #setEnabled(boolean)} to false for
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * preferences that are only displaying information and 1) should not be
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * clickable 2) should not have the view set to the disabled state.
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param shouldDisableView Set true if this preference should disable its view
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            when the preference is disabled.
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setShouldDisableView(boolean shouldDisableView) {
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mShouldDisableView = shouldDisableView;
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        notifyChanged();
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checks whether this Preference should disable its view when it's action is disabled.
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setShouldDisableView(boolean)
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if it should disable the view.
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getShouldDisableView() {
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mShouldDisableView;
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a unique ID for this Preference.  This ID should be unique across all
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Preference objects in a hierarchy.
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A unique ID for this Preference.
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getId() {
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mId;
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Processes a click on the preference. This includes saving the value to
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the {@link SharedPreferences}. However, the overridden method should
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * call {@link #callChangeListener(Object)} to make sure the client wants to
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * update the preference's state with the new value.
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onClick() {
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the key for this Preference, which is used as a key to the
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SharedPreferences}. This should be unique for the package.
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param key The key for the preference.
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setKey(String key) {
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKey = key;
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mRequiresKey && !hasKey()) {
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requireKey();
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the key for this Preference, which is also the key used for storing
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * values into SharedPreferences.
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The key.
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getKey() {
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mKey;
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checks whether the key is present, and if it isn't throws an
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * exception. This should be called by subclasses that store preferences in
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the {@link SharedPreferences}.
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException If there is no key assigned.
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void requireKey() {
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mKey == null) {
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException("Preference does not have a key assigned.");
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRequiresKey = true;
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checks whether this Preference has a valid key.
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the key exists and is not a blank string, false otherwise.
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasKey() {
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return !TextUtils.isEmpty(mKey);
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checks whether this Preference is persistent. If it is, it stores its value(s) into
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the persistent {@link SharedPreferences} storage.
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if it is persistent.
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isPersistent() {
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPersistent;
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checks whether, at the given time this method is called,
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this Preference should store/restore its value(s) into the
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SharedPreferences}. This, at minimum, checks whether this
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Preference is persistent and it currently has a key. Before you
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * save/restore from the {@link SharedPreferences}, check this first.
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if it should persist the value.
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean shouldPersist() {
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPreferenceManager != null && isPersistent() && hasKey();
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets whether this Preference is persistent. When persistent,
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it stores its value(s) into the persistent {@link SharedPreferences}
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * storage.
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param persistent Set true if it should store its value(s) into the {@link SharedPreferences}.
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setPersistent(boolean persistent) {
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPersistent = persistent;
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this method after the user changes the preference, but before the
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * internal state is set. This allows the client to ignore the user value.
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param newValue The new value of this Preference.
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the user value should be set as the preference
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         value (and persisted).
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean callChangeListener(Object newValue) {
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnChangeListener == null ? true : mOnChangeListener.onPreferenceChange(this, newValue);
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the callback to be invoked when this Preference is changed by the
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * user (but before the internal state has been updated).
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param onPreferenceChangeListener The callback to be invoked.
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOnPreferenceChangeListener(OnPreferenceChangeListener onPreferenceChangeListener) {
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnChangeListener = onPreferenceChangeListener;
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the callback to be invoked when this Preference is changed by the
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * user (but before the internal state has been updated).
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The callback to be invoked.
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public OnPreferenceChangeListener getOnPreferenceChangeListener() {
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnChangeListener;
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the callback to be invoked when this Preference is clicked.
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param onPreferenceClickListener The callback to be invoked.
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOnPreferenceClickListener(OnPreferenceClickListener onPreferenceClickListener) {
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnClickListener = onPreferenceClickListener;
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the callback to be invoked when this Preference is clicked.
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The callback to be invoked.
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public OnPreferenceClickListener getOnPreferenceClickListener() {
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnClickListener;
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when a click should be performed.
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param preferenceScreen A {@link PreferenceScreen} whose hierarchy click
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            listener should be called in the proper order (between other
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            processing). May be null.
98637ae5586761993a5e9cede6f6c41609b5c63cc29Justin Koh     * @hide
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
98837ae5586761993a5e9cede6f6c41609b5c63cc29Justin Koh    public void performClick(PreferenceScreen preferenceScreen) {
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isEnabled()) {
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onClick();
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnClickListener != null && mOnClickListener.onPreferenceClick(this)) {
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PreferenceManager preferenceManager = getPreferenceManager();
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (preferenceManager != null) {
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PreferenceManager.OnPreferenceTreeClickListener listener = preferenceManager
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .getOnPreferenceTreeClickListener();
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (preferenceScreen != null && listener != null
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && listener.onPreferenceTreeClick(preferenceScreen, this)) {
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mIntent != null) {
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Context context = getContext();
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            context.startActivity(mIntent);
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1015014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck
1016014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck    /**
1017014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck     * Allows a Preference to intercept key events without having focus.
1018014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck     * For example, SeekBarPreference uses this to intercept +/- to adjust
1019014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck     * the progress.
1020014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck     * @return True if the Preference handled the key. Returns false by default.
1021014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck     * @hide
1022014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck     */
1023014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck    public boolean onKey(View v, int keyCode, KeyEvent event) {
1024014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck        return false;
1025014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck    }
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the {@link android.content.Context} of this Preference.
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Each Preference in a Preference hierarchy can be
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from different Context (for example, if multiple activities provide preferences into a single
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PreferenceActivity}). This Context will be used to save the Preference values.
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The Context of this Preference.
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context getContext() {
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mContext;
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the {@link SharedPreferences} where this Preference can read its
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value(s). Usually, it's easier to use one of the helper read methods:
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getPersistedBoolean(boolean)}, {@link #getPersistedFloat(float)},
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getPersistedInt(int)}, {@link #getPersistedLong(long)},
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getPersistedString(String)}. To save values, see
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getEditor()}.
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In some cases, writes to the {@link #getEditor()} will not be committed
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * right away and hence not show up in the returned
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SharedPreferences}, this is intended behavior to improve
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * performance.
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The {@link SharedPreferences} where this Preference reads its
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         value(s), or null if it isn't attached to a Preference hierarchy.
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getEditor()
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SharedPreferences getSharedPreferences() {
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPreferenceManager == null) {
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPreferenceManager.getSharedPreferences();
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns an {@link SharedPreferences.Editor} where this Preference can
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * save its value(s). Usually it's easier to use one of the helper save
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * methods: {@link #persistBoolean(boolean)}, {@link #persistFloat(float)},
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #persistInt(int)}, {@link #persistLong(long)},
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #persistString(String)}. To read values, see
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getSharedPreferences()}. If {@link #shouldCommit()} returns
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * true, it is this Preference's responsibility to commit.
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In some cases, writes to this will not be committed right away and hence
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not show up in the SharedPreferences, this is intended behavior to
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * improve performance.
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A {@link SharedPreferences.Editor} where this preference saves
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         its value(s), or null if it isn't attached to a Preference
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         hierarchy.
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #shouldCommit()
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getSharedPreferences()
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SharedPreferences.Editor getEditor() {
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPreferenceManager == null) {
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPreferenceManager.getEditor();
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns whether the {@link Preference} should commit its saved value(s) in
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getEditor()}. This may return false in situations where batch
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * committing is being done (by the manager) to improve performance.
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether the Preference should commit its saved value(s).
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getEditor()
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean shouldCommit() {
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPreferenceManager == null) {
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPreferenceManager.shouldCommit();
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Compares Preference objects based on order (if set), otherwise alphabetically on the titles.
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param another The Preference to compare to this one.
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return 0 if the same; less than 0 if this Preference sorts ahead of <var>another</var>;
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *          greater than 0 if this Preference sorts after <var>another</var>.
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
111475af171006ee80aaf7cfb56ded1378afe0084ccaJeff Brown    @Override
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int compareTo(Preference another) {
111675af171006ee80aaf7cfb56ded1378afe0084ccaJeff Brown        if (mOrder != another.mOrder) {
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Do order comparison
111875af171006ee80aaf7cfb56ded1378afe0084ccaJeff Brown            return mOrder - another.mOrder;
1119b2e61e44e9cd1fa2974784e819f13b5ce72088f5Carsten Hauge        } else if (mTitle == another.mTitle) {
1120b2e61e44e9cd1fa2974784e819f13b5ce72088f5Carsten Hauge            // If titles are null or share same object comparison
1121b2e61e44e9cd1fa2974784e819f13b5ce72088f5Carsten Hauge            return 0;
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mTitle == null) {
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 1;
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (another.mTitle == null) {
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return -1;
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Do name comparison
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return CharSequences.compareToIgnoreCase(mTitle, another.mTitle);
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the internal change listener.
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param listener The listener.
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #notifyChanged()
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setOnPreferenceChangeInternalListener(OnPreferenceChangeInternalListener listener) {
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mListener = listener;
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Should be called when the data of this {@link Preference} has changed.
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void notifyChanged() {
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mListener != null) {
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mListener.onPreferenceChange(this);
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Should be called when a Preference has been
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * added/removed from this group, or the ordering should be
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * re-evaluated.
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void notifyHierarchyChanged() {
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mListener != null) {
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mListener.onPreferenceHierarchyChange(this);
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the {@link PreferenceManager} that manages this Preference object's tree.
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The {@link PreferenceManager}.
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PreferenceManager getPreferenceManager() {
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPreferenceManager;
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when this Preference has been attached to a Preference hierarchy.
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Make sure to call the super implementation.
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param preferenceManager The PreferenceManager of the hierarchy.
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onAttachedToHierarchy(PreferenceManager preferenceManager) {
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPreferenceManager = preferenceManager;
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mId = preferenceManager.getNextId();
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchSetInitialValue();
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the Preference hierarchy has been attached to the
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PreferenceActivity}. This can also be called when this
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Preference has been attached to a group that was already attached
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the {@link PreferenceActivity}.
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onAttachedToActivity() {
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // At this point, the hierarchy that this preference is in is connected
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // with all other preferences.
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        registerDependency();
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void registerDependency() {
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (TextUtils.isEmpty(mDependencyKey)) return;
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Preference preference = findPreferenceInHierarchy(mDependencyKey);
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (preference != null) {
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            preference.registerDependent(this);
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException("Dependency \"" + mDependencyKey
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + "\" not found for preference \"" + mKey + "\" (title: \"" + mTitle + "\"");
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void unregisterDependency() {
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDependencyKey != null) {
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Preference oldDependency = findPreferenceInHierarchy(mDependencyKey);
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (oldDependency != null) {
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                oldDependency.unregisterDependent(this);
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Finds a Preference in this hierarchy (the whole thing,
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * even above/below your {@link PreferenceScreen} screen break) with the given
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key.
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This only functions after we have been attached to a hierarchy.
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param key The key of the Preference to find.
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The Preference that uses the given key.
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Preference findPreferenceInHierarchy(String key) {
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (TextUtils.isEmpty(key) || mPreferenceManager == null) {
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPreferenceManager.findPreference(key);
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Adds a dependent Preference on this Preference so we can notify it.
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Usually, the dependent Preference registers itself (it's good for it to
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * know it depends on something), so please use
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Preference#setDependency(String)} on the dependent Preference.
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dependent The dependent Preference that will be enabled/disabled
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            according to the state of this Preference.
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void registerDependent(Preference dependent) {
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDependents == null) {
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDependents = new ArrayList<Preference>();
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDependents.add(dependent);
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dependent.onDependencyChanged(this, shouldDisableDependents());
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Removes a dependent Preference on this Preference.
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dependent The dependent Preference that will be enabled/disabled
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            according to the state of this Preference.
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the same Preference object, for chaining multiple calls
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         into a single statement.
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void unregisterDependent(Preference dependent) {
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDependents != null) {
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDependents.remove(dependent);
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Notifies any listening dependents of a change that affects the
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * dependency.
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param disableDependents Whether this Preference should disable
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            its dependents.
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notifyDependencyChange(boolean disableDependents) {
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final List<Preference> dependents = mDependents;
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dependents == null) {
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int dependentsCount = dependents.size();
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < dependentsCount; i++) {
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dependents.get(i).onDependencyChanged(this, disableDependents);
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the dependency changes.
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dependency The Preference that this Preference depends on.
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param disableDependent Set true to disable this Preference.
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onDependencyChanged(Preference dependency, boolean disableDependent) {
1297da53eca79e02ac70761c379f9f2cb3babce9e79dMichael Chan        if (mDependencyMet == disableDependent) {
1298da53eca79e02ac70761c379f9f2cb3babce9e79dMichael Chan            mDependencyMet = !disableDependent;
1299da53eca79e02ac70761c379f9f2cb3babce9e79dMichael Chan
1300da53eca79e02ac70761c379f9f2cb3babce9e79dMichael Chan            // Enabled state can change dependent preferences' states, so notify
1301da53eca79e02ac70761c379f9f2cb3babce9e79dMichael Chan            notifyDependencyChange(shouldDisableDependents());
1302da53eca79e02ac70761c379f9f2cb3babce9e79dMichael Chan
1303da53eca79e02ac70761c379f9f2cb3babce9e79dMichael Chan            notifyChanged();
1304da53eca79e02ac70761c379f9f2cb3babce9e79dMichael Chan        }
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
130602f56803632051c202407cec01406781993752a1Alan Viverette
130702f56803632051c202407cec01406781993752a1Alan Viverette    /**
130802f56803632051c202407cec01406781993752a1Alan Viverette     * Called when the implicit parent dependency changes.
130902f56803632051c202407cec01406781993752a1Alan Viverette     *
131002f56803632051c202407cec01406781993752a1Alan Viverette     * @param parent The Preference that this Preference depends on.
131102f56803632051c202407cec01406781993752a1Alan Viverette     * @param disableChild Set true to disable this Preference.
131202f56803632051c202407cec01406781993752a1Alan Viverette     */
131302f56803632051c202407cec01406781993752a1Alan Viverette    public void onParentChanged(Preference parent, boolean disableChild) {
131402f56803632051c202407cec01406781993752a1Alan Viverette        if (mParentDependencyMet == disableChild) {
131502f56803632051c202407cec01406781993752a1Alan Viverette            mParentDependencyMet = !disableChild;
131602f56803632051c202407cec01406781993752a1Alan Viverette
131702f56803632051c202407cec01406781993752a1Alan Viverette            // Enabled state can change dependent preferences' states, so notify
131802f56803632051c202407cec01406781993752a1Alan Viverette            notifyDependencyChange(shouldDisableDependents());
131902f56803632051c202407cec01406781993752a1Alan Viverette
132002f56803632051c202407cec01406781993752a1Alan Viverette            notifyChanged();
132102f56803632051c202407cec01406781993752a1Alan Viverette        }
132202f56803632051c202407cec01406781993752a1Alan Viverette    }
132302f56803632051c202407cec01406781993752a1Alan Viverette
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checks whether this preference's dependents should currently be
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * disabled.
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the dependents should be disabled, otherwise false.
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean shouldDisableDependents() {
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return !isEnabled();
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the key of a Preference that this Preference will depend on. If that
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Preference is not set or is off, this Preference will be disabled.
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dependencyKey The key of the Preference that this depends on.
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDependency(String dependencyKey) {
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Unregister the old dependency, if we had one
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unregisterDependency();
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Register the new
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDependencyKey = dependencyKey;
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        registerDependency();
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the key of the dependency on this Preference.
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The key of the dependency.
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDependency(String)
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getDependency() {
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDependencyKey;
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when this Preference is being removed from the hierarchy. You
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should remove any references to this Preference that you know about. Make
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * sure to call through to the superclass implementation.
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1364c615c6fc9caca76cd96998f86e1f1e6393aeadbbTor Norbye    @CallSuper
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPrepareForRemoval() {
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unregisterDependency();
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the default value for this Preference, which will be set either if
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * persistence is off or persistence is on and the preference is not found
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the persistent storage.
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param defaultValue The default value.
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDefaultValue(Object defaultValue) {
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDefaultValue = defaultValue;
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void dispatchSetInitialValue() {
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // By now, we know if we are persistent.
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean shouldPersist = shouldPersist();
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!shouldPersist || !getSharedPreferences().contains(mKey)) {
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDefaultValue != null) {
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onSetInitialValue(false, mDefaultValue);
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onSetInitialValue(true, null);
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Implement this to set the initial value of the Preference.
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If <var>restorePersistedValue</var> is true, you should restore the
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Preference value from the {@link android.content.SharedPreferences}. If
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>restorePersistedValue</var> is false, you should set the Preference
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value to defaultValue that is given (and possibly store to SharedPreferences
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if {@link #shouldPersist()} is true).
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This may not always be called. One example is if it should not persist
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * but there is no default value given.
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param restorePersistedValue True to restore the persisted value;
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            false to use the given <var>defaultValue</var>.
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param defaultValue The default value for this Preference. Only use this
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            if <var>restorePersistedValue</var> is false.
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void tryCommit(SharedPreferences.Editor editor) {
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPreferenceManager.shouldCommit()) {
1414dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick            try {
1415dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick                editor.apply();
1416dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick            } catch (AbstractMethodError unused) {
1417dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick                // The app injected its own pre-Gingerbread
1418dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick                // SharedPreferences.Editor implementation without
1419dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick                // an apply method.
1420dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick                editor.commit();
1421dd644c179c1bf47d82d776d7f644e4fc1467159dBrad Fitzpatrick            }
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Attempts to persist a String to the {@link android.content.SharedPreferences}.
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This will check if this Preference is persistent, get an editor from
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the {@link PreferenceManager}, put in the string, and check if we should commit (and
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * commit if so).
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param value The value to persist.
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the Preference is persistent. (This is not whether the
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         value was persisted, since we may not necessarily commit if there
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         will be a batch commit later.)
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getPersistedString(String)
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean persistString(String value) {
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (shouldPersist()) {
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Shouldn't store null
1441c3e1c2148209658829e66e6f3f109d8b9227c597Andreas Gampe            if (TextUtils.equals(value, getPersistedString(null))) {
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // It's already there, so the same as persisting
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SharedPreferences.Editor editor = mPreferenceManager.getEditor();
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            editor.putString(mKey, value);
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tryCommit(editor);
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Attempts to get a persisted String from the {@link android.content.SharedPreferences}.
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This will check if this Preference is persistent, get the SharedPreferences
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from the {@link PreferenceManager}, and get the value.
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param defaultReturnValue The default value to return if either the
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            Preference is not persistent or the Preference is not in the
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            shared preferences.
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The value from the SharedPreferences or the default return
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         value.
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #persistString(String)
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected String getPersistedString(String defaultReturnValue) {
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!shouldPersist()) {
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defaultReturnValue;
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPreferenceManager.getSharedPreferences().getString(mKey, defaultReturnValue);
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1476212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * Attempts to persist a set of Strings to the {@link android.content.SharedPreferences}.
1477212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * <p>
1478212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * This will check if this Preference is persistent, get an editor from
1479212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * the {@link PreferenceManager}, put in the strings, and check if we should commit (and
1480212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * commit if so).
1481212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
1482212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param values The values to persist.
1483212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @return True if the Preference is persistent. (This is not whether the
1484212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *         value was persisted, since we may not necessarily commit if there
1485212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *         will be a batch commit later.)
1486212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #getPersistedString(Set)
1487212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
1488212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @hide Pending API approval
1489212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     */
1490212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    protected boolean persistStringSet(Set<String> values) {
1491212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        if (shouldPersist()) {
1492212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            // Shouldn't store null
1493212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            if (values.equals(getPersistedStringSet(null))) {
1494212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                // It's already there, so the same as persisting
1495212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                return true;
1496212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            }
1497212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
1498212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            SharedPreferences.Editor editor = mPreferenceManager.getEditor();
1499212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            editor.putStringSet(mKey, values);
1500212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            tryCommit(editor);
1501212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            return true;
1502212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
1503212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        return false;
1504212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    }
1505212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
1506212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    /**
1507212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * Attempts to get a persisted set of Strings from the
1508212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * {@link android.content.SharedPreferences}.
1509212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * <p>
1510212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * This will check if this Preference is persistent, get the SharedPreferences
1511212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * from the {@link PreferenceManager}, and get the value.
1512212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
1513212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param defaultReturnValue The default value to return if either the
1514212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *            Preference is not persistent or the Preference is not in the
1515212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *            shared preferences.
1516212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @return The value from the SharedPreferences or the default return
1517212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *         value.
1518212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #persistStringSet(Set)
1519212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
1520212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @hide Pending API approval
1521212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     */
1522212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    protected Set<String> getPersistedStringSet(Set<String> defaultReturnValue) {
1523212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        if (!shouldPersist()) {
1524212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            return defaultReturnValue;
1525212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
1526212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
1527212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        return mPreferenceManager.getSharedPreferences().getStringSet(mKey, defaultReturnValue);
1528212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    }
1529212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
1530212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    /**
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Attempts to persist an int to the {@link android.content.SharedPreferences}.
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param value The value to persist.
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the Preference is persistent. (This is not whether the
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         value was persisted, since we may not necessarily commit if there
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         will be a batch commit later.)
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #persistString(String)
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getPersistedInt(int)
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean persistInt(int value) {
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (shouldPersist()) {
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value == getPersistedInt(~value)) {
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // It's already there, so the same as persisting
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SharedPreferences.Editor editor = mPreferenceManager.getEditor();
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            editor.putInt(mKey, value);
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tryCommit(editor);
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Attempts to get a persisted int from the {@link android.content.SharedPreferences}.
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param defaultReturnValue The default value to return if either this
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            Preference is not persistent or this Preference is not in the
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            SharedPreferences.
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The value from the SharedPreferences or the default return
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         value.
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getPersistedString(String)
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #persistInt(int)
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int getPersistedInt(int defaultReturnValue) {
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!shouldPersist()) {
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defaultReturnValue;
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPreferenceManager.getSharedPreferences().getInt(mKey, defaultReturnValue);
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Attempts to persist a float to the {@link android.content.SharedPreferences}.
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param value The value to persist.
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this Preference is persistent. (This is not whether the
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         value was persisted, since we may not necessarily commit if there
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         will be a batch commit later.)
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #persistString(String)
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getPersistedFloat(float)
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean persistFloat(float value) {
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (shouldPersist()) {
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value == getPersistedFloat(Float.NaN)) {
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // It's already there, so the same as persisting
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SharedPreferences.Editor editor = mPreferenceManager.getEditor();
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            editor.putFloat(mKey, value);
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tryCommit(editor);
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Attempts to get a persisted float from the {@link android.content.SharedPreferences}.
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param defaultReturnValue The default value to return if either this
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            Preference is not persistent or this Preference is not in the
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            SharedPreferences.
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The value from the SharedPreferences or the default return
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         value.
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getPersistedString(String)
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #persistFloat(float)
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected float getPersistedFloat(float defaultReturnValue) {
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!shouldPersist()) {
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defaultReturnValue;
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPreferenceManager.getSharedPreferences().getFloat(mKey, defaultReturnValue);
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Attempts to persist a long to the {@link android.content.SharedPreferences}.
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param value The value to persist.
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this Preference is persistent. (This is not whether the
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         value was persisted, since we may not necessarily commit if there
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         will be a batch commit later.)
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #persistString(String)
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getPersistedLong(long)
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean persistLong(long value) {
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (shouldPersist()) {
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value == getPersistedLong(~value)) {
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // It's already there, so the same as persisting
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SharedPreferences.Editor editor = mPreferenceManager.getEditor();
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            editor.putLong(mKey, value);
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tryCommit(editor);
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Attempts to get a persisted long from the {@link android.content.SharedPreferences}.
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param defaultReturnValue The default value to return if either this
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            Preference is not persistent or this Preference is not in the
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            SharedPreferences.
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The value from the SharedPreferences or the default return
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         value.
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getPersistedString(String)
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #persistLong(long)
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected long getPersistedLong(long defaultReturnValue) {
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!shouldPersist()) {
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defaultReturnValue;
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPreferenceManager.getSharedPreferences().getLong(mKey, defaultReturnValue);
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Attempts to persist a boolean to the {@link android.content.SharedPreferences}.
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param value The value to persist.
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this Preference is persistent. (This is not whether the
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         value was persisted, since we may not necessarily commit if there
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         will be a batch commit later.)
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #persistString(String)
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getPersistedBoolean(boolean)
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean persistBoolean(boolean value) {
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (shouldPersist()) {
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value == getPersistedBoolean(!value)) {
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // It's already there, so the same as persisting
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SharedPreferences.Editor editor = mPreferenceManager.getEditor();
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            editor.putBoolean(mKey, value);
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tryCommit(editor);
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Attempts to get a persisted boolean from the {@link android.content.SharedPreferences}.
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param defaultReturnValue The default value to return if either this
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            Preference is not persistent or this Preference is not in the
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            SharedPreferences.
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The value from the SharedPreferences or the default return
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         value.
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getPersistedString(String)
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #persistBoolean(boolean)
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean getPersistedBoolean(boolean defaultReturnValue) {
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!shouldPersist()) {
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defaultReturnValue;
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPreferenceManager.getSharedPreferences().getBoolean(mKey, defaultReturnValue);
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1706791b37e0d9375789c2930ed170d202ea728390fdAlan Viverette    boolean canRecycleLayout() {
1707791b37e0d9375789c2930ed170d202ea728390fdAlan Viverette        return mCanRecycleLayout;
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getFilterableStringBuilder().toString();
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the text that will be used to filter this Preference depending on
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * user input.
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If overridding and calling through to the superclass, make sure to prepend
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * your additions with a space.
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Text as a {@link StringBuilder} that will be used to filter this
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         preference. By default, this is the title and summary
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         (concatenated with a space).
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    StringBuilder getFilterableStringBuilder() {
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder();
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CharSequence title = getTitle();
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!TextUtils.isEmpty(title)) {
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sb.append(title).append(' ');
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CharSequence summary = getSummary();
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!TextUtils.isEmpty(summary)) {
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sb.append(summary).append(' ');
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17360bb9960598067f3320cdae8ab42c1ba0f3376f21Tammo Spalink        if (sb.length() > 0) {
17370bb9960598067f3320cdae8ab42c1ba0f3376f21Tammo Spalink            // Drop the last space
17380bb9960598067f3320cdae8ab42c1ba0f3376f21Tammo Spalink            sb.setLength(sb.length() - 1);
17390bb9960598067f3320cdae8ab42c1ba0f3376f21Tammo Spalink        }
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sb;
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Store this Preference hierarchy's frozen state into the given container.
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param container The Bundle in which to save the instance of this Preference.
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #restoreHierarchyState
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void saveHierarchyState(Bundle container) {
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchSaveInstanceState(container);
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by {@link #saveHierarchyState} to store the instance for this Preference and its children.
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * May be overridden to modify how the save happens for children. For example, some
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Preference objects may want to not store an instance for their children.
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param container The Bundle in which to save the instance of this Preference.
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #saveHierarchyState
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dispatchSaveInstanceState(Bundle container) {
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hasKey()) {
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBaseMethodCalled = false;
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcelable state = onSaveInstanceState();
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mBaseMethodCalled) {
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalStateException(
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Derived class did not call super.onSaveInstanceState()");
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (state != null) {
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                container.putParcelable(mKey, state);
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Hook allowing a Preference to generate a representation of its internal
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * state that can later be used to create a new instance with that same
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * state. This state should only contain information that is not persistent
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or can be reconstructed later.
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A Parcelable object containing the current dynamic state of
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         this Preference, or null if there is nothing interesting to save.
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         The default implementation returns null.
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #saveHierarchyState
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Parcelable onSaveInstanceState() {
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBaseMethodCalled = true;
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return BaseSavedState.EMPTY_STATE;
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Restore this Preference hierarchy's previously saved state from the given container.
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param container The Bundle that holds the previously saved state.
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #saveHierarchyState
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void restoreHierarchyState(Bundle container) {
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchRestoreInstanceState(container);
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by {@link #restoreHierarchyState} to retrieve the saved state for this
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Preference and its children. May be overridden to modify how restoring
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * happens to the children of a Preference. For example, some Preference objects may
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not want to save state for their children.
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param container The Bundle that holds the previously saved state.
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #restoreHierarchyState
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dispatchRestoreInstanceState(Bundle container) {
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hasKey()) {
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcelable state = container.getParcelable(mKey);
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (state != null) {
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mBaseMethodCalled = false;
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onRestoreInstanceState(state);
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mBaseMethodCalled) {
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new IllegalStateException(
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "Derived class did not call super.onRestoreInstanceState()");
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Hook allowing a Preference to re-apply a representation of its internal
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * state that had previously been generated by {@link #onSaveInstanceState}.
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This function will never be called with a null state.
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param state The saved state that had previously been returned by
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #onSaveInstanceState}.
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #restoreHierarchyState
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onRestoreInstanceState(Parcelable state) {
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBaseMethodCalled = true;
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (state != BaseSavedState.EMPTY_STATE && state != null) {
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("Wrong state class -- expecting Preference State");
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A base class for managing the instance state of a {@link Preference}.
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class BaseSavedState extends AbsSavedState {
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BaseSavedState(Parcel source) {
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(source);
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BaseSavedState(Parcelable superState) {
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(superState);
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Parcelable.Creator<BaseSavedState> CREATOR =
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new Parcelable.Creator<BaseSavedState>() {
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BaseSavedState createFromParcel(Parcel in) {
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new BaseSavedState(in);
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BaseSavedState[] newArray(int size) {
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new BaseSavedState[size];
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1874