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.content.Context;
20 import android.content.Intent;
21 import android.os.Bundle;
22 import android.view.MenuItem;
23 
24 import androidx.preference.Preference;
25 import androidx.preference.Preference.OnPreferenceChangeListener;
26 import androidx.preference.PreferenceFragment;
27 import androidx.preference.PreferenceScreen;
28 import androidx.preference.SwitchPreference;
29 
30 import com.android.internal.logging.MetricsLogger;
31 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
32 import com.android.systemui.demomode.DemoMode;
33 import com.android.systemui.demomode.DemoModeAvailabilityTracker;
34 import com.android.systemui.demomode.DemoModeController;
35 import com.android.systemui.res.R;
36 import com.android.systemui.util.settings.GlobalSettings;
37 
38 public class DemoModeFragment extends PreferenceFragment implements OnPreferenceChangeListener {
39 
40     private static final String[] STATUS_ICONS = {
41         "volume",
42         "bluetooth",
43         "location",
44         "alarm",
45         "zen",
46         "sync",
47         "tty",
48         "eri",
49         "mute",
50         "speakerphone",
51         "managed_profile",
52     };
53 
54     private SwitchPreference mEnabledSwitch;
55     private SwitchPreference mOnSwitch;
56 
57     private DemoModeController mDemoModeController;
58     private GlobalSettings mGlobalSettings;
59     private Tracker mDemoModeTracker;
60 
61     // We are the only ones who ever call this constructor, so don't worry about the warning
62     @SuppressLint("ValidFragment")
DemoModeFragment(DemoModeController demoModeController, GlobalSettings globalSettings)63     public DemoModeFragment(DemoModeController demoModeController, GlobalSettings globalSettings) {
64         super();
65         mDemoModeController = demoModeController;
66         mGlobalSettings = globalSettings;
67     }
68 
69 
70     @Override
onCreatePreferences(Bundle savedInstanceState, String rootKey)71     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
72         Context context = getContext();
73         mEnabledSwitch = new SwitchPreference(context);
74         mEnabledSwitch.setTitle(R.string.enable_demo_mode);
75         mEnabledSwitch.setOnPreferenceChangeListener(this);
76         mOnSwitch = new SwitchPreference(context);
77         mOnSwitch.setTitle(R.string.show_demo_mode);
78         mOnSwitch.setEnabled(false);
79         mOnSwitch.setOnPreferenceChangeListener(this);
80 
81         PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(context);
82         screen.addPreference(mEnabledSwitch);
83         screen.addPreference(mOnSwitch);
84         setPreferenceScreen(screen);
85 
86         mDemoModeTracker = new Tracker(context, mGlobalSettings);
87         mDemoModeTracker.startTracking();
88         updateDemoModeEnabled();
89         updateDemoModeOn();
90 
91         setHasOptionsMenu(true);
92     }
93 
94     @Override
onOptionsItemSelected(MenuItem item)95     public boolean onOptionsItemSelected(MenuItem item) {
96         switch (item.getItemId()) {
97             case android.R.id.home:
98                 getFragmentManager().popBackStack();
99                 break;
100         }
101         return super.onOptionsItemSelected(item);
102     }
103 
104     @Override
onResume()105     public void onResume() {
106         super.onResume();
107         MetricsLogger.visibility(getContext(), MetricsEvent.TUNER_DEMO_MODE, true);
108     }
109 
110     @Override
onPause()111     public void onPause() {
112         super.onPause();
113         MetricsLogger.visibility(getContext(), MetricsEvent.TUNER_DEMO_MODE, false);
114     }
115 
116     @Override
onDestroy()117     public void onDestroy() {
118         mDemoModeTracker.stopTracking();
119         super.onDestroy();
120     }
121 
updateDemoModeEnabled()122     private void updateDemoModeEnabled() {
123         mEnabledSwitch.setChecked(mDemoModeTracker.isDemoModeAvailable());
124         mOnSwitch.setEnabled(mDemoModeTracker.isDemoModeAvailable());
125     }
126 
updateDemoModeOn()127     private void updateDemoModeOn() {
128         mOnSwitch.setChecked(mDemoModeTracker.isInDemoMode());
129     }
130 
131     @Override
onPreferenceChange(Preference preference, Object newValue)132     public boolean onPreferenceChange(Preference preference, Object newValue) {
133         boolean enabled = newValue == Boolean.TRUE;
134         if (preference == mEnabledSwitch) {
135             if (!enabled) {
136                 // Make sure we aren't in demo mode when disabling it.
137                 mOnSwitch.setChecked(false);
138                 stopDemoMode();
139             }
140             MetricsLogger.action(getContext(), MetricsEvent.TUNER_DEMO_MODE_ENABLED, enabled);
141             mDemoModeController.requestSetDemoModeAllowed(enabled);
142         } else if (preference == mOnSwitch) {
143             MetricsLogger.action(getContext(), MetricsEvent.TUNER_DEMO_MODE_ON, enabled);
144             if (enabled) {
145                 startDemoMode();
146             } else {
147                 stopDemoMode();
148             }
149         } else {
150             return false;
151         }
152         return true;
153     }
154 
startDemoMode()155     private void startDemoMode() {
156         Intent intent = new Intent(DemoMode.ACTION_DEMO);
157 
158         mDemoModeController.requestStartDemoMode();
159 
160         intent.putExtra(DemoMode.EXTRA_COMMAND, DemoMode.COMMAND_CLOCK);
161 
162         //TODO: everything below should move to DemoModeController, or some `initialState` command
163         String demoTime = "1010"; // 10:10, a classic choice of horologists
164         try {
165             String[] versionParts = android.os.Build.VERSION.RELEASE_OR_CODENAME.split("\\.");
166             int majorVersion = Integer.valueOf(versionParts[0]);
167             demoTime = String.format("%02d00", majorVersion % 24);
168         } catch (IllegalArgumentException ex) {
169         }
170         intent.putExtra("hhmm", demoTime);
171         getContext().sendBroadcast(intent);
172 
173         intent.putExtra(DemoMode.EXTRA_COMMAND, DemoMode.COMMAND_NETWORK);
174         intent.putExtra("wifi", "show");
175         intent.putExtra("mobile", "show");
176         intent.putExtra("sims", "1");
177         intent.putExtra("nosim", "false");
178         intent.putExtra("level", "4");
179         intent.putExtra("datatype", "lte");
180         getContext().sendBroadcast(intent);
181 
182         // Need to send this after so that the sim controller already exists.
183         intent.putExtra("fully", "true");
184         getContext().sendBroadcast(intent);
185 
186         intent.putExtra(DemoMode.EXTRA_COMMAND, DemoMode.COMMAND_BATTERY);
187         intent.putExtra("level", "100");
188         intent.putExtra("plugged", "false");
189         getContext().sendBroadcast(intent);
190 
191         intent.putExtra(DemoMode.EXTRA_COMMAND, DemoMode.COMMAND_STATUS);
192         for (String icon : STATUS_ICONS) {
193             intent.putExtra(icon, "hide");
194         }
195         getContext().sendBroadcast(intent);
196 
197         intent.putExtra(DemoMode.EXTRA_COMMAND, DemoMode.COMMAND_NOTIFICATIONS);
198         intent.putExtra("visible", "false");
199         getContext().sendBroadcast(intent);
200 
201     }
202 
stopDemoMode()203     private void stopDemoMode() {
204         mDemoModeController.requestFinishDemoMode();
205     }
206 
207     private class Tracker extends DemoModeAvailabilityTracker {
Tracker(Context context, GlobalSettings globalSettings)208         Tracker(Context context, GlobalSettings globalSettings) {
209             super(context, globalSettings);
210         }
211 
212         @Override
onDemoModeAvailabilityChanged()213         public void onDemoModeAvailabilityChanged() {
214             updateDemoModeEnabled();
215             updateDemoModeOn();
216         }
217 
218         @Override
onDemoModeStarted()219         public void onDemoModeStarted() {
220             updateDemoModeOn();
221         }
222 
223         @Override
onDemoModeFinished()224         public void onDemoModeFinished() {
225             updateDemoModeOn();
226         }
227     };
228 }
229