17746f910656ce6e811853f4062108e9798063337Dianne Hackborn/* 27746f910656ce6e811853f4062108e9798063337Dianne Hackborn * Copyright (C) 2012 The Android Open Source Project 37746f910656ce6e811853f4062108e9798063337Dianne Hackborn * 47746f910656ce6e811853f4062108e9798063337Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 57746f910656ce6e811853f4062108e9798063337Dianne Hackborn * you may not use this file except in compliance with the License. 67746f910656ce6e811853f4062108e9798063337Dianne Hackborn * You may obtain a copy of the License at 77746f910656ce6e811853f4062108e9798063337Dianne Hackborn * 87746f910656ce6e811853f4062108e9798063337Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 97746f910656ce6e811853f4062108e9798063337Dianne Hackborn * 107746f910656ce6e811853f4062108e9798063337Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 117746f910656ce6e811853f4062108e9798063337Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 127746f910656ce6e811853f4062108e9798063337Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137746f910656ce6e811853f4062108e9798063337Dianne Hackborn * See the License for the specific language governing permissions and 147746f910656ce6e811853f4062108e9798063337Dianne Hackborn * limitations under the License. 157746f910656ce6e811853f4062108e9798063337Dianne Hackborn */ 167746f910656ce6e811853f4062108e9798063337Dianne Hackborn 177746f910656ce6e811853f4062108e9798063337Dianne Hackbornpackage android.preference; 187746f910656ce6e811853f4062108e9798063337Dianne Hackborn 197746f910656ce6e811853f4062108e9798063337Dianne Hackbornimport java.util.Arrays; 207746f910656ce6e811853f4062108e9798063337Dianne Hackborn 217b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.ArrayRes; 227746f910656ce6e811853f4062108e9798063337Dianne Hackbornimport android.app.AlertDialog.Builder; 237746f910656ce6e811853f4062108e9798063337Dianne Hackbornimport android.content.Context; 247746f910656ce6e811853f4062108e9798063337Dianne Hackbornimport android.content.DialogInterface; 257746f910656ce6e811853f4062108e9798063337Dianne Hackbornimport android.content.res.TypedArray; 267746f910656ce6e811853f4062108e9798063337Dianne Hackbornimport android.os.Parcel; 277746f910656ce6e811853f4062108e9798063337Dianne Hackbornimport android.os.Parcelable; 287746f910656ce6e811853f4062108e9798063337Dianne Hackbornimport android.util.AttributeSet; 297746f910656ce6e811853f4062108e9798063337Dianne Hackborn 307746f910656ce6e811853f4062108e9798063337Dianne Hackborn/** 317746f910656ce6e811853f4062108e9798063337Dianne Hackborn * @hide 327746f910656ce6e811853f4062108e9798063337Dianne Hackborn * A {@link Preference} that displays a list of entries as 337746f910656ce6e811853f4062108e9798063337Dianne Hackborn * a dialog which allow the user to toggle each individually on and off. 347746f910656ce6e811853f4062108e9798063337Dianne Hackborn * 357746f910656ce6e811853f4062108e9798063337Dianne Hackborn * @attr ref android.R.styleable#ListPreference_entries 367746f910656ce6e811853f4062108e9798063337Dianne Hackborn * @attr ref android.R.styleable#ListPreference_entryValues 377746f910656ce6e811853f4062108e9798063337Dianne Hackborn */ 387746f910656ce6e811853f4062108e9798063337Dianne Hackbornpublic class MultiCheckPreference extends DialogPreference { 397746f910656ce6e811853f4062108e9798063337Dianne Hackborn private CharSequence[] mEntries; 407746f910656ce6e811853f4062108e9798063337Dianne Hackborn private String[] mEntryValues; 417746f910656ce6e811853f4062108e9798063337Dianne Hackborn private boolean[] mSetValues; 427746f910656ce6e811853f4062108e9798063337Dianne Hackborn private boolean[] mOrigValues; 437746f910656ce6e811853f4062108e9798063337Dianne Hackborn private String mSummary; 44617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette 45617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette public MultiCheckPreference( 46617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 47617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette super(context, attrs, defStyleAttr, defStyleRes); 48617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette 49617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette TypedArray a = context.obtainStyledAttributes( 50617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette attrs, com.android.internal.R.styleable.ListPreference, defStyleAttr, defStyleRes); 517746f910656ce6e811853f4062108e9798063337Dianne Hackborn mEntries = a.getTextArray(com.android.internal.R.styleable.ListPreference_entries); 527746f910656ce6e811853f4062108e9798063337Dianne Hackborn if (mEntries != null) { 537746f910656ce6e811853f4062108e9798063337Dianne Hackborn setEntries(mEntries); 547746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 557746f910656ce6e811853f4062108e9798063337Dianne Hackborn setEntryValuesCS(a.getTextArray( 567746f910656ce6e811853f4062108e9798063337Dianne Hackborn com.android.internal.R.styleable.ListPreference_entryValues)); 577746f910656ce6e811853f4062108e9798063337Dianne Hackborn a.recycle(); 587746f910656ce6e811853f4062108e9798063337Dianne Hackborn 597746f910656ce6e811853f4062108e9798063337Dianne Hackborn /* Retrieve the Preference summary attribute since it's private 607746f910656ce6e811853f4062108e9798063337Dianne Hackborn * in the Preference class. 617746f910656ce6e811853f4062108e9798063337Dianne Hackborn */ 627746f910656ce6e811853f4062108e9798063337Dianne Hackborn a = context.obtainStyledAttributes(attrs, 637746f910656ce6e811853f4062108e9798063337Dianne Hackborn com.android.internal.R.styleable.Preference, 0, 0); 647746f910656ce6e811853f4062108e9798063337Dianne Hackborn mSummary = a.getString(com.android.internal.R.styleable.Preference_summary); 657746f910656ce6e811853f4062108e9798063337Dianne Hackborn a.recycle(); 667746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 677746f910656ce6e811853f4062108e9798063337Dianne Hackborn 68617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette public MultiCheckPreference(Context context, AttributeSet attrs, int defStyleAttr) { 69617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette this(context, attrs, defStyleAttr, 0); 70617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette } 71617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette 72617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette public MultiCheckPreference(Context context, AttributeSet attrs) { 73599d2a49e84bf0a4ee752e263a2c29d2ae942c3eAlan Viverette this(context, attrs, com.android.internal.R.attr.dialogPreferenceStyle); 74617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette } 75617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette 767746f910656ce6e811853f4062108e9798063337Dianne Hackborn public MultiCheckPreference(Context context) { 777746f910656ce6e811853f4062108e9798063337Dianne Hackborn this(context, null); 787746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 797746f910656ce6e811853f4062108e9798063337Dianne Hackborn 807746f910656ce6e811853f4062108e9798063337Dianne Hackborn /** 817746f910656ce6e811853f4062108e9798063337Dianne Hackborn * Sets the human-readable entries to be shown in the list. This will be 827746f910656ce6e811853f4062108e9798063337Dianne Hackborn * shown in subsequent dialogs. 837746f910656ce6e811853f4062108e9798063337Dianne Hackborn * <p> 847746f910656ce6e811853f4062108e9798063337Dianne Hackborn * Each entry must have a corresponding index in 857746f910656ce6e811853f4062108e9798063337Dianne Hackborn * {@link #setEntryValues(CharSequence[])}. 867746f910656ce6e811853f4062108e9798063337Dianne Hackborn * 877746f910656ce6e811853f4062108e9798063337Dianne Hackborn * @param entries The entries. 887746f910656ce6e811853f4062108e9798063337Dianne Hackborn * @see #setEntryValues(CharSequence[]) 897746f910656ce6e811853f4062108e9798063337Dianne Hackborn */ 907746f910656ce6e811853f4062108e9798063337Dianne Hackborn public void setEntries(CharSequence[] entries) { 917746f910656ce6e811853f4062108e9798063337Dianne Hackborn mEntries = entries; 927746f910656ce6e811853f4062108e9798063337Dianne Hackborn mSetValues = new boolean[entries.length]; 937746f910656ce6e811853f4062108e9798063337Dianne Hackborn mOrigValues = new boolean[entries.length]; 947746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 957746f910656ce6e811853f4062108e9798063337Dianne Hackborn 967746f910656ce6e811853f4062108e9798063337Dianne Hackborn /** 977746f910656ce6e811853f4062108e9798063337Dianne Hackborn * @see #setEntries(CharSequence[]) 987746f910656ce6e811853f4062108e9798063337Dianne Hackborn * @param entriesResId The entries array as a resource. 997746f910656ce6e811853f4062108e9798063337Dianne Hackborn */ 1007b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye public void setEntries(@ArrayRes int entriesResId) { 1017746f910656ce6e811853f4062108e9798063337Dianne Hackborn setEntries(getContext().getResources().getTextArray(entriesResId)); 1027746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 1037746f910656ce6e811853f4062108e9798063337Dianne Hackborn 1047746f910656ce6e811853f4062108e9798063337Dianne Hackborn /** 1057746f910656ce6e811853f4062108e9798063337Dianne Hackborn * The list of entries to be shown in the list in subsequent dialogs. 1067746f910656ce6e811853f4062108e9798063337Dianne Hackborn * 1077746f910656ce6e811853f4062108e9798063337Dianne Hackborn * @return The list as an array. 1087746f910656ce6e811853f4062108e9798063337Dianne Hackborn */ 1097746f910656ce6e811853f4062108e9798063337Dianne Hackborn public CharSequence[] getEntries() { 1107746f910656ce6e811853f4062108e9798063337Dianne Hackborn return mEntries; 1117746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 1127746f910656ce6e811853f4062108e9798063337Dianne Hackborn 1137746f910656ce6e811853f4062108e9798063337Dianne Hackborn /** 1147746f910656ce6e811853f4062108e9798063337Dianne Hackborn * The array to find the value to save for a preference when an entry from 1157746f910656ce6e811853f4062108e9798063337Dianne Hackborn * entries is selected. If a user clicks on the second item in entries, the 1167746f910656ce6e811853f4062108e9798063337Dianne Hackborn * second item in this array will be saved to the preference. 1177746f910656ce6e811853f4062108e9798063337Dianne Hackborn * 1187746f910656ce6e811853f4062108e9798063337Dianne Hackborn * @param entryValues The array to be used as values to save for the preference. 1197746f910656ce6e811853f4062108e9798063337Dianne Hackborn */ 1207746f910656ce6e811853f4062108e9798063337Dianne Hackborn public void setEntryValues(String[] entryValues) { 1217746f910656ce6e811853f4062108e9798063337Dianne Hackborn mEntryValues = entryValues; 1227746f910656ce6e811853f4062108e9798063337Dianne Hackborn Arrays.fill(mSetValues, false); 1237746f910656ce6e811853f4062108e9798063337Dianne Hackborn Arrays.fill(mOrigValues, false); 1247746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 1257746f910656ce6e811853f4062108e9798063337Dianne Hackborn 1267746f910656ce6e811853f4062108e9798063337Dianne Hackborn /** 1277746f910656ce6e811853f4062108e9798063337Dianne Hackborn * @see #setEntryValues(CharSequence[]) 1287746f910656ce6e811853f4062108e9798063337Dianne Hackborn * @param entryValuesResId The entry values array as a resource. 1297746f910656ce6e811853f4062108e9798063337Dianne Hackborn */ 1307b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye public void setEntryValues(@ArrayRes int entryValuesResId) { 1317746f910656ce6e811853f4062108e9798063337Dianne Hackborn setEntryValuesCS(getContext().getResources().getTextArray(entryValuesResId)); 1327746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 1337746f910656ce6e811853f4062108e9798063337Dianne Hackborn 1347746f910656ce6e811853f4062108e9798063337Dianne Hackborn private void setEntryValuesCS(CharSequence[] values) { 1357746f910656ce6e811853f4062108e9798063337Dianne Hackborn setValues(null); 1367746f910656ce6e811853f4062108e9798063337Dianne Hackborn if (values != null) { 1377746f910656ce6e811853f4062108e9798063337Dianne Hackborn mEntryValues = new String[values.length]; 1387746f910656ce6e811853f4062108e9798063337Dianne Hackborn for (int i=0; i<values.length; i++) { 1397746f910656ce6e811853f4062108e9798063337Dianne Hackborn mEntryValues[i] = values[i].toString(); 1407746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 1417746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 1427746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 1437746f910656ce6e811853f4062108e9798063337Dianne Hackborn 1447746f910656ce6e811853f4062108e9798063337Dianne Hackborn /** 1457746f910656ce6e811853f4062108e9798063337Dianne Hackborn * Returns the array of values to be saved for the preference. 1467746f910656ce6e811853f4062108e9798063337Dianne Hackborn * 1477746f910656ce6e811853f4062108e9798063337Dianne Hackborn * @return The array of values. 1487746f910656ce6e811853f4062108e9798063337Dianne Hackborn */ 14983e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn public String[] getEntryValues() { 1507746f910656ce6e811853f4062108e9798063337Dianne Hackborn return mEntryValues; 1517746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 1527746f910656ce6e811853f4062108e9798063337Dianne Hackborn 1537746f910656ce6e811853f4062108e9798063337Dianne Hackborn /** 15483e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn * Get the boolean state of a given value. 15583e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn */ 15683e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn public boolean getValue(int index) { 15783e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn return mSetValues[index]; 15883e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn } 15983e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn 16083e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn /** 16183e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn * Set the boolean state of a given value. 16283e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn */ 16383e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn public void setValue(int index, boolean state) { 16483e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn mSetValues[index] = state; 16583e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn } 16683e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn 16783e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn /** 1687746f910656ce6e811853f4062108e9798063337Dianne Hackborn * Sets the current values. 1697746f910656ce6e811853f4062108e9798063337Dianne Hackborn */ 1707746f910656ce6e811853f4062108e9798063337Dianne Hackborn public void setValues(boolean[] values) { 1717746f910656ce6e811853f4062108e9798063337Dianne Hackborn if (mSetValues != null) { 1727746f910656ce6e811853f4062108e9798063337Dianne Hackborn Arrays.fill(mSetValues, false); 1737746f910656ce6e811853f4062108e9798063337Dianne Hackborn Arrays.fill(mOrigValues, false); 1747746f910656ce6e811853f4062108e9798063337Dianne Hackborn if (values != null) { 1757746f910656ce6e811853f4062108e9798063337Dianne Hackborn System.arraycopy(values, 0, mSetValues, 0, 1767746f910656ce6e811853f4062108e9798063337Dianne Hackborn values.length < mSetValues.length ? values.length : mSetValues.length); 1777746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 1787746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 1797746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 1807746f910656ce6e811853f4062108e9798063337Dianne Hackborn 1817746f910656ce6e811853f4062108e9798063337Dianne Hackborn /** 1827746f910656ce6e811853f4062108e9798063337Dianne Hackborn * Returns the summary of this ListPreference. If the summary 1837746f910656ce6e811853f4062108e9798063337Dianne Hackborn * has a {@linkplain java.lang.String#format String formatting} 1847746f910656ce6e811853f4062108e9798063337Dianne Hackborn * marker in it (i.e. "%s" or "%1$s"), then the current entry 1857746f910656ce6e811853f4062108e9798063337Dianne Hackborn * value will be substituted in its place. 1867746f910656ce6e811853f4062108e9798063337Dianne Hackborn * 1877746f910656ce6e811853f4062108e9798063337Dianne Hackborn * @return the summary with appropriate string substitution 1887746f910656ce6e811853f4062108e9798063337Dianne Hackborn */ 1897746f910656ce6e811853f4062108e9798063337Dianne Hackborn @Override 1907746f910656ce6e811853f4062108e9798063337Dianne Hackborn public CharSequence getSummary() { 1917746f910656ce6e811853f4062108e9798063337Dianne Hackborn if (mSummary == null) { 1927746f910656ce6e811853f4062108e9798063337Dianne Hackborn return super.getSummary(); 1937746f910656ce6e811853f4062108e9798063337Dianne Hackborn } else { 1947746f910656ce6e811853f4062108e9798063337Dianne Hackborn return mSummary; 1957746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 1967746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 1977746f910656ce6e811853f4062108e9798063337Dianne Hackborn 1987746f910656ce6e811853f4062108e9798063337Dianne Hackborn /** 1997746f910656ce6e811853f4062108e9798063337Dianne Hackborn * Sets the summary for this Preference with a CharSequence. 2007746f910656ce6e811853f4062108e9798063337Dianne Hackborn * If the summary has a 2017746f910656ce6e811853f4062108e9798063337Dianne Hackborn * {@linkplain java.lang.String#format String formatting} 2027746f910656ce6e811853f4062108e9798063337Dianne Hackborn * marker in it (i.e. "%s" or "%1$s"), then the current entry 2037746f910656ce6e811853f4062108e9798063337Dianne Hackborn * value will be substituted in its place when it's retrieved. 2047746f910656ce6e811853f4062108e9798063337Dianne Hackborn * 2057746f910656ce6e811853f4062108e9798063337Dianne Hackborn * @param summary The summary for the preference. 2067746f910656ce6e811853f4062108e9798063337Dianne Hackborn */ 2077746f910656ce6e811853f4062108e9798063337Dianne Hackborn @Override 2087746f910656ce6e811853f4062108e9798063337Dianne Hackborn public void setSummary(CharSequence summary) { 2097746f910656ce6e811853f4062108e9798063337Dianne Hackborn super.setSummary(summary); 2107746f910656ce6e811853f4062108e9798063337Dianne Hackborn if (summary == null && mSummary != null) { 2117746f910656ce6e811853f4062108e9798063337Dianne Hackborn mSummary = null; 2127746f910656ce6e811853f4062108e9798063337Dianne Hackborn } else if (summary != null && !summary.equals(mSummary)) { 2137746f910656ce6e811853f4062108e9798063337Dianne Hackborn mSummary = summary.toString(); 2147746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 2157746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 2167746f910656ce6e811853f4062108e9798063337Dianne Hackborn 2177746f910656ce6e811853f4062108e9798063337Dianne Hackborn /** 2187746f910656ce6e811853f4062108e9798063337Dianne Hackborn * Returns the currently selected values. 2197746f910656ce6e811853f4062108e9798063337Dianne Hackborn */ 2207746f910656ce6e811853f4062108e9798063337Dianne Hackborn public boolean[] getValues() { 2217746f910656ce6e811853f4062108e9798063337Dianne Hackborn return mSetValues; 2227746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 2237746f910656ce6e811853f4062108e9798063337Dianne Hackborn 2247746f910656ce6e811853f4062108e9798063337Dianne Hackborn /** 2257746f910656ce6e811853f4062108e9798063337Dianne Hackborn * Returns the index of the given value (in the entry values array). 2267746f910656ce6e811853f4062108e9798063337Dianne Hackborn * 2277746f910656ce6e811853f4062108e9798063337Dianne Hackborn * @param value The value whose index should be returned. 2287746f910656ce6e811853f4062108e9798063337Dianne Hackborn * @return The index of the value, or -1 if not found. 2297746f910656ce6e811853f4062108e9798063337Dianne Hackborn */ 2307746f910656ce6e811853f4062108e9798063337Dianne Hackborn public int findIndexOfValue(String value) { 2317746f910656ce6e811853f4062108e9798063337Dianne Hackborn if (value != null && mEntryValues != null) { 2327746f910656ce6e811853f4062108e9798063337Dianne Hackborn for (int i = mEntryValues.length - 1; i >= 0; i--) { 2337746f910656ce6e811853f4062108e9798063337Dianne Hackborn if (mEntryValues[i].equals(value)) { 2347746f910656ce6e811853f4062108e9798063337Dianne Hackborn return i; 2357746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 2367746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 2377746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 2387746f910656ce6e811853f4062108e9798063337Dianne Hackborn return -1; 2397746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 2407746f910656ce6e811853f4062108e9798063337Dianne Hackborn 2417746f910656ce6e811853f4062108e9798063337Dianne Hackborn @Override 2427746f910656ce6e811853f4062108e9798063337Dianne Hackborn protected void onPrepareDialogBuilder(Builder builder) { 2437746f910656ce6e811853f4062108e9798063337Dianne Hackborn super.onPrepareDialogBuilder(builder); 2447746f910656ce6e811853f4062108e9798063337Dianne Hackborn 2457746f910656ce6e811853f4062108e9798063337Dianne Hackborn if (mEntries == null || mEntryValues == null) { 2467746f910656ce6e811853f4062108e9798063337Dianne Hackborn throw new IllegalStateException( 2477746f910656ce6e811853f4062108e9798063337Dianne Hackborn "ListPreference requires an entries array and an entryValues array."); 2487746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 2497746f910656ce6e811853f4062108e9798063337Dianne Hackborn 2507746f910656ce6e811853f4062108e9798063337Dianne Hackborn mOrigValues = Arrays.copyOf(mSetValues, mSetValues.length); 2517746f910656ce6e811853f4062108e9798063337Dianne Hackborn builder.setMultiChoiceItems(mEntries, mSetValues, 2527746f910656ce6e811853f4062108e9798063337Dianne Hackborn new DialogInterface.OnMultiChoiceClickListener() { 2537746f910656ce6e811853f4062108e9798063337Dianne Hackborn @Override 2547746f910656ce6e811853f4062108e9798063337Dianne Hackborn public void onClick(DialogInterface dialog, int which, boolean isChecked) { 2557746f910656ce6e811853f4062108e9798063337Dianne Hackborn mSetValues[which] = isChecked; 2567746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 2577746f910656ce6e811853f4062108e9798063337Dianne Hackborn }); 2587746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 2597746f910656ce6e811853f4062108e9798063337Dianne Hackborn 2607746f910656ce6e811853f4062108e9798063337Dianne Hackborn @Override 2617746f910656ce6e811853f4062108e9798063337Dianne Hackborn protected void onDialogClosed(boolean positiveResult) { 2627746f910656ce6e811853f4062108e9798063337Dianne Hackborn super.onDialogClosed(positiveResult); 2637746f910656ce6e811853f4062108e9798063337Dianne Hackborn 2647746f910656ce6e811853f4062108e9798063337Dianne Hackborn if (positiveResult) { 2657746f910656ce6e811853f4062108e9798063337Dianne Hackborn if (callChangeListener(getValues())) { 2667746f910656ce6e811853f4062108e9798063337Dianne Hackborn return; 2677746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 2687746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 2697746f910656ce6e811853f4062108e9798063337Dianne Hackborn System.arraycopy(mOrigValues, 0, mSetValues, 0, mSetValues.length); 2707746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 2717746f910656ce6e811853f4062108e9798063337Dianne Hackborn 2727746f910656ce6e811853f4062108e9798063337Dianne Hackborn @Override 2737746f910656ce6e811853f4062108e9798063337Dianne Hackborn protected Object onGetDefaultValue(TypedArray a, int index) { 2747746f910656ce6e811853f4062108e9798063337Dianne Hackborn return a.getString(index); 2757746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 2767746f910656ce6e811853f4062108e9798063337Dianne Hackborn 2777746f910656ce6e811853f4062108e9798063337Dianne Hackborn @Override 2787746f910656ce6e811853f4062108e9798063337Dianne Hackborn protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { 2797746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 2807746f910656ce6e811853f4062108e9798063337Dianne Hackborn 2817746f910656ce6e811853f4062108e9798063337Dianne Hackborn @Override 2827746f910656ce6e811853f4062108e9798063337Dianne Hackborn protected Parcelable onSaveInstanceState() { 2837746f910656ce6e811853f4062108e9798063337Dianne Hackborn final Parcelable superState = super.onSaveInstanceState(); 2847746f910656ce6e811853f4062108e9798063337Dianne Hackborn if (isPersistent()) { 2857746f910656ce6e811853f4062108e9798063337Dianne Hackborn // No need to save instance state since it's persistent 2867746f910656ce6e811853f4062108e9798063337Dianne Hackborn return superState; 2877746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 2887746f910656ce6e811853f4062108e9798063337Dianne Hackborn 2897746f910656ce6e811853f4062108e9798063337Dianne Hackborn final SavedState myState = new SavedState(superState); 2907746f910656ce6e811853f4062108e9798063337Dianne Hackborn myState.values = getValues(); 2917746f910656ce6e811853f4062108e9798063337Dianne Hackborn return myState; 2927746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 2937746f910656ce6e811853f4062108e9798063337Dianne Hackborn 2947746f910656ce6e811853f4062108e9798063337Dianne Hackborn @Override 2957746f910656ce6e811853f4062108e9798063337Dianne Hackborn protected void onRestoreInstanceState(Parcelable state) { 2967746f910656ce6e811853f4062108e9798063337Dianne Hackborn if (state == null || !state.getClass().equals(SavedState.class)) { 2977746f910656ce6e811853f4062108e9798063337Dianne Hackborn // Didn't save state for us in onSaveInstanceState 2987746f910656ce6e811853f4062108e9798063337Dianne Hackborn super.onRestoreInstanceState(state); 2997746f910656ce6e811853f4062108e9798063337Dianne Hackborn return; 3007746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 3017746f910656ce6e811853f4062108e9798063337Dianne Hackborn 3027746f910656ce6e811853f4062108e9798063337Dianne Hackborn SavedState myState = (SavedState) state; 3037746f910656ce6e811853f4062108e9798063337Dianne Hackborn super.onRestoreInstanceState(myState.getSuperState()); 3047746f910656ce6e811853f4062108e9798063337Dianne Hackborn setValues(myState.values); 3057746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 3067746f910656ce6e811853f4062108e9798063337Dianne Hackborn 3077746f910656ce6e811853f4062108e9798063337Dianne Hackborn private static class SavedState extends BaseSavedState { 3087746f910656ce6e811853f4062108e9798063337Dianne Hackborn boolean[] values; 3097746f910656ce6e811853f4062108e9798063337Dianne Hackborn 3107746f910656ce6e811853f4062108e9798063337Dianne Hackborn public SavedState(Parcel source) { 3117746f910656ce6e811853f4062108e9798063337Dianne Hackborn super(source); 3127746f910656ce6e811853f4062108e9798063337Dianne Hackborn values = source.createBooleanArray(); 3137746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 3147746f910656ce6e811853f4062108e9798063337Dianne Hackborn 3157746f910656ce6e811853f4062108e9798063337Dianne Hackborn @Override 3167746f910656ce6e811853f4062108e9798063337Dianne Hackborn public void writeToParcel(Parcel dest, int flags) { 3177746f910656ce6e811853f4062108e9798063337Dianne Hackborn super.writeToParcel(dest, flags); 3187746f910656ce6e811853f4062108e9798063337Dianne Hackborn dest.writeBooleanArray(values); 3197746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 3207746f910656ce6e811853f4062108e9798063337Dianne Hackborn 3217746f910656ce6e811853f4062108e9798063337Dianne Hackborn public SavedState(Parcelable superState) { 3227746f910656ce6e811853f4062108e9798063337Dianne Hackborn super(superState); 3237746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 3247746f910656ce6e811853f4062108e9798063337Dianne Hackborn 3257746f910656ce6e811853f4062108e9798063337Dianne Hackborn public static final Parcelable.Creator<SavedState> CREATOR = 3267746f910656ce6e811853f4062108e9798063337Dianne Hackborn new Parcelable.Creator<SavedState>() { 3277746f910656ce6e811853f4062108e9798063337Dianne Hackborn public SavedState createFromParcel(Parcel in) { 3287746f910656ce6e811853f4062108e9798063337Dianne Hackborn return new SavedState(in); 3297746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 3307746f910656ce6e811853f4062108e9798063337Dianne Hackborn 3317746f910656ce6e811853f4062108e9798063337Dianne Hackborn public SavedState[] newArray(int size) { 3327746f910656ce6e811853f4062108e9798063337Dianne Hackborn return new SavedState[size]; 3337746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 3347746f910656ce6e811853f4062108e9798063337Dianne Hackborn }; 3357746f910656ce6e811853f4062108e9798063337Dianne Hackborn } 3367746f910656ce6e811853f4062108e9798063337Dianne Hackborn 3377746f910656ce6e811853f4062108e9798063337Dianne Hackborn} 338