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