10112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler/* 20112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * Copyright (C) 2015 The Android Open Source Project 30112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * 40112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * Licensed under the Apache License, Version 2.0 (the "License"); 50112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * you may not use this file except in compliance with the License. 60112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * You may obtain a copy of the License at 70112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * 80112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * http://www.apache.org/licenses/LICENSE-2.0 90112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * 100112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * Unless required by applicable law or agreed to in writing, software 110112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * distributed under the License is distributed on an "AS IS" BASIS, 120112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * See the License for the specific language governing permissions and 140112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * limitations under the License 150112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler */ 160112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 170112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerpackage android.support.v14.preference; 180112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 190112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.content.Context; 200112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.content.SharedPreferences; 210112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.content.res.TypedArray; 220112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.os.Parcel; 230112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.os.Parcelable; 240112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.support.annotation.ArrayRes; 250112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.support.annotation.NonNull; 260112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.support.v4.content.SharedPreferencesCompat; 270112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.support.v4.content.res.TypedArrayUtils; 280112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.support.v7.preference.DialogPreference; 290112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.util.AttributeSet; 300112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 310112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport java.util.Collections; 320112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport java.util.HashSet; 330112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport java.util.Set; 340112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 350112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler/** 360112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * A {@link android.support.v7.preference.Preference} that displays a list of entries as 370112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * a dialog. 380112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * <p> 390112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * This preference will store a set of strings into the SharedPreferences. 400112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * This set will contain one or more values from the 410112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * {@link #setEntryValues(CharSequence[])} array. 420112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * 430112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @attr ref android.R.styleable#MultiSelectListPreference_entries 440112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @attr ref android.R.styleable#MultiSelectListPreference_entryValues 450112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler */ 460112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerpublic class MultiSelectListPreference extends DialogPreference { 470112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler private CharSequence[] mEntries; 480112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler private CharSequence[] mEntryValues; 490112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler private Set<String> mValues = new HashSet<>(); 500112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 510112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public MultiSelectListPreference( 520112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 530112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler super(context, attrs, defStyleAttr, defStyleRes); 540112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 550112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler final TypedArray a = context.obtainStyledAttributes(attrs, 560112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler R.styleable.MultiSelectListPreference, defStyleAttr, 570112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler defStyleRes); 580112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 590112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler mEntries = TypedArrayUtils.getTextArray(a, 600112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler R.styleable.MultiSelectListPreference_entries, 610112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler R.styleable.MultiSelectListPreference_android_entries); 620112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 630112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler mEntryValues = TypedArrayUtils.getTextArray(a, 640112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler R.styleable.MultiSelectListPreference_entryValues, 650112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler R.styleable.MultiSelectListPreference_android_entryValues); 660112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 670112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler a.recycle(); 680112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 690112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 700112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public MultiSelectListPreference(Context context, AttributeSet attrs, int defStyleAttr) { 710112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler this(context, attrs, defStyleAttr, 0); 720112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 730112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 740112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public MultiSelectListPreference(Context context, AttributeSet attrs) { 750112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler this(context, attrs, R.attr.dialogPreferenceStyle); 760112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 770112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 780112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public MultiSelectListPreference(Context context) { 790112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler this(context, null); 800112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 810112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 820112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler /** 830112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * Attempts to persist a set of Strings to the {@link android.content.SharedPreferences}. 840112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * <p> 850112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * This will check if this Preference is persistent, get an editor from 860112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * the {@link android.preference.PreferenceManager}, put in the strings, and check if we should 870112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * commit (and commit if so). 880112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * 890112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @param values The values to persist. 900112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @return True if the Preference is persistent. (This is not whether the 910112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * value was persisted, since we may not necessarily commit if there 920112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * will be a batch commit later.) 930112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @see #getPersistedString 940112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * 950112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @hide 960112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler */ 970112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler protected boolean persistStringSet(Set<String> values) { 980112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler if (shouldPersist()) { 990112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler // Shouldn't store null 1000112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler if (values.equals(getPersistedStringSet(null))) { 1010112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler // It's already there, so the same as persisting 1020112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return true; 1030112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 1040112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 1050112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler SharedPreferences.Editor editor = getPreferenceManager().getSharedPreferences().edit(); 1060112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler editor.putStringSet(getKey(), values); 1070112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler SharedPreferencesCompat.EditorCompat.getInstance().apply(editor); 1080112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return true; 1090112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 1100112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return false; 1110112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 1120112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 1130112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler /** 1140112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * Attempts to get a persisted set of Strings from the 1150112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * {@link android.content.SharedPreferences}. 1160112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * <p> 1170112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * This will check if this Preference is persistent, get the SharedPreferences 1180112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * from the {@link android.preference.PreferenceManager}, and get the value. 1190112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * 1200112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @param defaultReturnValue The default value to return if either the 1210112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * Preference is not persistent or the Preference is not in the 1220112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * shared preferences. 1230112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @return The value from the SharedPreferences or the default return 1240112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * value. 1250112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @see #persistStringSet(Set) 1260112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * 1270112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @hide 1280112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler */ 1290112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler protected Set<String> getPersistedStringSet(Set<String> defaultReturnValue) { 1300112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler if (!shouldPersist()) { 1310112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return defaultReturnValue; 1320112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 1330112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 1340112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return getPreferenceManager().getSharedPreferences() 1350112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler .getStringSet(getKey(), defaultReturnValue); 1360112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 1370112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 1380112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler /** 1390112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * Sets the human-readable entries to be shown in the list. This will be 1400112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * shown in subsequent dialogs. 1410112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * <p> 1420112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * Each entry must have a corresponding index in 1430112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * {@link #setEntryValues(CharSequence[])}. 1440112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * 1450112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @param entries The entries. 1460112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @see #setEntryValues(CharSequence[]) 1470112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler */ 1480112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public void setEntries(CharSequence[] entries) { 1490112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler mEntries = entries; 1500112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 1510112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 1520112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler /** 1530112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @see #setEntries(CharSequence[]) 1540112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @param entriesResId The entries array as a resource. 1550112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler */ 1560112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public void setEntries(@ArrayRes int entriesResId) { 1570112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler setEntries(getContext().getResources().getTextArray(entriesResId)); 1580112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 1590112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 1600112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler /** 1610112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * The list of entries to be shown in the list in subsequent dialogs. 1620112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * 1630112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @return The list as an array. 1640112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler */ 1650112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public CharSequence[] getEntries() { 1660112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return mEntries; 1670112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 1680112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 1690112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler /** 1700112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * The array to find the value to save for a preference when an entry from 1710112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * entries is selected. If a user clicks on the second item in entries, the 1720112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * second item in this array will be saved to the preference. 1730112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * 1740112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @param entryValues The array to be used as values to save for the preference. 1750112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler */ 1760112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public void setEntryValues(CharSequence[] entryValues) { 1770112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler mEntryValues = entryValues; 1780112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 1790112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 1800112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler /** 1810112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @see #setEntryValues(CharSequence[]) 1820112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @param entryValuesResId The entry values array as a resource. 1830112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler */ 1840112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public void setEntryValues(@ArrayRes int entryValuesResId) { 1850112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler setEntryValues(getContext().getResources().getTextArray(entryValuesResId)); 1860112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 1870112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 1880112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler /** 1890112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * Returns the array of values to be saved for the preference. 1900112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * 1910112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @return The array of values. 1920112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler */ 1930112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public CharSequence[] getEntryValues() { 1940112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return mEntryValues; 1950112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 1960112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 1970112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler /** 1980112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * Sets the value of the key. This should contain entries in 1990112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * {@link #getEntryValues()}. 2000112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * 2010112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @param values The values to set for the key. 2020112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler */ 2030112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public void setValues(Set<String> values) { 2040112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler mValues.clear(); 2050112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler mValues.addAll(values); 2060112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 2070112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler persistStringSet(values); 2080112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 2090112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 2100112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler /** 2110112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * Retrieves the current value of the key. 2120112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler */ 2130112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public Set<String> getValues() { 2140112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return mValues; 2150112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 2160112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 2170112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler /** 2180112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * Returns the index of the given value (in the entry values array). 2190112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * 2200112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @param value The value whose index should be returned. 2210112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * @return The index of the value, or -1 if not found. 2220112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler */ 2230112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public int findIndexOfValue(String value) { 2240112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler if (value != null && mEntryValues != null) { 2250112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler for (int i = mEntryValues.length - 1; i >= 0; i--) { 2260112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler if (mEntryValues[i].equals(value)) { 2270112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return i; 2280112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 2290112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 2300112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 2310112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return -1; 2320112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 2330112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 2340112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler protected boolean[] getSelectedItems() { 2350112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler final CharSequence[] entries = mEntryValues; 2360112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler final int entryCount = entries.length; 2370112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler final Set<String> values = mValues; 2380112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler boolean[] result = new boolean[entryCount]; 2390112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 2400112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler for (int i = 0; i < entryCount; i++) { 2410112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler result[i] = values.contains(entries[i].toString()); 2420112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 2430112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 2440112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return result; 2450112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 2460112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 2470112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler @Override 2480112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler protected Object onGetDefaultValue(TypedArray a, int index) { 2490112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler final CharSequence[] defaultValues = a.getTextArray(index); 2500112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler final Set<String> result = new HashSet<>(); 2510112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 2520112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler for (final CharSequence defaultValue : defaultValues) { 2530112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler result.add(defaultValue.toString()); 2540112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 2550112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 2560112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return result; 2570112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 2580112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 2590112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler @Override 2600112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { 2610112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler setValues(restoreValue ? getPersistedStringSet(mValues) : (Set<String>) defaultValue); 2620112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 2630112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 2640112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler @Override 2650112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler protected Parcelable onSaveInstanceState() { 2660112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler final Parcelable superState = super.onSaveInstanceState(); 2670112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler if (isPersistent()) { 2680112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler // No need to save instance state 2690112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return superState; 2700112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 2710112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 2720112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler final SavedState myState = new SavedState(superState); 2730112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler myState.values = getValues(); 2740112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return myState; 2750112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 2760112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 2770112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler @Override 2780112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler protected void onRestoreInstanceState(Parcelable state) { 2790112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler if (state == null || !state.getClass().equals(SavedState.class)) { 2800112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler // Didn't save state for us in onSaveInstanceState 2810112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler super.onRestoreInstanceState(state); 2820112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return; 2830112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 2840112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 2850112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler SavedState myState = (SavedState) state; 2860112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler super.onRestoreInstanceState(myState.getSuperState()); 2870112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler setValues(myState.values); 2880112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 2890112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 2900112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler private static class SavedState extends BaseSavedState { 2910112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler Set<String> values; 2920112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 2930112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public SavedState(Parcel source) { 2940112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler super(source); 2950112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler final int size = source.readInt(); 2960112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler values = new HashSet<>(); 2970112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler String[] strings = new String[size]; 2980112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler source.readStringArray(strings); 2990112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 3000112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler Collections.addAll(values, strings); 3010112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 3020112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 3030112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public SavedState(Parcelable superState) { 3040112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler super(superState); 3050112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 3060112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 3070112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler @Override 3080112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public void writeToParcel(@NonNull Parcel dest, int flags) { 3090112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler super.writeToParcel(dest, flags); 3100112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler dest.writeInt(values.size()); 3110112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler dest.writeStringArray(values.toArray(new String[values.size()])); 3120112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 3130112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 3140112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public static final Parcelable.Creator<SavedState> CREATOR = 3150112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler new Parcelable.Creator<SavedState>() { 3160112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public SavedState createFromParcel(Parcel in) { 3170112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return new SavedState(in); 3180112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 3190112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 3200112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public SavedState[] newArray(int size) { 3210112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return new SavedState[size]; 3220112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 3230112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler }; 3240112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 3250112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler} 326