blob: 14af466a24245332ab2367b02aff44f98d675b59 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2008 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
Joe Onoratofd52b182010-11-10 18:00:52 -080017package com.android.systemui.statusbar.phone;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080018
Dave Mankoff3c6aaab2020-01-10 17:50:34 -050019import android.annotation.Nullable;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070020import android.app.ActivityTaskManager;
Jason Monk697b82a2017-04-19 18:41:06 -040021import android.app.AlarmManager;
John Spurlock604a5ee2015-06-01 12:27:22 -040022import android.app.AlarmManager.AlarmClockInfo;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -050023import android.app.IActivityManager;
Jason Monk697b82a2017-04-19 18:41:06 -040024import android.app.SynchronousUserSwitchObserver;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080025import android.content.BroadcastReceiver;
26import android.content.Context;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080027import android.content.Intent;
28import android.content.IntentFilter;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -050029import android.content.SharedPreferences;
30import android.content.res.Resources;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080031import android.media.AudioManager;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080032import android.os.Handler;
Kenny Guy3094d4a2015-04-01 19:14:10 +010033import android.os.RemoteException;
Adrian Roosc42a1e12014-07-07 23:35:53 +020034import android.os.UserHandle;
Kenny Guy3094d4a2015-04-01 19:14:10 +010035import android.os.UserManager;
John Spurlockae641c92014-06-30 18:11:40 -040036import android.provider.Settings.Global;
Beverlyb9826dd2018-04-12 15:02:45 -040037import android.service.notification.ZenModeConfig;
Tyler Gunnef9f6f92014-09-12 22:16:17 -070038import android.telecom.TelecomManager;
Evan Lairdbee3eb82018-05-16 15:58:49 -040039import android.text.format.DateFormat;
John Spurlockcd686b52013-06-05 10:13:46 -040040import android.util.Log;
Beverlyff2df9b2018-10-10 16:54:10 -040041
Joe Onorato798ac4c2010-05-27 16:39:00 -040042import com.android.systemui.R;
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000043import com.android.systemui.broadcast.BroadcastDispatcher;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -050044import com.android.systemui.dagger.qualifiers.DisplayId;
45import com.android.systemui.dagger.qualifiers.Main;
Dave Mankoffc7cf9fc2019-12-19 15:43:20 -050046import com.android.systemui.dagger.qualifiers.UiBackground;
John Spurlock3c4076a2015-02-24 12:12:25 -050047import com.android.systemui.qs.tiles.DndTile;
Jason Monk3e189872016-01-12 09:10:34 -050048import com.android.systemui.qs.tiles.RotationLockTile;
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -050049import com.android.systemui.screenrecord.RecordingController;
Jason Monkaa573e92017-01-27 17:00:29 -050050import com.android.systemui.statusbar.CommandQueue;
Jason Monk70364362015-08-06 16:32:18 -040051import com.android.systemui.statusbar.policy.BluetoothController;
John Spurlock96fe98d2014-08-27 09:36:02 -040052import com.android.systemui.statusbar.policy.CastController;
53import com.android.systemui.statusbar.policy.CastController.CastDevice;
Jason Monkf23aa992016-01-22 16:45:21 -050054import com.android.systemui.statusbar.policy.DataSaverController;
Jason Monkaa573e92017-01-27 17:00:29 -050055import com.android.systemui.statusbar.policy.DataSaverController.Listener;
56import com.android.systemui.statusbar.policy.DeviceProvisionedController;
57import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
Jason Monk952d5d82014-10-27 15:28:22 -040058import com.android.systemui.statusbar.policy.HotspotController;
Lucas Dupinc8f16e82019-09-17 18:24:50 -040059import com.android.systemui.statusbar.policy.KeyguardStateController;
Jason Monk359bb742017-04-13 10:40:40 -040060import com.android.systemui.statusbar.policy.LocationController;
Juan Flores2ff37202015-04-30 13:44:23 +020061import com.android.systemui.statusbar.policy.NextAlarmController;
Jason Monk3e189872016-01-12 09:10:34 -050062import com.android.systemui.statusbar.policy.RotationLockController;
Jason Monkaa573e92017-01-27 17:00:29 -050063import com.android.systemui.statusbar.policy.RotationLockController.RotationLockControllerCallback;
Michael Groovera51ea812019-03-19 18:56:36 -070064import com.android.systemui.statusbar.policy.SensorPrivacyController;
Adrian Roos88b11932015-07-22 14:59:48 -070065import com.android.systemui.statusbar.policy.UserInfoController;
Jason Monkaa573e92017-01-27 17:00:29 -050066import com.android.systemui.statusbar.policy.ZenModeController;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -050067import com.android.systemui.util.time.DateFormatUtil;
Jason Monk324b8862017-02-16 17:19:12 -050068
Evan Lairdbee3eb82018-05-16 15:58:49 -040069import java.util.Locale;
Dave Mankoffc7cf9fc2019-12-19 15:43:20 -050070import java.util.concurrent.Executor;
Jason Monk697b82a2017-04-19 18:41:06 -040071
Dave Mankoff3c6aaab2020-01-10 17:50:34 -050072import javax.inject.Inject;
73
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080074/**
yoshiki iguchi69d65852019-02-13 18:07:41 +090075 * This class contains all of the policy about which icons are installed in the status bar at boot
76 * time. It goes through the normal API for icons, even though it probably strictly doesn't need to.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080077 */
yoshiki iguchi69d65852019-02-13 18:07:41 +090078public class PhoneStatusBarPolicy
79 implements BluetoothController.Callback,
80 CommandQueue.Callbacks,
81 RotationLockControllerCallback,
82 Listener,
83 ZenModeController.Callback,
84 DeviceProvisionedListener,
Lucas Dupinc8f16e82019-09-17 18:24:50 -040085 KeyguardStateController.Callback,
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -050086 LocationController.LocationChangeCallback,
87 RecordingController.RecordingStateChangeCallback {
Joe Onoratofd52b182010-11-10 18:00:52 -080088 private static final String TAG = "PhoneStatusBarPolicy";
John Spurlocka37e9c82014-07-08 09:40:31 -040089 private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
Robert Greenwaltd7085fc2010-09-08 15:24:47 -070090
Dave Mankoff3c6aaab2020-01-10 17:50:34 -050091 static final int LOCATION_STATUS_ICON_ID =
Fabian Kozynski228e3102019-11-25 11:04:34 -050092 com.android.internal.R.drawable.perm_group_location;
Jason Monk359bb742017-04-13 10:40:40 -040093
Jason Monk3e189872016-01-12 09:10:34 -050094 private final String mSlotCast;
95 private final String mSlotHotspot;
96 private final String mSlotBluetooth;
97 private final String mSlotTty;
98 private final String mSlotZen;
99 private final String mSlotVolume;
100 private final String mSlotAlarmClock;
101 private final String mSlotManagedProfile;
102 private final String mSlotRotate;
103 private final String mSlotHeadset;
Jason Monkf23aa992016-01-22 16:45:21 -0500104 private final String mSlotDataSaver;
Jason Monk359bb742017-04-13 10:40:40 -0400105 private final String mSlotLocation;
Michael Groovera51ea812019-03-19 18:56:36 -0700106 private final String mSlotSensorsOff;
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500107 private final String mSlotScreenRecord;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500108 private final int mDisplayId;
109 private final SharedPreferences mSharedPreferences;
110 private final DateFormatUtil mDateFormatUtil;
111 private final TelecomManager mTelecomManager;
112 private final AudioManager mAudioManager;
John Spurlocka37e9c82014-07-08 09:40:31 -0400113
Joe Onorato10523b4d2010-10-25 10:42:46 -0700114 private final Handler mHandler = new Handler();
John Spurlock96fe98d2014-08-27 09:36:02 -0400115 private final CastController mCast;
Jason Monk952d5d82014-10-27 15:28:22 -0400116 private final HotspotController mHotspot;
Evan Lairdbee3eb82018-05-16 15:58:49 -0400117 private final NextAlarmController mNextAlarmController;
John Spurlock15782262015-05-29 15:35:53 -0400118 private final AlarmManager mAlarmManager;
Adrian Roos88b11932015-07-22 14:59:48 -0700119 private final UserInfoController mUserInfoController;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500120 private final IActivityManager mIActivityManager;
Rubin Xu1205fb12015-11-04 17:45:03 +0000121 private final UserManager mUserManager;
Jason Monk07473ce2016-01-05 14:59:19 -0500122 private final StatusBarIconController mIconController;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500123 private final CommandQueue mCommandQueue;
124 private final BroadcastDispatcher mBroadcastDispatcher;
125 private final Resources mResources;
Jason Monk3e189872016-01-12 09:10:34 -0500126 private final RotationLockController mRotationLockController;
Jason Monkf23aa992016-01-22 16:45:21 -0500127 private final DataSaverController mDataSaver;
Jason Monkaa573e92017-01-27 17:00:29 -0500128 private final ZenModeController mZenController;
129 private final DeviceProvisionedController mProvisionedController;
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400130 private final KeyguardStateController mKeyguardStateController;
Jason Monk359bb742017-04-13 10:40:40 -0400131 private final LocationController mLocationController;
Dave Mankoffc7cf9fc2019-12-19 15:43:20 -0500132 private final Executor mUiBgExecutor;
Michael Groovera51ea812019-03-19 18:56:36 -0700133 private final SensorPrivacyController mSensorPrivacyController;
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500134 private final RecordingController mRecordingController;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800135
John Spurlocka37e9c82014-07-08 09:40:31 -0400136 private boolean mZenVisible;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800137 private boolean mVolumeVisible;
John Spurlock604a5ee2015-06-01 12:27:22 -0400138 private boolean mCurrentUserSetup;
Wink Saville04e71b32009-04-02 11:00:54 -0700139
Rubin Xu1205fb12015-11-04 17:45:03 +0000140 private boolean mManagedProfileIconVisible = false;
Kenny Guy3094d4a2015-04-01 19:14:10 +0100141
Jason Monk70364362015-08-06 16:32:18 -0400142 private BluetoothController mBluetooth;
Evan Lairdbee3eb82018-05-16 15:58:49 -0400143 private AlarmManager.AlarmClockInfo mNextAlarm;
Wink Savillee9b06d72009-05-18 21:47:50 -0700144
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500145 @Inject
146 public PhoneStatusBarPolicy(StatusBarIconController iconController,
Dave Mankoffc7cf9fc2019-12-19 15:43:20 -0500147 CommandQueue commandQueue, BroadcastDispatcher broadcastDispatcher,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500148 @UiBackground Executor uiBgExecutor, @Main Resources resources,
149 CastController castController, HotspotController hotspotController,
150 BluetoothController bluetoothController, NextAlarmController nextAlarmController,
151 UserInfoController userInfoController, RotationLockController rotationLockController,
152 DataSaverController dataSaverController, ZenModeController zenModeController,
153 DeviceProvisionedController deviceProvisionedController,
154 KeyguardStateController keyguardStateController,
155 LocationController locationController,
156 SensorPrivacyController sensorPrivacyController, IActivityManager iActivityManager,
157 AlarmManager alarmManager, UserManager userManager, AudioManager audioManager,
158 RecordingController recordingController,
159 @Nullable TelecomManager telecomManager, @DisplayId int displayId,
160 @Main SharedPreferences sharedPreferences, DateFormatUtil dateFormatUtil) {
Jason Monk07473ce2016-01-05 14:59:19 -0500161 mIconController = iconController;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500162 mCommandQueue = commandQueue;
163 mBroadcastDispatcher = broadcastDispatcher;
164 mResources = resources;
165 mCast = castController;
166 mHotspot = hotspotController;
167 mBluetooth = bluetoothController;
168 mNextAlarmController = nextAlarmController;
169 mAlarmManager = alarmManager;
170 mUserInfoController = userInfoController;
171 mIActivityManager = iActivityManager;
172 mUserManager = userManager;
173 mRotationLockController = rotationLockController;
174 mDataSaver = dataSaverController;
175 mZenController = zenModeController;
176 mProvisionedController = deviceProvisionedController;
177 mKeyguardStateController = keyguardStateController;
178 mLocationController = locationController;
179 mSensorPrivacyController = sensorPrivacyController;
180 mRecordingController = recordingController;
Dave Mankoffc7cf9fc2019-12-19 15:43:20 -0500181 mUiBgExecutor = uiBgExecutor;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500182 mAudioManager = audioManager;
183 mTelecomManager = telecomManager;
Jason Monk3e189872016-01-12 09:10:34 -0500184
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500185 mSlotCast = resources.getString(com.android.internal.R.string.status_bar_cast);
186 mSlotHotspot = resources.getString(com.android.internal.R.string.status_bar_hotspot);
187 mSlotBluetooth = resources.getString(com.android.internal.R.string.status_bar_bluetooth);
188 mSlotTty = resources.getString(com.android.internal.R.string.status_bar_tty);
189 mSlotZen = resources.getString(com.android.internal.R.string.status_bar_zen);
190 mSlotVolume = resources.getString(com.android.internal.R.string.status_bar_volume);
191 mSlotAlarmClock = resources.getString(com.android.internal.R.string.status_bar_alarm_clock);
192 mSlotManagedProfile = resources.getString(
Jason Monk3e189872016-01-12 09:10:34 -0500193 com.android.internal.R.string.status_bar_managed_profile);
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500194 mSlotRotate = resources.getString(com.android.internal.R.string.status_bar_rotate);
195 mSlotHeadset = resources.getString(com.android.internal.R.string.status_bar_headset);
196 mSlotDataSaver = resources.getString(com.android.internal.R.string.status_bar_data_saver);
197 mSlotLocation = resources.getString(com.android.internal.R.string.status_bar_location);
198 mSlotSensorsOff = resources.getString(com.android.internal.R.string.status_bar_sensors_off);
199 mSlotScreenRecord = resources.getString(
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500200 com.android.internal.R.string.status_bar_screen_record);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800201
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500202 mDisplayId = displayId;
203 mSharedPreferences = sharedPreferences;
204 mDateFormatUtil = dateFormatUtil;
205 }
206
207 /** Initialize the object after construction. */
208 public void init() {
Daniel Sandlere3b7a2d2011-10-27 16:16:15 -0400209 // listen for broadcasts
210 IntentFilter filter = new IntentFilter();
Daniel Sandlere3b7a2d2011-10-27 16:16:15 -0400211 filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
John Spurlockbcc10872014-11-28 15:29:21 -0500212 filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);
Jason Monk3e189872016-01-12 09:10:34 -0500213 filter.addAction(AudioManager.ACTION_HEADSET_PLUG);
Daniel Bright350f7f92020-01-22 14:24:11 -0800214 filter.addAction(Intent.ACTION_SIM_STATE_CHANGED);
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700215 filter.addAction(TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED);
Rubin Xue95057a2016-04-01 16:49:25 +0100216 filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
217 filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
Nicolas Prevot6c7b8742016-04-13 10:28:58 +0100218 filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500219 mBroadcastDispatcher.registerReceiverWithHandler(mIntentReceiver, filter, mHandler);
Daniel Sandlere3b7a2d2011-10-27 16:16:15 -0400220
Kenny Guy3094d4a2015-04-01 19:14:10 +0100221 // listen for user / profile change.
222 try {
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500223 mIActivityManager.registerUserSwitchObserver(mUserSwitchListener, TAG);
Kenny Guy3094d4a2015-04-01 19:14:10 +0100224 } catch (RemoteException e) {
225 // Ignore
226 }
227
Wink Saville04e71b32009-04-02 11:00:54 -0700228 // TTY status
Hall Liu108ca202017-07-24 15:19:04 -0700229 updateTTY();
Wink Saville04e71b32009-04-02 11:00:54 -0700230
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800231 // bluetooth status
Jorim Jaggi2d75f9f2014-10-08 17:10:58 -0700232 updateBluetooth();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800233
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800234 // Alarm clock
Jason Monk3e189872016-01-12 09:10:34 -0500235 mIconController.setIcon(mSlotAlarmClock, R.drawable.stat_sys_alarm, null);
236 mIconController.setIconVisibility(mSlotAlarmClock, false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800237
John Spurlocka37e9c82014-07-08 09:40:31 -0400238 // zen
Amin Shaikh833bb0f2019-03-28 14:03:48 -0400239 mIconController.setIcon(mSlotZen, R.drawable.stat_sys_dnd, null);
Jason Monk3e189872016-01-12 09:10:34 -0500240 mIconController.setIconVisibility(mSlotZen, false);
John Spurlocka37e9c82014-07-08 09:40:31 -0400241
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800242 // volume
Jason Monk3e189872016-01-12 09:10:34 -0500243 mIconController.setIcon(mSlotVolume, R.drawable.stat_sys_ringer_vibrate, null);
244 mIconController.setIconVisibility(mSlotVolume, false);
John Spurlocka37e9c82014-07-08 09:40:31 -0400245 updateVolumeZen();
John Spurlock96fe98d2014-08-27 09:36:02 -0400246
247 // cast
Jason Monk3e189872016-01-12 09:10:34 -0500248 mIconController.setIcon(mSlotCast, R.drawable.stat_sys_cast, null);
249 mIconController.setIconVisibility(mSlotCast, false);
Jason Monk952d5d82014-10-27 15:28:22 -0400250
251 // hotspot
Jason Monk3e189872016-01-12 09:10:34 -0500252 mIconController.setIcon(mSlotHotspot, R.drawable.stat_sys_hotspot,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500253 mResources.getString(R.string.accessibility_status_bar_hotspot));
Jason Monk3e189872016-01-12 09:10:34 -0500254 mIconController.setIconVisibility(mSlotHotspot, mHotspot.isHotspotEnabled());
Kenny Guy3094d4a2015-04-01 19:14:10 +0100255
256 // managed profile
Jason Monk3e189872016-01-12 09:10:34 -0500257 mIconController.setIcon(mSlotManagedProfile, R.drawable.stat_sys_managed_profile_status,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500258 mResources.getString(R.string.accessibility_managed_profile));
Jason Monk3e189872016-01-12 09:10:34 -0500259 mIconController.setIconVisibility(mSlotManagedProfile, mManagedProfileIconVisible);
Jason Monkf23aa992016-01-22 16:45:21 -0500260
261 // data saver
262 mIconController.setIcon(mSlotDataSaver, R.drawable.stat_sys_data_saver,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500263 mResources.getString(R.string.accessibility_data_saver_on));
Jason Monkf23aa992016-01-22 16:45:21 -0500264 mIconController.setIconVisibility(mSlotDataSaver, false);
Jason Monkaa573e92017-01-27 17:00:29 -0500265
Fabian Kozynskied5dfd92018-12-20 15:00:48 -0500266 mIconController.setIcon(mSlotLocation, LOCATION_STATUS_ICON_ID,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500267 mResources.getString(R.string.accessibility_location_active));
Fabian Kozynskied5dfd92018-12-20 15:00:48 -0500268 mIconController.setIconVisibility(mSlotLocation, false);
Evan Lairdcf1a1032018-11-14 13:46:08 -0500269
Michael Groovera51ea812019-03-19 18:56:36 -0700270 // sensors off
Michael Groover1ddabcc2019-04-19 18:35:24 -0700271 mIconController.setIcon(mSlotSensorsOff, R.drawable.stat_sys_sensors_off,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500272 mResources.getString(R.string.accessibility_sensors_off_active));
Michael Groovera51ea812019-03-19 18:56:36 -0700273 mIconController.setIconVisibility(mSlotSensorsOff,
274 mSensorPrivacyController.isSensorPrivacyEnabled());
275
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500276 // screen record
277 mIconController.setIcon(mSlotScreenRecord, R.drawable.stat_sys_screen_record, null);
278 mIconController.setIconVisibility(mSlotScreenRecord, false);
279
Jason Monkaa573e92017-01-27 17:00:29 -0500280 mRotationLockController.addCallback(this);
281 mBluetooth.addCallback(this);
282 mProvisionedController.addCallback(this);
283 mZenController.addCallback(this);
284 mCast.addCallback(mCastCallback);
285 mHotspot.addCallback(mHotspotCallback);
Evan Lairdbee3eb82018-05-16 15:58:49 -0400286 mNextAlarmController.addCallback(mNextAlarmCallback);
Jason Monk88529052016-11-04 13:29:58 -0400287 mDataSaver.addCallback(this);
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400288 mKeyguardStateController.addCallback(this);
Michael Groovera51ea812019-03-19 18:56:36 -0700289 mSensorPrivacyController.addCallback(mSensorPrivacyListener);
Fabian Kozynski16b26992019-05-06 10:18:41 -0400290 mLocationController.addCallback(this);
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500291 mRecordingController.addCallback(this);
Jason Monkaa573e92017-01-27 17:00:29 -0500292
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500293 mCommandQueue.addCallback(this);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800294 }
295
Jason Monkaa573e92017-01-27 17:00:29 -0500296 @Override
297 public void onZenChanged(int zen) {
John Spurlocka37e9c82014-07-08 09:40:31 -0400298 updateVolumeZen();
John Spurlockba2c6a02014-05-19 09:44:06 -0400299 }
300
Jason Monk359bb742017-04-13 10:40:40 -0400301 @Override
Beverlyb9826dd2018-04-12 15:02:45 -0400302 public void onConfigChanged(ZenModeConfig config) {
303 updateVolumeZen();
304 }
305
Adrian Roosc42a1e12014-07-07 23:35:53 +0200306 private void updateAlarm() {
John Spurlock604a5ee2015-06-01 12:27:22 -0400307 final AlarmClockInfo alarm = mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT);
308 final boolean hasAlarm = alarm != null && alarm.getTriggerTime() > 0;
Jason Monk20c0eb42017-03-02 17:35:49 -0500309 int zen = mZenController.getZen();
310 final boolean zenNone = zen == Global.ZEN_MODE_NO_INTERRUPTIONS;
Jason Monk3e189872016-01-12 09:10:34 -0500311 mIconController.setIcon(mSlotAlarmClock, zenNone ? R.drawable.stat_sys_alarm_dim
Evan Lairdbee3eb82018-05-16 15:58:49 -0400312 : R.drawable.stat_sys_alarm, buildAlarmContentDescription());
Jason Monk3e189872016-01-12 09:10:34 -0500313 mIconController.setIconVisibility(mSlotAlarmClock, mCurrentUserSetup && hasAlarm);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800314 }
315
Evan Lairdbee3eb82018-05-16 15:58:49 -0400316 private String buildAlarmContentDescription() {
317 if (mNextAlarm == null) {
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500318 return mResources.getString(R.string.status_bar_alarm);
Evan Lairdbee3eb82018-05-16 15:58:49 -0400319 }
Evan Lairdbee3eb82018-05-16 15:58:49 -0400320
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500321 String skeleton = mDateFormatUtil.is24HourFormat() ? "EHm" : "Ehma";
Evan Lairdbee3eb82018-05-16 15:58:49 -0400322 String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500323 String dateString = DateFormat.format(pattern, mNextAlarm.getTriggerTime()).toString();
Evan Lairdbee3eb82018-05-16 15:58:49 -0400324
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500325 return mResources.getString(R.string.accessibility_quick_settings_alarm, dateString);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800326 }
327
John Spurlockbcc10872014-11-28 15:29:21 -0500328 private final void updateVolumeZen() {
John Spurlocka37e9c82014-07-08 09:40:31 -0400329 boolean zenVisible = false;
330 int zenIconId = 0;
331 String zenDescription = null;
332
333 boolean volumeVisible = false;
334 int volumeIconId = 0;
335 String volumeDescription = null;
Jason Monk20c0eb42017-03-02 17:35:49 -0500336 int zen = mZenController.getZen();
John Spurlocka37e9c82014-07-08 09:40:31 -0400337
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500338 if (DndTile.isVisible(mSharedPreferences) || DndTile.isCombinedIcon(mSharedPreferences)) {
Jason Monk20c0eb42017-03-02 17:35:49 -0500339 zenVisible = zen != Global.ZEN_MODE_OFF;
Evan Lairda9adbd52018-05-16 11:32:08 -0400340 zenIconId = R.drawable.stat_sys_dnd;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500341 zenDescription = mResources.getString(R.string.quick_settings_dnd_label);
Jason Monk20c0eb42017-03-02 17:35:49 -0500342 } else if (zen == Global.ZEN_MODE_NO_INTERRUPTIONS) {
John Spurlocka37e9c82014-07-08 09:40:31 -0400343 zenVisible = true;
Amin Shaikh833bb0f2019-03-28 14:03:48 -0400344 zenIconId = R.drawable.stat_sys_dnd;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500345 zenDescription = mResources.getString(R.string.interruption_level_none);
Jason Monk20c0eb42017-03-02 17:35:49 -0500346 } else if (zen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS) {
John Spurlocka37e9c82014-07-08 09:40:31 -0400347 zenVisible = true;
Amin Shaikh833bb0f2019-03-28 14:03:48 -0400348 zenIconId = R.drawable.stat_sys_dnd;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500349 zenDescription = mResources.getString(R.string.interruption_level_priority);
Svetoslav Ganov6179ea32011-06-28 01:12:41 -0700350 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800351
Beverlyff2df9b2018-10-10 16:54:10 -0400352 if (!ZenModeConfig.isZenOverridingRinger(zen, mZenController.getConsolidatedPolicy())) {
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500353 if (mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_VIBRATE) {
Beverlyb9826dd2018-04-12 15:02:45 -0400354 volumeVisible = true;
355 volumeIconId = R.drawable.stat_sys_ringer_vibrate;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500356 volumeDescription = mResources.getString(R.string.accessibility_ringer_vibrate);
357 } else if (mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT) {
Beverlyb9826dd2018-04-12 15:02:45 -0400358 volumeVisible = true;
359 volumeIconId = R.drawable.stat_sys_ringer_silent;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500360 volumeDescription = mResources.getString(R.string.accessibility_ringer_silent);
Beverlyb9826dd2018-04-12 15:02:45 -0400361 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800362 }
John Spurlocka37e9c82014-07-08 09:40:31 -0400363
364 if (zenVisible) {
Jason Monk3e189872016-01-12 09:10:34 -0500365 mIconController.setIcon(mSlotZen, zenIconId, zenDescription);
John Spurlocka37e9c82014-07-08 09:40:31 -0400366 }
367 if (zenVisible != mZenVisible) {
Jason Monk3e189872016-01-12 09:10:34 -0500368 mIconController.setIconVisibility(mSlotZen, zenVisible);
John Spurlocka37e9c82014-07-08 09:40:31 -0400369 mZenVisible = zenVisible;
370 }
371
372 if (volumeVisible) {
Jason Monk3e189872016-01-12 09:10:34 -0500373 mIconController.setIcon(mSlotVolume, volumeIconId, volumeDescription);
John Spurlocka37e9c82014-07-08 09:40:31 -0400374 }
375 if (volumeVisible != mVolumeVisible) {
Jason Monk3e189872016-01-12 09:10:34 -0500376 mIconController.setIconVisibility(mSlotVolume, volumeVisible);
John Spurlocka37e9c82014-07-08 09:40:31 -0400377 mVolumeVisible = volumeVisible;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800378 }
John Spurlock15782262015-05-29 15:35:53 -0400379 updateAlarm();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800380 }
381
Jason Monk70364362015-08-06 16:32:18 -0400382 @Override
383 public void onBluetoothDevicesChanged() {
384 updateBluetooth();
385 }
386
387 @Override
388 public void onBluetoothStateChange(boolean enabled) {
389 updateBluetooth();
390 }
391
Jorim Jaggi2d75f9f2014-10-08 17:10:58 -0700392 private final void updateBluetooth() {
Amin Shaikhad29e932019-03-08 11:26:12 -0500393 int iconId = R.drawable.stat_sys_data_bluetooth_connected;
Jorim Jaggi2d75f9f2014-10-08 17:10:58 -0700394 String contentDescription =
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500395 mResources.getString(R.string.accessibility_quick_settings_bluetooth_on);
Evan Laird3cdf47e2018-01-29 16:01:41 -0500396 boolean bluetoothVisible = false;
Jason Monk70364362015-08-06 16:32:18 -0400397 if (mBluetooth != null) {
Ugo Yu40f08802019-11-19 09:56:40 +0800398 if (mBluetooth.isBluetoothConnected()
399 && (mBluetooth.isBluetoothAudioActive()
400 || !mBluetooth.isBluetoothAudioProfileOnly())) {
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500401 contentDescription = mResources.getString(
Ugo Yu40f08802019-11-19 09:56:40 +0800402 R.string.accessibility_bluetooth_connected);
Evan Laird3cdf47e2018-01-29 16:01:41 -0500403 bluetoothVisible = mBluetooth.isBluetoothEnabled();
Jaikumar Ganesh084c6652009-12-07 10:58:18 -0800404 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800405 }
Wink Savillee9b06d72009-05-18 21:47:50 -0700406
Jason Monk3e189872016-01-12 09:10:34 -0500407 mIconController.setIcon(mSlotBluetooth, iconId, contentDescription);
Evan Laird3cdf47e2018-01-29 16:01:41 -0500408 mIconController.setIconVisibility(mSlotBluetooth, bluetoothVisible);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800409 }
410
Hall Liu108ca202017-07-24 15:19:04 -0700411 private final void updateTTY() {
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500412 if (mTelecomManager == null) {
Hall Liu108ca202017-07-24 15:19:04 -0700413 updateTTY(TelecomManager.TTY_MODE_OFF);
414 } else {
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500415 updateTTY(mTelecomManager.getCurrentTtyMode());
Hall Liu108ca202017-07-24 15:19:04 -0700416 }
417 }
418
419 private final void updateTTY(int currentTtyMode) {
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700420 boolean enabled = currentTtyMode != TelecomManager.TTY_MODE_OFF;
Wink Saville04e71b32009-04-02 11:00:54 -0700421
John Spurlocka37e9c82014-07-08 09:40:31 -0400422 if (DEBUG) Log.v(TAG, "updateTTY: enabled: " + enabled);
Wink Saville04e71b32009-04-02 11:00:54 -0700423
424 if (enabled) {
425 // TTY is on
John Spurlocka37e9c82014-07-08 09:40:31 -0400426 if (DEBUG) Log.v(TAG, "updateTTY: set TTY on");
Jason Monk3e189872016-01-12 09:10:34 -0500427 mIconController.setIcon(mSlotTty, R.drawable.stat_sys_tty_mode,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500428 mResources.getString(R.string.accessibility_tty_enabled));
Jason Monk3e189872016-01-12 09:10:34 -0500429 mIconController.setIconVisibility(mSlotTty, true);
Wink Saville04e71b32009-04-02 11:00:54 -0700430 } else {
431 // TTY is off
John Spurlocka37e9c82014-07-08 09:40:31 -0400432 if (DEBUG) Log.v(TAG, "updateTTY: set TTY off");
Jason Monk3e189872016-01-12 09:10:34 -0500433 mIconController.setIconVisibility(mSlotTty, false);
Wink Saville04e71b32009-04-02 11:00:54 -0700434 }
435 }
John Spurlock96fe98d2014-08-27 09:36:02 -0400436
437 private void updateCast() {
438 boolean isCasting = false;
439 for (CastDevice device : mCast.getCastDevices()) {
440 if (device.state == CastDevice.STATE_CONNECTING
441 || device.state == CastDevice.STATE_CONNECTED) {
442 isCasting = true;
443 break;
444 }
445 }
446 if (DEBUG) Log.v(TAG, "updateCast: isCasting: " + isCasting);
Dan Sandler8fd25bf2015-10-20 16:01:27 -0700447 mHandler.removeCallbacks(mRemoveCastIconRunnable);
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500448 if (isCasting && !mRecordingController.isRecording()) { // screen record has its own icon
Jason Monk3e189872016-01-12 09:10:34 -0500449 mIconController.setIcon(mSlotCast, R.drawable.stat_sys_cast,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500450 mResources.getString(R.string.accessibility_casting));
Jason Monk3e189872016-01-12 09:10:34 -0500451 mIconController.setIconVisibility(mSlotCast, true);
Dan Sandler8fd25bf2015-10-20 16:01:27 -0700452 } else {
453 // don't turn off the screen-record icon for a few seconds, just to make sure the user
454 // has seen it
455 if (DEBUG) Log.v(TAG, "updateCast: hiding icon in 3 sec...");
456 mHandler.postDelayed(mRemoveCastIconRunnable, 3000);
John Spurlock96fe98d2014-08-27 09:36:02 -0400457 }
John Spurlock96fe98d2014-08-27 09:36:02 -0400458 }
459
Kenny Guy3094d4a2015-04-01 19:14:10 +0100460 private void updateManagedProfile() {
Jorim Jaggifabc7432017-05-15 02:40:05 +0200461 // getLastResumedActivityUserId needds to acquire the AM lock, which may be contended in
462 // some cases. Since it doesn't really matter here whether it's updated in this frame
463 // or in the next one, we call this method from our UI offload thread.
Dave Mankoffc7cf9fc2019-12-19 15:43:20 -0500464 mUiBgExecutor.execute(() -> {
Jorim Jaggifabc7432017-05-15 02:40:05 +0200465 final int userId;
466 try {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700467 userId = ActivityTaskManager.getService().getLastResumedActivityUserId();
Jorim Jaggifabc7432017-05-15 02:40:05 +0200468 boolean isManagedProfile = mUserManager.isManagedProfile(userId);
469 mHandler.post(() -> {
470 final boolean showIcon;
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400471 if (isManagedProfile && (!mKeyguardStateController.isShowing()
472 || mKeyguardStateController.isOccluded())) {
Jorim Jaggifabc7432017-05-15 02:40:05 +0200473 showIcon = true;
474 mIconController.setIcon(mSlotManagedProfile,
475 R.drawable.stat_sys_managed_profile_status,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500476 mResources.getString(R.string.accessibility_managed_profile));
Jorim Jaggifabc7432017-05-15 02:40:05 +0200477 } else {
478 showIcon = false;
479 }
480 if (mManagedProfileIconVisible != showIcon) {
481 mIconController.setIconVisibility(mSlotManagedProfile, showIcon);
482 mManagedProfileIconVisible = showIcon;
483 }
484 });
485 } catch (RemoteException e) {
486 Log.w(TAG, "updateManagedProfile: ", e);
Tony Makec319ab2017-03-28 18:50:01 +0100487 }
Jorim Jaggifabc7432017-05-15 02:40:05 +0200488 });
Kenny Guy3094d4a2015-04-01 19:14:10 +0100489 }
490
Fyodor Kupolov6005b3f2015-11-23 17:41:50 -0800491 private final SynchronousUserSwitchObserver mUserSwitchListener =
492 new SynchronousUserSwitchObserver() {
Kenny Guy3094d4a2015-04-01 19:14:10 +0100493 @Override
Fyodor Kupolov6005b3f2015-11-23 17:41:50 -0800494 public void onUserSwitching(int newUserId) throws RemoteException {
Tony Makec319ab2017-03-28 18:50:01 +0100495 mHandler.post(() -> mUserInfoController.reloadUserInfo());
Kenny Guy3094d4a2015-04-01 19:14:10 +0100496 }
497
498 @Override
499 public void onUserSwitchComplete(int newUserId) throws RemoteException {
Tony Makec319ab2017-03-28 18:50:01 +0100500 mHandler.post(() -> {
501 updateAlarm();
Tony Makec319ab2017-03-28 18:50:01 +0100502 updateManagedProfile();
Toni Barzice97f9232016-04-27 18:10:58 -0700503 });
Kenny Guy3094d4a2015-04-01 19:14:10 +0100504 }
505 };
506
Jason Monk952d5d82014-10-27 15:28:22 -0400507 private final HotspotController.Callback mHotspotCallback = new HotspotController.Callback() {
508 @Override
Rohan Shahe4071122018-01-22 15:16:09 -0800509 public void onHotspotChanged(boolean enabled, int numDevices) {
Jason Monk3e189872016-01-12 09:10:34 -0500510 mIconController.setIconVisibility(mSlotHotspot, enabled);
Jason Monk952d5d82014-10-27 15:28:22 -0400511 }
512 };
513
John Spurlock96fe98d2014-08-27 09:36:02 -0400514 private final CastController.Callback mCastCallback = new CastController.Callback() {
515 @Override
516 public void onCastDevicesChanged() {
517 updateCast();
518 }
519 };
Kenny Guy3094d4a2015-04-01 19:14:10 +0100520
Juan Flores2ff37202015-04-30 13:44:23 +0200521 private final NextAlarmController.NextAlarmChangeCallback mNextAlarmCallback =
522 new NextAlarmController.NextAlarmChangeCallback() {
Jason Monk324b8862017-02-16 17:19:12 -0500523 @Override
524 public void onNextAlarmChanged(AlarmManager.AlarmClockInfo nextAlarm) {
Evan Lairdbee3eb82018-05-16 15:58:49 -0400525 mNextAlarm = nextAlarm;
Jason Monk324b8862017-02-16 17:19:12 -0500526 updateAlarm();
527 }
528 };
Juan Flores2ff37202015-04-30 13:44:23 +0200529
Michael Groovera51ea812019-03-19 18:56:36 -0700530 private final SensorPrivacyController.OnSensorPrivacyChangedListener mSensorPrivacyListener =
531 new SensorPrivacyController.OnSensorPrivacyChangedListener() {
532 @Override
533 public void onSensorPrivacyChanged(boolean enabled) {
534 mHandler.post(() -> {
535 mIconController.setIconVisibility(mSlotSensorsOff, enabled);
536 });
537 }
538 };
539
Jason Monkaa573e92017-01-27 17:00:29 -0500540 @Override
Charles Chenf3d295c2018-11-30 18:15:21 +0800541 public void appTransitionStarting(int displayId, long startTime, long duration,
542 boolean forced) {
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500543 if (mDisplayId == displayId) {
Charles Chenf3d295c2018-11-30 18:15:21 +0800544 updateManagedProfile();
Charles Chenf3d295c2018-11-30 18:15:21 +0800545 }
Kenny Guy3094d4a2015-04-01 19:14:10 +0100546 }
547
Jason Monkaa573e92017-01-27 17:00:29 -0500548 @Override
549 public void onKeyguardShowingChanged() {
Kenny Guy3094d4a2015-04-01 19:14:10 +0100550 updateManagedProfile();
551 }
John Spurlock604a5ee2015-06-01 12:27:22 -0400552
Jason Monkaa573e92017-01-27 17:00:29 -0500553 @Override
554 public void onUserSetupChanged() {
555 boolean userSetup = mProvisionedController.isUserSetup(
556 mProvisionedController.getCurrentUser());
John Spurlock604a5ee2015-06-01 12:27:22 -0400557 if (mCurrentUserSetup == userSetup) return;
558 mCurrentUserSetup = userSetup;
559 updateAlarm();
560 }
Jason Monk3e189872016-01-12 09:10:34 -0500561
562 @Override
563 public void onRotationLockStateChanged(boolean rotationLocked, boolean affordanceVisible) {
564 boolean portrait = RotationLockTile.isCurrentOrientationLockPortrait(
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500565 mRotationLockController, mResources);
Jason Monk3e189872016-01-12 09:10:34 -0500566 if (rotationLocked) {
567 if (portrait) {
568 mIconController.setIcon(mSlotRotate, R.drawable.stat_sys_rotate_portrait,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500569 mResources.getString(R.string.accessibility_rotation_lock_on_portrait));
Jason Monk3e189872016-01-12 09:10:34 -0500570 } else {
571 mIconController.setIcon(mSlotRotate, R.drawable.stat_sys_rotate_landscape,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500572 mResources.getString(R.string.accessibility_rotation_lock_on_landscape));
Jason Monk3e189872016-01-12 09:10:34 -0500573 }
Jason Monk8816dff2016-02-09 21:50:36 -0500574 mIconController.setIconVisibility(mSlotRotate, true);
Jason Monk3e189872016-01-12 09:10:34 -0500575 } else {
Jason Monk8816dff2016-02-09 21:50:36 -0500576 mIconController.setIconVisibility(mSlotRotate, false);
Jason Monk3e189872016-01-12 09:10:34 -0500577 }
578 }
579
580 private void updateHeadsetPlug(Intent intent) {
581 boolean connected = intent.getIntExtra("state", 0) != 0;
582 boolean hasMic = intent.getIntExtra("microphone", 0) != 0;
583 if (connected) {
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500584 String contentDescription = mResources.getString(hasMic
Jason Monk3e189872016-01-12 09:10:34 -0500585 ? R.string.accessibility_status_bar_headset
586 : R.string.accessibility_status_bar_headphones);
Amin Shaikhad29e932019-03-08 11:26:12 -0500587 mIconController.setIcon(mSlotHeadset, hasMic ? R.drawable.stat_sys_headset_mic
588 : R.drawable.stat_sys_headset, contentDescription);
Jason Monk3e189872016-01-12 09:10:34 -0500589 mIconController.setIconVisibility(mSlotHeadset, true);
590 } else {
591 mIconController.setIconVisibility(mSlotHeadset, false);
592 }
593 }
594
Jason Monkf23aa992016-01-22 16:45:21 -0500595 @Override
596 public void onDataSaverChanged(boolean isDataSaving) {
597 mIconController.setIconVisibility(mSlotDataSaver, isDataSaving);
598 }
599
Fabian Kozynski16b26992019-05-06 10:18:41 -0400600 @Override
601 public void onLocationActiveChanged(boolean active) {
Fabian Kozynski228e3102019-11-25 11:04:34 -0500602 updateLocation();
Fabian Kozynski16b26992019-05-06 10:18:41 -0400603 }
604
605 // Updates the status view based on the current state of location requests.
606 private void updateLocation() {
607 if (mLocationController.isLocationActive()) {
608 mIconController.setIconVisibility(mSlotLocation, true);
609 } else {
610 mIconController.setIconVisibility(mSlotLocation, false);
611 }
612 }
613
Jason Monk3e189872016-01-12 09:10:34 -0500614 private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
615 @Override
616 public void onReceive(Context context, Intent intent) {
617 String action = intent.getAction();
Lucas Dupin5e0f0d22018-02-26 13:32:16 -0800618 switch (action) {
619 case AudioManager.RINGER_MODE_CHANGED_ACTION:
620 case AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION:
621 updateVolumeZen();
622 break;
Daniel Bright350f7f92020-01-22 14:24:11 -0800623 case Intent.ACTION_SIM_STATE_CHANGED:
Lucas Dupin5e0f0d22018-02-26 13:32:16 -0800624 // Avoid rebroadcast because SysUI is direct boot aware.
Meng Wang0e8d91a2020-01-17 14:58:01 -0800625 if (intent.getBooleanExtra(Intent.EXTRA_REBROADCAST_ON_UNLOCK, false)) {
Lucas Dupin5e0f0d22018-02-26 13:32:16 -0800626 break;
627 }
Lucas Dupin5e0f0d22018-02-26 13:32:16 -0800628 break;
629 case TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED:
630 updateTTY(intent.getIntExtra(TelecomManager.EXTRA_CURRENT_TTY_MODE,
631 TelecomManager.TTY_MODE_OFF));
632 break;
633 case Intent.ACTION_MANAGED_PROFILE_AVAILABLE:
634 case Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE:
635 case Intent.ACTION_MANAGED_PROFILE_REMOVED:
636 updateManagedProfile();
637 break;
638 case AudioManager.ACTION_HEADSET_PLUG:
639 updateHeadsetPlug(intent);
640 break;
Jason Monk3e189872016-01-12 09:10:34 -0500641 }
642 }
643 };
644
645 private Runnable mRemoveCastIconRunnable = new Runnable() {
646 @Override
647 public void run() {
648 if (DEBUG) Log.v(TAG, "updateCast: hiding icon NOW");
649 mIconController.setIconVisibility(mSlotCast, false);
650 }
651 };
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500652
653 // Screen Recording
654 @Override
655 public void onCountdown(long millisUntilFinished) {
656 if (DEBUG) Log.d(TAG, "screenrecord: countdown " + millisUntilFinished);
657 int countdown = (int) Math.floorDiv(millisUntilFinished + 500, 1000);
658 int resourceId = R.drawable.stat_sys_screen_record;
659 switch (countdown) {
660 case 1:
661 resourceId = R.drawable.stat_sys_screen_record_1;
662 break;
663 case 2:
664 resourceId = R.drawable.stat_sys_screen_record_2;
665 break;
666 case 3:
667 resourceId = R.drawable.stat_sys_screen_record_3;
668 break;
669 }
670 mIconController.setIcon(mSlotScreenRecord, resourceId, null);
671 mIconController.setIconVisibility(mSlotScreenRecord, true);
672 }
673
674 @Override
Beth Thibodeau58772782020-02-18 20:55:38 -0500675 public void onCountdownEnd() {
676 if (DEBUG) Log.d(TAG, "screenrecord: hiding icon during countdown");
677 mHandler.post(() -> mIconController.setIconVisibility(mSlotScreenRecord, false));
678 }
679
680 @Override
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500681 public void onRecordingStart() {
682 if (DEBUG) Log.d(TAG, "screenrecord: showing icon");
683 mIconController.setIcon(mSlotScreenRecord,
684 R.drawable.stat_sys_screen_record, null);
685 mIconController.setIconVisibility(mSlotScreenRecord, true);
686 }
687
688 @Override
689 public void onRecordingEnd() {
Beth Thibodeau58772782020-02-18 20:55:38 -0500690 // Ensure this is on the main thread
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500691 if (DEBUG) Log.d(TAG, "screenrecord: hiding icon");
692 mHandler.post(() -> mIconController.setIconVisibility(mSlotScreenRecord, false));
693 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800694}