1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5  * except in compliance with the License. You may obtain a copy of the License at
6  *
7  *      http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the
10  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11  * KIND, either express or implied. See the License for the specific language governing
12  * permissions and limitations under the License.
13  */
14 
15 package com.android.systemui.tuner;
16 
17 import android.annotation.Nullable;
18 import android.app.AlertDialog;
19 import android.app.Dialog;
20 import android.app.DialogFragment;
21 import android.content.Context;
22 import android.content.DialogInterface;
23 import android.content.DialogInterface.OnClickListener;
24 import android.os.Bundle;
25 import android.support.v14.preference.ListPreferenceDialogFragment;
26 import android.support.v7.preference.ListPreference;
27 import android.util.AttributeSet;
28 import android.view.LayoutInflater;
29 import android.view.View;
30 import android.view.ViewGroup;
31 
32 public class CustomListPreference extends ListPreference {
33 
CustomListPreference(Context context, AttributeSet attrs)34     public CustomListPreference(Context context, AttributeSet attrs) {
35         super(context, attrs);
36     }
37 
CustomListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)38     public CustomListPreference(Context context, AttributeSet attrs, int defStyleAttr,
39                                 int defStyleRes) {
40         super(context, attrs, defStyleAttr, defStyleRes);
41     }
42 
onPrepareDialogBuilder(AlertDialog.Builder builder, OnClickListener listener)43     protected void onPrepareDialogBuilder(AlertDialog.Builder builder,
44             OnClickListener listener) {
45     }
46 
onDialogClosed(boolean positiveResult)47     protected void onDialogClosed(boolean positiveResult) {
48     }
49 
onDialogCreated(DialogFragment fragment, Dialog dialog)50     protected Dialog onDialogCreated(DialogFragment fragment, Dialog dialog) {
51         return dialog;
52     }
53 
isAutoClosePreference()54     protected boolean isAutoClosePreference() {
55         return true;
56     }
57 
58     /**
59      * Called when a user is about to choose the given value, to determine if we
60      * should show a confirmation dialog.
61      *
62      * @param value the value the user is about to choose
63      * @return the message to show in a confirmation dialog, or {@code null} to
64      *         not request confirmation
65      */
getConfirmationMessage(String value)66     protected CharSequence getConfirmationMessage(String value) {
67         return null;
68     }
69 
onDialogStateRestored(DialogFragment fragment, Dialog dialog, Bundle savedInstanceState)70     protected void onDialogStateRestored(DialogFragment fragment, Dialog dialog,
71             Bundle savedInstanceState) {
72     }
73 
74     public static class CustomListPreferenceDialogFragment extends ListPreferenceDialogFragment {
75 
76         private static final String KEY_CLICKED_ENTRY_INDEX
77                 = "settings.CustomListPrefDialog.KEY_CLICKED_ENTRY_INDEX";
78 
79         private int mClickedDialogEntryIndex;
80 
newInstance(String key)81         public static ListPreferenceDialogFragment newInstance(String key) {
82             final ListPreferenceDialogFragment fragment = new CustomListPreferenceDialogFragment();
83             final Bundle b = new Bundle(1);
84             b.putString(ARG_KEY, key);
85             fragment.setArguments(b);
86             return fragment;
87         }
88 
getCustomizablePreference()89         public CustomListPreference getCustomizablePreference() {
90             return (CustomListPreference) getPreference();
91         }
92 
93         @Override
onPrepareDialogBuilder(AlertDialog.Builder builder)94         protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
95             super.onPrepareDialogBuilder(builder);
96             mClickedDialogEntryIndex = getCustomizablePreference()
97                     .findIndexOfValue(getCustomizablePreference().getValue());
98             getCustomizablePreference().onPrepareDialogBuilder(builder, getOnItemClickListener());
99             if (!getCustomizablePreference().isAutoClosePreference()) {
100                 builder.setPositiveButton(com.android.internal.R.string.ok, new OnClickListener() {
101                     @Override
102                     public void onClick(DialogInterface dialog, int which) {
103                         onItemConfirmed();
104                     }
105                 });
106             }
107         }
108 
109         @Override
onCreateDialog(Bundle savedInstanceState)110         public Dialog onCreateDialog(Bundle savedInstanceState) {
111             Dialog dialog = super.onCreateDialog(savedInstanceState);
112             if (savedInstanceState != null) {
113                 mClickedDialogEntryIndex = savedInstanceState.getInt(KEY_CLICKED_ENTRY_INDEX,
114                         mClickedDialogEntryIndex);
115             }
116             return getCustomizablePreference().onDialogCreated(this, dialog);
117         }
118 
119         @Override
onSaveInstanceState(Bundle outState)120         public void onSaveInstanceState(Bundle outState) {
121             super.onSaveInstanceState(outState);
122             outState.putInt(KEY_CLICKED_ENTRY_INDEX, mClickedDialogEntryIndex);
123         }
124 
125         @Override
onActivityCreated(Bundle savedInstanceState)126         public void onActivityCreated(Bundle savedInstanceState) {
127             super.onActivityCreated(savedInstanceState);
128             getCustomizablePreference().onDialogStateRestored(this, getDialog(), savedInstanceState);
129         }
130 
getOnItemClickListener()131         protected OnClickListener getOnItemClickListener() {
132             return new OnClickListener() {
133                 @Override
134                 public void onClick(DialogInterface dialog, int which) {
135                     setClickedDialogEntryIndex(which);
136                     if (getCustomizablePreference().isAutoClosePreference()) {
137                         onItemConfirmed();
138                     }
139                 }
140             };
141         }
142 
setClickedDialogEntryIndex(int which)143         protected void setClickedDialogEntryIndex(int which) {
144             mClickedDialogEntryIndex = which;
145         }
146 
getValue()147         private String getValue() {
148             final ListPreference preference = getCustomizablePreference();
149             if (mClickedDialogEntryIndex >= 0 && preference.getEntryValues() != null) {
150                 return preference.getEntryValues()[mClickedDialogEntryIndex].toString();
151             } else {
152                 return null;
153             }
154         }
155 
onItemConfirmed()156         protected void onItemConfirmed() {
157             onClick(getDialog(), DialogInterface.BUTTON_POSITIVE);
158             getDialog().dismiss();
159         }
160 
161         @Override
onDialogClosed(boolean positiveResult)162         public void onDialogClosed(boolean positiveResult) {
163             getCustomizablePreference().onDialogClosed(positiveResult);
164             final ListPreference preference = getCustomizablePreference();
165             final String value = getValue();
166             if (positiveResult && value != null) {
167                 if (preference.callChangeListener(value)) {
168                     preference.setValue(value);
169                 }
170             }
171         }
172     }
173 }
174