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
197b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.ArrayRes;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.AlertDialog.Builder;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.DialogInterface;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
2694c02a1a1a6d7e6900e5a459e9cc699b9510e5a2Alan Viveretteimport android.text.TextUtils;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A {@link Preference} that displays a list of entries as
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a dialog.
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This preference will store a string into the SharedPreferences. This string will be the value
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the {@link #setEntryValues(CharSequence[])} array.
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ListPreference_entries
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ListPreference_entryValues
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ListPreference extends DialogPreference {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence[] mEntries;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence[] mEntryValues;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mValue;
43ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    private String mSummary;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mClickedDialogEntryIndex;
4594c02a1a1a6d7e6900e5a459e9cc699b9510e5a2Alan Viverette    private boolean mValueSet;
46617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette
47617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    public ListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
48617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        super(context, attrs, defStyleAttr, defStyleRes);
49617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette
50617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        TypedArray a = context.obtainStyledAttributes(
51617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette                attrs, com.android.internal.R.styleable.ListPreference, defStyleAttr, defStyleRes);
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEntries = a.getTextArray(com.android.internal.R.styleable.ListPreference_entries);
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEntryValues = a.getTextArray(com.android.internal.R.styleable.ListPreference_entryValues);
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
55ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root
56ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        /* Retrieve the Preference summary attribute since it's private
57ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root         * in the Preference class.
58ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root         */
59ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        a = context.obtainStyledAttributes(attrs,
60617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette                com.android.internal.R.styleable.Preference, defStyleAttr, defStyleRes);
61ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        mSummary = a.getString(com.android.internal.R.styleable.Preference_summary);
62ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        a.recycle();
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
64ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root
65617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    public ListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
66617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        this(context, attrs, defStyleAttr, 0);
67617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    }
68617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette
69617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    public ListPreference(Context context, AttributeSet attrs) {
70599d2a49e84bf0a4ee752e263a2c29d2ae942c3eAlan Viverette        this(context, attrs, com.android.internal.R.attr.dialogPreferenceStyle);
71617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    }
72617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ListPreference(Context context) {
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context, null);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the human-readable entries to be shown in the list. This will be
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * shown in subsequent dialogs.
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Each entry must have a corresponding index in
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setEntryValues(CharSequence[])}.
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param entries The entries.
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setEntryValues(CharSequence[])
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setEntries(CharSequence[] entries) {
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEntries = entries;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setEntries(CharSequence[])
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param entriesResId The entries array as a resource.
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
957b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye    public void setEntries(@ArrayRes int entriesResId) {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setEntries(getContext().getResources().getTextArray(entriesResId));
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The list of entries to be shown in the list in subsequent dialogs.
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The list as an array.
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence[] getEntries() {
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mEntries;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The array to find the value to save for a preference when an entry from
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * entries is selected. If a user clicks on the second item in entries, the
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * second item in this array will be saved to the preference.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param entryValues The array to be used as values to save for the preference.
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setEntryValues(CharSequence[] entryValues) {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEntryValues = entryValues;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setEntryValues(CharSequence[])
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param entryValuesResId The entry values array as a resource.
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1237b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye    public void setEntryValues(@ArrayRes int entryValuesResId) {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setEntryValues(getContext().getResources().getTextArray(entryValuesResId));
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the array of values to be saved for the preference.
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The array of values.
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence[] getEntryValues() {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mEntryValues;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the value of the key. This should be one of the entries in
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getEntryValues()}.
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param value The value to set for the key.
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setValue(String value) {
14394c02a1a1a6d7e6900e5a459e9cc699b9510e5a2Alan Viverette        // Always persist/notify the first time.
14494c02a1a1a6d7e6900e5a459e9cc699b9510e5a2Alan Viverette        final boolean changed = !TextUtils.equals(mValue, value);
14594c02a1a1a6d7e6900e5a459e9cc699b9510e5a2Alan Viverette        if (changed || !mValueSet) {
14694c02a1a1a6d7e6900e5a459e9cc699b9510e5a2Alan Viverette            mValue = value;
14794c02a1a1a6d7e6900e5a459e9cc699b9510e5a2Alan Viverette            mValueSet = true;
14894c02a1a1a6d7e6900e5a459e9cc699b9510e5a2Alan Viverette            persistString(value);
14994c02a1a1a6d7e6900e5a459e9cc699b9510e5a2Alan Viverette            if (changed) {
15094c02a1a1a6d7e6900e5a459e9cc699b9510e5a2Alan Viverette                notifyChanged();
15194c02a1a1a6d7e6900e5a459e9cc699b9510e5a2Alan Viverette            }
15294c02a1a1a6d7e6900e5a459e9cc699b9510e5a2Alan Viverette        }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
156ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * Returns the summary of this ListPreference. If the summary
157ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * has a {@linkplain java.lang.String#format String formatting}
158ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * marker in it (i.e. "%s" or "%1$s"), then the current entry
159ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * value will be substituted in its place.
160ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     *
161ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * @return the summary with appropriate string substitution
162ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     */
163ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    @Override
164ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    public CharSequence getSummary() {
165ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        final CharSequence entry = getEntry();
16613e13ddd4e3d1e7c10b55b6e3fe47d6bfd317ed3Alan Viverette        if (mSummary == null) {
167ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root            return super.getSummary();
168ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        } else {
16913e13ddd4e3d1e7c10b55b6e3fe47d6bfd317ed3Alan Viverette            return String.format(mSummary, entry == null ? "" : entry);
170ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        }
171ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    }
172ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root
173ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    /**
174ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * Sets the summary for this Preference with a CharSequence.
175ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * If the summary has a
176ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * {@linkplain java.lang.String#format String formatting}
177ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * marker in it (i.e. "%s" or "%1$s"), then the current entry
178ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * value will be substituted in its place when it's retrieved.
179ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     *
180ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * @param summary The summary for the preference.
181ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     */
182ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    @Override
183ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    public void setSummary(CharSequence summary) {
184ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        super.setSummary(summary);
185ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        if (summary == null && mSummary != null) {
186ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root            mSummary = null;
187ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        } else if (summary != null && !summary.equals(mSummary)) {
188ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root            mSummary = summary.toString();
189ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        }
190ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    }
191ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root
192ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    /**
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the value to the given index from the entry values.
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param index The index of the value to set.
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setValueIndex(int index) {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mEntryValues != null) {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setValue(mEntryValues[index].toString());
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the value of the key. This should be one of the entries in
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getEntryValues()}.
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The value of the key.
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getValue() {
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mValue;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the entry corresponding to the current value.
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The entry corresponding to the current value, or null.
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence getEntry() {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int index = getValueIndex();
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return index >= 0 && mEntries != null ? mEntries[index] : null;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the index of the given value (in the entry values array).
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param value The value whose index should be returned.
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The index of the value, or -1 if not found.
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int findIndexOfValue(String value) {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null && mEntryValues != null) {
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = mEntryValues.length - 1; i >= 0; i--) {
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mEntryValues[i].equals(value)) {
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return i;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int getValueIndex() {
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return findIndexOfValue(mValue);
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPrepareDialogBuilder(Builder builder) {
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onPrepareDialogBuilder(builder);
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mEntries == null || mEntryValues == null) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException(
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "ListPreference requires an entries array and an entryValues array.");
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mClickedDialogEntryIndex = getValueIndex();
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        builder.setSingleChoiceItems(mEntries, mClickedDialogEntryIndex,
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new DialogInterface.OnClickListener() {
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    public void onClick(DialogInterface dialog, int which) {
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mClickedDialogEntryIndex = which;
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        /*
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         * Clicking on an item simulates the positive button
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         * click, and dismisses the dialog.
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         */
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ListPreference.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        dialog.dismiss();
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        });
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The typical interaction for list-based dialogs is to have
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * click-on-an-item dismiss the dialog instead of the user having to
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * press 'Ok'.
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        builder.setPositiveButton(null, null);
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onDialogClosed(boolean positiveResult) {
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onDialogClosed(positiveResult);
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (positiveResult && mClickedDialogEntryIndex >= 0 && mEntryValues != null) {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String value = mEntryValues[mClickedDialogEntryIndex].toString();
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (callChangeListener(value)) {
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setValue(value);
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Object onGetDefaultValue(TypedArray a, int index) {
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a.getString(index);
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setValue(restoreValue ? getPersistedString(mValue) : (String) defaultValue);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Parcelable onSaveInstanceState() {
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Parcelable superState = super.onSaveInstanceState();
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isPersistent()) {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // No need to save instance state since it's persistent
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return superState;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final SavedState myState = new SavedState(superState);
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        myState.value = getValue();
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return myState;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onRestoreInstanceState(Parcelable state) {
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (state == null || !state.getClass().equals(SavedState.class)) {
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Didn't save state for us in onSaveInstanceState
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.onRestoreInstanceState(state);
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SavedState myState = (SavedState) state;
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onRestoreInstanceState(myState.getSuperState());
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setValue(myState.value);
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static class SavedState extends BaseSavedState {
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String value;
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public SavedState(Parcel source) {
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(source);
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            value = source.readString();
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void writeToParcel(Parcel dest, int flags) {
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.writeToParcel(dest, flags);
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeString(value);
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public SavedState(Parcelable superState) {
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(superState);
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Parcelable.Creator<SavedState> CREATOR =
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new Parcelable.Creator<SavedState>() {
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public SavedState createFromParcel(Parcel in) {
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new SavedState(in);
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public SavedState[] newArray(int size) {
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new SavedState[size];
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
355