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