• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16 
17 package android.support.v14.preference;
18 
19 import android.app.AlertDialog;
20 import android.content.DialogInterface;
21 import android.os.Bundle;
22 import android.support.annotation.NonNull;
23 import android.support.v7.preference.internal.AbstractMultiSelectListPreference;
24 
25 import java.util.ArrayList;
26 import java.util.HashSet;
27 import java.util.Set;
28 
29 public class MultiSelectListPreferenceDialogFragment extends PreferenceDialogFragment {
30 
31     private static final String SAVE_STATE_VALUES =
32             "MultiSelectListPreferenceDialogFragment.values";
33     private static final String SAVE_STATE_CHANGED =
34             "MultiSelectListPreferenceDialogFragment.changed";
35     private static final String SAVE_STATE_ENTRIES =
36             "MultiSelectListPreferenceDialogFragment.entries";
37     private static final String SAVE_STATE_ENTRY_VALUES =
38             "MultiSelectListPreferenceDialogFragment.entryValues";
39 
40     private Set<String> mNewValues = new HashSet<>();
41     private boolean mPreferenceChanged;
42     private CharSequence[] mEntries;
43     private CharSequence[] mEntryValues;
44 
newInstance(String key)45     public static MultiSelectListPreferenceDialogFragment newInstance(String key) {
46         final MultiSelectListPreferenceDialogFragment fragment =
47                 new MultiSelectListPreferenceDialogFragment();
48         final Bundle b = new Bundle(1);
49         b.putString(ARG_KEY, key);
50         fragment.setArguments(b);
51         return fragment;
52     }
53 
54     @Override
onCreate(Bundle savedInstanceState)55     public void onCreate(Bundle savedInstanceState) {
56         super.onCreate(savedInstanceState);
57 
58         if (savedInstanceState == null) {
59             final AbstractMultiSelectListPreference preference = getListPreference();
60 
61             if (preference.getEntries() == null || preference.getEntryValues() == null) {
62                 throw new IllegalStateException(
63                         "MultiSelectListPreference requires an entries array and " +
64                                 "an entryValues array.");
65             }
66 
67             mNewValues.clear();
68             mNewValues.addAll(preference.getValues());
69             mPreferenceChanged = false;
70             mEntries = preference.getEntries();
71             mEntryValues = preference.getEntryValues();
72         } else {
73             mNewValues.clear();
74             mNewValues.addAll(savedInstanceState.getStringArrayList(SAVE_STATE_VALUES));
75             mPreferenceChanged = savedInstanceState.getBoolean(SAVE_STATE_CHANGED, false);
76             mEntries = savedInstanceState.getCharSequenceArray(SAVE_STATE_ENTRIES);
77             mEntryValues = savedInstanceState.getCharSequenceArray(SAVE_STATE_ENTRY_VALUES);
78         }
79     }
80 
81     @Override
onSaveInstanceState(@onNull Bundle outState)82     public void onSaveInstanceState(@NonNull Bundle outState) {
83         super.onSaveInstanceState(outState);
84         outState.putStringArrayList(SAVE_STATE_VALUES, new ArrayList<>(mNewValues));
85         outState.putBoolean(SAVE_STATE_CHANGED, mPreferenceChanged);
86         outState.putCharSequenceArray(SAVE_STATE_ENTRIES, mEntries);
87         outState.putCharSequenceArray(SAVE_STATE_ENTRY_VALUES, mEntryValues);
88     }
89 
getListPreference()90     private AbstractMultiSelectListPreference getListPreference() {
91         return (AbstractMultiSelectListPreference) getPreference();
92     }
93 
94     @Override
onPrepareDialogBuilder(AlertDialog.Builder builder)95     protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
96         super.onPrepareDialogBuilder(builder);
97 
98         final int entryCount = mEntryValues.length;
99         final boolean[] checkedItems = new boolean[entryCount];
100         for (int i = 0; i < entryCount; i++) {
101             checkedItems[i] = mNewValues.contains(mEntryValues[i].toString());
102         }
103         builder.setMultiChoiceItems(mEntries, checkedItems,
104                 new DialogInterface.OnMultiChoiceClickListener() {
105                     @Override
106                     public void onClick(DialogInterface dialog, int which, boolean isChecked) {
107                         if (isChecked) {
108                             mPreferenceChanged |= mNewValues.add(
109                                     mEntryValues[which].toString());
110                         } else {
111                             mPreferenceChanged |= mNewValues.remove(
112                                     mEntryValues[which].toString());
113                         }
114                     }
115                 });
116     }
117 
118     @Override
onDialogClosed(boolean positiveResult)119     public void onDialogClosed(boolean positiveResult) {
120         final AbstractMultiSelectListPreference preference = getListPreference();
121         if (positiveResult && mPreferenceChanged) {
122             final Set<String> values = mNewValues;
123             if (preference.callChangeListener(values)) {
124                 preference.setValues(values);
125             }
126         }
127         mPreferenceChanged = false;
128     }
129 }
130