blob: aebc2c968432db94b2440498c3f3c9f0cb34eca1 [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
Rubin Xu1205fb12015-11-04 17:45:03 +000019import android.app.ActivityManager;
Jason Monk324b8862017-02-16 17:19:12 -050020import android.app.ActivityManager.RunningAppProcessInfo;
21import android.app.ActivityManager.StackId;
22import android.app.ActivityManager.StackInfo;
Adrian Roosc42a1e12014-07-07 23:35:53 +020023import android.app.AlarmManager;
John Spurlock604a5ee2015-06-01 12:27:22 -040024import android.app.AlarmManager.AlarmClockInfo;
Jason Monk324b8862017-02-16 17:19:12 -050025import android.app.AppGlobals;
26import android.app.Notification;
27import android.app.Notification.Action;
28import android.app.Notification.BigTextStyle;
29import android.app.Notification.Style;
30import android.app.NotificationManager;
31import android.app.PendingIntent;
Fyodor Kupolov6005b3f2015-11-23 17:41:50 -080032import android.app.SynchronousUserSwitchObserver;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080033import android.content.BroadcastReceiver;
34import android.content.Context;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080035import android.content.Intent;
36import android.content.IntentFilter;
Jason Monk324b8862017-02-16 17:19:12 -050037import android.content.pm.ApplicationInfo;
38import android.content.pm.IPackageManager;
39import android.content.pm.PackageManager;
40import android.content.pm.PackageManager.NameNotFoundException;
Kenny Guy3094d4a2015-04-01 19:14:10 +010041import android.content.pm.UserInfo;
Jason Monk324b8862017-02-16 17:19:12 -050042import android.graphics.drawable.Icon;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080043import android.media.AudioManager;
Jason Monk324b8862017-02-16 17:19:12 -050044import android.net.Uri;
45import android.os.Bundle;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080046import android.os.Handler;
Kenny Guy3094d4a2015-04-01 19:14:10 +010047import android.os.RemoteException;
Adrian Roosc42a1e12014-07-07 23:35:53 +020048import android.os.UserHandle;
Kenny Guy3094d4a2015-04-01 19:14:10 +010049import android.os.UserManager;
Jason Monk324b8862017-02-16 17:19:12 -050050import android.provider.Settings;
John Spurlockae641c92014-06-30 18:11:40 -040051import android.provider.Settings.Global;
Jason Monk324b8862017-02-16 17:19:12 -050052import android.service.notification.StatusBarNotification;
Tyler Gunnef9f6f92014-09-12 22:16:17 -070053import android.telecom.TelecomManager;
Jason Monk324b8862017-02-16 17:19:12 -050054import android.util.ArrayMap;
55import android.util.ArraySet;
John Spurlockcd686b52013-06-05 10:13:46 -040056import android.util.Log;
Jason Monk324b8862017-02-16 17:19:12 -050057import android.util.Pair;
Winsonc0d70582016-01-29 10:24:39 -080058
Jason Monk324b8862017-02-16 17:19:12 -050059import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
Wink Savillea639b312012-07-10 12:37:54 -070060import com.android.internal.telephony.IccCardConstants;
Wink Saville04e71b32009-04-02 11:00:54 -070061import com.android.internal.telephony.TelephonyIntents;
Jason Monk9c7844c2017-01-18 15:21:53 -050062import com.android.systemui.Dependency;
Joe Onorato798ac4c2010-05-27 16:39:00 -040063import com.android.systemui.R;
Jason Monk324b8862017-02-16 17:19:12 -050064import com.android.systemui.R.string;
Jason Monkaa573e92017-01-27 17:00:29 -050065import com.android.systemui.SysUiServiceProvider;
John Spurlock3c4076a2015-02-24 12:12:25 -050066import com.android.systemui.qs.tiles.DndTile;
Jason Monk3e189872016-01-12 09:10:34 -050067import com.android.systemui.qs.tiles.RotationLockTile;
Jason Monk324b8862017-02-16 17:19:12 -050068import com.android.systemui.recents.Recents;
69import com.android.systemui.recents.misc.SystemServicesProxy;
70import com.android.systemui.recents.misc.SystemServicesProxy.TaskStackListener;
Jason Monkaa573e92017-01-27 17:00:29 -050071import com.android.systemui.statusbar.CommandQueue;
72import com.android.systemui.statusbar.CommandQueue.Callbacks;
Jason Monk70364362015-08-06 16:32:18 -040073import com.android.systemui.statusbar.policy.BluetoothController;
74import com.android.systemui.statusbar.policy.BluetoothController.Callback;
John Spurlock96fe98d2014-08-27 09:36:02 -040075import com.android.systemui.statusbar.policy.CastController;
76import com.android.systemui.statusbar.policy.CastController.CastDevice;
Jason Monkf23aa992016-01-22 16:45:21 -050077import com.android.systemui.statusbar.policy.DataSaverController;
Jason Monkaa573e92017-01-27 17:00:29 -050078import com.android.systemui.statusbar.policy.DataSaverController.Listener;
79import com.android.systemui.statusbar.policy.DeviceProvisionedController;
80import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
Jason Monk952d5d82014-10-27 15:28:22 -040081import com.android.systemui.statusbar.policy.HotspotController;
Jason Monkaa573e92017-01-27 17:00:29 -050082import com.android.systemui.statusbar.policy.KeyguardMonitor;
Juan Flores2ff37202015-04-30 13:44:23 +020083import com.android.systemui.statusbar.policy.NextAlarmController;
Jason Monk3e189872016-01-12 09:10:34 -050084import com.android.systemui.statusbar.policy.RotationLockController;
Jason Monkaa573e92017-01-27 17:00:29 -050085import com.android.systemui.statusbar.policy.RotationLockController.RotationLockControllerCallback;
Adrian Roos88b11932015-07-22 14:59:48 -070086import com.android.systemui.statusbar.policy.UserInfoController;
Jason Monkaa573e92017-01-27 17:00:29 -050087import com.android.systemui.statusbar.policy.ZenModeController;
Jason Monk324b8862017-02-16 17:19:12 -050088import com.android.systemui.util.NotificationChannels;
89
90import java.util.ArrayList;
91import java.util.List;
Joe Onorato798ac4c2010-05-27 16:39:00 -040092
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080093/**
94 * This class contains all of the policy about which icons are installed in the status
Joe Onorato798ac4c2010-05-27 16:39:00 -040095 * bar at boot time. It goes through the normal API for icons, even though it probably
96 * strictly doesn't need to.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080097 */
Jason Monkaa573e92017-01-27 17:00:29 -050098public class PhoneStatusBarPolicy implements Callback, Callbacks,
99 RotationLockControllerCallback, Listener,
100 ZenModeController.Callback, DeviceProvisionedListener, KeyguardMonitor.Callback {
Joe Onoratofd52b182010-11-10 18:00:52 -0800101 private static final String TAG = "PhoneStatusBarPolicy";
John Spurlocka37e9c82014-07-08 09:40:31 -0400102 private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
Robert Greenwaltd7085fc2010-09-08 15:24:47 -0700103
Jason Monk3e189872016-01-12 09:10:34 -0500104 private final String mSlotCast;
105 private final String mSlotHotspot;
106 private final String mSlotBluetooth;
107 private final String mSlotTty;
108 private final String mSlotZen;
109 private final String mSlotVolume;
110 private final String mSlotAlarmClock;
111 private final String mSlotManagedProfile;
112 private final String mSlotRotate;
113 private final String mSlotHeadset;
Jason Monkf23aa992016-01-22 16:45:21 -0500114 private final String mSlotDataSaver;
John Spurlocka37e9c82014-07-08 09:40:31 -0400115
Dianne Hackborn4840e142009-03-24 22:40:29 -0700116 private final Context mContext;
Joe Onorato10523b4d2010-10-25 10:42:46 -0700117 private final Handler mHandler = new Handler();
John Spurlock96fe98d2014-08-27 09:36:02 -0400118 private final CastController mCast;
Jason Monk952d5d82014-10-27 15:28:22 -0400119 private final HotspotController mHotspot;
Juan Flores2ff37202015-04-30 13:44:23 +0200120 private final NextAlarmController mNextAlarm;
John Spurlock15782262015-05-29 15:35:53 -0400121 private final AlarmManager mAlarmManager;
Adrian Roos88b11932015-07-22 14:59:48 -0700122 private final UserInfoController mUserInfoController;
Rubin Xu1205fb12015-11-04 17:45:03 +0000123 private final UserManager mUserManager;
Jason Monk07473ce2016-01-05 14:59:19 -0500124 private final StatusBarIconController mIconController;
Jason Monk3e189872016-01-12 09:10:34 -0500125 private final RotationLockController mRotationLockController;
Jason Monkf23aa992016-01-22 16:45:21 -0500126 private final DataSaverController mDataSaver;
Jason Monkaa573e92017-01-27 17:00:29 -0500127 private final ZenModeController mZenController;
128 private final DeviceProvisionedController mProvisionedController;
129 private final KeyguardMonitor mKeyguardMonitor;
Jason Monk324b8862017-02-16 17:19:12 -0500130 private final ArraySet<Pair<String, Integer>> mCurrentNotifs = new ArraySet<>();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800131
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800132 // Assume it's all good unless we hear otherwise. We don't always seem
133 // to get broadcasts that it *is* there.
Wink Savillea639b312012-07-10 12:37:54 -0700134 IccCardConstants.State mSimState = IccCardConstants.State.READY;
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
John Spurlockae641c92014-06-30 18:11:40 -0400140 private int mZen;
John Spurlockba2c6a02014-05-19 09:44:06 -0400141
Kenny Guy3094d4a2015-04-01 19:14:10 +0100142 private boolean mManagedProfileFocused = false;
Rubin Xu1205fb12015-11-04 17:45:03 +0000143 private boolean mManagedProfileIconVisible = false;
144 private boolean mManagedProfileInQuietMode = false;
Kenny Guy3094d4a2015-04-01 19:14:10 +0100145
Jason Monk70364362015-08-06 16:32:18 -0400146 private BluetoothController mBluetooth;
Wink Savillee9b06d72009-05-18 21:47:50 -0700147
Jason Monk9c7844c2017-01-18 15:21:53 -0500148 public PhoneStatusBarPolicy(Context context, StatusBarIconController iconController) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800149 mContext = context;
Jason Monk07473ce2016-01-05 14:59:19 -0500150 mIconController = iconController;
Jason Monk9c7844c2017-01-18 15:21:53 -0500151 mCast = Dependency.get(CastController.class);
152 mHotspot = Dependency.get(HotspotController.class);
153 mBluetooth = Dependency.get(BluetoothController.class);
Jason Monk9c7844c2017-01-18 15:21:53 -0500154 mNextAlarm = Dependency.get(NextAlarmController.class);
John Spurlock15782262015-05-29 15:35:53 -0400155 mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Jason Monk9c7844c2017-01-18 15:21:53 -0500156 mUserInfoController = Dependency.get(UserInfoController.class);
Rubin Xu1205fb12015-11-04 17:45:03 +0000157 mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
Jason Monk9c7844c2017-01-18 15:21:53 -0500158 mRotationLockController = Dependency.get(RotationLockController.class);
159 mDataSaver = Dependency.get(DataSaverController.class);
Jason Monkaa573e92017-01-27 17:00:29 -0500160 mZenController = Dependency.get(ZenModeController.class);
161 mProvisionedController = Dependency.get(DeviceProvisionedController.class);
162 mKeyguardMonitor = Dependency.get(KeyguardMonitor.class);
Jason Monk3e189872016-01-12 09:10:34 -0500163
164 mSlotCast = context.getString(com.android.internal.R.string.status_bar_cast);
165 mSlotHotspot = context.getString(com.android.internal.R.string.status_bar_hotspot);
166 mSlotBluetooth = context.getString(com.android.internal.R.string.status_bar_bluetooth);
167 mSlotTty = context.getString(com.android.internal.R.string.status_bar_tty);
168 mSlotZen = context.getString(com.android.internal.R.string.status_bar_zen);
169 mSlotVolume = context.getString(com.android.internal.R.string.status_bar_volume);
170 mSlotAlarmClock = context.getString(com.android.internal.R.string.status_bar_alarm_clock);
171 mSlotManagedProfile = context.getString(
172 com.android.internal.R.string.status_bar_managed_profile);
173 mSlotRotate = context.getString(com.android.internal.R.string.status_bar_rotate);
174 mSlotHeadset = context.getString(com.android.internal.R.string.status_bar_headset);
Jason Monkf23aa992016-01-22 16:45:21 -0500175 mSlotDataSaver = context.getString(com.android.internal.R.string.status_bar_data_saver);
Jason Monk3e189872016-01-12 09:10:34 -0500176
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800177
Daniel Sandlere3b7a2d2011-10-27 16:16:15 -0400178 // listen for broadcasts
179 IntentFilter filter = new IntentFilter();
Daniel Sandlere3b7a2d2011-10-27 16:16:15 -0400180 filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
John Spurlockbcc10872014-11-28 15:29:21 -0500181 filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);
Jason Monk3e189872016-01-12 09:10:34 -0500182 filter.addAction(AudioManager.ACTION_HEADSET_PLUG);
Daniel Sandlere3b7a2d2011-10-27 16:16:15 -0400183 filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700184 filter.addAction(TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED);
Rubin Xue95057a2016-04-01 16:49:25 +0100185 filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
186 filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
Nicolas Prevot6c7b8742016-04-13 10:28:58 +0100187 filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);
Daniel Sandlere3b7a2d2011-10-27 16:16:15 -0400188 mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);
189
Kenny Guy3094d4a2015-04-01 19:14:10 +0100190 // listen for user / profile change.
191 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -0800192 ActivityManager.getService().registerUserSwitchObserver(mUserSwitchListener, TAG);
Kenny Guy3094d4a2015-04-01 19:14:10 +0100193 } catch (RemoteException e) {
194 // Ignore
195 }
196
Wink Saville04e71b32009-04-02 11:00:54 -0700197 // TTY status
Jason Monk324b8862017-02-16 17:19:12 -0500198 mIconController.setIcon(mSlotTty, R.drawable.stat_sys_tty_mode, null);
Jason Monk3e189872016-01-12 09:10:34 -0500199 mIconController.setIconVisibility(mSlotTty, false);
Wink Saville04e71b32009-04-02 11:00:54 -0700200
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800201 // bluetooth status
Jorim Jaggi2d75f9f2014-10-08 17:10:58 -0700202 updateBluetooth();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800203
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800204 // Alarm clock
Jason Monk3e189872016-01-12 09:10:34 -0500205 mIconController.setIcon(mSlotAlarmClock, R.drawable.stat_sys_alarm, null);
206 mIconController.setIconVisibility(mSlotAlarmClock, false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800207
John Spurlocka37e9c82014-07-08 09:40:31 -0400208 // zen
Jason Monk3e189872016-01-12 09:10:34 -0500209 mIconController.setIcon(mSlotZen, R.drawable.stat_sys_zen_important, null);
210 mIconController.setIconVisibility(mSlotZen, false);
John Spurlocka37e9c82014-07-08 09:40:31 -0400211
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800212 // volume
Jason Monk3e189872016-01-12 09:10:34 -0500213 mIconController.setIcon(mSlotVolume, R.drawable.stat_sys_ringer_vibrate, null);
214 mIconController.setIconVisibility(mSlotVolume, false);
John Spurlocka37e9c82014-07-08 09:40:31 -0400215 updateVolumeZen();
John Spurlock96fe98d2014-08-27 09:36:02 -0400216
217 // cast
Jason Monk3e189872016-01-12 09:10:34 -0500218 mIconController.setIcon(mSlotCast, R.drawable.stat_sys_cast, null);
219 mIconController.setIconVisibility(mSlotCast, false);
Jason Monk952d5d82014-10-27 15:28:22 -0400220
221 // hotspot
Jason Monk3e189872016-01-12 09:10:34 -0500222 mIconController.setIcon(mSlotHotspot, R.drawable.stat_sys_hotspot,
Jason Monk08187a42015-06-09 14:33:51 -0400223 mContext.getString(R.string.accessibility_status_bar_hotspot));
Jason Monk3e189872016-01-12 09:10:34 -0500224 mIconController.setIconVisibility(mSlotHotspot, mHotspot.isHotspotEnabled());
Kenny Guy3094d4a2015-04-01 19:14:10 +0100225
226 // managed profile
Jason Monk3e189872016-01-12 09:10:34 -0500227 mIconController.setIcon(mSlotManagedProfile, R.drawable.stat_sys_managed_profile_status,
Adrian Roos1b5eb972015-06-11 18:22:52 -0700228 mContext.getString(R.string.accessibility_managed_profile));
Jason Monk3e189872016-01-12 09:10:34 -0500229 mIconController.setIconVisibility(mSlotManagedProfile, mManagedProfileIconVisible);
Jason Monkf23aa992016-01-22 16:45:21 -0500230
231 // data saver
232 mIconController.setIcon(mSlotDataSaver, R.drawable.stat_sys_data_saver,
233 context.getString(R.string.accessibility_data_saver_on));
234 mIconController.setIconVisibility(mSlotDataSaver, false);
Jason Monkaa573e92017-01-27 17:00:29 -0500235
236 mRotationLockController.addCallback(this);
237 mBluetooth.addCallback(this);
238 mProvisionedController.addCallback(this);
239 mZenController.addCallback(this);
240 mCast.addCallback(mCastCallback);
241 mHotspot.addCallback(mHotspotCallback);
242 mNextAlarm.addCallback(mNextAlarmCallback);
Jason Monk88529052016-11-04 13:29:58 -0400243 mDataSaver.addCallback(this);
Jason Monkaa573e92017-01-27 17:00:29 -0500244 mKeyguardMonitor.addCallback(this);
245
246 SysUiServiceProvider.getComponent(mContext, CommandQueue.class).addCallbacks(this);
Jason Monk324b8862017-02-16 17:19:12 -0500247 SystemServicesProxy.getInstance(mContext).registerTaskStackListener(mTaskListener);
248
249 // Clear out all old notifications on startup (only present in the case where sysui dies)
250 NotificationManager noMan = mContext.getSystemService(NotificationManager.class);
251 for (StatusBarNotification notification : noMan.getActiveNotifications()) {
252 if (notification.getId() == SystemMessage.NOTE_INSTANT_APPS) {
253 noMan.cancel(notification.getTag(), notification.getId());
254 }
255 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800256 }
257
Jason Monkaa573e92017-01-27 17:00:29 -0500258 public void destroy() {
259 mRotationLockController.removeCallback(this);
260 mBluetooth.removeCallback(this);
261 mProvisionedController.removeCallback(this);
262 mZenController.removeCallback(this);
263 mCast.removeCallback(mCastCallback);
264 mHotspot.removeCallback(mHotspotCallback);
265 mNextAlarm.removeCallback(mNextAlarmCallback);
266 mDataSaver.removeCallback(this);
267 mKeyguardMonitor.removeCallback(this);
268 SysUiServiceProvider.getComponent(mContext, CommandQueue.class).removeCallbacks(this);
269 mContext.unregisterReceiver(mIntentReceiver);
Jason Monk324b8862017-02-16 17:19:12 -0500270
271 NotificationManager noMan = mContext.getSystemService(NotificationManager.class);
272 mCurrentNotifs.forEach(v -> noMan.cancelAsUser(v.first, SystemMessage.NOTE_INSTANT_APPS,
273 new UserHandle(v.second)));
Nicolas Prevot1dbbe7d2016-05-17 12:52:54 +0100274 }
275
Jason Monkaa573e92017-01-27 17:00:29 -0500276 @Override
277 public void onZenChanged(int zen) {
John Spurlockba2c6a02014-05-19 09:44:06 -0400278 mZen = zen;
John Spurlocka37e9c82014-07-08 09:40:31 -0400279 updateVolumeZen();
John Spurlockba2c6a02014-05-19 09:44:06 -0400280 }
281
Adrian Roosc42a1e12014-07-07 23:35:53 +0200282 private void updateAlarm() {
John Spurlock604a5ee2015-06-01 12:27:22 -0400283 final AlarmClockInfo alarm = mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT);
284 final boolean hasAlarm = alarm != null && alarm.getTriggerTime() > 0;
John Spurlock15782262015-05-29 15:35:53 -0400285 final boolean zenNone = mZen == Global.ZEN_MODE_NO_INTERRUPTIONS;
Jason Monk3e189872016-01-12 09:10:34 -0500286 mIconController.setIcon(mSlotAlarmClock, zenNone ? R.drawable.stat_sys_alarm_dim
Jason Monk07473ce2016-01-05 14:59:19 -0500287 : R.drawable.stat_sys_alarm, null);
Jason Monk3e189872016-01-12 09:10:34 -0500288 mIconController.setIconVisibility(mSlotAlarmClock, mCurrentUserSetup && hasAlarm);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800289 }
290
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800291 private final void updateSimState(Intent intent) {
Wink Savillea639b312012-07-10 12:37:54 -0700292 String stateExtra = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);
293 if (IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(stateExtra)) {
294 mSimState = IccCardConstants.State.ABSENT;
Jason Monk07473ce2016-01-05 14:59:19 -0500295 } else if (IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR.equals(stateExtra)) {
Rakesh Pallerlaf099a5f2013-02-06 11:44:23 +0530296 mSimState = IccCardConstants.State.CARD_IO_ERROR;
Junda Liua2f6a672016-05-24 10:07:40 -0700297 } else if (IccCardConstants.INTENT_VALUE_ICC_CARD_RESTRICTED.equals(stateExtra)) {
298 mSimState = IccCardConstants.State.CARD_RESTRICTED;
Jason Monk07473ce2016-01-05 14:59:19 -0500299 } else if (IccCardConstants.INTENT_VALUE_ICC_READY.equals(stateExtra)) {
Wink Savillea639b312012-07-10 12:37:54 -0700300 mSimState = IccCardConstants.State.READY;
Jason Monk07473ce2016-01-05 14:59:19 -0500301 } else if (IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals(stateExtra)) {
Wink Savillea639b312012-07-10 12:37:54 -0700302 final String lockedReason =
303 intent.getStringExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON);
304 if (IccCardConstants.INTENT_VALUE_LOCKED_ON_PIN.equals(lockedReason)) {
305 mSimState = IccCardConstants.State.PIN_REQUIRED;
Jason Monk07473ce2016-01-05 14:59:19 -0500306 } else if (IccCardConstants.INTENT_VALUE_LOCKED_ON_PUK.equals(lockedReason)) {
Wink Savillea639b312012-07-10 12:37:54 -0700307 mSimState = IccCardConstants.State.PUK_REQUIRED;
Jason Monk07473ce2016-01-05 14:59:19 -0500308 } else {
Wink Savillea639b312012-07-10 12:37:54 -0700309 mSimState = IccCardConstants.State.NETWORK_LOCKED;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800310 }
311 } else {
Wink Savillea639b312012-07-10 12:37:54 -0700312 mSimState = IccCardConstants.State.UNKNOWN;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800313 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800314 }
315
John Spurlockbcc10872014-11-28 15:29:21 -0500316 private final void updateVolumeZen() {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800317 AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
John Spurlocka37e9c82014-07-08 09:40:31 -0400318
319 boolean zenVisible = false;
320 int zenIconId = 0;
321 String zenDescription = null;
322
323 boolean volumeVisible = false;
324 int volumeIconId = 0;
325 String volumeDescription = null;
326
John Spurlockf88d8082015-03-25 18:09:51 -0400327 if (DndTile.isVisible(mContext) || DndTile.isCombinedIcon(mContext)) {
John Spurlock3c4076a2015-02-24 12:12:25 -0500328 zenVisible = mZen != Global.ZEN_MODE_OFF;
John Spurlock4ec8b602015-05-11 17:46:28 -0400329 zenIconId = mZen == Global.ZEN_MODE_NO_INTERRUPTIONS
330 ? R.drawable.stat_sys_dnd_total_silence : R.drawable.stat_sys_dnd;
John Spurlock3c4076a2015-02-24 12:12:25 -0500331 zenDescription = mContext.getString(R.string.quick_settings_dnd_label);
332 } else if (mZen == Global.ZEN_MODE_NO_INTERRUPTIONS) {
John Spurlocka37e9c82014-07-08 09:40:31 -0400333 zenVisible = true;
334 zenIconId = R.drawable.stat_sys_zen_none;
John Spurlockd9c75db2015-04-28 11:19:13 -0400335 zenDescription = mContext.getString(R.string.interruption_level_none);
John Spurlockae641c92014-06-30 18:11:40 -0400336 } else if (mZen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS) {
John Spurlocka37e9c82014-07-08 09:40:31 -0400337 zenVisible = true;
338 zenIconId = R.drawable.stat_sys_zen_important;
John Spurlockd9c75db2015-04-28 11:19:13 -0400339 zenDescription = mContext.getString(R.string.interruption_level_priority);
Svetoslav Ganov6179ea32011-06-28 01:12:41 -0700340 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800341
John Spurlockd9c75db2015-04-28 11:19:13 -0400342 if (DndTile.isVisible(mContext) && !DndTile.isCombinedIcon(mContext)
John Spurlocka48d7792015-03-03 17:35:57 -0500343 && audioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT) {
344 volumeVisible = true;
345 volumeIconId = R.drawable.stat_sys_ringer_silent;
346 volumeDescription = mContext.getString(R.string.accessibility_ringer_silent);
John Spurlock4f1163c2015-04-02 17:41:21 -0400347 } else if (mZen != Global.ZEN_MODE_NO_INTERRUPTIONS && mZen != Global.ZEN_MODE_ALARMS &&
John Spurlock661f2cf2014-11-17 10:29:10 -0500348 audioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_VIBRATE) {
John Spurlocka37e9c82014-07-08 09:40:31 -0400349 volumeVisible = true;
350 volumeIconId = R.drawable.stat_sys_ringer_vibrate;
351 volumeDescription = mContext.getString(R.string.accessibility_ringer_vibrate);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800352 }
John Spurlocka37e9c82014-07-08 09:40:31 -0400353
354 if (zenVisible) {
Jason Monk3e189872016-01-12 09:10:34 -0500355 mIconController.setIcon(mSlotZen, zenIconId, zenDescription);
John Spurlocka37e9c82014-07-08 09:40:31 -0400356 }
357 if (zenVisible != mZenVisible) {
Jason Monk3e189872016-01-12 09:10:34 -0500358 mIconController.setIconVisibility(mSlotZen, zenVisible);
John Spurlocka37e9c82014-07-08 09:40:31 -0400359 mZenVisible = zenVisible;
360 }
361
362 if (volumeVisible) {
Jason Monk3e189872016-01-12 09:10:34 -0500363 mIconController.setIcon(mSlotVolume, volumeIconId, volumeDescription);
John Spurlocka37e9c82014-07-08 09:40:31 -0400364 }
365 if (volumeVisible != mVolumeVisible) {
Jason Monk3e189872016-01-12 09:10:34 -0500366 mIconController.setIconVisibility(mSlotVolume, volumeVisible);
John Spurlocka37e9c82014-07-08 09:40:31 -0400367 mVolumeVisible = volumeVisible;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800368 }
John Spurlock15782262015-05-29 15:35:53 -0400369 updateAlarm();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800370 }
371
Jason Monk70364362015-08-06 16:32:18 -0400372 @Override
373 public void onBluetoothDevicesChanged() {
374 updateBluetooth();
375 }
376
377 @Override
378 public void onBluetoothStateChange(boolean enabled) {
379 updateBluetooth();
380 }
381
Jorim Jaggi2d75f9f2014-10-08 17:10:58 -0700382 private final void updateBluetooth() {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400383 int iconId = R.drawable.stat_sys_data_bluetooth;
Jorim Jaggi2d75f9f2014-10-08 17:10:58 -0700384 String contentDescription =
Jason Monk1aa32822015-07-14 16:10:32 -0400385 mContext.getString(R.string.accessibility_quick_settings_bluetooth_on);
Jason Monk70364362015-08-06 16:32:18 -0400386 boolean bluetoothEnabled = false;
387 if (mBluetooth != null) {
388 bluetoothEnabled = mBluetooth.isBluetoothEnabled();
389 if (mBluetooth.isBluetoothConnected()) {
Jaikumar Ganeshd9bb6882010-09-27 17:05:24 -0700390 iconId = R.drawable.stat_sys_data_bluetooth_connected;
Svetoslav Ganov6179ea32011-06-28 01:12:41 -0700391 contentDescription = mContext.getString(R.string.accessibility_bluetooth_connected);
Jaikumar Ganesh084c6652009-12-07 10:58:18 -0800392 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800393 }
Wink Savillee9b06d72009-05-18 21:47:50 -0700394
Jason Monk3e189872016-01-12 09:10:34 -0500395 mIconController.setIcon(mSlotBluetooth, iconId, contentDescription);
396 mIconController.setIconVisibility(mSlotBluetooth, bluetoothEnabled);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800397 }
398
Wink Savillee9b06d72009-05-18 21:47:50 -0700399 private final void updateTTY(Intent intent) {
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700400 int currentTtyMode = intent.getIntExtra(TelecomManager.EXTRA_CURRENT_TTY_MODE,
401 TelecomManager.TTY_MODE_OFF);
402 boolean enabled = currentTtyMode != TelecomManager.TTY_MODE_OFF;
Wink Saville04e71b32009-04-02 11:00:54 -0700403
John Spurlocka37e9c82014-07-08 09:40:31 -0400404 if (DEBUG) Log.v(TAG, "updateTTY: enabled: " + enabled);
Wink Saville04e71b32009-04-02 11:00:54 -0700405
406 if (enabled) {
407 // TTY is on
John Spurlocka37e9c82014-07-08 09:40:31 -0400408 if (DEBUG) Log.v(TAG, "updateTTY: set TTY on");
Jason Monk3e189872016-01-12 09:10:34 -0500409 mIconController.setIcon(mSlotTty, R.drawable.stat_sys_tty_mode,
Svetoslav Ganov6179ea32011-06-28 01:12:41 -0700410 mContext.getString(R.string.accessibility_tty_enabled));
Jason Monk3e189872016-01-12 09:10:34 -0500411 mIconController.setIconVisibility(mSlotTty, true);
Wink Saville04e71b32009-04-02 11:00:54 -0700412 } else {
413 // TTY is off
John Spurlocka37e9c82014-07-08 09:40:31 -0400414 if (DEBUG) Log.v(TAG, "updateTTY: set TTY off");
Jason Monk3e189872016-01-12 09:10:34 -0500415 mIconController.setIconVisibility(mSlotTty, false);
Wink Saville04e71b32009-04-02 11:00:54 -0700416 }
417 }
John Spurlock96fe98d2014-08-27 09:36:02 -0400418
419 private void updateCast() {
420 boolean isCasting = false;
421 for (CastDevice device : mCast.getCastDevices()) {
422 if (device.state == CastDevice.STATE_CONNECTING
423 || device.state == CastDevice.STATE_CONNECTED) {
424 isCasting = true;
425 break;
426 }
427 }
428 if (DEBUG) Log.v(TAG, "updateCast: isCasting: " + isCasting);
Dan Sandler8fd25bf2015-10-20 16:01:27 -0700429 mHandler.removeCallbacks(mRemoveCastIconRunnable);
John Spurlock96fe98d2014-08-27 09:36:02 -0400430 if (isCasting) {
Jason Monk3e189872016-01-12 09:10:34 -0500431 mIconController.setIcon(mSlotCast, R.drawable.stat_sys_cast,
John Spurlock96fe98d2014-08-27 09:36:02 -0400432 mContext.getString(R.string.accessibility_casting));
Jason Monk3e189872016-01-12 09:10:34 -0500433 mIconController.setIconVisibility(mSlotCast, true);
Dan Sandler8fd25bf2015-10-20 16:01:27 -0700434 } else {
435 // don't turn off the screen-record icon for a few seconds, just to make sure the user
436 // has seen it
437 if (DEBUG) Log.v(TAG, "updateCast: hiding icon in 3 sec...");
438 mHandler.postDelayed(mRemoveCastIconRunnable, 3000);
John Spurlock96fe98d2014-08-27 09:36:02 -0400439 }
John Spurlock96fe98d2014-08-27 09:36:02 -0400440 }
441
Rubin Xu1205fb12015-11-04 17:45:03 +0000442 private void updateQuietState() {
443 mManagedProfileInQuietMode = false;
444 int currentUserId = ActivityManager.getCurrentUser();
445 for (UserInfo ui : mUserManager.getEnabledProfiles(currentUserId)) {
446 if (ui.isManagedProfile() && ui.isQuietModeEnabled()) {
447 mManagedProfileInQuietMode = true;
448 return;
449 }
450 }
451 }
452
Kenny Guy3094d4a2015-04-01 19:14:10 +0100453 private void profileChanged(int userId) {
Kenny Guy3094d4a2015-04-01 19:14:10 +0100454 UserInfo user = null;
455 if (userId == UserHandle.USER_CURRENT) {
456 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -0800457 user = ActivityManager.getService().getCurrentUser();
Kenny Guy3094d4a2015-04-01 19:14:10 +0100458 } catch (RemoteException e) {
459 // Ignore
460 }
461 } else {
Rubin Xu1205fb12015-11-04 17:45:03 +0000462 user = mUserManager.getUserInfo(userId);
Kenny Guy3094d4a2015-04-01 19:14:10 +0100463 }
464
465 mManagedProfileFocused = user != null && user.isManagedProfile();
466 if (DEBUG) Log.v(TAG, "profileChanged: mManagedProfileFocused: " + mManagedProfileFocused);
467 // Actually update the icon later when transition starts.
468 }
469
470 private void updateManagedProfile() {
Jason Monk324b8862017-02-16 17:19:12 -0500471 if (DEBUG) {
472 Log.v(TAG, "updateManagedProfile: mManagedProfileFocused: "
473 + mManagedProfileFocused);
474 }
Rubin Xu1205fb12015-11-04 17:45:03 +0000475 final boolean showIcon;
Jason Monkaa573e92017-01-27 17:00:29 -0500476 if (mManagedProfileFocused && !mKeyguardMonitor.isShowing()) {
Rubin Xu1205fb12015-11-04 17:45:03 +0000477 showIcon = true;
Jason Monk3e189872016-01-12 09:10:34 -0500478 mIconController.setIcon(mSlotManagedProfile,
Jason Monk07473ce2016-01-05 14:59:19 -0500479 R.drawable.stat_sys_managed_profile_status,
Rubin Xu1205fb12015-11-04 17:45:03 +0000480 mContext.getString(R.string.accessibility_managed_profile));
481 } else if (mManagedProfileInQuietMode) {
482 showIcon = true;
Jason Monk3e189872016-01-12 09:10:34 -0500483 mIconController.setIcon(mSlotManagedProfile,
Jason Monk07473ce2016-01-05 14:59:19 -0500484 R.drawable.stat_sys_managed_profile_status_off,
Rubin Xu1205fb12015-11-04 17:45:03 +0000485 mContext.getString(R.string.accessibility_managed_profile));
486 } else {
487 showIcon = false;
488 }
Kenny Guy3094d4a2015-04-01 19:14:10 +0100489 if (mManagedProfileIconVisible != showIcon) {
Jason Monk3e189872016-01-12 09:10:34 -0500490 mIconController.setIconVisibility(mSlotManagedProfile, showIcon);
Kenny Guy3094d4a2015-04-01 19:14:10 +0100491 mManagedProfileIconVisible = showIcon;
492 }
493 }
494
Jason Monk324b8862017-02-16 17:19:12 -0500495 private void updateForegroundInstantApps() {
496 NotificationManager noMan = mContext.getSystemService(NotificationManager.class);
497 ArraySet<Pair<String, Integer>> notifs = new ArraySet<>(mCurrentNotifs);
498 IPackageManager pm = AppGlobals.getPackageManager();
499 mCurrentNotifs.clear();
500 try {
501 int[] STACKS_TO_CHECK = new int[]{
502 StackId.FULLSCREEN_WORKSPACE_STACK_ID,
503 StackId.DOCKED_STACK_ID,
504 };
505 for (int i = 0; i < STACKS_TO_CHECK.length; i++) {
506 StackInfo info = ActivityManager.getService().getStackInfo(STACKS_TO_CHECK[i]);
507 if (info == null || info.topActivity == null) continue;
508 String pkg = info.topActivity.getPackageName();
509 if (!hasNotif(notifs, pkg, info.userId)) {
510 // TODO: Optimize by not always needing to get application info.
511 // Maybe cache non-ephemeral packages?
512 ApplicationInfo appInfo = pm.getApplicationInfo(pkg, 0, info.userId);
513 if (appInfo.isInstantApp()) {
514 postEphemeralNotif(pkg, info.userId, appInfo, noMan);
515 }
516 }
517 }
518 } catch (RemoteException e) {
519 e.rethrowFromSystemServer();
520 }
521 // Cancel all the leftover notifications that don't have a foreground process anymore.
522 notifs.forEach(v -> noMan.cancelAsUser(v.first, SystemMessage.NOTE_INSTANT_APPS,
523 new UserHandle(v.second)));
524 }
525
526 private void postEphemeralNotif(String pkg, int userId, ApplicationInfo appInfo,
527 NotificationManager noMan) {
528 final Bundle extras = new Bundle();
529 extras.putString(Notification.EXTRA_SUBSTITUTE_APP_NAME,
530 mContext.getString(R.string.instant_apps));
531 mCurrentNotifs.add(new Pair<>(pkg, userId));
532 String message = mContext.getString(R.string.instant_apps_message);
533 PendingIntent appInfoAction = PendingIntent.getActivity(mContext, 0,
534 new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
535 .setData(Uri.fromParts("package", pkg, null)), 0);
536 // TODO: Add action for go to web as well.
537 Action action = new Notification.Action.Builder(null, mContext.getString(R.string.app_info),
538 appInfoAction).build();
539
540 noMan.notifyAsUser(pkg, SystemMessage.NOTE_INSTANT_APPS,
541 new Notification.Builder(mContext, NotificationChannels.GENERAL)
542 .addExtras(extras)
543 .addAction(action)
544 .setContentIntent(appInfoAction)
545 .setColor(mContext.getColor(R.color.instant_apps_color))
546 .setContentTitle(appInfo.loadLabel(mContext.getPackageManager()))
547 .setLargeIcon(Icon.createWithResource(pkg, appInfo.icon))
548 .setSmallIcon(Icon.createWithResource(mContext.getPackageName(),
549 R.drawable.instant_icon))
550 .setContentText(message)
551 .setOngoing(true)
552 .build(),
553 new UserHandle(userId));
554 }
555
556 private boolean hasNotif(ArraySet<Pair<String, Integer>> notifs, String pkg, int userId) {
557 Pair<String, Integer> key = new Pair<>(pkg, userId);
558 if (notifs.remove(key)) {
559 mCurrentNotifs.add(key);
560 return true;
561 }
562 return false;
563 }
564
Fyodor Kupolov6005b3f2015-11-23 17:41:50 -0800565 private final SynchronousUserSwitchObserver mUserSwitchListener =
566 new SynchronousUserSwitchObserver() {
Kenny Guy3094d4a2015-04-01 19:14:10 +0100567 @Override
Fyodor Kupolov6005b3f2015-11-23 17:41:50 -0800568 public void onUserSwitching(int newUserId) throws RemoteException {
Toni Barzice97f9232016-04-27 18:10:58 -0700569 mHandler.post(new Runnable() {
570 @Override
571 public void run() {
572 mUserInfoController.reloadUserInfo();
573 }
574 });
Kenny Guy3094d4a2015-04-01 19:14:10 +0100575 }
576
577 @Override
578 public void onUserSwitchComplete(int newUserId) throws RemoteException {
Toni Barzice97f9232016-04-27 18:10:58 -0700579 mHandler.post(new Runnable() {
580 @Override
581 public void run() {
582 updateAlarm();
583 profileChanged(newUserId);
584 updateQuietState();
585 updateManagedProfile();
Jason Monk324b8862017-02-16 17:19:12 -0500586 updateForegroundInstantApps();
Toni Barzice97f9232016-04-27 18:10:58 -0700587 }
588 });
Kenny Guy3094d4a2015-04-01 19:14:10 +0100589 }
590
591 @Override
592 public void onForegroundProfileSwitch(int newProfileId) {
Toni Barzice97f9232016-04-27 18:10:58 -0700593 mHandler.post(new Runnable() {
594 @Override
595 public void run() {
596 profileChanged(newProfileId);
597 }
598 });
Kenny Guy3094d4a2015-04-01 19:14:10 +0100599 }
600 };
601
Jason Monk952d5d82014-10-27 15:28:22 -0400602 private final HotspotController.Callback mHotspotCallback = new HotspotController.Callback() {
603 @Override
604 public void onHotspotChanged(boolean enabled) {
Jason Monk3e189872016-01-12 09:10:34 -0500605 mIconController.setIconVisibility(mSlotHotspot, enabled);
Jason Monk952d5d82014-10-27 15:28:22 -0400606 }
607 };
608
John Spurlock96fe98d2014-08-27 09:36:02 -0400609 private final CastController.Callback mCastCallback = new CastController.Callback() {
610 @Override
611 public void onCastDevicesChanged() {
612 updateCast();
613 }
614 };
Kenny Guy3094d4a2015-04-01 19:14:10 +0100615
Juan Flores2ff37202015-04-30 13:44:23 +0200616 private final NextAlarmController.NextAlarmChangeCallback mNextAlarmCallback =
617 new NextAlarmController.NextAlarmChangeCallback() {
Jason Monk324b8862017-02-16 17:19:12 -0500618 @Override
619 public void onNextAlarmChanged(AlarmManager.AlarmClockInfo nextAlarm) {
620 updateAlarm();
621 }
622 };
Juan Flores2ff37202015-04-30 13:44:23 +0200623
Jason Monkaa573e92017-01-27 17:00:29 -0500624 @Override
625 public void appTransitionStarting(long startTime, long duration, boolean forced) {
Kenny Guy3094d4a2015-04-01 19:14:10 +0100626 updateManagedProfile();
Jason Monk324b8862017-02-16 17:19:12 -0500627 updateForegroundInstantApps();
Kenny Guy3094d4a2015-04-01 19:14:10 +0100628 }
629
Jason Monkaa573e92017-01-27 17:00:29 -0500630 @Override
631 public void onKeyguardShowingChanged() {
Kenny Guy3094d4a2015-04-01 19:14:10 +0100632 updateManagedProfile();
Jason Monk324b8862017-02-16 17:19:12 -0500633 updateForegroundInstantApps();
Kenny Guy3094d4a2015-04-01 19:14:10 +0100634 }
John Spurlock604a5ee2015-06-01 12:27:22 -0400635
Jason Monkaa573e92017-01-27 17:00:29 -0500636 @Override
637 public void onUserSetupChanged() {
638 boolean userSetup = mProvisionedController.isUserSetup(
639 mProvisionedController.getCurrentUser());
John Spurlock604a5ee2015-06-01 12:27:22 -0400640 if (mCurrentUserSetup == userSetup) return;
641 mCurrentUserSetup = userSetup;
642 updateAlarm();
Rubin Xu1205fb12015-11-04 17:45:03 +0000643 updateQuietState();
John Spurlock604a5ee2015-06-01 12:27:22 -0400644 }
Jason Monk3e189872016-01-12 09:10:34 -0500645
646 @Override
Jason Monk324b8862017-02-16 17:19:12 -0500647 public void preloadRecentApps() {
648 updateForegroundInstantApps();
649 }
650
651 @Override
Jason Monk3e189872016-01-12 09:10:34 -0500652 public void onRotationLockStateChanged(boolean rotationLocked, boolean affordanceVisible) {
653 boolean portrait = RotationLockTile.isCurrentOrientationLockPortrait(
654 mRotationLockController, mContext);
655 if (rotationLocked) {
656 if (portrait) {
657 mIconController.setIcon(mSlotRotate, R.drawable.stat_sys_rotate_portrait,
658 mContext.getString(R.string.accessibility_rotation_lock_on_portrait));
659 } else {
660 mIconController.setIcon(mSlotRotate, R.drawable.stat_sys_rotate_landscape,
661 mContext.getString(R.string.accessibility_rotation_lock_on_landscape));
662 }
Jason Monk8816dff2016-02-09 21:50:36 -0500663 mIconController.setIconVisibility(mSlotRotate, true);
Jason Monk3e189872016-01-12 09:10:34 -0500664 } else {
Jason Monk8816dff2016-02-09 21:50:36 -0500665 mIconController.setIconVisibility(mSlotRotate, false);
Jason Monk3e189872016-01-12 09:10:34 -0500666 }
667 }
668
669 private void updateHeadsetPlug(Intent intent) {
670 boolean connected = intent.getIntExtra("state", 0) != 0;
671 boolean hasMic = intent.getIntExtra("microphone", 0) != 0;
672 if (connected) {
673 String contentDescription = mContext.getString(hasMic
674 ? R.string.accessibility_status_bar_headset
675 : R.string.accessibility_status_bar_headphones);
676 mIconController.setIcon(mSlotHeadset, hasMic ? R.drawable.ic_headset_mic
677 : R.drawable.ic_headset, contentDescription);
678 mIconController.setIconVisibility(mSlotHeadset, true);
679 } else {
680 mIconController.setIconVisibility(mSlotHeadset, false);
681 }
682 }
683
Jason Monkf23aa992016-01-22 16:45:21 -0500684 @Override
685 public void onDataSaverChanged(boolean isDataSaving) {
686 mIconController.setIconVisibility(mSlotDataSaver, isDataSaving);
687 }
688
Jason Monk324b8862017-02-16 17:19:12 -0500689 private final TaskStackListener mTaskListener = new TaskStackListener() {
690 @Override
691 public void onTaskStackChanged() {
692 // Listen for changes to stacks and then check which instant apps are foreground.
693 updateForegroundInstantApps();
694 }
695 };
696
Jason Monk3e189872016-01-12 09:10:34 -0500697 private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
698 @Override
699 public void onReceive(Context context, Intent intent) {
700 String action = intent.getAction();
Julia Reynolds4e6024b2016-04-26 16:12:26 -0400701 if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION) ||
Jason Monk3e189872016-01-12 09:10:34 -0500702 action.equals(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION)) {
703 updateVolumeZen();
704 } else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
705 updateSimState(intent);
706 } else if (action.equals(TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED)) {
707 updateTTY(intent);
Rubin Xue95057a2016-04-01 16:49:25 +0100708 } else if (action.equals(Intent.ACTION_MANAGED_PROFILE_AVAILABLE) ||
Nicolas Prevot6c7b8742016-04-13 10:28:58 +0100709 action.equals(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE) ||
710 action.equals(Intent.ACTION_MANAGED_PROFILE_REMOVED)) {
Jason Monk3e189872016-01-12 09:10:34 -0500711 updateQuietState();
712 updateManagedProfile();
713 } else if (action.equals(AudioManager.ACTION_HEADSET_PLUG)) {
714 updateHeadsetPlug(intent);
715 }
716 }
717 };
718
719 private Runnable mRemoveCastIconRunnable = new Runnable() {
720 @Override
721 public void run() {
722 if (DEBUG) Log.v(TAG, "updateCast: hiding icon NOW");
723 mIconController.setIconVisibility(mSlotCast, false);
724 }
725 };
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800726}