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.app.AlertDialog; 200112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.content.DialogInterface; 210112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport android.os.Bundle; 220112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 230112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport java.util.HashSet; 240112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerimport java.util.Set; 250112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 260112bacf4aa212f4d0da45594a88694f295ae56cTony Mantlerpublic class MultiSelectListPreferenceDialogFragment extends PreferenceDialogFragment { 270112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 280112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler private Set<String> mNewValues = new HashSet<>(); 290112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler private boolean mPreferenceChanged; 300112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 310112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public static MultiSelectListPreferenceDialogFragment newInstance(String key) { 320112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler final MultiSelectListPreferenceDialogFragment fragment = 330112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler new MultiSelectListPreferenceDialogFragment(); 340112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler final Bundle b = new Bundle(1); 350112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler b.putString(ARG_KEY, key); 360112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler fragment.setArguments(b); 370112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return fragment; 380112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 390112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 400112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler private MultiSelectListPreference getListPreference() { 410112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler return (MultiSelectListPreference) getPreference(); 420112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 430112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 440112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler @Override 450112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { 460112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler super.onPrepareDialogBuilder(builder); 470112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 480112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler final MultiSelectListPreference preference = getListPreference(); 490112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 500112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler if (preference.getEntries() == null || preference.getEntryValues() == null) { 510112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler throw new IllegalStateException( 520112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler "MultiSelectListPreference requires an entries array and " + 530112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler "an entryValues array."); 540112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 550112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 560112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler boolean[] checkedItems = preference.getSelectedItems(); 570112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler builder.setMultiChoiceItems(preference.getEntries(), checkedItems, 580112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler new DialogInterface.OnMultiChoiceClickListener() { 590112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public void onClick(DialogInterface dialog, int which, boolean isChecked) { 600112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler if (isChecked) { 610112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler mPreferenceChanged |= mNewValues.add( 620112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler preference.getEntryValues()[which].toString()); 630112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } else { 640112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler mPreferenceChanged |= mNewValues.remove( 650112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler preference.getEntryValues()[which].toString()); 660112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 670112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 680112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler }); 690112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler mNewValues.clear(); 700112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler mNewValues.addAll(preference.getValues()); 710112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 720112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 730112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler @Override 740112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler public void onDialogClosed(boolean positiveResult) { 750112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler final MultiSelectListPreference preference = getListPreference(); 760112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler if (positiveResult && mPreferenceChanged) { 770112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler final Set<String> values = mNewValues; 780112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler if (preference.callChangeListener(values)) { 790112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler preference.setValues(values); 800112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 810112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 820112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler mPreferenceChanged = false; 830112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler } 840112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler 850112bacf4aa212f4d0da45594a88694f295ae56cTony Mantler} 86