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