16904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler/*
26904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Copyright (C) 2015 The Android Open Source Project
36904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *
46904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Licensed under the Apache License, Version 2.0 (the "License");
56904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * you may not use this file except in compliance with the License.
66904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * You may obtain a copy of the License at
76904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *
86904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *      http://www.apache.org/licenses/LICENSE-2.0
96904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *
106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Unless required by applicable law or agreed to in writing, software
116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * distributed under the License is distributed on an "AS IS" BASIS,
126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * See the License for the specific language governing permissions and
146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * limitations under the License
156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */
166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
176904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerpackage android.support.v7.preference;
186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
196904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.content.Context;
206904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.content.res.TypedArray;
216904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.os.Parcel;
226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.os.Parcelable;
230112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.support.annotation.ArrayRes;
246904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.support.annotation.NonNull;
2584765eaea7da18d0576db557959129e9d0db8e8cTony Mantlerimport android.support.v4.content.res.TypedArrayUtils;
266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.text.TextUtils;
276904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.util.AttributeSet;
286904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
296904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler/**
306904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * A {@link Preference} that displays a list of entries as
316904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * a dialog.
326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * <p>
336904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * This preference will store a string into the SharedPreferences. This string will be the value
346904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * from the {@link #setEntryValues(CharSequence[])} array.
356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *
36929f27aab7ac7231f3734c988d5ee7201627d535Alan Viverette * @attr name android:entries
37929f27aab7ac7231f3734c988d5ee7201627d535Alan Viverette * @attr name android:entryValues
386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */
396904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerpublic class ListPreference extends DialogPreference {
406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private CharSequence[] mEntries;
416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private CharSequence[] mEntryValues;
426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private String mValue;
436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private String mSummary;
446904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private boolean mValueSet;
456904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
466904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public ListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
476904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        super(context, attrs, defStyleAttr, defStyleRes);
486904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
496904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        TypedArray a = context.obtainStyledAttributes(
506904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                attrs, R.styleable.ListPreference, defStyleAttr, defStyleRes);
5184765eaea7da18d0576db557959129e9d0db8e8cTony Mantler
5284765eaea7da18d0576db557959129e9d0db8e8cTony Mantler        mEntries = TypedArrayUtils.getTextArray(a, R.styleable.ListPreference_entries,
5384765eaea7da18d0576db557959129e9d0db8e8cTony Mantler                R.styleable.ListPreference_android_entries);
5484765eaea7da18d0576db557959129e9d0db8e8cTony Mantler
5584765eaea7da18d0576db557959129e9d0db8e8cTony Mantler        mEntryValues = TypedArrayUtils.getTextArray(a, R.styleable.ListPreference_entryValues,
5684765eaea7da18d0576db557959129e9d0db8e8cTony Mantler                R.styleable.ListPreference_android_entryValues);
5784765eaea7da18d0576db557959129e9d0db8e8cTony Mantler
586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        a.recycle();
596904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        /* Retrieve the Preference summary attribute since it's private
616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         * in the Preference class.
626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         */
636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        a = context.obtainStyledAttributes(attrs,
646904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                R.styleable.Preference, defStyleAttr, defStyleRes);
6584765eaea7da18d0576db557959129e9d0db8e8cTony Mantler
6684765eaea7da18d0576db557959129e9d0db8e8cTony Mantler        mSummary = TypedArrayUtils.getString(a, R.styleable.Preference_summary,
6784765eaea7da18d0576db557959129e9d0db8e8cTony Mantler                R.styleable.Preference_android_summary);
6884765eaea7da18d0576db557959129e9d0db8e8cTony Mantler
696904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        a.recycle();
706904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
716904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
726904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public ListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
736904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        this(context, attrs, defStyleAttr, 0);
746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
766904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public ListPreference(Context context, AttributeSet attrs) {
773fadd62b614e4a69aefe920aac640bdb629e502eJason Monk        this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.dialogPreferenceStyle,
783fadd62b614e4a69aefe920aac640bdb629e502eJason Monk                android.R.attr.dialogPreferenceStyle));
796904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public ListPreference(Context context) {
826904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        this(context, null);
836904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Sets the human-readable entries to be shown in the list. This will be
876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * shown in subsequent dialogs.
886904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * <p>
896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Each entry must have a corresponding index in
906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * {@link #setEntryValues(CharSequence[])}.
916904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param entries The entries.
936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @see #setEntryValues(CharSequence[])
946904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
956904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void setEntries(CharSequence[] entries) {
966904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        mEntries = entries;
976904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
986904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
996904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1006904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @see #setEntries(CharSequence[])
1016904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param entriesResId The entries array as a resource.
1026904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1030112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    public void setEntries(@ArrayRes int entriesResId) {
1046904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        setEntries(getContext().getResources().getTextArray(entriesResId));
1056904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1066904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1076904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1086904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * The list of entries to be shown in the list in subsequent dialogs.
1096904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
1106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return The list as an array.
1116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CharSequence[] getEntries() {
1136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return mEntries;
1146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1176904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * The array to find the value to save for a preference when an entry from
1186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * entries is selected. If a user clicks on the second item in entries, the
1196904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * second item in this array will be saved to the preference.
1206904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
1216904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param entryValues The array to be used as values to save for the preference.
1226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1236904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void setEntryValues(CharSequence[] entryValues) {
1246904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        mEntryValues = entryValues;
1256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1276904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1286904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @see #setEntryValues(CharSequence[])
1296904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param entryValuesResId The entry values array as a resource.
1306904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1310112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    public void setEntryValues(@ArrayRes int entryValuesResId) {
1326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        setEntryValues(getContext().getResources().getTextArray(entryValuesResId));
1336904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1346904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1366904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Returns the array of values to be saved for the preference.
1376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
1386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return The array of values.
1396904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CharSequence[] getEntryValues() {
1416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return mEntryValues;
1426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1446904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1456904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Sets the value of the key. This should be one of the entries in
1466904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * {@link #getEntryValues()}.
1476904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
1486904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param value The value to set for the key.
1496904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1506904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void setValue(String value) {
1516904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        // Always persist/notify the first time.
1526904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        final boolean changed = !TextUtils.equals(mValue, value);
1536904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (changed || !mValueSet) {
1546904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            mValue = value;
1556904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            mValueSet = true;
1566904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            persistString(value);
1576904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            if (changed) {
1586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                notifyChanged();
1596904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            }
1606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
1616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1646904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Returns the summary of this ListPreference. If the summary
1656904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * has a {@linkplain java.lang.String#format String formatting}
1666904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * marker in it (i.e. "%s" or "%1$s"), then the current entry
1676904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * value will be substituted in its place.
1686904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
1696904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return the summary with appropriate string substitution
1706904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1716904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    @Override
1726904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CharSequence getSummary() {
1736904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        final CharSequence entry = getEntry();
1746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (mSummary == null) {
1756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            return super.getSummary();
1766904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        } else {
1776904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            return String.format(mSummary, entry == null ? "" : entry);
1786904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
1796904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1826904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Sets the summary for this Preference with a CharSequence.
1836904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * If the summary has a
1846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * {@linkplain java.lang.String#format String formatting}
1856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * marker in it (i.e. "%s" or "%1$s"), then the current entry
1866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * value will be substituted in its place when it's retrieved.
1876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
1886904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param summary The summary for the preference.
1896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    @Override
1916904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void setSummary(CharSequence summary) {
1926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        super.setSummary(summary);
1936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (summary == null && mSummary != null) {
1946904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            mSummary = null;
1956904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        } else if (summary != null && !summary.equals(mSummary)) {
1966904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            mSummary = summary.toString();
1976904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
1986904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1996904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2006904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
2016904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Sets the value to the given index from the entry values.
2026904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
2036904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param index The index of the value to set.
2046904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
2056904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void setValueIndex(int index) {
2066904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (mEntryValues != null) {
2076904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            setValue(mEntryValues[index].toString());
2086904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
2096904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
2106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
2126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Returns the value of the key. This should be one of the entries in
2136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * {@link #getEntryValues()}.
2146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
2156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return The value of the key.
2166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
2176904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public String getValue() {
2186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return mValue;
2196904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
2206904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2216904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
2226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Returns the entry corresponding to the current value.
2236904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
2246904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return The entry corresponding to the current value, or null.
2256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
2266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CharSequence getEntry() {
2276904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        int index = getValueIndex();
2286904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return index >= 0 && mEntries != null ? mEntries[index] : null;
2296904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
2306904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2316904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
2326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Returns the index of the given value (in the entry values array).
2336904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
2346904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param value The value whose index should be returned.
2356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return The index of the value, or -1 if not found.
2366904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
2376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public int findIndexOfValue(String value) {
2386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (value != null && mEntryValues != null) {
2396904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            for (int i = mEntryValues.length - 1; i >= 0; i--) {
2406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                if (mEntryValues[i].equals(value)) {
2416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                    return i;
2426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                }
2436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            }
2446904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
2456904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return -1;
2466904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
2476904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2486904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private int getValueIndex() {
2496904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return findIndexOfValue(mValue);
2506904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
2516904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2526904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    @Override
2536904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    protected Object onGetDefaultValue(TypedArray a, int index) {
2546904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return a.getString(index);
2556904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
2566904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2576904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    @Override
2586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
2596904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        setValue(restoreValue ? getPersistedString(mValue) : (String) defaultValue);
2606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
2616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    @Override
2636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    protected Parcelable onSaveInstanceState() {
2646904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        final Parcelable superState = super.onSaveInstanceState();
2656904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (isPersistent()) {
2666904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            // No need to save instance state since it's persistent
2676904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            return superState;
2686904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
2696904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2706904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        final SavedState myState = new SavedState(superState);
2716904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        myState.value = getValue();
2726904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return myState;
2736904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
2746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    @Override
2766904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    protected void onRestoreInstanceState(Parcelable state) {
2776904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (state == null || !state.getClass().equals(SavedState.class)) {
2786904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            // Didn't save state for us in onSaveInstanceState
2796904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            super.onRestoreInstanceState(state);
2806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            return;
2816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
2826904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2836904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        SavedState myState = (SavedState) state;
2846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        super.onRestoreInstanceState(myState.getSuperState());
2856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        setValue(myState.value);
2866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
2876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2886904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private static class SavedState extends BaseSavedState {
2896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        String value;
2906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2916904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        public SavedState(Parcel source) {
2926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            super(source);
2936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            value = source.readString();
2946904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
2956904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2966904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        @Override
2976904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        public void writeToParcel(@NonNull Parcel dest, int flags) {
2986904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            super.writeToParcel(dest, flags);
2996904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            dest.writeString(value);
3006904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
3016904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
3026904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        public SavedState(Parcelable superState) {
3036904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            super(superState);
3046904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
3056904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
3066904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        public static final Parcelable.Creator<SavedState> CREATOR =
3076904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                new Parcelable.Creator<SavedState>() {
3086904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            public SavedState createFromParcel(Parcel in) {
3096904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                return new SavedState(in);
3106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            }
3116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
3126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            public SavedState[] newArray(int size) {
3136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                return new SavedState[size];
3146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            }
3156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        };
3166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
3176904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
3186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler}
319