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