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.app.AlertDialog.Builder;
18790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.app.Dialog;
19790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.app.DialogFragment;
20790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.app.Fragment;
21790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.content.Context;
22790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.content.DialogInterface.OnClickListener;
23790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.os.Bundle;
24790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.support.v14.preference.PreferenceFragment;
25790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.support.v7.preference.Preference;
26790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.support.v7.preference.PreferenceScreen;
27790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.util.AttributeSet;
28790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.util.Log;
29790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.view.View;
30790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport android.widget.Toolbar;
31790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
32790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport com.android.settingslib.Utils;
33790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport com.android.systemui.fragments.FragmentHostManager;
34790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport com.android.systemui.R;
35790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
36790442e4cd8106cf2c69d23ff185953b620b087aJason Monkimport libcore.util.Objects;
37790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
38790442e4cd8106cf2c69d23ff185953b620b087aJason Monkpublic class RadioListPreference extends CustomListPreference {
39790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
40790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    private OnClickListener mOnClickListener;
41790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    private CharSequence mSummary;
42790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
43790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    public RadioListPreference(Context context, AttributeSet attrs) {
44790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        super(context, attrs);
45790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    }
46790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
47790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    @Override
48790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    protected void onPrepareDialogBuilder(Builder builder, OnClickListener listener) {
49790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        mOnClickListener = listener;
50790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    }
51790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
52790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    @Override
53790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    public void setSummary(CharSequence summary) {
54790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        super.setSummary(summary);
55790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        mSummary = summary;
56790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    }
57790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
58790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    @Override
59790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    public CharSequence getSummary() {
60790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        if (mSummary == null || mSummary.toString().contains("%s")) {
61790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            return super.getSummary();
62790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        }
63790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        return mSummary;
64790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    }
65790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
66790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    @Override
67790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    protected Dialog onDialogCreated(DialogFragment fragment, Dialog dialog) {
68790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        Dialog d = new Dialog(getContext(), android.R.style.Theme_DeviceDefault_Settings);
69790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        Toolbar t = (Toolbar) d.findViewById(com.android.internal.R.id.action_bar);
70790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        View v = new View(getContext());
71790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        v.setId(R.id.content);
72790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        d.setContentView(v);
73790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        t.setTitle(getTitle());
74790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        t.setNavigationIcon(Utils.getDrawable(d.getContext(), android.R.attr.homeAsUpIndicator));
75790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        t.setNavigationOnClickListener(view -> d.dismiss());
76790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
77790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        RadioFragment f = new RadioFragment();
78790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        f.setPreference(this);
79790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        FragmentHostManager.get(v).getFragmentManager()
80790442e4cd8106cf2c69d23ff185953b620b087aJason Monk                .beginTransaction()
81790442e4cd8106cf2c69d23ff185953b620b087aJason Monk                .add(android.R.id.content, f)
82790442e4cd8106cf2c69d23ff185953b620b087aJason Monk                .commit();
83790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        return d;
84790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    }
85790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
86790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    @Override
87790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    protected void onDialogStateRestored(DialogFragment fragment, Dialog dialog,
88790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            Bundle savedInstanceState) {
89790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        super.onDialogStateRestored(fragment, dialog, savedInstanceState);
90790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        View view = dialog.findViewById(R.id.content);
91790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        RadioFragment radioFragment = (RadioFragment) FragmentHostManager.get(view)
92790442e4cd8106cf2c69d23ff185953b620b087aJason Monk                .getFragmentManager().findFragmentById(R.id.content);
93790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        if (radioFragment != null) {
94790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            radioFragment.setPreference(this);
95790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        }
96790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    }
97790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
98790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    @Override
99790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    protected void onDialogClosed(boolean positiveResult) {
100790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        super.onDialogClosed(positiveResult);
101790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    }
102790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
103790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    public static class RadioFragment extends TunerPreferenceFragment {
104790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        private RadioListPreference mListPref;
105790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
106790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        @Override
107790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
108790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            Context context = getPreferenceManager().getContext();
109790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(context);
110790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            setPreferenceScreen(screen);
111790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            if (mListPref != null) {
112790442e4cd8106cf2c69d23ff185953b620b087aJason Monk                update();
113790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            }
114790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        }
115790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
116790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        private void update() {
117790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            Context context = getPreferenceManager().getContext();
118790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
119790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            CharSequence[] entries = mListPref.getEntries();
120790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            CharSequence[] values = mListPref.getEntryValues();
121790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            CharSequence current = mListPref.getValue();
122790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            for (int i = 0; i < entries.length; i++) {
123790442e4cd8106cf2c69d23ff185953b620b087aJason Monk                CharSequence entry = entries[i];
124790442e4cd8106cf2c69d23ff185953b620b087aJason Monk                SelectablePreference pref = new SelectablePreference(context);
125790442e4cd8106cf2c69d23ff185953b620b087aJason Monk                getPreferenceScreen().addPreference(pref);
126790442e4cd8106cf2c69d23ff185953b620b087aJason Monk                pref.setTitle(entry);
127790442e4cd8106cf2c69d23ff185953b620b087aJason Monk                pref.setChecked(Objects.equal(current, values[i]));
128790442e4cd8106cf2c69d23ff185953b620b087aJason Monk                pref.setKey(String.valueOf(i));
129790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            }
130790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        }
131790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
132790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        @Override
133790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        public boolean onPreferenceTreeClick(Preference preference) {
134790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            mListPref.mOnClickListener.onClick(null, Integer.parseInt(preference.getKey()));
135790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            return true;
136790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        }
137790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
138790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        public void setPreference(RadioListPreference radioListPreference) {
139790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            mListPref = radioListPreference;
140790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            if (getPreferenceManager() != null) {
141790442e4cd8106cf2c69d23ff185953b620b087aJason Monk                update();
142790442e4cd8106cf2c69d23ff185953b620b087aJason Monk            }
143790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        }
144790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    }
145790442e4cd8106cf2c69d23ff185953b620b087aJason Monk}
146