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