1790442e4cd8106cf2c69d23ff185953b620b087aJason Monk/* 2790442e4cd8106cf2c69d23ff185953b620b087aJason Monk * Copyright (C) 2017 The Android Open Source Project 3790442e4cd8106cf2c69d23ff185953b620b087aJason Monk * 4790442e4cd8106cf2c69d23ff185953b620b087aJason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5790442e4cd8106cf2c69d23ff185953b620b087aJason Monk * except in compliance with the License. You may obtain a copy of the License at 6790442e4cd8106cf2c69d23ff185953b620b087aJason Monk * 7790442e4cd8106cf2c69d23ff185953b620b087aJason Monk * http://www.apache.org/licenses/LICENSE-2.0 8790442e4cd8106cf2c69d23ff185953b620b087aJason Monk * 9790442e4cd8106cf2c69d23ff185953b620b087aJason Monk * Unless required by applicable law or agreed to in writing, software distributed under the 10790442e4cd8106cf2c69d23ff185953b620b087aJason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11790442e4cd8106cf2c69d23ff185953b620b087aJason Monk * KIND, either express or implied. See the License for the specific language governing 12790442e4cd8106cf2c69d23ff185953b620b087aJason Monk * permissions and limitations under the License. 13790442e4cd8106cf2c69d23ff185953b620b087aJason Monk */ 14790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 15790442e4cd8106cf2c69d23ff185953b620b087aJason Monkpackage com.android.systemui.tuner; 16790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 17790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.annotation.Nullable; 18790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.app.AlertDialog; 19790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.app.Dialog; 20790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.app.DialogFragment; 21790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.content.Context; 22790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.content.DialogInterface; 23790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.content.DialogInterface.OnClickListener; 24790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.os.Bundle; 25790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.support.v14.preference.ListPreferenceDialogFragment; 26790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.support.v7.preference.ListPreference; 27790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.util.AttributeSet; 28790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.view.LayoutInflater; 29790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.view.View; 30790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.view.ViewGroup; 31790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 32790442e4cd8106cf2c69d23ff185953b620b087aJason Monkpublic class CustomListPreference extends ListPreference { 33790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 34790442e4cd8106cf2c69d23ff185953b620b087aJason Monk public CustomListPreference(Context context, AttributeSet attrs) { 35790442e4cd8106cf2c69d23ff185953b620b087aJason Monk super(context, attrs); 36790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 37790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 38790442e4cd8106cf2c69d23ff185953b620b087aJason Monk public CustomListPreference(Context context, AttributeSet attrs, int defStyleAttr, 39790442e4cd8106cf2c69d23ff185953b620b087aJason Monk int defStyleRes) { 40790442e4cd8106cf2c69d23ff185953b620b087aJason Monk super(context, attrs, defStyleAttr, defStyleRes); 41790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 42790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 43790442e4cd8106cf2c69d23ff185953b620b087aJason Monk protected void onPrepareDialogBuilder(AlertDialog.Builder builder, 44790442e4cd8106cf2c69d23ff185953b620b087aJason Monk OnClickListener listener) { 45790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 46790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 47790442e4cd8106cf2c69d23ff185953b620b087aJason Monk protected void onDialogClosed(boolean positiveResult) { 48790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 49790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 50790442e4cd8106cf2c69d23ff185953b620b087aJason Monk protected Dialog onDialogCreated(DialogFragment fragment, Dialog dialog) { 51790442e4cd8106cf2c69d23ff185953b620b087aJason Monk return dialog; 52790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 53790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 54790442e4cd8106cf2c69d23ff185953b620b087aJason Monk protected boolean isAutoClosePreference() { 55790442e4cd8106cf2c69d23ff185953b620b087aJason Monk return true; 56790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 57790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 58790442e4cd8106cf2c69d23ff185953b620b087aJason Monk /** 59790442e4cd8106cf2c69d23ff185953b620b087aJason Monk * Called when a user is about to choose the given value, to determine if we 60790442e4cd8106cf2c69d23ff185953b620b087aJason Monk * should show a confirmation dialog. 61790442e4cd8106cf2c69d23ff185953b620b087aJason Monk * 62790442e4cd8106cf2c69d23ff185953b620b087aJason Monk * @param value the value the user is about to choose 63790442e4cd8106cf2c69d23ff185953b620b087aJason Monk * @return the message to show in a confirmation dialog, or {@code null} to 64790442e4cd8106cf2c69d23ff185953b620b087aJason Monk * not request confirmation 65790442e4cd8106cf2c69d23ff185953b620b087aJason Monk */ 66790442e4cd8106cf2c69d23ff185953b620b087aJason Monk protected CharSequence getConfirmationMessage(String value) { 67790442e4cd8106cf2c69d23ff185953b620b087aJason Monk return null; 68790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 69790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 70790442e4cd8106cf2c69d23ff185953b620b087aJason Monk protected void onDialogStateRestored(DialogFragment fragment, Dialog dialog, 71790442e4cd8106cf2c69d23ff185953b620b087aJason Monk Bundle savedInstanceState) { 72790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 73790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 74790442e4cd8106cf2c69d23ff185953b620b087aJason Monk public static class CustomListPreferenceDialogFragment extends ListPreferenceDialogFragment { 75790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 76790442e4cd8106cf2c69d23ff185953b620b087aJason Monk private static final String KEY_CLICKED_ENTRY_INDEX 77790442e4cd8106cf2c69d23ff185953b620b087aJason Monk = "settings.CustomListPrefDialog.KEY_CLICKED_ENTRY_INDEX"; 78790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 79790442e4cd8106cf2c69d23ff185953b620b087aJason Monk private int mClickedDialogEntryIndex; 80790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 81790442e4cd8106cf2c69d23ff185953b620b087aJason Monk public static ListPreferenceDialogFragment newInstance(String key) { 82790442e4cd8106cf2c69d23ff185953b620b087aJason Monk final ListPreferenceDialogFragment fragment = new CustomListPreferenceDialogFragment(); 83790442e4cd8106cf2c69d23ff185953b620b087aJason Monk final Bundle b = new Bundle(1); 84790442e4cd8106cf2c69d23ff185953b620b087aJason Monk b.putString(ARG_KEY, key); 85790442e4cd8106cf2c69d23ff185953b620b087aJason Monk fragment.setArguments(b); 86790442e4cd8106cf2c69d23ff185953b620b087aJason Monk return fragment; 87790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 88790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 89790442e4cd8106cf2c69d23ff185953b620b087aJason Monk public CustomListPreference getCustomizablePreference() { 90790442e4cd8106cf2c69d23ff185953b620b087aJason Monk return (CustomListPreference) getPreference(); 91790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 92790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 93790442e4cd8106cf2c69d23ff185953b620b087aJason Monk @Override 94790442e4cd8106cf2c69d23ff185953b620b087aJason Monk protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { 95790442e4cd8106cf2c69d23ff185953b620b087aJason Monk super.onPrepareDialogBuilder(builder); 96790442e4cd8106cf2c69d23ff185953b620b087aJason Monk mClickedDialogEntryIndex = getCustomizablePreference() 97790442e4cd8106cf2c69d23ff185953b620b087aJason Monk .findIndexOfValue(getCustomizablePreference().getValue()); 98790442e4cd8106cf2c69d23ff185953b620b087aJason Monk getCustomizablePreference().onPrepareDialogBuilder(builder, getOnItemClickListener()); 99790442e4cd8106cf2c69d23ff185953b620b087aJason Monk if (!getCustomizablePreference().isAutoClosePreference()) { 100790442e4cd8106cf2c69d23ff185953b620b087aJason Monk builder.setPositiveButton(com.android.internal.R.string.ok, new OnClickListener() { 101790442e4cd8106cf2c69d23ff185953b620b087aJason Monk @Override 102790442e4cd8106cf2c69d23ff185953b620b087aJason Monk public void onClick(DialogInterface dialog, int which) { 103790442e4cd8106cf2c69d23ff185953b620b087aJason Monk onItemConfirmed(); 104790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 105790442e4cd8106cf2c69d23ff185953b620b087aJason Monk }); 106790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 107790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 108790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 109790442e4cd8106cf2c69d23ff185953b620b087aJason Monk @Override 110790442e4cd8106cf2c69d23ff185953b620b087aJason Monk public Dialog onCreateDialog(Bundle savedInstanceState) { 111790442e4cd8106cf2c69d23ff185953b620b087aJason Monk Dialog dialog = super.onCreateDialog(savedInstanceState); 112790442e4cd8106cf2c69d23ff185953b620b087aJason Monk if (savedInstanceState != null) { 113790442e4cd8106cf2c69d23ff185953b620b087aJason Monk mClickedDialogEntryIndex = savedInstanceState.getInt(KEY_CLICKED_ENTRY_INDEX, 114790442e4cd8106cf2c69d23ff185953b620b087aJason Monk mClickedDialogEntryIndex); 115790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 116790442e4cd8106cf2c69d23ff185953b620b087aJason Monk return getCustomizablePreference().onDialogCreated(this, dialog); 117790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 118790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 119790442e4cd8106cf2c69d23ff185953b620b087aJason Monk @Override 120790442e4cd8106cf2c69d23ff185953b620b087aJason Monk public void onSaveInstanceState(Bundle outState) { 121790442e4cd8106cf2c69d23ff185953b620b087aJason Monk super.onSaveInstanceState(outState); 122790442e4cd8106cf2c69d23ff185953b620b087aJason Monk outState.putInt(KEY_CLICKED_ENTRY_INDEX, mClickedDialogEntryIndex); 123790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 124790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 125790442e4cd8106cf2c69d23ff185953b620b087aJason Monk @Override 126790442e4cd8106cf2c69d23ff185953b620b087aJason Monk public void onActivityCreated(Bundle savedInstanceState) { 127790442e4cd8106cf2c69d23ff185953b620b087aJason Monk super.onActivityCreated(savedInstanceState); 128790442e4cd8106cf2c69d23ff185953b620b087aJason Monk getCustomizablePreference().onDialogStateRestored(this, getDialog(), savedInstanceState); 129790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 130790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 131790442e4cd8106cf2c69d23ff185953b620b087aJason Monk protected OnClickListener getOnItemClickListener() { 132790442e4cd8106cf2c69d23ff185953b620b087aJason Monk return new OnClickListener() { 133790442e4cd8106cf2c69d23ff185953b620b087aJason Monk @Override 134790442e4cd8106cf2c69d23ff185953b620b087aJason Monk public void onClick(DialogInterface dialog, int which) { 135790442e4cd8106cf2c69d23ff185953b620b087aJason Monk setClickedDialogEntryIndex(which); 136790442e4cd8106cf2c69d23ff185953b620b087aJason Monk if (getCustomizablePreference().isAutoClosePreference()) { 137790442e4cd8106cf2c69d23ff185953b620b087aJason Monk onItemConfirmed(); 138790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 139790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 140790442e4cd8106cf2c69d23ff185953b620b087aJason Monk }; 141790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 142790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 143790442e4cd8106cf2c69d23ff185953b620b087aJason Monk protected void setClickedDialogEntryIndex(int which) { 144790442e4cd8106cf2c69d23ff185953b620b087aJason Monk mClickedDialogEntryIndex = which; 145790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 146790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 147790442e4cd8106cf2c69d23ff185953b620b087aJason Monk private String getValue() { 148790442e4cd8106cf2c69d23ff185953b620b087aJason Monk final ListPreference preference = getCustomizablePreference(); 149790442e4cd8106cf2c69d23ff185953b620b087aJason Monk if (mClickedDialogEntryIndex >= 0 && preference.getEntryValues() != null) { 150790442e4cd8106cf2c69d23ff185953b620b087aJason Monk return preference.getEntryValues()[mClickedDialogEntryIndex].toString(); 151790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } else { 152790442e4cd8106cf2c69d23ff185953b620b087aJason Monk return null; 153790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 154790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 155790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 156790442e4cd8106cf2c69d23ff185953b620b087aJason Monk protected void onItemConfirmed() { 157790442e4cd8106cf2c69d23ff185953b620b087aJason Monk onClick(getDialog(), DialogInterface.BUTTON_POSITIVE); 158790442e4cd8106cf2c69d23ff185953b620b087aJason Monk getDialog().dismiss(); 159790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 160790442e4cd8106cf2c69d23ff185953b620b087aJason Monk 161790442e4cd8106cf2c69d23ff185953b620b087aJason Monk @Override 162790442e4cd8106cf2c69d23ff185953b620b087aJason Monk public void onDialogClosed(boolean positiveResult) { 163790442e4cd8106cf2c69d23ff185953b620b087aJason Monk getCustomizablePreference().onDialogClosed(positiveResult); 164790442e4cd8106cf2c69d23ff185953b620b087aJason Monk final ListPreference preference = getCustomizablePreference(); 165790442e4cd8106cf2c69d23ff185953b620b087aJason Monk final String value = getValue(); 166790442e4cd8106cf2c69d23ff185953b620b087aJason Monk if (positiveResult && value != null) { 167790442e4cd8106cf2c69d23ff185953b620b087aJason Monk if (preference.callChangeListener(value)) { 168790442e4cd8106cf2c69d23ff185953b620b087aJason Monk preference.setValue(value); 169790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 170790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 171790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 172790442e4cd8106cf2c69d23ff185953b620b087aJason Monk } 173790442e4cd8106cf2c69d23ff185953b620b087aJason Monk} 174