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