1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.systemui.tuner;
17 
18 import android.annotation.SuppressLint;
19 import android.app.AlertDialog;
20 import android.app.Dialog;
21 import android.app.DialogFragment;
22 import android.content.DialogInterface;
23 import android.hardware.display.AmbientDisplayConfiguration;
24 import android.os.Build;
25 import android.os.Bundle;
26 import android.provider.Settings;
27 import android.view.Menu;
28 import android.view.MenuInflater;
29 import android.view.MenuItem;
30 
31 import androidx.preference.Preference;
32 import androidx.preference.PreferenceFragment;
33 
34 import com.android.internal.logging.MetricsLogger;
35 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
36 import com.android.systemui.R;
37 import com.android.systemui.shared.plugins.PluginPrefs;
38 
39 public class TunerFragment extends PreferenceFragment {
40 
41     private static final String TAG = "TunerFragment";
42 
43     private static final String KEY_BATTERY_PCT = "battery_pct";
44     private static final String KEY_PLUGINS = "plugins";
45     private static final CharSequence KEY_DOZE = "doze";
46 
47     public static final String SETTING_SEEN_TUNER_WARNING = "seen_tuner_warning";
48 
49     private static final String WARNING_TAG = "tuner_warning";
50     private static final String[] DEBUG_ONLY = new String[] {
51             "nav_bar",
52             "lockscreen",
53             "picture_in_picture",
54     };
55 
56     private static final int MENU_REMOVE = Menu.FIRST + 1;
57 
58     private final TunerService mTunerService;
59 
60     // We are the only ones who ever call this constructor, so don't worry about the warning
61     @SuppressLint("ValidFragment")
TunerFragment(TunerService tunerService)62     public TunerFragment(TunerService tunerService) {
63         super();
64         mTunerService = tunerService;
65     }
66 
67     @Override
onCreate(Bundle savedInstanceState)68     public void onCreate(Bundle savedInstanceState) {
69         super.onCreate(savedInstanceState);
70 
71         setHasOptionsMenu(true);
72     }
73 
74     @Override
onActivityCreated(Bundle savedInstanceState)75     public void onActivityCreated(Bundle savedInstanceState) {
76         super.onActivityCreated(savedInstanceState);
77         getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
78     }
79 
80     @Override
onCreatePreferences(Bundle savedInstanceState, String rootKey)81     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
82         addPreferencesFromResource(R.xml.tuner_prefs);
83         if (!PluginPrefs.hasPlugins(getContext())) {
84             getPreferenceScreen().removePreference(findPreference(KEY_PLUGINS));
85         }
86         if (!alwaysOnAvailable()) {
87             getPreferenceScreen().removePreference(findPreference(KEY_DOZE));
88         }
89         if (!Build.IS_DEBUGGABLE) {
90             for (int i = 0; i < DEBUG_ONLY.length; i++) {
91                 Preference preference = findPreference(DEBUG_ONLY[i]);
92                 if (preference != null) getPreferenceScreen().removePreference(preference);
93             }
94         }
95 
96         if (Settings.Secure.getInt(getContext().getContentResolver(), SETTING_SEEN_TUNER_WARNING,
97                 0) == 0) {
98             if (getFragmentManager().findFragmentByTag(WARNING_TAG) == null) {
99                 new TunerWarningFragment().show(getFragmentManager(), WARNING_TAG);
100             }
101         }
102     }
103 
alwaysOnAvailable()104     private boolean alwaysOnAvailable() {
105         return new AmbientDisplayConfiguration(getContext()).alwaysOnAvailable();
106     }
107 
108     @Override
onResume()109     public void onResume() {
110         super.onResume();
111         getActivity().setTitle(R.string.system_ui_tuner);
112 
113         MetricsLogger.visibility(getContext(), MetricsEvent.TUNER, true);
114     }
115 
116     @Override
onPause()117     public void onPause() {
118         super.onPause();
119 
120         MetricsLogger.visibility(getContext(), MetricsEvent.TUNER, false);
121     }
122 
123     @Override
onCreateOptionsMenu(Menu menu, MenuInflater inflater)124     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
125         menu.add(Menu.NONE, MENU_REMOVE, Menu.NONE, R.string.remove_from_settings);
126     }
127 
128     @Override
onOptionsItemSelected(MenuItem item)129     public boolean onOptionsItemSelected(MenuItem item) {
130         switch (item.getItemId()) {
131             case android.R.id.home:
132                 getActivity().finish();
133                 return true;
134             case MENU_REMOVE:
135                 mTunerService.showResetRequest(() -> {
136                     if (getActivity() != null) {
137                         getActivity().finish();
138                     }
139                 });
140                 return true;
141         }
142         return super.onOptionsItemSelected(item);
143     }
144 
145     public static class TunerWarningFragment extends DialogFragment {
146         @Override
onCreateDialog(Bundle savedInstanceState)147         public Dialog onCreateDialog(Bundle savedInstanceState) {
148             return new AlertDialog.Builder(getContext())
149                     .setTitle(R.string.tuner_warning_title)
150                     .setMessage(R.string.tuner_warning)
151                     .setPositiveButton(R.string.got_it, new DialogInterface.OnClickListener() {
152                         @Override
153                         public void onClick(DialogInterface dialog, int which) {
154                             Settings.Secure.putInt(getContext().getContentResolver(),
155                                     SETTING_SEEN_TUNER_WARNING, 1);
156                         }
157                     }).show();
158         }
159     }
160 }
161