1cc0e782871eb6b946ded880e391866f27953654bAlan Viverette/* 2cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * Copyright (C) 2013 The Android Open Source Project 3cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * 4cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * Licensed under the Apache License, Version 2.0 (the "License"); 5cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * you may not use this file except in compliance with the License. 6cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * You may obtain a copy of the License at 7cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * 8cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * http://www.apache.org/licenses/LICENSE-2.0 9cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * 10cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * Unless required by applicable law or agreed to in writing, software 11cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * distributed under the License is distributed on an "AS IS" BASIS, 12cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * See the License for the specific language governing permissions and 14cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * limitations under the License. 15cc0e782871eb6b946ded880e391866f27953654bAlan Viverette */ 16cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 17cc0e782871eb6b946ded880e391866f27953654bAlan Viverettepackage com.android.settings.accessibility; 18cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 1939b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.app.AlertDialog; 20cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.app.Dialog; 21cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.content.Context; 2239b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.content.DialogInterface; 23cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.content.res.TypedArray; 24cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.os.Parcel; 25cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.os.Parcelable; 26cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.util.AttributeSet; 27cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.view.LayoutInflater; 28cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.view.View; 29cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.view.ViewGroup; 30cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.widget.AbsListView; 31cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.widget.AdapterView; 32cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.widget.BaseAdapter; 33cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 344482812cb1c86d756125df7e151c2d2726e9e164Juan Langimport com.android.settingslib.CustomDialogPreference; 3539b467482d1bf256a111c757e9b7621c6f523271Jason Monk 36cc0e782871eb6b946ded880e391866f27953654bAlan Viverette/** 37cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * Abstract dialog preference that displays a set of values and optional titles. 38cc0e782871eb6b946ded880e391866f27953654bAlan Viverette */ 3939b467482d1bf256a111c757e9b7621c6f523271Jason Monkpublic abstract class ListDialogPreference extends CustomDialogPreference { 40cc0e782871eb6b946ded880e391866f27953654bAlan Viverette private CharSequence[] mEntryTitles; 41cc0e782871eb6b946ded880e391866f27953654bAlan Viverette private int[] mEntryValues; 42cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 43cc0e782871eb6b946ded880e391866f27953654bAlan Viverette private OnValueChangedListener mOnValueChangedListener; 44cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 45cc0e782871eb6b946ded880e391866f27953654bAlan Viverette /** The layout resource to use for grid items. */ 46cc0e782871eb6b946ded880e391866f27953654bAlan Viverette private int mListItemLayout; 47cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 48cc0e782871eb6b946ded880e391866f27953654bAlan Viverette /** The current value of this preference. */ 49cc0e782871eb6b946ded880e391866f27953654bAlan Viverette private int mValue; 50cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 51cc0e782871eb6b946ded880e391866f27953654bAlan Viverette /** The index within the value set of the current value. */ 52cc0e782871eb6b946ded880e391866f27953654bAlan Viverette private int mValueIndex; 53cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 54cc0e782871eb6b946ded880e391866f27953654bAlan Viverette /** Whether the value had been set using {@link #setValue}. */ 55cc0e782871eb6b946ded880e391866f27953654bAlan Viverette private boolean mValueSet; 56cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 57cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public ListDialogPreference(Context context, AttributeSet attrs) { 58cc0e782871eb6b946ded880e391866f27953654bAlan Viverette super(context, attrs); 59cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 60cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 61cc0e782871eb6b946ded880e391866f27953654bAlan Viverette /** 62cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * Sets a listened to invoke when the value of this preference changes. 63cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * 64cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * @param listener the listener to invoke 65cc0e782871eb6b946ded880e391866f27953654bAlan Viverette */ 66cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public void setOnValueChangedListener(OnValueChangedListener listener) { 67cc0e782871eb6b946ded880e391866f27953654bAlan Viverette mOnValueChangedListener = listener; 68cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 69cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 70cc0e782871eb6b946ded880e391866f27953654bAlan Viverette /** 71cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * Sets the layout to use for grid items. 72cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * 73cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * @param layoutResId the layout to use for displaying grid items 74cc0e782871eb6b946ded880e391866f27953654bAlan Viverette */ 75cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public void setListItemLayoutResource(int layoutResId) { 76cc0e782871eb6b946ded880e391866f27953654bAlan Viverette mListItemLayout = layoutResId; 77cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 78cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 79cc0e782871eb6b946ded880e391866f27953654bAlan Viverette /** 80cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * Sets the list of item values. Values must be distinct. 81cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * 82cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * @param values the list of item values 83cc0e782871eb6b946ded880e391866f27953654bAlan Viverette */ 84cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public void setValues(int[] values) { 85cc0e782871eb6b946ded880e391866f27953654bAlan Viverette mEntryValues = values; 862e1bf8a4782f7f7d5d808faaeafc50bd5d4ecc21Alan Viverette 872e1bf8a4782f7f7d5d808faaeafc50bd5d4ecc21Alan Viverette if (mValueSet && mValueIndex == AbsListView.INVALID_POSITION) { 882e1bf8a4782f7f7d5d808faaeafc50bd5d4ecc21Alan Viverette mValueIndex = getIndexForValue(mValue); 892e1bf8a4782f7f7d5d808faaeafc50bd5d4ecc21Alan Viverette } 90cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 91cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 92cc0e782871eb6b946ded880e391866f27953654bAlan Viverette /** 93cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * Sets the list of item titles. May be null if no titles are specified, or 94cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * may be shorter than the list of values to leave some titles unspecified. 95cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * 96cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * @param titles the list of item titles 97cc0e782871eb6b946ded880e391866f27953654bAlan Viverette */ 98cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public void setTitles(CharSequence[] titles) { 99cc0e782871eb6b946ded880e391866f27953654bAlan Viverette mEntryTitles = titles; 100cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 101cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 102cc0e782871eb6b946ded880e391866f27953654bAlan Viverette /** 103cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * Populates a list item view with data for the specified index. 104cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * 105cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * @param view the view to populate 106cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * @param index the index for which to populate the view 107cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * @see #setListItemLayoutResource(int) 108cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * @see #getValueAt(int) 109cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * @see #getTitleAt(int) 110cc0e782871eb6b946ded880e391866f27953654bAlan Viverette */ 111cc0e782871eb6b946ded880e391866f27953654bAlan Viverette protected abstract void onBindListItem(View view, int index); 112cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 113cc0e782871eb6b946ded880e391866f27953654bAlan Viverette /** 114cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * @return the title at the specified index, or null if none specified 115cc0e782871eb6b946ded880e391866f27953654bAlan Viverette */ 116cc0e782871eb6b946ded880e391866f27953654bAlan Viverette protected CharSequence getTitleAt(int index) { 117cc0e782871eb6b946ded880e391866f27953654bAlan Viverette if (mEntryTitles == null || mEntryTitles.length <= index) { 118cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return null; 119cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 120cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 121cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return mEntryTitles[index]; 122cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 123cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 124cc0e782871eb6b946ded880e391866f27953654bAlan Viverette /** 125cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * @return the value at the specified index 126cc0e782871eb6b946ded880e391866f27953654bAlan Viverette */ 127cc0e782871eb6b946ded880e391866f27953654bAlan Viverette protected int getValueAt(int index) { 128cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return mEntryValues[index]; 129cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 130cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 131cc0e782871eb6b946ded880e391866f27953654bAlan Viverette @Override 132cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public CharSequence getSummary() { 133cc0e782871eb6b946ded880e391866f27953654bAlan Viverette if (mValueIndex >= 0) { 134cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return getTitleAt(mValueIndex); 135cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 136cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 137cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return null; 138cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 139cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 140cc0e782871eb6b946ded880e391866f27953654bAlan Viverette @Override 14139b467482d1bf256a111c757e9b7621c6f523271Jason Monk protected void onPrepareDialogBuilder(AlertDialog.Builder builder, 14239b467482d1bf256a111c757e9b7621c6f523271Jason Monk DialogInterface.OnClickListener listener) { 14339b467482d1bf256a111c757e9b7621c6f523271Jason Monk super.onPrepareDialogBuilder(builder, listener); 144cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 145cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final Context context = getContext(); 146cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final int dialogLayout = getDialogLayoutResource(); 147cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final View picker = LayoutInflater.from(context).inflate(dialogLayout, null); 148cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final ListPreferenceAdapter adapter = new ListPreferenceAdapter(); 149cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final AbsListView list = (AbsListView) picker.findViewById(android.R.id.list); 150cc0e782871eb6b946ded880e391866f27953654bAlan Viverette list.setAdapter(adapter); 15139b467482d1bf256a111c757e9b7621c6f523271Jason Monk list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 152cc0e782871eb6b946ded880e391866f27953654bAlan Viverette @Override 153cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public void onItemClick(AdapterView<?> adapter, View v, int position, long id) { 154cc0e782871eb6b946ded880e391866f27953654bAlan Viverette if (callChangeListener((int) id)) { 155cc0e782871eb6b946ded880e391866f27953654bAlan Viverette setValue((int) id); 156cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 157cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 158cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final Dialog dialog = getDialog(); 159cc0e782871eb6b946ded880e391866f27953654bAlan Viverette if (dialog != null) { 160cc0e782871eb6b946ded880e391866f27953654bAlan Viverette dialog.dismiss(); 161cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 162cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 163cc0e782871eb6b946ded880e391866f27953654bAlan Viverette }); 164cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 165cc0e782871eb6b946ded880e391866f27953654bAlan Viverette // Set initial selection. 166cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final int selectedPosition = getIndexForValue(mValue); 167cc0e782871eb6b946ded880e391866f27953654bAlan Viverette if (selectedPosition != AbsListView.INVALID_POSITION) { 168cc0e782871eb6b946ded880e391866f27953654bAlan Viverette list.setSelection(selectedPosition); 169cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 170cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 171cc0e782871eb6b946ded880e391866f27953654bAlan Viverette builder.setView(picker); 172cc0e782871eb6b946ded880e391866f27953654bAlan Viverette builder.setPositiveButton(null, null); 173cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 174cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 175cc0e782871eb6b946ded880e391866f27953654bAlan Viverette /** 176cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * @return the index of the specified value within the list of entry values, 177cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * or {@link AbsListView#INVALID_POSITION} if not found 178cc0e782871eb6b946ded880e391866f27953654bAlan Viverette */ 179cc0e782871eb6b946ded880e391866f27953654bAlan Viverette protected int getIndexForValue(int value) { 180cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final int[] values = mEntryValues; 1812e1bf8a4782f7f7d5d808faaeafc50bd5d4ecc21Alan Viverette if (values != null) { 1822e1bf8a4782f7f7d5d808faaeafc50bd5d4ecc21Alan Viverette final int count = values.length; 1832e1bf8a4782f7f7d5d808faaeafc50bd5d4ecc21Alan Viverette for (int i = 0; i < count; i++) { 1842e1bf8a4782f7f7d5d808faaeafc50bd5d4ecc21Alan Viverette if (values[i] == value) { 1852e1bf8a4782f7f7d5d808faaeafc50bd5d4ecc21Alan Viverette return i; 1862e1bf8a4782f7f7d5d808faaeafc50bd5d4ecc21Alan Viverette } 187cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 188cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 189cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 190cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return AbsListView.INVALID_POSITION; 191cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 192cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 193cc0e782871eb6b946ded880e391866f27953654bAlan Viverette /** 194cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * Sets the current value. If the value exists within the set of entry 195cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * values, updates the selection index. 196cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * 197cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * @param value the value to set 198cc0e782871eb6b946ded880e391866f27953654bAlan Viverette */ 199cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public void setValue(int value) { 200cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final boolean changed = mValue != value; 201cc0e782871eb6b946ded880e391866f27953654bAlan Viverette if (changed || !mValueSet) { 202cc0e782871eb6b946ded880e391866f27953654bAlan Viverette mValue = value; 203cc0e782871eb6b946ded880e391866f27953654bAlan Viverette mValueIndex = getIndexForValue(value); 204cc0e782871eb6b946ded880e391866f27953654bAlan Viverette mValueSet = true; 205cc0e782871eb6b946ded880e391866f27953654bAlan Viverette persistInt(value); 206cc0e782871eb6b946ded880e391866f27953654bAlan Viverette if (changed) { 207cc0e782871eb6b946ded880e391866f27953654bAlan Viverette notifyDependencyChange(shouldDisableDependents()); 208cc0e782871eb6b946ded880e391866f27953654bAlan Viverette notifyChanged(); 209cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 210cc0e782871eb6b946ded880e391866f27953654bAlan Viverette if (mOnValueChangedListener != null) { 211cc0e782871eb6b946ded880e391866f27953654bAlan Viverette mOnValueChangedListener.onValueChanged(this, value); 212cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 213cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 214cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 215cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 216cc0e782871eb6b946ded880e391866f27953654bAlan Viverette /** 217cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * @return the current value 218cc0e782871eb6b946ded880e391866f27953654bAlan Viverette */ 219cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public int getValue() { 220cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return mValue; 221cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 222cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 223cc0e782871eb6b946ded880e391866f27953654bAlan Viverette @Override 224cc0e782871eb6b946ded880e391866f27953654bAlan Viverette protected Object onGetDefaultValue(TypedArray a, int index) { 225cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return a.getInt(index, 0); 226cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 227cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 228cc0e782871eb6b946ded880e391866f27953654bAlan Viverette @Override 229cc0e782871eb6b946ded880e391866f27953654bAlan Viverette protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { 230cc0e782871eb6b946ded880e391866f27953654bAlan Viverette setValue(restoreValue ? getPersistedInt(mValue) : (Integer) defaultValue); 231cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 232cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 233cc0e782871eb6b946ded880e391866f27953654bAlan Viverette @Override 234cc0e782871eb6b946ded880e391866f27953654bAlan Viverette protected Parcelable onSaveInstanceState() { 235cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final Parcelable superState = super.onSaveInstanceState(); 236cc0e782871eb6b946ded880e391866f27953654bAlan Viverette if (isPersistent()) { 237cc0e782871eb6b946ded880e391866f27953654bAlan Viverette // No need to save instance state since it's persistent 238cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return superState; 239cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 240cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 241cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final SavedState myState = new SavedState(superState); 242cc0e782871eb6b946ded880e391866f27953654bAlan Viverette myState.value = getValue(); 243cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return myState; 244cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 245cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 246cc0e782871eb6b946ded880e391866f27953654bAlan Viverette @Override 247cc0e782871eb6b946ded880e391866f27953654bAlan Viverette protected void onRestoreInstanceState(Parcelable state) { 248cc0e782871eb6b946ded880e391866f27953654bAlan Viverette if (state == null || !state.getClass().equals(SavedState.class)) { 249cc0e782871eb6b946ded880e391866f27953654bAlan Viverette // Didn't save state for us in onSaveInstanceState 250cc0e782871eb6b946ded880e391866f27953654bAlan Viverette super.onRestoreInstanceState(state); 251cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return; 252cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 253cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 254cc0e782871eb6b946ded880e391866f27953654bAlan Viverette SavedState myState = (SavedState) state; 255cc0e782871eb6b946ded880e391866f27953654bAlan Viverette super.onRestoreInstanceState(myState.getSuperState()); 256cc0e782871eb6b946ded880e391866f27953654bAlan Viverette setValue(myState.value); 257cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 258cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 259cc0e782871eb6b946ded880e391866f27953654bAlan Viverette private class ListPreferenceAdapter extends BaseAdapter { 260cc0e782871eb6b946ded880e391866f27953654bAlan Viverette private LayoutInflater mInflater; 261cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 262cc0e782871eb6b946ded880e391866f27953654bAlan Viverette @Override 263cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public int getCount() { 264cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return mEntryValues.length; 265cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 266cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 267cc0e782871eb6b946ded880e391866f27953654bAlan Viverette @Override 268cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public Integer getItem(int position) { 269cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return mEntryValues[position]; 270cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 271cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 272cc0e782871eb6b946ded880e391866f27953654bAlan Viverette @Override 273cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public long getItemId(int position) { 274cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return mEntryValues[position]; 275cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 276cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 277cc0e782871eb6b946ded880e391866f27953654bAlan Viverette @Override 278cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public boolean hasStableIds() { 279cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return true; 280cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 281cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 282cc0e782871eb6b946ded880e391866f27953654bAlan Viverette @Override 283cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public View getView(int position, View convertView, ViewGroup parent) { 284cc0e782871eb6b946ded880e391866f27953654bAlan Viverette if (convertView == null) { 285cc0e782871eb6b946ded880e391866f27953654bAlan Viverette if (mInflater == null) { 286cc0e782871eb6b946ded880e391866f27953654bAlan Viverette mInflater = LayoutInflater.from(parent.getContext()); 287cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 288cc0e782871eb6b946ded880e391866f27953654bAlan Viverette convertView = mInflater.inflate(mListItemLayout, parent, false); 289cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 290cc0e782871eb6b946ded880e391866f27953654bAlan Viverette onBindListItem(convertView, position); 291cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return convertView; 292cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 293cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 294cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 295cc0e782871eb6b946ded880e391866f27953654bAlan Viverette private static class SavedState extends BaseSavedState { 296cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public int value; 297cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 298cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public SavedState(Parcel source) { 299cc0e782871eb6b946ded880e391866f27953654bAlan Viverette super(source); 300cc0e782871eb6b946ded880e391866f27953654bAlan Viverette value = source.readInt(); 301cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 302cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 303cc0e782871eb6b946ded880e391866f27953654bAlan Viverette @Override 304cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public void writeToParcel(Parcel dest, int flags) { 305cc0e782871eb6b946ded880e391866f27953654bAlan Viverette super.writeToParcel(dest, flags); 306cc0e782871eb6b946ded880e391866f27953654bAlan Viverette dest.writeInt(value); 307cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 308cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 309cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public SavedState(Parcelable superState) { 310cc0e782871eb6b946ded880e391866f27953654bAlan Viverette super(superState); 311cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 312cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 313cc0e782871eb6b946ded880e391866f27953654bAlan Viverette @SuppressWarnings({ "hiding", "unused" }) 314cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public static final Creator<SavedState> CREATOR = new Creator<SavedState>() { 315cc0e782871eb6b946ded880e391866f27953654bAlan Viverette @Override 316cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public SavedState createFromParcel(Parcel in) { 317cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return new SavedState(in); 318cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 319cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 320cc0e782871eb6b946ded880e391866f27953654bAlan Viverette @Override 321cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public SavedState[] newArray(int size) { 322cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return new SavedState[size]; 323cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 324cc0e782871eb6b946ded880e391866f27953654bAlan Viverette }; 325cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 326cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 327cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public interface OnValueChangedListener { 328cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public void onValueChanged(ListDialogPreference preference, int value); 329cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 330cc0e782871eb6b946ded880e391866f27953654bAlan Viverette} 331