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.res.TypedArray;
210112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.os.Parcel;
220112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.os.Parcelable;
230112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.support.annotation.ArrayRes;
240112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.support.annotation.NonNull;
250112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.support.v4.content.res.TypedArrayUtils;
2631453bcbebe270c126f9980f69d4626228c71f0dTony Mantlerimport android.support.v7.preference.internal.AbstractMultiSelectListPreference;
270112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.util.AttributeSet;
280112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
290112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport java.util.Collections;
300112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport java.util.HashSet;
310112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport java.util.Set;
320112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
330112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler/**
340112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * A {@link android.support.v7.preference.Preference} that displays a list of entries as
350112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * a dialog.
360112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * <p>
370112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * This preference will store a set of strings into the SharedPreferences.
380112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * This set will contain one or more values from the
390112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler * {@link #setEntryValues(CharSequence[])} array.
400112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler *
41929f27aab7ac7231f3734c988d5ee7201627d535Alan Viverette * @attr name android:entries
42929f27aab7ac7231f3734c988d5ee7201627d535Alan Viverette * @attr name android:entryValues
430112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler */
4431453bcbebe270c126f9980f69d4626228c71f0dTony Mantlerpublic class MultiSelectListPreference extends AbstractMultiSelectListPreference {
450112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    private CharSequence[] mEntries;
460112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    private CharSequence[] mEntryValues;
470112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    private Set<String> mValues = new HashSet<>();
480112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
490112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    public MultiSelectListPreference(
500112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
510112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        super(context, attrs, defStyleAttr, defStyleRes);
520112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
530112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        final TypedArray a = context.obtainStyledAttributes(attrs,
546759b1021d8198ad1d239bb30e5a102b99624bceAdam Lesinski                android.support.v7.preference.R.styleable.MultiSelectListPreference, defStyleAttr,
550112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler                defStyleRes);
560112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
570112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        mEntries = TypedArrayUtils.getTextArray(a,
586759b1021d8198ad1d239bb30e5a102b99624bceAdam Lesinski                android.support.v7.preference.R.styleable.MultiSelectListPreference_entries,
596759b1021d8198ad1d239bb30e5a102b99624bceAdam Lesinski                android.support.v7.preference.R.styleable.MultiSelectListPreference_android_entries);
600112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
610112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        mEntryValues = TypedArrayUtils.getTextArray(a,
626759b1021d8198ad1d239bb30e5a102b99624bceAdam Lesinski                android.support.v7.preference.R.styleable.MultiSelectListPreference_entryValues,
636759b1021d8198ad1d239bb30e5a102b99624bceAdam Lesinski                android.support.v7.preference.R.styleable.MultiSelectListPreference_android_entryValues);
640112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
650112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        a.recycle();
660112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    }
670112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
680112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    public MultiSelectListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
690112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        this(context, attrs, defStyleAttr, 0);
700112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    }
710112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
720112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    public MultiSelectListPreference(Context context, AttributeSet attrs) {
736759b1021d8198ad1d239bb30e5a102b99624bceAdam Lesinski        this(context, attrs, TypedArrayUtils.getAttr(context,
746759b1021d8198ad1d239bb30e5a102b99624bceAdam Lesinski                android.support.v7.preference.R.attr.dialogPreferenceStyle,
753fadd62b614e4a69aefe920aac640bdb629e502eJason Monk                android.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     * Sets the human-readable entries to be shown in the list. This will be
840112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * shown in subsequent dialogs.
850112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * <p>
860112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * Each entry must have a corresponding index in
870112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * {@link #setEntryValues(CharSequence[])}.
880112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     *
890112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * @param entries The entries.
900112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * @see #setEntryValues(CharSequence[])
910112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     */
920112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    public void setEntries(CharSequence[] entries) {
930112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        mEntries = entries;
940112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    }
950112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
960112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    /**
970112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * @see #setEntries(CharSequence[])
980112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * @param entriesResId The entries array as a resource.
990112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     */
1000112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    public void setEntries(@ArrayRes int entriesResId) {
1010112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        setEntries(getContext().getResources().getTextArray(entriesResId));
1020112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    }
1030112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
1040112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    /**
1050112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * The list of entries to be shown in the list in subsequent dialogs.
1060112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     *
1070112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * @return The list as an array.
1080112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     */
109e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas    @Override
1100112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    public CharSequence[] getEntries() {
1110112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        return mEntries;
1120112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    }
1130112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
1140112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    /**
1150112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * The array to find the value to save for a preference when an entry from
1160112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * entries is selected. If a user clicks on the second item in entries, the
1170112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * second item in this array will be saved to the preference.
1180112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     *
1190112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * @param entryValues The array to be used as values to save for the preference.
1200112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     */
1210112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    public void setEntryValues(CharSequence[] entryValues) {
1220112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        mEntryValues = entryValues;
1230112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    }
1240112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
1250112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    /**
1260112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * @see #setEntryValues(CharSequence[])
1270112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * @param entryValuesResId The entry values array as a resource.
1280112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     */
1290112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    public void setEntryValues(@ArrayRes int entryValuesResId) {
1300112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        setEntryValues(getContext().getResources().getTextArray(entryValuesResId));
1310112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    }
1320112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
1330112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    /**
1340112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * Returns the array of values to be saved for the preference.
1350112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     *
1360112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * @return The array of values.
1370112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     */
138e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas    @Override
1390112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    public CharSequence[] getEntryValues() {
1400112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        return mEntryValues;
1410112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    }
1420112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
1430112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    /**
1440112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * Sets the value of the key. This should contain entries in
1450112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * {@link #getEntryValues()}.
1460112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     *
1470112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * @param values The values to set for the key.
1480112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     */
149e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas    @Override
1500112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    public void setValues(Set<String> values) {
1510112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        mValues.clear();
1520112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        mValues.addAll(values);
1530112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
1540112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        persistStringSet(values);
1550112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    }
1560112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
1570112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    /**
1580112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * Retrieves the current value of the key.
1590112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     */
160e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas    @Override
1610112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    public Set<String> getValues() {
1620112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        return mValues;
1630112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    }
1640112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
1650112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    /**
1660112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * Returns the index of the given value (in the entry values array).
1670112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     *
1680112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * @param value The value whose index should be returned.
1690112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     * @return The index of the value, or -1 if not found.
1700112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler     */
1710112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    public int findIndexOfValue(String value) {
1720112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        if (value != null && mEntryValues != null) {
1730112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            for (int i = mEntryValues.length - 1; i >= 0; i--) {
1740112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler                if (mEntryValues[i].equals(value)) {
1750112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler                    return i;
1760112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler                }
1770112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            }
1780112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        }
1790112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        return -1;
1800112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    }
1810112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
1820112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    protected boolean[] getSelectedItems() {
1830112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        final CharSequence[] entries = mEntryValues;
1840112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        final int entryCount = entries.length;
1850112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        final Set<String> values = mValues;
1860112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        boolean[] result = new boolean[entryCount];
1870112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
1880112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        for (int i = 0; i < entryCount; i++) {
1890112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            result[i] = values.contains(entries[i].toString());
1900112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        }
1910112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
1920112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        return result;
1930112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    }
1940112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
1950112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    @Override
1960112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    protected Object onGetDefaultValue(TypedArray a, int index) {
1970112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        final CharSequence[] defaultValues = a.getTextArray(index);
1980112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        final Set<String> result = new HashSet<>();
1990112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
2000112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        for (final CharSequence defaultValue : defaultValues) {
2010112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            result.add(defaultValue.toString());
2020112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        }
2030112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
2040112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        return result;
2050112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    }
2060112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
207abc73958d264e1eed7fd401a18be1d9ede8304ebAurimas Liutikas    @SuppressWarnings("unchecked")
2080112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    @Override
2090112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
2100112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        setValues(restoreValue ? getPersistedStringSet(mValues) : (Set<String>) defaultValue);
2110112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    }
2120112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
2130112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    @Override
2140112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    protected Parcelable onSaveInstanceState() {
2150112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        final Parcelable superState = super.onSaveInstanceState();
2160112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        if (isPersistent()) {
2170112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            // No need to save instance state
2180112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            return superState;
2190112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        }
2200112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
2210112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        final SavedState myState = new SavedState(superState);
2220112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        myState.values = getValues();
2230112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        return myState;
2240112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    }
2250112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
2260112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    @Override
2270112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    protected void onRestoreInstanceState(Parcelable state) {
2280112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        if (state == null || !state.getClass().equals(SavedState.class)) {
2290112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            // Didn't save state for us in onSaveInstanceState
2300112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            super.onRestoreInstanceState(state);
2310112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            return;
2320112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        }
2330112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
2340112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        SavedState myState = (SavedState) state;
2350112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        super.onRestoreInstanceState(myState.getSuperState());
2360112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        setValues(myState.values);
2370112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    }
2380112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
2390112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    private static class SavedState extends BaseSavedState {
2400112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        Set<String> values;
2410112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
2420112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        public SavedState(Parcel source) {
2430112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            super(source);
2440112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            final int size = source.readInt();
2450112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            values = new HashSet<>();
2460112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            String[] strings = new String[size];
2470112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            source.readStringArray(strings);
2480112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
2490112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            Collections.addAll(values, strings);
2500112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        }
2510112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
2520112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        public SavedState(Parcelable superState) {
2530112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            super(superState);
2540112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        }
2550112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
2560112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        @Override
2570112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        public void writeToParcel(@NonNull Parcel dest, int flags) {
2580112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            super.writeToParcel(dest, flags);
2590112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            dest.writeInt(values.size());
2600112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler            dest.writeStringArray(values.toArray(new String[values.size()]));
2610112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        }
2620112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
2630112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler        public static final Parcelable.Creator<SavedState> CREATOR =
2640112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler                new Parcelable.Creator<SavedState>() {
265e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas                    @Override
2660112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler                    public SavedState createFromParcel(Parcel in) {
2670112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler                        return new SavedState(in);
2680112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler                    }
2690112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler
270e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas                    @Override
2710112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler                    public SavedState[] newArray(int size) {
2720112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler                        return new SavedState[size];
2730112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler                    }
2740112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler                };
2750112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler    }
2760112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler}
277