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