16904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler/*
26904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Copyright (C) 2015 The Android Open Source Project
36904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *
46904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Licensed under the Apache License, Version 2.0 (the "License");
56904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * you may not use this file except in compliance with the License.
66904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * You may obtain a copy of the License at
76904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *
86904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *      http://www.apache.org/licenses/LICENSE-2.0
96904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *
106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Unless required by applicable law or agreed to in writing, software
116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * distributed under the License is distributed on an "AS IS" BASIS,
126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * See the License for the specific language governing permissions and
146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * limitations under the License
156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */
166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
176904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerpackage android.support.v14.preference;
186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
196904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.app.AlertDialog;
206904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.content.DialogInterface;
216904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.os.Bundle;
22c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantlerimport android.support.annotation.NonNull;
236904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.support.v7.preference.ListPreference;
246904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerpublic class ListPreferenceDialogFragment extends PreferenceDialogFragment {
266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
27c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler    private static final String SAVE_STATE_INDEX = "ListPreferenceDialogFragment.index";
28c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler    private static final String SAVE_STATE_ENTRIES = "ListPreferenceDialogFragment.entries";
29c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler    private static final String SAVE_STATE_ENTRY_VALUES =
30c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler            "ListPreferenceDialogFragment.entryValues";
31c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler
326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private int mClickedDialogEntryIndex;
33c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler    private CharSequence[] mEntries;
34c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler    private CharSequence[] mEntryValues;
356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
366904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public static ListPreferenceDialogFragment newInstance(String key) {
376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        final ListPreferenceDialogFragment fragment = new ListPreferenceDialogFragment();
386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        final Bundle b = new Bundle(1);
396904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        b.putString(ARG_KEY, key);
406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        fragment.setArguments(b);
416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return fragment;
426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
44c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler    @Override
45c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler    public void onCreate(Bundle savedInstanceState) {
46c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler        super.onCreate(savedInstanceState);
47c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler        if (savedInstanceState == null) {
48c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler            final ListPreference preference = getListPreference();
49c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler
50c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler            if (preference.getEntries() == null || preference.getEntryValues() == null) {
51c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler                throw new IllegalStateException(
52c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler                        "ListPreference requires an entries array and an entryValues array.");
53c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler            }
54c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler
55c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler            mClickedDialogEntryIndex = preference.findIndexOfValue(preference.getValue());
56c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler            mEntries = preference.getEntries();
57c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler            mEntryValues = preference.getEntryValues();
58c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler        } else {
59c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler            mClickedDialogEntryIndex = savedInstanceState.getInt(SAVE_STATE_INDEX, 0);
60c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler            mEntries = savedInstanceState.getCharSequenceArray(SAVE_STATE_ENTRIES);
61c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler            mEntryValues = savedInstanceState.getCharSequenceArray(SAVE_STATE_ENTRY_VALUES);
62c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler        }
63c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler    }
64c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler
65c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler    @Override
66c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler    public void onSaveInstanceState(@NonNull Bundle outState) {
67c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler        super.onSaveInstanceState(outState);
68c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler        outState.putInt(SAVE_STATE_INDEX, mClickedDialogEntryIndex);
69c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler        outState.putCharSequenceArray(SAVE_STATE_ENTRIES, mEntries);
70c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler        outState.putCharSequenceArray(SAVE_STATE_ENTRY_VALUES, mEntryValues);
71c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler    }
72c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler
736904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private ListPreference getListPreference() {
746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return (ListPreference) getPreference();
756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
766904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
776904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    @Override
786904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
796904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        super.onPrepareDialogBuilder(builder);
806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
81c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler        builder.setSingleChoiceItems(mEntries, mClickedDialogEntryIndex,
826904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                new DialogInterface.OnClickListener() {
836904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                    public void onClick(DialogInterface dialog, int which) {
846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                        mClickedDialogEntryIndex = which;
856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                        /*
876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                         * Clicking on an item simulates the positive button
886904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                         * click, and dismisses the dialog.
896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                         */
906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                        ListPreferenceDialogFragment.this.onClick(dialog,
916904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                                DialogInterface.BUTTON_POSITIVE);
926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                        dialog.dismiss();
936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                    }
946904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                });
956904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
966904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        /*
976904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         * The typical interaction for list-based dialogs is to have
986904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         * click-on-an-item dismiss the dialog instead of the user having to
996904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         * press 'Ok'.
1006904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler         */
1016904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        builder.setPositiveButton(null, null);
1026904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1036904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1046904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    @Override
1056904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void onDialogClosed(boolean positiveResult) {
1066904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        final ListPreference preference = getListPreference();
107c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler        if (positiveResult && mClickedDialogEntryIndex >= 0) {
108c12b7f9acda3a2892a6a9f0d8f37476158a67bbbTony Mantler            String value = mEntryValues[mClickedDialogEntryIndex].toString();
1096904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            if (preference.callChangeListener(value)) {
1106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                preference.setValue(value);
1116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            }
1126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
1136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler}
116