blob: a065b74bda9971ab666717f29ea9453ad9520655 [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
Fabian Kozynskib6a20372020-04-01 09:36:43 -040042import androidx.lifecycle.Observer;
43
Joe Onorato798ac4c2010-05-27 16:39:00 -040044import com.android.systemui.R;
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000045import com.android.systemui.broadcast.BroadcastDispatcher;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -050046import com.android.systemui.dagger.qualifiers.DisplayId;
47import com.android.systemui.dagger.qualifiers.Main;
Dave Mankoffc7cf9fc2019-12-19 15:43:20 -050048import com.android.systemui.dagger.qualifiers.UiBackground;
John Spurlock3c4076a2015-02-24 12:12:25 -050049import com.android.systemui.qs.tiles.DndTile;
Jason Monk3e189872016-01-12 09:10:34 -050050import com.android.systemui.qs.tiles.RotationLockTile;
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -050051import com.android.systemui.screenrecord.RecordingController;
Jason Monkaa573e92017-01-27 17:00:29 -050052import com.android.systemui.statusbar.CommandQueue;
Jason Monk70364362015-08-06 16:32:18 -040053import com.android.systemui.statusbar.policy.BluetoothController;
John Spurlock96fe98d2014-08-27 09:36:02 -040054import com.android.systemui.statusbar.policy.CastController;
55import com.android.systemui.statusbar.policy.CastController.CastDevice;
Jason Monkf23aa992016-01-22 16:45:21 -050056import com.android.systemui.statusbar.policy.DataSaverController;
Jason Monkaa573e92017-01-27 17:00:29 -050057import com.android.systemui.statusbar.policy.DataSaverController.Listener;
58import com.android.systemui.statusbar.policy.DeviceProvisionedController;
59import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
Jason Monk952d5d82014-10-27 15:28:22 -040060import com.android.systemui.statusbar.policy.HotspotController;
Lucas Dupinc8f16e82019-09-17 18:24:50 -040061import com.android.systemui.statusbar.policy.KeyguardStateController;
Jason Monk359bb742017-04-13 10:40:40 -040062import com.android.systemui.statusbar.policy.LocationController;
Juan Flores2ff37202015-04-30 13:44:23 +020063import com.android.systemui.statusbar.policy.NextAlarmController;
Jason Monk3e189872016-01-12 09:10:34 -050064import com.android.systemui.statusbar.policy.RotationLockController;
Jason Monkaa573e92017-01-27 17:00:29 -050065import com.android.systemui.statusbar.policy.RotationLockController.RotationLockControllerCallback;
Michael Groovera51ea812019-03-19 18:56:36 -070066import com.android.systemui.statusbar.policy.SensorPrivacyController;
Adrian Roos88b11932015-07-22 14:59:48 -070067import com.android.systemui.statusbar.policy.UserInfoController;
Jason Monkaa573e92017-01-27 17:00:29 -050068import com.android.systemui.statusbar.policy.ZenModeController;
Fabian Kozynskib6a20372020-04-01 09:36:43 -040069import com.android.systemui.util.RingerModeTracker;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -050070import com.android.systemui.util.time.DateFormatUtil;
Jason Monk324b8862017-02-16 17:19:12 -050071
Evan Lairdbee3eb82018-05-16 15:58:49 -040072import java.util.Locale;
Dave Mankoffc7cf9fc2019-12-19 15:43:20 -050073import java.util.concurrent.Executor;
Jason Monk697b82a2017-04-19 18:41:06 -040074
Dave Mankoff3c6aaab2020-01-10 17:50:34 -050075import javax.inject.Inject;
76
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080077/**
yoshiki iguchi69d65852019-02-13 18:07:41 +090078 * This class contains all of the policy about which icons are installed in the status bar at boot
79 * 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 -080080 */
yoshiki iguchi69d65852019-02-13 18:07:41 +090081public class PhoneStatusBarPolicy
82 implements BluetoothController.Callback,
83 CommandQueue.Callbacks,
84 RotationLockControllerCallback,
85 Listener,
86 ZenModeController.Callback,
87 DeviceProvisionedListener,
Lucas Dupinc8f16e82019-09-17 18:24:50 -040088 KeyguardStateController.Callback,
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -050089 LocationController.LocationChangeCallback,
90 RecordingController.RecordingStateChangeCallback {
Joe Onoratofd52b182010-11-10 18:00:52 -080091 private static final String TAG = "PhoneStatusBarPolicy";
John Spurlocka37e9c82014-07-08 09:40:31 -040092 private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
Robert Greenwaltd7085fc2010-09-08 15:24:47 -070093
Dave Mankoff3c6aaab2020-01-10 17:50:34 -050094 static final int LOCATION_STATUS_ICON_ID =
Fabian Kozynski228e3102019-11-25 11:04:34 -050095 com.android.internal.R.drawable.perm_group_location;
Jason Monk359bb742017-04-13 10:40:40 -040096
Jason Monk3e189872016-01-12 09:10:34 -050097 private final String mSlotCast;
98 private final String mSlotHotspot;
99 private final String mSlotBluetooth;
100 private final String mSlotTty;
101 private final String mSlotZen;
102 private final String mSlotVolume;
103 private final String mSlotAlarmClock;
104 private final String mSlotManagedProfile;
105 private final String mSlotRotate;
106 private final String mSlotHeadset;
Jason Monkf23aa992016-01-22 16:45:21 -0500107 private final String mSlotDataSaver;
Jason Monk359bb742017-04-13 10:40:40 -0400108 private final String mSlotLocation;
Michael Groovera51ea812019-03-19 18:56:36 -0700109 private final String mSlotSensorsOff;
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500110 private final String mSlotScreenRecord;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500111 private final int mDisplayId;
112 private final SharedPreferences mSharedPreferences;
113 private final DateFormatUtil mDateFormatUtil;
114 private final TelecomManager mTelecomManager;
John Spurlocka37e9c82014-07-08 09:40:31 -0400115
Joe Onorato10523b4d2010-10-25 10:42:46 -0700116 private final Handler mHandler = new Handler();
John Spurlock96fe98d2014-08-27 09:36:02 -0400117 private final CastController mCast;
Jason Monk952d5d82014-10-27 15:28:22 -0400118 private final HotspotController mHotspot;
Evan Lairdbee3eb82018-05-16 15:58:49 -0400119 private final NextAlarmController mNextAlarmController;
John Spurlock15782262015-05-29 15:35:53 -0400120 private final AlarmManager mAlarmManager;
Adrian Roos88b11932015-07-22 14:59:48 -0700121 private final UserInfoController mUserInfoController;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500122 private final IActivityManager mIActivityManager;
Rubin Xu1205fb12015-11-04 17:45:03 +0000123 private final UserManager mUserManager;
Jason Monk07473ce2016-01-05 14:59:19 -0500124 private final StatusBarIconController mIconController;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500125 private final CommandQueue mCommandQueue;
126 private final BroadcastDispatcher mBroadcastDispatcher;
127 private final Resources mResources;
Jason Monk3e189872016-01-12 09:10:34 -0500128 private final RotationLockController mRotationLockController;
Jason Monkf23aa992016-01-22 16:45:21 -0500129 private final DataSaverController mDataSaver;
Jason Monkaa573e92017-01-27 17:00:29 -0500130 private final ZenModeController mZenController;
131 private final DeviceProvisionedController mProvisionedController;
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400132 private final KeyguardStateController mKeyguardStateController;
Jason Monk359bb742017-04-13 10:40:40 -0400133 private final LocationController mLocationController;
Dave Mankoffc7cf9fc2019-12-19 15:43:20 -0500134 private final Executor mUiBgExecutor;
Michael Groovera51ea812019-03-19 18:56:36 -0700135 private final SensorPrivacyController mSensorPrivacyController;
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500136 private final RecordingController mRecordingController;
Fabian Kozynskib6a20372020-04-01 09:36:43 -0400137 private final RingerModeTracker mRingerModeTracker;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800138
John Spurlocka37e9c82014-07-08 09:40:31 -0400139 private boolean mZenVisible;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800140 private boolean mVolumeVisible;
John Spurlock604a5ee2015-06-01 12:27:22 -0400141 private boolean mCurrentUserSetup;
Wink Saville04e71b32009-04-02 11:00:54 -0700142
Rubin Xu1205fb12015-11-04 17:45:03 +0000143 private boolean mManagedProfileIconVisible = false;
Kenny Guy3094d4a2015-04-01 19:14:10 +0100144
Jason Monk70364362015-08-06 16:32:18 -0400145 private BluetoothController mBluetooth;
Evan Lairdbee3eb82018-05-16 15:58:49 -0400146 private AlarmManager.AlarmClockInfo mNextAlarm;
Wink Savillee9b06d72009-05-18 21:47:50 -0700147
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500148 @Inject
149 public PhoneStatusBarPolicy(StatusBarIconController iconController,
Dave Mankoffc7cf9fc2019-12-19 15:43:20 -0500150 CommandQueue commandQueue, BroadcastDispatcher broadcastDispatcher,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500151 @UiBackground Executor uiBgExecutor, @Main Resources resources,
152 CastController castController, HotspotController hotspotController,
153 BluetoothController bluetoothController, NextAlarmController nextAlarmController,
154 UserInfoController userInfoController, RotationLockController rotationLockController,
155 DataSaverController dataSaverController, ZenModeController zenModeController,
156 DeviceProvisionedController deviceProvisionedController,
157 KeyguardStateController keyguardStateController,
158 LocationController locationController,
159 SensorPrivacyController sensorPrivacyController, IActivityManager iActivityManager,
Fabian Kozynskib6a20372020-04-01 09:36:43 -0400160 AlarmManager alarmManager, UserManager userManager,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500161 RecordingController recordingController,
162 @Nullable TelecomManager telecomManager, @DisplayId int displayId,
Fabian Kozynskib6a20372020-04-01 09:36:43 -0400163 @Main SharedPreferences sharedPreferences, DateFormatUtil dateFormatUtil,
164 RingerModeTracker ringerModeTracker) {
Jason Monk07473ce2016-01-05 14:59:19 -0500165 mIconController = iconController;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500166 mCommandQueue = commandQueue;
167 mBroadcastDispatcher = broadcastDispatcher;
168 mResources = resources;
169 mCast = castController;
170 mHotspot = hotspotController;
171 mBluetooth = bluetoothController;
172 mNextAlarmController = nextAlarmController;
173 mAlarmManager = alarmManager;
174 mUserInfoController = userInfoController;
175 mIActivityManager = iActivityManager;
176 mUserManager = userManager;
177 mRotationLockController = rotationLockController;
178 mDataSaver = dataSaverController;
179 mZenController = zenModeController;
180 mProvisionedController = deviceProvisionedController;
181 mKeyguardStateController = keyguardStateController;
182 mLocationController = locationController;
183 mSensorPrivacyController = sensorPrivacyController;
184 mRecordingController = recordingController;
Dave Mankoffc7cf9fc2019-12-19 15:43:20 -0500185 mUiBgExecutor = uiBgExecutor;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500186 mTelecomManager = telecomManager;
Fabian Kozynskib6a20372020-04-01 09:36:43 -0400187 mRingerModeTracker = ringerModeTracker;
Jason Monk3e189872016-01-12 09:10:34 -0500188
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500189 mSlotCast = resources.getString(com.android.internal.R.string.status_bar_cast);
190 mSlotHotspot = resources.getString(com.android.internal.R.string.status_bar_hotspot);
191 mSlotBluetooth = resources.getString(com.android.internal.R.string.status_bar_bluetooth);
192 mSlotTty = resources.getString(com.android.internal.R.string.status_bar_tty);
193 mSlotZen = resources.getString(com.android.internal.R.string.status_bar_zen);
194 mSlotVolume = resources.getString(com.android.internal.R.string.status_bar_volume);
195 mSlotAlarmClock = resources.getString(com.android.internal.R.string.status_bar_alarm_clock);
196 mSlotManagedProfile = resources.getString(
Jason Monk3e189872016-01-12 09:10:34 -0500197 com.android.internal.R.string.status_bar_managed_profile);
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500198 mSlotRotate = resources.getString(com.android.internal.R.string.status_bar_rotate);
199 mSlotHeadset = resources.getString(com.android.internal.R.string.status_bar_headset);
200 mSlotDataSaver = resources.getString(com.android.internal.R.string.status_bar_data_saver);
201 mSlotLocation = resources.getString(com.android.internal.R.string.status_bar_location);
202 mSlotSensorsOff = resources.getString(com.android.internal.R.string.status_bar_sensors_off);
203 mSlotScreenRecord = resources.getString(
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500204 com.android.internal.R.string.status_bar_screen_record);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800205
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500206 mDisplayId = displayId;
207 mSharedPreferences = sharedPreferences;
208 mDateFormatUtil = dateFormatUtil;
209 }
210
211 /** Initialize the object after construction. */
212 public void init() {
Daniel Sandlere3b7a2d2011-10-27 16:16:15 -0400213 // listen for broadcasts
214 IntentFilter filter = new IntentFilter();
Fabian Kozynskib6a20372020-04-01 09:36:43 -0400215
Jason Monk3e189872016-01-12 09:10:34 -0500216 filter.addAction(AudioManager.ACTION_HEADSET_PLUG);
Daniel Bright350f7f92020-01-22 14:24:11 -0800217 filter.addAction(Intent.ACTION_SIM_STATE_CHANGED);
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700218 filter.addAction(TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED);
Rubin Xue95057a2016-04-01 16:49:25 +0100219 filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
220 filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
Nicolas Prevot6c7b8742016-04-13 10:28:58 +0100221 filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500222 mBroadcastDispatcher.registerReceiverWithHandler(mIntentReceiver, filter, mHandler);
Fabian Kozynskib6a20372020-04-01 09:36:43 -0400223 Observer<Integer> observer = ringer -> mHandler.post(this::updateVolumeZen);
224
225 mRingerModeTracker.getRingerMode().observeForever(observer);
226 mRingerModeTracker.getRingerModeInternal().observeForever(observer);
Daniel Sandlere3b7a2d2011-10-27 16:16:15 -0400227
Kenny Guy3094d4a2015-04-01 19:14:10 +0100228 // listen for user / profile change.
229 try {
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500230 mIActivityManager.registerUserSwitchObserver(mUserSwitchListener, TAG);
Kenny Guy3094d4a2015-04-01 19:14:10 +0100231 } catch (RemoteException e) {
232 // Ignore
233 }
234
Wink Saville04e71b32009-04-02 11:00:54 -0700235 // TTY status
Hall Liu108ca202017-07-24 15:19:04 -0700236 updateTTY();
Wink Saville04e71b32009-04-02 11:00:54 -0700237
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800238 // bluetooth status
Jorim Jaggi2d75f9f2014-10-08 17:10:58 -0700239 updateBluetooth();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800240
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800241 // Alarm clock
Jason Monk3e189872016-01-12 09:10:34 -0500242 mIconController.setIcon(mSlotAlarmClock, R.drawable.stat_sys_alarm, null);
243 mIconController.setIconVisibility(mSlotAlarmClock, false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800244
John Spurlocka37e9c82014-07-08 09:40:31 -0400245 // zen
Amin Shaikh833bb0f2019-03-28 14:03:48 -0400246 mIconController.setIcon(mSlotZen, R.drawable.stat_sys_dnd, null);
Jason Monk3e189872016-01-12 09:10:34 -0500247 mIconController.setIconVisibility(mSlotZen, false);
John Spurlocka37e9c82014-07-08 09:40:31 -0400248
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800249 // volume
Jason Monk3e189872016-01-12 09:10:34 -0500250 mIconController.setIcon(mSlotVolume, R.drawable.stat_sys_ringer_vibrate, null);
251 mIconController.setIconVisibility(mSlotVolume, false);
John Spurlocka37e9c82014-07-08 09:40:31 -0400252 updateVolumeZen();
John Spurlock96fe98d2014-08-27 09:36:02 -0400253
254 // cast
Jason Monk3e189872016-01-12 09:10:34 -0500255 mIconController.setIcon(mSlotCast, R.drawable.stat_sys_cast, null);
256 mIconController.setIconVisibility(mSlotCast, false);
Jason Monk952d5d82014-10-27 15:28:22 -0400257
258 // hotspot
Jason Monk3e189872016-01-12 09:10:34 -0500259 mIconController.setIcon(mSlotHotspot, R.drawable.stat_sys_hotspot,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500260 mResources.getString(R.string.accessibility_status_bar_hotspot));
Jason Monk3e189872016-01-12 09:10:34 -0500261 mIconController.setIconVisibility(mSlotHotspot, mHotspot.isHotspotEnabled());
Kenny Guy3094d4a2015-04-01 19:14:10 +0100262
263 // managed profile
Jason Monk3e189872016-01-12 09:10:34 -0500264 mIconController.setIcon(mSlotManagedProfile, R.drawable.stat_sys_managed_profile_status,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500265 mResources.getString(R.string.accessibility_managed_profile));
Jason Monk3e189872016-01-12 09:10:34 -0500266 mIconController.setIconVisibility(mSlotManagedProfile, mManagedProfileIconVisible);
Jason Monkf23aa992016-01-22 16:45:21 -0500267
268 // data saver
269 mIconController.setIcon(mSlotDataSaver, R.drawable.stat_sys_data_saver,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500270 mResources.getString(R.string.accessibility_data_saver_on));
Jason Monkf23aa992016-01-22 16:45:21 -0500271 mIconController.setIconVisibility(mSlotDataSaver, false);
Jason Monkaa573e92017-01-27 17:00:29 -0500272
Fabian Kozynskied5dfd92018-12-20 15:00:48 -0500273 mIconController.setIcon(mSlotLocation, LOCATION_STATUS_ICON_ID,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500274 mResources.getString(R.string.accessibility_location_active));
Fabian Kozynskied5dfd92018-12-20 15:00:48 -0500275 mIconController.setIconVisibility(mSlotLocation, false);
Evan Lairdcf1a1032018-11-14 13:46:08 -0500276
Michael Groovera51ea812019-03-19 18:56:36 -0700277 // sensors off
Michael Groover1ddabcc2019-04-19 18:35:24 -0700278 mIconController.setIcon(mSlotSensorsOff, R.drawable.stat_sys_sensors_off,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500279 mResources.getString(R.string.accessibility_sensors_off_active));
Michael Groovera51ea812019-03-19 18:56:36 -0700280 mIconController.setIconVisibility(mSlotSensorsOff,
281 mSensorPrivacyController.isSensorPrivacyEnabled());
282
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500283 // screen record
284 mIconController.setIcon(mSlotScreenRecord, R.drawable.stat_sys_screen_record, null);
285 mIconController.setIconVisibility(mSlotScreenRecord, false);
286
Jason Monkaa573e92017-01-27 17:00:29 -0500287 mRotationLockController.addCallback(this);
288 mBluetooth.addCallback(this);
289 mProvisionedController.addCallback(this);
290 mZenController.addCallback(this);
291 mCast.addCallback(mCastCallback);
292 mHotspot.addCallback(mHotspotCallback);
Evan Lairdbee3eb82018-05-16 15:58:49 -0400293 mNextAlarmController.addCallback(mNextAlarmCallback);
Jason Monk88529052016-11-04 13:29:58 -0400294 mDataSaver.addCallback(this);
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400295 mKeyguardStateController.addCallback(this);
Michael Groovera51ea812019-03-19 18:56:36 -0700296 mSensorPrivacyController.addCallback(mSensorPrivacyListener);
Fabian Kozynski16b26992019-05-06 10:18:41 -0400297 mLocationController.addCallback(this);
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500298 mRecordingController.addCallback(this);
Jason Monkaa573e92017-01-27 17:00:29 -0500299
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500300 mCommandQueue.addCallback(this);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800301 }
302
Jason Monkaa573e92017-01-27 17:00:29 -0500303 @Override
304 public void onZenChanged(int zen) {
John Spurlocka37e9c82014-07-08 09:40:31 -0400305 updateVolumeZen();
John Spurlockba2c6a02014-05-19 09:44:06 -0400306 }
307
Jason Monk359bb742017-04-13 10:40:40 -0400308 @Override
Beverlyb9826dd2018-04-12 15:02:45 -0400309 public void onConfigChanged(ZenModeConfig config) {
310 updateVolumeZen();
311 }
312
Adrian Roosc42a1e12014-07-07 23:35:53 +0200313 private void updateAlarm() {
John Spurlock604a5ee2015-06-01 12:27:22 -0400314 final AlarmClockInfo alarm = mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT);
315 final boolean hasAlarm = alarm != null && alarm.getTriggerTime() > 0;
Jason Monk20c0eb42017-03-02 17:35:49 -0500316 int zen = mZenController.getZen();
317 final boolean zenNone = zen == Global.ZEN_MODE_NO_INTERRUPTIONS;
Jason Monk3e189872016-01-12 09:10:34 -0500318 mIconController.setIcon(mSlotAlarmClock, zenNone ? R.drawable.stat_sys_alarm_dim
Evan Lairdbee3eb82018-05-16 15:58:49 -0400319 : R.drawable.stat_sys_alarm, buildAlarmContentDescription());
Jason Monk3e189872016-01-12 09:10:34 -0500320 mIconController.setIconVisibility(mSlotAlarmClock, mCurrentUserSetup && hasAlarm);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800321 }
322
Evan Lairdbee3eb82018-05-16 15:58:49 -0400323 private String buildAlarmContentDescription() {
324 if (mNextAlarm == null) {
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500325 return mResources.getString(R.string.status_bar_alarm);
Evan Lairdbee3eb82018-05-16 15:58:49 -0400326 }
Evan Lairdbee3eb82018-05-16 15:58:49 -0400327
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500328 String skeleton = mDateFormatUtil.is24HourFormat() ? "EHm" : "Ehma";
Evan Lairdbee3eb82018-05-16 15:58:49 -0400329 String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500330 String dateString = DateFormat.format(pattern, mNextAlarm.getTriggerTime()).toString();
Evan Lairdbee3eb82018-05-16 15:58:49 -0400331
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500332 return mResources.getString(R.string.accessibility_quick_settings_alarm, dateString);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800333 }
334
John Spurlockbcc10872014-11-28 15:29:21 -0500335 private final void updateVolumeZen() {
John Spurlocka37e9c82014-07-08 09:40:31 -0400336 boolean zenVisible = false;
337 int zenIconId = 0;
338 String zenDescription = null;
339
340 boolean volumeVisible = false;
341 int volumeIconId = 0;
342 String volumeDescription = null;
Jason Monk20c0eb42017-03-02 17:35:49 -0500343 int zen = mZenController.getZen();
John Spurlocka37e9c82014-07-08 09:40:31 -0400344
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500345 if (DndTile.isVisible(mSharedPreferences) || DndTile.isCombinedIcon(mSharedPreferences)) {
Jason Monk20c0eb42017-03-02 17:35:49 -0500346 zenVisible = zen != Global.ZEN_MODE_OFF;
Evan Lairda9adbd52018-05-16 11:32:08 -0400347 zenIconId = R.drawable.stat_sys_dnd;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500348 zenDescription = mResources.getString(R.string.quick_settings_dnd_label);
Jason Monk20c0eb42017-03-02 17:35:49 -0500349 } else if (zen == Global.ZEN_MODE_NO_INTERRUPTIONS) {
John Spurlocka37e9c82014-07-08 09:40:31 -0400350 zenVisible = true;
Amin Shaikh833bb0f2019-03-28 14:03:48 -0400351 zenIconId = R.drawable.stat_sys_dnd;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500352 zenDescription = mResources.getString(R.string.interruption_level_none);
Jason Monk20c0eb42017-03-02 17:35:49 -0500353 } else if (zen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS) {
John Spurlocka37e9c82014-07-08 09:40:31 -0400354 zenVisible = true;
Amin Shaikh833bb0f2019-03-28 14:03:48 -0400355 zenIconId = R.drawable.stat_sys_dnd;
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500356 zenDescription = mResources.getString(R.string.interruption_level_priority);
Svetoslav Ganov6179ea32011-06-28 01:12:41 -0700357 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800358
Beverlyff2df9b2018-10-10 16:54:10 -0400359 if (!ZenModeConfig.isZenOverridingRinger(zen, mZenController.getConsolidatedPolicy())) {
Fabian Kozynskib6a20372020-04-01 09:36:43 -0400360 final Integer ringerModeInternal =
361 mRingerModeTracker.getRingerModeInternal().getValue();
362 if (ringerModeInternal != null) {
363 if (ringerModeInternal == AudioManager.RINGER_MODE_VIBRATE) {
364 volumeVisible = true;
365 volumeIconId = R.drawable.stat_sys_ringer_vibrate;
366 volumeDescription = mResources.getString(R.string.accessibility_ringer_vibrate);
367 } else if (ringerModeInternal == AudioManager.RINGER_MODE_SILENT) {
368 volumeVisible = true;
369 volumeIconId = R.drawable.stat_sys_ringer_silent;
370 volumeDescription = mResources.getString(R.string.accessibility_ringer_silent);
371 }
Beverlyb9826dd2018-04-12 15:02:45 -0400372 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800373 }
John Spurlocka37e9c82014-07-08 09:40:31 -0400374
375 if (zenVisible) {
Jason Monk3e189872016-01-12 09:10:34 -0500376 mIconController.setIcon(mSlotZen, zenIconId, zenDescription);
John Spurlocka37e9c82014-07-08 09:40:31 -0400377 }
378 if (zenVisible != mZenVisible) {
Jason Monk3e189872016-01-12 09:10:34 -0500379 mIconController.setIconVisibility(mSlotZen, zenVisible);
John Spurlocka37e9c82014-07-08 09:40:31 -0400380 mZenVisible = zenVisible;
381 }
382
383 if (volumeVisible) {
Jason Monk3e189872016-01-12 09:10:34 -0500384 mIconController.setIcon(mSlotVolume, volumeIconId, volumeDescription);
John Spurlocka37e9c82014-07-08 09:40:31 -0400385 }
386 if (volumeVisible != mVolumeVisible) {
Jason Monk3e189872016-01-12 09:10:34 -0500387 mIconController.setIconVisibility(mSlotVolume, volumeVisible);
John Spurlocka37e9c82014-07-08 09:40:31 -0400388 mVolumeVisible = volumeVisible;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800389 }
John Spurlock15782262015-05-29 15:35:53 -0400390 updateAlarm();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800391 }
392
Jason Monk70364362015-08-06 16:32:18 -0400393 @Override
394 public void onBluetoothDevicesChanged() {
395 updateBluetooth();
396 }
397
398 @Override
399 public void onBluetoothStateChange(boolean enabled) {
400 updateBluetooth();
401 }
402
Jorim Jaggi2d75f9f2014-10-08 17:10:58 -0700403 private final void updateBluetooth() {
Amin Shaikhad29e932019-03-08 11:26:12 -0500404 int iconId = R.drawable.stat_sys_data_bluetooth_connected;
Jorim Jaggi2d75f9f2014-10-08 17:10:58 -0700405 String contentDescription =
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500406 mResources.getString(R.string.accessibility_quick_settings_bluetooth_on);
Evan Laird3cdf47e2018-01-29 16:01:41 -0500407 boolean bluetoothVisible = false;
Jason Monk70364362015-08-06 16:32:18 -0400408 if (mBluetooth != null) {
Ugo Yu40f08802019-11-19 09:56:40 +0800409 if (mBluetooth.isBluetoothConnected()
410 && (mBluetooth.isBluetoothAudioActive()
411 || !mBluetooth.isBluetoothAudioProfileOnly())) {
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500412 contentDescription = mResources.getString(
Ugo Yu40f08802019-11-19 09:56:40 +0800413 R.string.accessibility_bluetooth_connected);
Evan Laird3cdf47e2018-01-29 16:01:41 -0500414 bluetoothVisible = mBluetooth.isBluetoothEnabled();
Jaikumar Ganesh084c6652009-12-07 10:58:18 -0800415 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800416 }
Wink Savillee9b06d72009-05-18 21:47:50 -0700417
Jason Monk3e189872016-01-12 09:10:34 -0500418 mIconController.setIcon(mSlotBluetooth, iconId, contentDescription);
Evan Laird3cdf47e2018-01-29 16:01:41 -0500419 mIconController.setIconVisibility(mSlotBluetooth, bluetoothVisible);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800420 }
421
Hall Liu108ca202017-07-24 15:19:04 -0700422 private final void updateTTY() {
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500423 if (mTelecomManager == null) {
Hall Liu108ca202017-07-24 15:19:04 -0700424 updateTTY(TelecomManager.TTY_MODE_OFF);
425 } else {
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500426 updateTTY(mTelecomManager.getCurrentTtyMode());
Hall Liu108ca202017-07-24 15:19:04 -0700427 }
428 }
429
430 private final void updateTTY(int currentTtyMode) {
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700431 boolean enabled = currentTtyMode != TelecomManager.TTY_MODE_OFF;
Wink Saville04e71b32009-04-02 11:00:54 -0700432
John Spurlocka37e9c82014-07-08 09:40:31 -0400433 if (DEBUG) Log.v(TAG, "updateTTY: enabled: " + enabled);
Wink Saville04e71b32009-04-02 11:00:54 -0700434
435 if (enabled) {
436 // TTY is on
John Spurlocka37e9c82014-07-08 09:40:31 -0400437 if (DEBUG) Log.v(TAG, "updateTTY: set TTY on");
Jason Monk3e189872016-01-12 09:10:34 -0500438 mIconController.setIcon(mSlotTty, R.drawable.stat_sys_tty_mode,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500439 mResources.getString(R.string.accessibility_tty_enabled));
Jason Monk3e189872016-01-12 09:10:34 -0500440 mIconController.setIconVisibility(mSlotTty, true);
Wink Saville04e71b32009-04-02 11:00:54 -0700441 } else {
442 // TTY is off
John Spurlocka37e9c82014-07-08 09:40:31 -0400443 if (DEBUG) Log.v(TAG, "updateTTY: set TTY off");
Jason Monk3e189872016-01-12 09:10:34 -0500444 mIconController.setIconVisibility(mSlotTty, false);
Wink Saville04e71b32009-04-02 11:00:54 -0700445 }
446 }
John Spurlock96fe98d2014-08-27 09:36:02 -0400447
448 private void updateCast() {
449 boolean isCasting = false;
450 for (CastDevice device : mCast.getCastDevices()) {
451 if (device.state == CastDevice.STATE_CONNECTING
452 || device.state == CastDevice.STATE_CONNECTED) {
453 isCasting = true;
454 break;
455 }
456 }
457 if (DEBUG) Log.v(TAG, "updateCast: isCasting: " + isCasting);
Dan Sandler8fd25bf2015-10-20 16:01:27 -0700458 mHandler.removeCallbacks(mRemoveCastIconRunnable);
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500459 if (isCasting && !mRecordingController.isRecording()) { // screen record has its own icon
Jason Monk3e189872016-01-12 09:10:34 -0500460 mIconController.setIcon(mSlotCast, R.drawable.stat_sys_cast,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500461 mResources.getString(R.string.accessibility_casting));
Jason Monk3e189872016-01-12 09:10:34 -0500462 mIconController.setIconVisibility(mSlotCast, true);
Dan Sandler8fd25bf2015-10-20 16:01:27 -0700463 } else {
464 // don't turn off the screen-record icon for a few seconds, just to make sure the user
465 // has seen it
466 if (DEBUG) Log.v(TAG, "updateCast: hiding icon in 3 sec...");
467 mHandler.postDelayed(mRemoveCastIconRunnable, 3000);
John Spurlock96fe98d2014-08-27 09:36:02 -0400468 }
John Spurlock96fe98d2014-08-27 09:36:02 -0400469 }
470
Kenny Guy3094d4a2015-04-01 19:14:10 +0100471 private void updateManagedProfile() {
Jorim Jaggifabc7432017-05-15 02:40:05 +0200472 // getLastResumedActivityUserId needds to acquire the AM lock, which may be contended in
473 // some cases. Since it doesn't really matter here whether it's updated in this frame
474 // or in the next one, we call this method from our UI offload thread.
Dave Mankoffc7cf9fc2019-12-19 15:43:20 -0500475 mUiBgExecutor.execute(() -> {
Jorim Jaggifabc7432017-05-15 02:40:05 +0200476 final int userId;
477 try {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700478 userId = ActivityTaskManager.getService().getLastResumedActivityUserId();
Jorim Jaggifabc7432017-05-15 02:40:05 +0200479 boolean isManagedProfile = mUserManager.isManagedProfile(userId);
480 mHandler.post(() -> {
481 final boolean showIcon;
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400482 if (isManagedProfile && (!mKeyguardStateController.isShowing()
483 || mKeyguardStateController.isOccluded())) {
Jorim Jaggifabc7432017-05-15 02:40:05 +0200484 showIcon = true;
485 mIconController.setIcon(mSlotManagedProfile,
486 R.drawable.stat_sys_managed_profile_status,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500487 mResources.getString(R.string.accessibility_managed_profile));
Jorim Jaggifabc7432017-05-15 02:40:05 +0200488 } else {
489 showIcon = false;
490 }
491 if (mManagedProfileIconVisible != showIcon) {
492 mIconController.setIconVisibility(mSlotManagedProfile, showIcon);
493 mManagedProfileIconVisible = showIcon;
494 }
495 });
496 } catch (RemoteException e) {
497 Log.w(TAG, "updateManagedProfile: ", e);
Tony Makec319ab2017-03-28 18:50:01 +0100498 }
Jorim Jaggifabc7432017-05-15 02:40:05 +0200499 });
Kenny Guy3094d4a2015-04-01 19:14:10 +0100500 }
501
Fyodor Kupolov6005b3f2015-11-23 17:41:50 -0800502 private final SynchronousUserSwitchObserver mUserSwitchListener =
503 new SynchronousUserSwitchObserver() {
Kenny Guy3094d4a2015-04-01 19:14:10 +0100504 @Override
Fyodor Kupolov6005b3f2015-11-23 17:41:50 -0800505 public void onUserSwitching(int newUserId) throws RemoteException {
Tony Makec319ab2017-03-28 18:50:01 +0100506 mHandler.post(() -> mUserInfoController.reloadUserInfo());
Kenny Guy3094d4a2015-04-01 19:14:10 +0100507 }
508
509 @Override
510 public void onUserSwitchComplete(int newUserId) throws RemoteException {
Tony Makec319ab2017-03-28 18:50:01 +0100511 mHandler.post(() -> {
512 updateAlarm();
Tony Makec319ab2017-03-28 18:50:01 +0100513 updateManagedProfile();
Toni Barzice97f9232016-04-27 18:10:58 -0700514 });
Kenny Guy3094d4a2015-04-01 19:14:10 +0100515 }
516 };
517
Jason Monk952d5d82014-10-27 15:28:22 -0400518 private final HotspotController.Callback mHotspotCallback = new HotspotController.Callback() {
519 @Override
Rohan Shahe4071122018-01-22 15:16:09 -0800520 public void onHotspotChanged(boolean enabled, int numDevices) {
Jason Monk3e189872016-01-12 09:10:34 -0500521 mIconController.setIconVisibility(mSlotHotspot, enabled);
Jason Monk952d5d82014-10-27 15:28:22 -0400522 }
523 };
524
John Spurlock96fe98d2014-08-27 09:36:02 -0400525 private final CastController.Callback mCastCallback = new CastController.Callback() {
526 @Override
527 public void onCastDevicesChanged() {
528 updateCast();
529 }
530 };
Kenny Guy3094d4a2015-04-01 19:14:10 +0100531
Juan Flores2ff37202015-04-30 13:44:23 +0200532 private final NextAlarmController.NextAlarmChangeCallback mNextAlarmCallback =
533 new NextAlarmController.NextAlarmChangeCallback() {
Jason Monk324b8862017-02-16 17:19:12 -0500534 @Override
535 public void onNextAlarmChanged(AlarmManager.AlarmClockInfo nextAlarm) {
Evan Lairdbee3eb82018-05-16 15:58:49 -0400536 mNextAlarm = nextAlarm;
Jason Monk324b8862017-02-16 17:19:12 -0500537 updateAlarm();
538 }
539 };
Juan Flores2ff37202015-04-30 13:44:23 +0200540
Michael Groovera51ea812019-03-19 18:56:36 -0700541 private final SensorPrivacyController.OnSensorPrivacyChangedListener mSensorPrivacyListener =
542 new SensorPrivacyController.OnSensorPrivacyChangedListener() {
543 @Override
544 public void onSensorPrivacyChanged(boolean enabled) {
545 mHandler.post(() -> {
546 mIconController.setIconVisibility(mSlotSensorsOff, enabled);
547 });
548 }
549 };
550
Jason Monkaa573e92017-01-27 17:00:29 -0500551 @Override
Charles Chenf3d295c2018-11-30 18:15:21 +0800552 public void appTransitionStarting(int displayId, long startTime, long duration,
553 boolean forced) {
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500554 if (mDisplayId == displayId) {
Charles Chenf3d295c2018-11-30 18:15:21 +0800555 updateManagedProfile();
Charles Chenf3d295c2018-11-30 18:15:21 +0800556 }
Kenny Guy3094d4a2015-04-01 19:14:10 +0100557 }
558
Jason Monkaa573e92017-01-27 17:00:29 -0500559 @Override
560 public void onKeyguardShowingChanged() {
Kenny Guy3094d4a2015-04-01 19:14:10 +0100561 updateManagedProfile();
562 }
John Spurlock604a5ee2015-06-01 12:27:22 -0400563
Jason Monkaa573e92017-01-27 17:00:29 -0500564 @Override
565 public void onUserSetupChanged() {
566 boolean userSetup = mProvisionedController.isUserSetup(
567 mProvisionedController.getCurrentUser());
John Spurlock604a5ee2015-06-01 12:27:22 -0400568 if (mCurrentUserSetup == userSetup) return;
569 mCurrentUserSetup = userSetup;
570 updateAlarm();
571 }
Jason Monk3e189872016-01-12 09:10:34 -0500572
573 @Override
574 public void onRotationLockStateChanged(boolean rotationLocked, boolean affordanceVisible) {
575 boolean portrait = RotationLockTile.isCurrentOrientationLockPortrait(
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500576 mRotationLockController, mResources);
Jason Monk3e189872016-01-12 09:10:34 -0500577 if (rotationLocked) {
578 if (portrait) {
579 mIconController.setIcon(mSlotRotate, R.drawable.stat_sys_rotate_portrait,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500580 mResources.getString(R.string.accessibility_rotation_lock_on_portrait));
Jason Monk3e189872016-01-12 09:10:34 -0500581 } else {
582 mIconController.setIcon(mSlotRotate, R.drawable.stat_sys_rotate_landscape,
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500583 mResources.getString(R.string.accessibility_rotation_lock_on_landscape));
Jason Monk3e189872016-01-12 09:10:34 -0500584 }
Jason Monk8816dff2016-02-09 21:50:36 -0500585 mIconController.setIconVisibility(mSlotRotate, true);
Jason Monk3e189872016-01-12 09:10:34 -0500586 } else {
Jason Monk8816dff2016-02-09 21:50:36 -0500587 mIconController.setIconVisibility(mSlotRotate, false);
Jason Monk3e189872016-01-12 09:10:34 -0500588 }
589 }
590
591 private void updateHeadsetPlug(Intent intent) {
592 boolean connected = intent.getIntExtra("state", 0) != 0;
593 boolean hasMic = intent.getIntExtra("microphone", 0) != 0;
594 if (connected) {
Dave Mankoff3c6aaab2020-01-10 17:50:34 -0500595 String contentDescription = mResources.getString(hasMic
Jason Monk3e189872016-01-12 09:10:34 -0500596 ? R.string.accessibility_status_bar_headset
597 : R.string.accessibility_status_bar_headphones);
Amin Shaikhad29e932019-03-08 11:26:12 -0500598 mIconController.setIcon(mSlotHeadset, hasMic ? R.drawable.stat_sys_headset_mic
599 : R.drawable.stat_sys_headset, contentDescription);
Jason Monk3e189872016-01-12 09:10:34 -0500600 mIconController.setIconVisibility(mSlotHeadset, true);
601 } else {
602 mIconController.setIconVisibility(mSlotHeadset, false);
603 }
604 }
605
Jason Monkf23aa992016-01-22 16:45:21 -0500606 @Override
607 public void onDataSaverChanged(boolean isDataSaving) {
608 mIconController.setIconVisibility(mSlotDataSaver, isDataSaving);
609 }
610
Fabian Kozynski16b26992019-05-06 10:18:41 -0400611 @Override
612 public void onLocationActiveChanged(boolean active) {
Fabian Kozynski228e3102019-11-25 11:04:34 -0500613 updateLocation();
Fabian Kozynski16b26992019-05-06 10:18:41 -0400614 }
615
616 // Updates the status view based on the current state of location requests.
617 private void updateLocation() {
618 if (mLocationController.isLocationActive()) {
619 mIconController.setIconVisibility(mSlotLocation, true);
620 } else {
621 mIconController.setIconVisibility(mSlotLocation, false);
622 }
623 }
624
Jason Monk3e189872016-01-12 09:10:34 -0500625 private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
626 @Override
627 public void onReceive(Context context, Intent intent) {
628 String action = intent.getAction();
Lucas Dupin5e0f0d22018-02-26 13:32:16 -0800629 switch (action) {
Daniel Bright350f7f92020-01-22 14:24:11 -0800630 case Intent.ACTION_SIM_STATE_CHANGED:
Lucas Dupin5e0f0d22018-02-26 13:32:16 -0800631 // Avoid rebroadcast because SysUI is direct boot aware.
Meng Wang0e8d91a2020-01-17 14:58:01 -0800632 if (intent.getBooleanExtra(Intent.EXTRA_REBROADCAST_ON_UNLOCK, false)) {
Lucas Dupin5e0f0d22018-02-26 13:32:16 -0800633 break;
634 }
Lucas Dupin5e0f0d22018-02-26 13:32:16 -0800635 break;
636 case TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED:
637 updateTTY(intent.getIntExtra(TelecomManager.EXTRA_CURRENT_TTY_MODE,
638 TelecomManager.TTY_MODE_OFF));
639 break;
640 case Intent.ACTION_MANAGED_PROFILE_AVAILABLE:
641 case Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE:
642 case Intent.ACTION_MANAGED_PROFILE_REMOVED:
643 updateManagedProfile();
644 break;
645 case AudioManager.ACTION_HEADSET_PLUG:
646 updateHeadsetPlug(intent);
647 break;
Jason Monk3e189872016-01-12 09:10:34 -0500648 }
649 }
650 };
651
652 private Runnable mRemoveCastIconRunnable = new Runnable() {
653 @Override
654 public void run() {
655 if (DEBUG) Log.v(TAG, "updateCast: hiding icon NOW");
656 mIconController.setIconVisibility(mSlotCast, false);
657 }
658 };
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500659
660 // Screen Recording
661 @Override
662 public void onCountdown(long millisUntilFinished) {
663 if (DEBUG) Log.d(TAG, "screenrecord: countdown " + millisUntilFinished);
664 int countdown = (int) Math.floorDiv(millisUntilFinished + 500, 1000);
665 int resourceId = R.drawable.stat_sys_screen_record;
Beth Thibodeau47811b42020-04-22 01:22:39 -0400666 String description = Integer.toString(countdown);
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500667 switch (countdown) {
668 case 1:
669 resourceId = R.drawable.stat_sys_screen_record_1;
670 break;
671 case 2:
672 resourceId = R.drawable.stat_sys_screen_record_2;
673 break;
674 case 3:
675 resourceId = R.drawable.stat_sys_screen_record_3;
676 break;
677 }
Beth Thibodeau47811b42020-04-22 01:22:39 -0400678 mIconController.setIcon(mSlotScreenRecord, resourceId, description);
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500679 mIconController.setIconVisibility(mSlotScreenRecord, true);
680 }
681
682 @Override
Beth Thibodeau58772782020-02-18 20:55:38 -0500683 public void onCountdownEnd() {
684 if (DEBUG) Log.d(TAG, "screenrecord: hiding icon during countdown");
685 mHandler.post(() -> mIconController.setIconVisibility(mSlotScreenRecord, false));
686 }
687
688 @Override
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500689 public void onRecordingStart() {
690 if (DEBUG) Log.d(TAG, "screenrecord: showing icon");
691 mIconController.setIcon(mSlotScreenRecord,
Beth Thibodeau47811b42020-04-22 01:22:39 -0400692 R.drawable.stat_sys_screen_record,
693 mResources.getString(R.string.screenrecord_ongoing_screen_only));
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500694 mIconController.setIconVisibility(mSlotScreenRecord, true);
695 }
696
697 @Override
698 public void onRecordingEnd() {
Beth Thibodeau58772782020-02-18 20:55:38 -0500699 // Ensure this is on the main thread
Beth Thibodeau8bfbf1f2020-02-13 13:55:37 -0500700 if (DEBUG) Log.d(TAG, "screenrecord: hiding icon");
701 mHandler.post(() -> mIconController.setIconVisibility(mSlotScreenRecord, false));
702 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800703}