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