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