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