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