1212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell/* 2212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * Copyright (C) 2010 The Android Open Source Project 3212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 4212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * Licensed under the Apache License, Version 2.0 (the "License"); 5212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * you may not use this file except in compliance with the License. 6212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * You may obtain a copy of the License at 7212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 8212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * http://www.apache.org/licenses/LICENSE-2.0 9212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 10212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * Unless required by applicable law or agreed to in writing, software 11212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * distributed under the License is distributed on an "AS IS" BASIS, 12212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * See the License for the specific language governing permissions and 14212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * limitations under the License. 15212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell */ 16212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 17212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellpackage android.preference; 18212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 19212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport android.app.AlertDialog.Builder; 20212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport android.content.Context; 21212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport android.content.DialogInterface; 22212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport android.content.res.TypedArray; 23212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport android.os.Parcel; 24212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport android.os.Parcelable; 25212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport android.util.AttributeSet; 26212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 27212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport java.util.HashSet; 28212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport java.util.Set; 29212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 30212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell/** 31212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * A {@link Preference} that displays a list of entries as 32212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * a dialog. 33212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * <p> 34212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * This preference will store a set of strings into the SharedPreferences. 35212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * This set will contain one or more values from the 36212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * {@link #setEntryValues(CharSequence[])} array. 37212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 38212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @attr ref android.R.styleable#MultiSelectListPreference_entries 39212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @attr ref android.R.styleable#MultiSelectListPreference_entryValues 40212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell */ 41212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellpublic class MultiSelectListPreference extends DialogPreference { 42212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell private CharSequence[] mEntries; 43212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell private CharSequence[] mEntryValues; 44212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell private Set<String> mValues = new HashSet<String>(); 45212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell private Set<String> mNewValues = new HashSet<String>(); 46212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell private boolean mPreferenceChanged; 47212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 48212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public MultiSelectListPreference(Context context, AttributeSet attrs) { 49212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell super(context, attrs); 50212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 51212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell TypedArray a = context.obtainStyledAttributes(attrs, 52212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell com.android.internal.R.styleable.MultiSelectListPreference, 0, 0); 53212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell mEntries = a.getTextArray(com.android.internal.R.styleable.MultiSelectListPreference_entries); 54212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell mEntryValues = a.getTextArray(com.android.internal.R.styleable.MultiSelectListPreference_entryValues); 55212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell a.recycle(); 56212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 57212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 58212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public MultiSelectListPreference(Context context) { 59212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell this(context, null); 60212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 61212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 62212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell /** 63212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * Sets the human-readable entries to be shown in the list. This will be 64212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * shown in subsequent dialogs. 65212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * <p> 66212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * Each entry must have a corresponding index in 67212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * {@link #setEntryValues(CharSequence[])}. 68212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 69212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @param entries The entries. 70212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @see #setEntryValues(CharSequence[]) 71212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell */ 72212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public void setEntries(CharSequence[] entries) { 73212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell mEntries = entries; 74212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 75212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 76212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell /** 77212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @see #setEntries(CharSequence[]) 78212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @param entriesResId The entries array as a resource. 79212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell */ 80212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public void setEntries(int entriesResId) { 81212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell setEntries(getContext().getResources().getTextArray(entriesResId)); 82212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 83212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 84212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell /** 85212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * The list of entries to be shown in the list in subsequent dialogs. 86212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 87212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @return The list as an array. 88212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell */ 89212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public CharSequence[] getEntries() { 90212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return mEntries; 91212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 92212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 93212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell /** 94212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * The array to find the value to save for a preference when an entry from 95212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * entries is selected. If a user clicks on the second item in entries, the 96212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * second item in this array will be saved to the preference. 97212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 98212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @param entryValues The array to be used as values to save for the preference. 99212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell */ 100212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public void setEntryValues(CharSequence[] entryValues) { 101212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell mEntryValues = entryValues; 102212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 103212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 104212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell /** 105212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @see #setEntryValues(CharSequence[]) 106212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @param entryValuesResId The entry values array as a resource. 107212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell */ 108212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public void setEntryValues(int entryValuesResId) { 109212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell setEntryValues(getContext().getResources().getTextArray(entryValuesResId)); 110212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 111212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 112212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell /** 113212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * Returns the array of values to be saved for the preference. 114212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 115212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @return The array of values. 116212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell */ 117212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public CharSequence[] getEntryValues() { 118212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return mEntryValues; 119212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 120212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 121212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell /** 122212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * Sets the value of the key. This should contain entries in 123212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * {@link #getEntryValues()}. 124212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 125212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @param values The values to set for the key. 126212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell */ 127212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public void setValues(Set<String> values) { 128cd9ea08d9cb68004b2d5f69302cddf53dc034e7bAmith Yamasani mValues.clear(); 129cd9ea08d9cb68004b2d5f69302cddf53dc034e7bAmith Yamasani mValues.addAll(values); 130cd9ea08d9cb68004b2d5f69302cddf53dc034e7bAmith Yamasani 131212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell persistStringSet(values); 132212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 133212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 134212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell /** 135212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * Retrieves the current value of the key. 136212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell */ 137212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public Set<String> getValues() { 138212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return mValues; 139212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 140212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 141212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell /** 142212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * Returns the index of the given value (in the entry values array). 143212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 144212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @param value The value whose index should be returned. 145212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @return The index of the value, or -1 if not found. 146212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell */ 147212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public int findIndexOfValue(String value) { 148212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell if (value != null && mEntryValues != null) { 149212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell for (int i = mEntryValues.length - 1; i >= 0; i--) { 150212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell if (mEntryValues[i].equals(value)) { 151212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return i; 152212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 153212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 154212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 155212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return -1; 156212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 157212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 158212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell @Override 159212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell protected void onPrepareDialogBuilder(Builder builder) { 160212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell super.onPrepareDialogBuilder(builder); 161212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 162212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell if (mEntries == null || mEntryValues == null) { 163212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell throw new IllegalStateException( 164212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell "MultiSelectListPreference requires an entries array and " + 165212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell "an entryValues array."); 166212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 167212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 168212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell boolean[] checkedItems = getSelectedItems(); 169212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell builder.setMultiChoiceItems(mEntries, checkedItems, 170212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell new DialogInterface.OnMultiChoiceClickListener() { 171212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public void onClick(DialogInterface dialog, int which, boolean isChecked) { 172212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell if (isChecked) { 173ece60fb243f6d1dcee24f5c8f925f449e0514f7eJustin Koh mPreferenceChanged |= mNewValues.add(mEntryValues[which].toString()); 174212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } else { 175ece60fb243f6d1dcee24f5c8f925f449e0514f7eJustin Koh mPreferenceChanged |= mNewValues.remove(mEntryValues[which].toString()); 176212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 177212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 178212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell }); 179212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell mNewValues.clear(); 180212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell mNewValues.addAll(mValues); 181212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 182212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 183212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell private boolean[] getSelectedItems() { 184ece60fb243f6d1dcee24f5c8f925f449e0514f7eJustin Koh final CharSequence[] entries = mEntryValues; 185212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell final int entryCount = entries.length; 186212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell final Set<String> values = mValues; 187212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell boolean[] result = new boolean[entryCount]; 188212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 189212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell for (int i = 0; i < entryCount; i++) { 190212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell result[i] = values.contains(entries[i].toString()); 191212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 192212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 193212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return result; 194212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 195212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 196212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell @Override 197212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell protected void onDialogClosed(boolean positiveResult) { 198212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell super.onDialogClosed(positiveResult); 199212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 200212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell if (positiveResult && mPreferenceChanged) { 201212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell final Set<String> values = mNewValues; 202212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell if (callChangeListener(values)) { 203212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell setValues(values); 204212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 205212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 206212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell mPreferenceChanged = false; 207212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 208212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 209212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell @Override 210212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell protected Object onGetDefaultValue(TypedArray a, int index) { 211212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell final CharSequence[] defaultValues = a.getTextArray(index); 212212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell final int valueCount = defaultValues.length; 213212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell final Set<String> result = new HashSet<String>(); 214212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 215212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell for (int i = 0; i < valueCount; i++) { 216212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell result.add(defaultValues[i].toString()); 217212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 218212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 219212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return result; 220212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 221212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 222212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell @Override 223212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { 224212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell setValues(restoreValue ? getPersistedStringSet(mValues) : (Set<String>) defaultValue); 225212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 226212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 227212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell @Override 228212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell protected Parcelable onSaveInstanceState() { 229212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell final Parcelable superState = super.onSaveInstanceState(); 230212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell if (isPersistent()) { 231212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell // No need to save instance state 232212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return superState; 233212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 234212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 235212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell final SavedState myState = new SavedState(superState); 236212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell myState.values = getValues(); 237212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return myState; 238212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 239212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 240212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell private static class SavedState extends BaseSavedState { 241212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell Set<String> values; 242212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 243212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public SavedState(Parcel source) { 244212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell super(source); 245212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell values = new HashSet<String>(); 246212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell String[] strings = source.readStringArray(); 247212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 248212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell final int stringCount = strings.length; 249212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell for (int i = 0; i < stringCount; i++) { 250212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell values.add(strings[i]); 251212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 252212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 253212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 254212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public SavedState(Parcelable superState) { 255212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell super(superState); 256212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 257212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 258212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell @Override 259212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public void writeToParcel(Parcel dest, int flags) { 260212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell super.writeToParcel(dest, flags); 261212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell dest.writeStringArray(values.toArray(new String[0])); 262212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 263212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 264212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public static final Parcelable.Creator<SavedState> CREATOR = 265212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell new Parcelable.Creator<SavedState>() { 266212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public SavedState createFromParcel(Parcel in) { 267212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return new SavedState(in); 268212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 269212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 270212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public SavedState[] newArray(int size) { 271212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return new SavedState[size]; 272212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 273212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell }; 274212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 275212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell} 276