19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.preference;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
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;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A {@link Preference} that displays a list of entries as
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a dialog.
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This preference will store a string into the SharedPreferences. This string will be the value
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the {@link #setEntryValues(CharSequence[])} array.
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ListPreference_entries
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ListPreference_entryValues
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ListPreference extends DialogPreference {
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence[] mEntries;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence[] mEntryValues;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mValue;
42ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    private String mSummary;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mClickedDialogEntryIndex;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ListPreference(Context context, AttributeSet attrs) {
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context, attrs);
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray a = context.obtainStyledAttributes(attrs,
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.ListPreference, 0, 0);
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEntries = a.getTextArray(com.android.internal.R.styleable.ListPreference_entries);
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEntryValues = a.getTextArray(com.android.internal.R.styleable.ListPreference_entryValues);
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
53ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root
54ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        /* Retrieve the Preference summary attribute since it's private
55ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root         * in the Preference class.
56ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root         */
57ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        a = context.obtainStyledAttributes(attrs,
58ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root                com.android.internal.R.styleable.Preference, 0, 0);
59ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        mSummary = a.getString(com.android.internal.R.styleable.Preference_summary);
60ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        a.recycle();
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
62ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ListPreference(Context context) {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context, null);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the human-readable entries to be shown in the list. This will be
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * shown in subsequent dialogs.
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Each entry must have a corresponding index in
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setEntryValues(CharSequence[])}.
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param entries The entries.
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setEntryValues(CharSequence[])
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setEntries(CharSequence[] entries) {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEntries = entries;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setEntries(CharSequence[])
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param entriesResId The entries array as a resource.
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setEntries(int entriesResId) {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setEntries(getContext().getResources().getTextArray(entriesResId));
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The list of entries to be shown in the list in subsequent dialogs.
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The list as an array.
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence[] getEntries() {
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mEntries;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The array to find the value to save for a preference when an entry from
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * entries is selected. If a user clicks on the second item in entries, the
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * second item in this array will be saved to the preference.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param entryValues The array to be used as values to save for the preference.
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setEntryValues(CharSequence[] entryValues) {
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEntryValues = entryValues;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setEntryValues(CharSequence[])
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param entryValuesResId The entry values array as a resource.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setEntryValues(int entryValuesResId) {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setEntryValues(getContext().getResources().getTextArray(entryValuesResId));
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the array of values to be saved for the preference.
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The array of values.
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence[] getEntryValues() {
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mEntryValues;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the value of the key. This should be one of the entries in
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getEntryValues()}.
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param value The value to set for the key.
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setValue(String value) {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mValue = value;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        persistString(value);
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
139ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * Returns the summary of this ListPreference. If the summary
140ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * has a {@linkplain java.lang.String#format String formatting}
141ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * marker in it (i.e. "%s" or "%1$s"), then the current entry
142ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * value will be substituted in its place.
143ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     *
144ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * @return the summary with appropriate string substitution
145ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     */
146ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    @Override
147ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    public CharSequence getSummary() {
148ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        final CharSequence entry = getEntry();
149ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        if (mSummary == null || entry == null) {
150ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root            return super.getSummary();
151ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        } else {
152ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root            return String.format(mSummary, entry);
153ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        }
154ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    }
155ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root
156ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    /**
157ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * Sets the summary for this Preference with a CharSequence.
158ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * If the summary has a
159ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * {@linkplain java.lang.String#format String formatting}
160ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * marker in it (i.e. "%s" or "%1$s"), then the current entry
161ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * value will be substituted in its place when it's retrieved.
162ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     *
163ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     * @param summary The summary for the preference.
164ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root     */
165ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    @Override
166ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    public void setSummary(CharSequence summary) {
167ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        super.setSummary(summary);
168ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        if (summary == null && mSummary != null) {
169ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root            mSummary = null;
170ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        } else if (summary != null && !summary.equals(mSummary)) {
171ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root            mSummary = summary.toString();
172ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root        }
173ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    }
174ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root
175ba636df784398e4cd56f2982de63973ef6cd44fbKenny Root    /**
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the value to the given index from the entry values.
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param index The index of the value to set.
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setValueIndex(int index) {
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mEntryValues != null) {
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setValue(mEntryValues[index].toString());
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the value of the key. This should be one of the entries in
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getEntryValues()}.
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The value of the key.
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getValue() {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mValue;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the entry corresponding to the current value.
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The entry corresponding to the current value, or null.
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence getEntry() {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int index = getValueIndex();
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return index >= 0 && mEntries != null ? mEntries[index] : null;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the index of the given value (in the entry values array).
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param value The value whose index should be returned.
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The index of the value, or -1 if not found.
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int findIndexOfValue(String value) {
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null && mEntryValues != null) {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = mEntryValues.length - 1; i >= 0; i--) {
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mEntryValues[i].equals(value)) {
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return i;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int getValueIndex() {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return findIndexOfValue(mValue);
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onPrepareDialogBuilder(Builder builder) {
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onPrepareDialogBuilder(builder);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mEntries == null || mEntryValues == null) {
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException(
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "ListPreference requires an entries array and an entryValues array.");
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mClickedDialogEntryIndex = getValueIndex();
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        builder.setSingleChoiceItems(mEntries, mClickedDialogEntryIndex,
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new DialogInterface.OnClickListener() {
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    public void onClick(DialogInterface dialog, int which) {
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mClickedDialogEntryIndex = which;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        /*
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         * Clicking on an item simulates the positive button
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         * click, and dismisses the dialog.
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         */
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ListPreference.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE);
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        dialog.dismiss();
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        });
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The typical interaction for list-based dialogs is to have
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * click-on-an-item dismiss the dialog instead of the user having to
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * press 'Ok'.
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        builder.setPositiveButton(null, null);
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onDialogClosed(boolean positiveResult) {
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onDialogClosed(positiveResult);
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (positiveResult && mClickedDialogEntryIndex >= 0 && mEntryValues != null) {
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String value = mEntryValues[mClickedDialogEntryIndex].toString();
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (callChangeListener(value)) {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setValue(value);
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Object onGetDefaultValue(TypedArray a, int index) {
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a.getString(index);
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setValue(restoreValue ? getPersistedString(mValue) : (String) defaultValue);
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Parcelable onSaveInstanceState() {
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Parcelable superState = super.onSaveInstanceState();
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isPersistent()) {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // No need to save instance state since it's persistent
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return superState;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final SavedState myState = new SavedState(superState);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        myState.value = getValue();
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return myState;
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onRestoreInstanceState(Parcelable state) {
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (state == null || !state.getClass().equals(SavedState.class)) {
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Didn't save state for us in onSaveInstanceState
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.onRestoreInstanceState(state);
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SavedState myState = (SavedState) state;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onRestoreInstanceState(myState.getSuperState());
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setValue(myState.value);
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static class SavedState extends BaseSavedState {
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String value;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public SavedState(Parcel source) {
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(source);
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            value = source.readString();
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void writeToParcel(Parcel dest, int flags) {
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.writeToParcel(dest, flags);
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeString(value);
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public SavedState(Parcelable superState) {
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(superState);
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Parcelable.Creator<SavedState> CREATOR =
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new Parcelable.Creator<SavedState>() {
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public SavedState createFromParcel(Parcel in) {
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new SavedState(in);
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public SavedState[] newArray(int size) {
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new SavedState[size];
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
338