From 3c6aaab6c402ecd2c455382aaee4f042241d960d Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Fri, 10 Jan 2020 17:50:34 -0500 Subject: [PATCH] Make PhoneStatusBarPolicy injectable. Add DateFormatUtil that makes DateFormat methods non-static, (is24HourFormat specifically). PhoneStatusBarPolicy no longer needs a context. Bug: 147505562 Test: atest SystemUITests Change-Id: I7b272441971f5a74f2736cd545498b8b4077fca6 --- .../systemui/statusbar/car/CarStatusBar.java | 3 + .../statusbar/car/CarStatusBarModule.java | 3 + .../src/com/android/systemui/Prefs.java | 2 +- .../systemui/dagger/DependencyProvider.java | 9 + .../systemui/dagger/SystemServicesModule.java | 1 + .../globalactions/GlobalActionsDialog.java | 19 +- .../android/systemui/qs/tiles/DndTile.java | 16 +- .../systemui/qs/tiles/RotationLockTile.java | 6 +- .../statusbar/phone/PhoneStatusBarPolicy.java | 222 +++++++++--------- .../systemui/statusbar/phone/StatusBar.java | 5 +- .../phone/dagger/StatusBarPhoneModule.java | 3 + .../systemui/util/time/DateFormatUtil.java | 40 ++++ .../statusbar/phone/StatusBarTest.java | 2 + 13 files changed, 197 insertions(+), 134 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/util/time/DateFormatUtil.java diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java index a4eada4ebe0b1..f39f9124efbb5 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -122,6 +122,7 @@ import com.android.systemui.statusbar.phone.LockscreenLockIconController; import com.android.systemui.statusbar.phone.LockscreenWallpaper; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.NotificationShadeWindowController; +import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy; import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; @@ -324,6 +325,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt KeyguardDismissUtil keyguardDismissUtil, ExtensionController extensionController, UserInfoControllerImpl userInfoControllerImpl, + PhoneStatusBarPolicy phoneStatusBarPolicy, DismissCallbackRegistry dismissCallbackRegistry, StatusBarTouchableRegionManager statusBarTouchableRegionManager, /* Car Settings injected components. */ @@ -407,6 +409,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt keyguardDismissUtil, extensionController, userInfoControllerImpl, + phoneStatusBarPolicy, dismissCallbackRegistry, statusBarTouchableRegionManager); mUserSwitcherController = userSwitcherController; diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java index 729496580bf6a..843e7c55852a0 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java @@ -82,6 +82,7 @@ import com.android.systemui.statusbar.phone.LockscreenLockIconController; import com.android.systemui.statusbar.phone.LockscreenWallpaper; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.NotificationShadeWindowController; +import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy; import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBarIconController; @@ -197,6 +198,7 @@ public class CarStatusBarModule { KeyguardDismissUtil keyguardDismissUtil, ExtensionController extensionController, UserInfoControllerImpl userInfoControllerImpl, + PhoneStatusBarPolicy phoneStatusBarPolicy, DismissCallbackRegistry dismissCallbackRegistry, StatusBarTouchableRegionManager statusBarTouchableRegionManager, CarServiceProvider carServiceProvider, @@ -278,6 +280,7 @@ public class CarStatusBarModule { keyguardDismissUtil, extensionController, userInfoControllerImpl, + phoneStatusBarPolicy, dismissCallbackRegistry, statusBarTouchableRegionManager, carServiceProvider, diff --git a/packages/SystemUI/src/com/android/systemui/Prefs.java b/packages/SystemUI/src/com/android/systemui/Prefs.java index 10ae3434daaab..f0a82c519d48d 100644 --- a/packages/SystemUI/src/com/android/systemui/Prefs.java +++ b/packages/SystemUI/src/com/android/systemui/Prefs.java @@ -164,7 +164,7 @@ public final class Prefs { get(context).unregisterOnSharedPreferenceChangeListener(listener); } - private static SharedPreferences get(Context context) { + public static SharedPreferences get(Context context) { return context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE); } } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java index 7c0033c1d4ec3..024378d56edd3 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java @@ -20,6 +20,7 @@ import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME; import android.app.INotificationManager; import android.content.Context; +import android.content.SharedPreferences; import android.hardware.display.AmbientDisplayConfiguration; import android.hardware.display.NightDisplayListener; import android.os.Handler; @@ -34,6 +35,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.util.NotificationMessagingUtil; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.ViewMediatorCallback; +import com.android.systemui.Prefs; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.doze.AlwaysOnDisplayPolicy; @@ -77,6 +79,13 @@ public class DependencyProvider { return new Handler(thread.getLooper()); } + /** */ + @Provides + @Main + public SharedPreferences provideSharePreferences(Context context) { + return Prefs.get(context); + } + /** */ @Provides public AmbientDisplayConfiguration provideAmbientDispalyConfiguration(Context context) { diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java index 3aa14a31a5d95..352ee33049645 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java @@ -209,6 +209,7 @@ public class SystemServicesModule { @Provides @Singleton + @Nullable static TelecomManager provideTelecomManager(Context context) { return context.getSystemService(TelecomManager.class); } diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index 4fba83a4cc9ce..e0805c76c72f9 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -203,7 +203,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, ConfigurationController configurationController, ActivityStarter activityStarter, KeyguardStateController keyguardStateController, UserManager userManager, TrustManager trustManager, IActivityManager iActivityManager, - TelecomManager telecomManager, MetricsLogger metricsLogger, + @Nullable TelecomManager telecomManager, MetricsLogger metricsLogger, BlurUtils blurUtils, SysuiColorExtractor colorExtractor, IStatusBarService statusBarService, NotificationShadeWindowController notificationShadeWindowController, @@ -561,13 +561,16 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, @Override public void onPress() { mMetricsLogger.action(MetricsEvent.ACTION_EMERGENCY_DIALER_FROM_POWER_MENU); - Intent intent = mTelecomManager.createLaunchEmergencyDialerIntent(null /* number */); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS - | Intent.FLAG_ACTIVITY_CLEAR_TOP); - intent.putExtra(EmergencyDialerConstants.EXTRA_ENTRY_TYPE, - EmergencyDialerConstants.ENTRY_TYPE_POWER_MENU); - mContext.startActivityAsUser(intent, UserHandle.CURRENT); + if (mTelecomManager != null) { + Intent intent = mTelecomManager.createLaunchEmergencyDialerIntent( + null /* number */); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS + | Intent.FLAG_ACTIVITY_CLEAR_TOP); + intent.putExtra(EmergencyDialerConstants.EXTRA_ENTRY_TYPE, + EmergencyDialerConstants.ENTRY_TYPE_POWER_MENU); + mContext.startActivityAsUser(intent, UserHandle.CURRENT); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java index ebf45a66a23af..9f7b84aa62c13 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java @@ -53,6 +53,7 @@ import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.SysUIToast; import com.android.systemui.broadcast.BroadcastDispatcher; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.DetailAdapter; import com.android.systemui.plugins.qs.QSTile.BooleanState; @@ -79,6 +80,7 @@ public class DndTile extends QSTileImpl { private final ZenModeController mController; private final DndDetailAdapter mDetailAdapter; private final ActivityStarter mActivityStarter; + private final SharedPreferences mSharedPreferences; private final BroadcastDispatcher mBroadcastDispatcher; private boolean mListening; @@ -87,10 +89,12 @@ public class DndTile extends QSTileImpl { @Inject public DndTile(QSHost host, ZenModeController zenModeController, - ActivityStarter activityStarter, BroadcastDispatcher broadcastDispatcher) { + ActivityStarter activityStarter, BroadcastDispatcher broadcastDispatcher, + @Main SharedPreferences sharedPreferences) { super(host); mController = zenModeController; mActivityStarter = activityStarter; + mSharedPreferences = sharedPreferences; mDetailAdapter = new DndDetailAdapter(); mBroadcastDispatcher = broadcastDispatcher; broadcastDispatcher.registerReceiver(mReceiver, new IntentFilter(ACTION_SET_VISIBLE)); @@ -111,16 +115,16 @@ public class DndTile extends QSTileImpl { Prefs.putBoolean(context, Prefs.Key.DND_TILE_VISIBLE, visible); } - public static boolean isVisible(Context context) { - return Prefs.getBoolean(context, Prefs.Key.DND_TILE_VISIBLE, false /* defaultValue */); + public static boolean isVisible(SharedPreferences prefs) { + return prefs.getBoolean(Prefs.Key.DND_TILE_VISIBLE, false /* defaultValue */); } public static void setCombinedIcon(Context context, boolean combined) { Prefs.putBoolean(context, Prefs.Key.DND_TILE_COMBINED_ICON, combined); } - public static boolean isCombinedIcon(Context context) { - return Prefs.getBoolean(context, Prefs.Key.DND_TILE_COMBINED_ICON, + public static boolean isCombinedIcon(SharedPreferences sharedPreferences) { + return sharedPreferences.getBoolean(Prefs.Key.DND_TILE_COMBINED_ICON, false /* defaultValue */); } @@ -301,7 +305,7 @@ public class DndTile extends QSTileImpl { @Override public boolean isAvailable() { - return isVisible(mContext); + return isVisible(mSharedPreferences); } private final OnSharedPreferenceChangeListener mPrefListener diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java index 2557226d07bdd..5dcb4e3b1fb99 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java @@ -16,9 +16,9 @@ package com.android.systemui.qs.tiles; -import android.content.Context; import android.content.Intent; import android.content.res.Configuration; +import android.content.res.Resources; import android.provider.Settings; import android.service.quicksettings.Tile; import android.widget.Switch; @@ -81,11 +81,11 @@ public class RotationLockTile extends QSTileImpl { } public static boolean isCurrentOrientationLockPortrait(RotationLockController controller, - Context context) { + Resources resources) { int lockOrientation = controller.getRotationLockOrientation(); if (lockOrientation == Configuration.ORIENTATION_UNDEFINED) { // Freely rotating device; use current rotation - return context.getResources().getConfiguration().orientation + return resources.getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE; } else { return lockOrientation != Configuration.ORIENTATION_LANDSCAPE; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 1ab36c5e37601..14af466a24245 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -16,15 +16,18 @@ package com.android.systemui.statusbar.phone; -import android.app.ActivityManager; +import android.annotation.Nullable; import android.app.ActivityTaskManager; import android.app.AlarmManager; import android.app.AlarmManager.AlarmClockInfo; +import android.app.IActivityManager; import android.app.SynchronousUserSwitchObserver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.content.res.Resources; import android.media.AudioManager; import android.os.Handler; import android.os.RemoteException; @@ -33,13 +36,13 @@ import android.os.UserManager; import android.provider.Settings.Global; import android.service.notification.ZenModeConfig; import android.telecom.TelecomManager; -import android.telephony.TelephonyManager; import android.text.format.DateFormat; import android.util.Log; -import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.broadcast.BroadcastDispatcher; +import com.android.systemui.dagger.qualifiers.DisplayId; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.UiBackground; import com.android.systemui.qs.tiles.DndTile; import com.android.systemui.qs.tiles.RotationLockTile; @@ -61,10 +64,13 @@ import com.android.systemui.statusbar.policy.RotationLockController.RotationLock import com.android.systemui.statusbar.policy.SensorPrivacyController; import com.android.systemui.statusbar.policy.UserInfoController; import com.android.systemui.statusbar.policy.ZenModeController; +import com.android.systemui.util.time.DateFormatUtil; import java.util.Locale; import java.util.concurrent.Executor; +import javax.inject.Inject; + /** * This class contains all of the policy about which icons are installed in the status bar at boot * time. It goes through the normal API for icons, even though it probably strictly doesn't need to. @@ -82,7 +88,7 @@ public class PhoneStatusBarPolicy private static final String TAG = "PhoneStatusBarPolicy"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - public static final int LOCATION_STATUS_ICON_ID = + static final int LOCATION_STATUS_ICON_ID = com.android.internal.R.drawable.perm_group_location; private final String mSlotCast; @@ -97,20 +103,26 @@ public class PhoneStatusBarPolicy private final String mSlotHeadset; private final String mSlotDataSaver; private final String mSlotLocation; - private final String mSlotMicrophone; - private final String mSlotCamera; private final String mSlotSensorsOff; private final String mSlotScreenRecord; + private final int mDisplayId; + private final SharedPreferences mSharedPreferences; + private final DateFormatUtil mDateFormatUtil; + private final TelecomManager mTelecomManager; + private final AudioManager mAudioManager; - private final Context mContext; private final Handler mHandler = new Handler(); private final CastController mCast; private final HotspotController mHotspot; private final NextAlarmController mNextAlarmController; private final AlarmManager mAlarmManager; private final UserInfoController mUserInfoController; + private final IActivityManager mIActivityManager; private final UserManager mUserManager; private final StatusBarIconController mIconController; + private final CommandQueue mCommandQueue; + private final BroadcastDispatcher mBroadcastDispatcher; + private final Resources mResources; private final RotationLockController mRotationLockController; private final DataSaverController mDataSaver; private final ZenModeController mZenController; @@ -121,10 +133,6 @@ public class PhoneStatusBarPolicy private final SensorPrivacyController mSensorPrivacyController; private final RecordingController mRecordingController; - // Assume it's all good unless we hear otherwise. We don't always seem - // to get broadcasts that it *is* there. - int mSimState = TelephonyManager.SIM_STATE_READY; - private boolean mZenVisible; private boolean mVolumeVisible; private boolean mCurrentUserSetup; @@ -134,47 +142,70 @@ public class PhoneStatusBarPolicy private BluetoothController mBluetooth; private AlarmManager.AlarmClockInfo mNextAlarm; - public PhoneStatusBarPolicy(Context context, StatusBarIconController iconController, + @Inject + public PhoneStatusBarPolicy(StatusBarIconController iconController, CommandQueue commandQueue, BroadcastDispatcher broadcastDispatcher, - @UiBackground Executor uiBgExecutor) { - mContext = context; + @UiBackground Executor uiBgExecutor, @Main Resources resources, + CastController castController, HotspotController hotspotController, + BluetoothController bluetoothController, NextAlarmController nextAlarmController, + UserInfoController userInfoController, RotationLockController rotationLockController, + DataSaverController dataSaverController, ZenModeController zenModeController, + DeviceProvisionedController deviceProvisionedController, + KeyguardStateController keyguardStateController, + LocationController locationController, + SensorPrivacyController sensorPrivacyController, IActivityManager iActivityManager, + AlarmManager alarmManager, UserManager userManager, AudioManager audioManager, + RecordingController recordingController, + @Nullable TelecomManager telecomManager, @DisplayId int displayId, + @Main SharedPreferences sharedPreferences, DateFormatUtil dateFormatUtil) { mIconController = iconController; - mCast = Dependency.get(CastController.class); - mHotspot = Dependency.get(HotspotController.class); - mBluetooth = Dependency.get(BluetoothController.class); - mNextAlarmController = Dependency.get(NextAlarmController.class); - mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); - mUserInfoController = Dependency.get(UserInfoController.class); - mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); - mRotationLockController = Dependency.get(RotationLockController.class); - mDataSaver = Dependency.get(DataSaverController.class); - mZenController = Dependency.get(ZenModeController.class); - mProvisionedController = Dependency.get(DeviceProvisionedController.class); - mKeyguardStateController = Dependency.get(KeyguardStateController.class); - mLocationController = Dependency.get(LocationController.class); - mSensorPrivacyController = Dependency.get(SensorPrivacyController.class); - mRecordingController = Dependency.get(RecordingController.class); + mCommandQueue = commandQueue; + mBroadcastDispatcher = broadcastDispatcher; + mResources = resources; + mCast = castController; + mHotspot = hotspotController; + mBluetooth = bluetoothController; + mNextAlarmController = nextAlarmController; + mAlarmManager = alarmManager; + mUserInfoController = userInfoController; + mIActivityManager = iActivityManager; + mUserManager = userManager; + mRotationLockController = rotationLockController; + mDataSaver = dataSaverController; + mZenController = zenModeController; + mProvisionedController = deviceProvisionedController; + mKeyguardStateController = keyguardStateController; + mLocationController = locationController; + mSensorPrivacyController = sensorPrivacyController; + mRecordingController = recordingController; mUiBgExecutor = uiBgExecutor; + mAudioManager = audioManager; + mTelecomManager = telecomManager; - mSlotCast = context.getString(com.android.internal.R.string.status_bar_cast); - mSlotHotspot = context.getString(com.android.internal.R.string.status_bar_hotspot); - mSlotBluetooth = context.getString(com.android.internal.R.string.status_bar_bluetooth); - mSlotTty = context.getString(com.android.internal.R.string.status_bar_tty); - mSlotZen = context.getString(com.android.internal.R.string.status_bar_zen); - mSlotVolume = context.getString(com.android.internal.R.string.status_bar_volume); - mSlotAlarmClock = context.getString(com.android.internal.R.string.status_bar_alarm_clock); - mSlotManagedProfile = context.getString( + mSlotCast = resources.getString(com.android.internal.R.string.status_bar_cast); + mSlotHotspot = resources.getString(com.android.internal.R.string.status_bar_hotspot); + mSlotBluetooth = resources.getString(com.android.internal.R.string.status_bar_bluetooth); + mSlotTty = resources.getString(com.android.internal.R.string.status_bar_tty); + mSlotZen = resources.getString(com.android.internal.R.string.status_bar_zen); + mSlotVolume = resources.getString(com.android.internal.R.string.status_bar_volume); + mSlotAlarmClock = resources.getString(com.android.internal.R.string.status_bar_alarm_clock); + mSlotManagedProfile = resources.getString( com.android.internal.R.string.status_bar_managed_profile); - mSlotRotate = context.getString(com.android.internal.R.string.status_bar_rotate); - mSlotHeadset = context.getString(com.android.internal.R.string.status_bar_headset); - mSlotDataSaver = context.getString(com.android.internal.R.string.status_bar_data_saver); - mSlotLocation = context.getString(com.android.internal.R.string.status_bar_location); - mSlotMicrophone = context.getString(com.android.internal.R.string.status_bar_microphone); - mSlotCamera = context.getString(com.android.internal.R.string.status_bar_camera); - mSlotSensorsOff = context.getString(com.android.internal.R.string.status_bar_sensors_off); - mSlotScreenRecord = context.getString( + mSlotRotate = resources.getString(com.android.internal.R.string.status_bar_rotate); + mSlotHeadset = resources.getString(com.android.internal.R.string.status_bar_headset); + mSlotDataSaver = resources.getString(com.android.internal.R.string.status_bar_data_saver); + mSlotLocation = resources.getString(com.android.internal.R.string.status_bar_location); + mSlotSensorsOff = resources.getString(com.android.internal.R.string.status_bar_sensors_off); + mSlotScreenRecord = resources.getString( com.android.internal.R.string.status_bar_screen_record); + mDisplayId = displayId; + mSharedPreferences = sharedPreferences; + mDateFormatUtil = dateFormatUtil; + } + + /** Initialize the object after construction. */ + public void init() { // listen for broadcasts IntentFilter filter = new IntentFilter(); filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); @@ -185,11 +216,11 @@ public class PhoneStatusBarPolicy filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED); - broadcastDispatcher.registerReceiverWithHandler(mIntentReceiver, filter, mHandler); + mBroadcastDispatcher.registerReceiverWithHandler(mIntentReceiver, filter, mHandler); // listen for user / profile change. try { - ActivityManager.getService().registerUserSwitchObserver(mUserSwitchListener, TAG); + mIActivityManager.registerUserSwitchObserver(mUserSwitchListener, TAG); } catch (RemoteException e) { // Ignore } @@ -219,26 +250,26 @@ public class PhoneStatusBarPolicy // hotspot mIconController.setIcon(mSlotHotspot, R.drawable.stat_sys_hotspot, - mContext.getString(R.string.accessibility_status_bar_hotspot)); + mResources.getString(R.string.accessibility_status_bar_hotspot)); mIconController.setIconVisibility(mSlotHotspot, mHotspot.isHotspotEnabled()); // managed profile mIconController.setIcon(mSlotManagedProfile, R.drawable.stat_sys_managed_profile_status, - mContext.getString(R.string.accessibility_managed_profile)); + mResources.getString(R.string.accessibility_managed_profile)); mIconController.setIconVisibility(mSlotManagedProfile, mManagedProfileIconVisible); // data saver mIconController.setIcon(mSlotDataSaver, R.drawable.stat_sys_data_saver, - context.getString(R.string.accessibility_data_saver_on)); + mResources.getString(R.string.accessibility_data_saver_on)); mIconController.setIconVisibility(mSlotDataSaver, false); mIconController.setIcon(mSlotLocation, LOCATION_STATUS_ICON_ID, - mContext.getString(R.string.accessibility_location_active)); + mResources.getString(R.string.accessibility_location_active)); mIconController.setIconVisibility(mSlotLocation, false); // sensors off mIconController.setIcon(mSlotSensorsOff, R.drawable.stat_sys_sensors_off, - mContext.getString(R.string.accessibility_sensors_off_active)); + mResources.getString(R.string.accessibility_sensors_off_active)); mIconController.setIconVisibility(mSlotSensorsOff, mSensorPrivacyController.isSensorPrivacyEnabled()); @@ -259,7 +290,7 @@ public class PhoneStatusBarPolicy mLocationController.addCallback(this); mRecordingController.addCallback(this); - commandQueue.addCallback(this); + mCommandQueue.addCallback(this); } @Override @@ -284,51 +315,17 @@ public class PhoneStatusBarPolicy private String buildAlarmContentDescription() { if (mNextAlarm == null) { - return mContext.getString(R.string.status_bar_alarm); + return mResources.getString(R.string.status_bar_alarm); } - return formatNextAlarm(mNextAlarm, mContext); - } - private static String formatNextAlarm(AlarmManager.AlarmClockInfo info, Context context) { - if (info == null) { - return ""; - } - String skeleton = DateFormat.is24HourFormat( - context, ActivityManager.getCurrentUser()) ? "EHm" : "Ehma"; + String skeleton = mDateFormatUtil.is24HourFormat() ? "EHm" : "Ehma"; String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton); - String dateString = DateFormat.format(pattern, info.getTriggerTime()).toString(); + String dateString = DateFormat.format(pattern, mNextAlarm.getTriggerTime()).toString(); - return context.getString(R.string.accessibility_quick_settings_alarm, dateString); - } - - private final void updateSimState(Intent intent) { - String stateExtra = intent.getStringExtra(Intent.EXTRA_SIM_STATE); - if (Intent.SIM_STATE_ABSENT.equals(stateExtra)) { - mSimState = TelephonyManager.SIM_STATE_READY; - } else if (Intent.SIM_STATE_CARD_IO_ERROR.equals(stateExtra)) { - mSimState = TelephonyManager.SIM_STATE_CARD_IO_ERROR; - } else if (Intent.SIM_STATE_CARD_RESTRICTED.equals(stateExtra)) { - mSimState = TelephonyManager.SIM_STATE_CARD_RESTRICTED; - } else if (Intent.SIM_STATE_READY.equals(stateExtra)) { - mSimState = TelephonyManager.SIM_STATE_READY; - } else if (Intent.SIM_STATE_LOCKED.equals(stateExtra)) { - final String lockedReason = - intent.getStringExtra(Intent.EXTRA_SIM_LOCKED_REASON); - if (Intent.SIM_LOCKED_ON_PIN.equals(lockedReason)) { - mSimState = TelephonyManager.SIM_STATE_PIN_REQUIRED; - } else if (Intent.SIM_LOCKED_ON_PUK.equals(lockedReason)) { - mSimState = TelephonyManager.SIM_STATE_PUK_REQUIRED; - } else { - mSimState = TelephonyManager.SIM_STATE_NETWORK_LOCKED; - } - } else { - mSimState = TelephonyManager.SIM_STATE_UNKNOWN; - } + return mResources.getString(R.string.accessibility_quick_settings_alarm, dateString); } private final void updateVolumeZen() { - AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); - boolean zenVisible = false; int zenIconId = 0; String zenDescription = null; @@ -338,29 +335,29 @@ public class PhoneStatusBarPolicy String volumeDescription = null; int zen = mZenController.getZen(); - if (DndTile.isVisible(mContext) || DndTile.isCombinedIcon(mContext)) { + if (DndTile.isVisible(mSharedPreferences) || DndTile.isCombinedIcon(mSharedPreferences)) { zenVisible = zen != Global.ZEN_MODE_OFF; zenIconId = R.drawable.stat_sys_dnd; - zenDescription = mContext.getString(R.string.quick_settings_dnd_label); + zenDescription = mResources.getString(R.string.quick_settings_dnd_label); } else if (zen == Global.ZEN_MODE_NO_INTERRUPTIONS) { zenVisible = true; zenIconId = R.drawable.stat_sys_dnd; - zenDescription = mContext.getString(R.string.interruption_level_none); + zenDescription = mResources.getString(R.string.interruption_level_none); } else if (zen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS) { zenVisible = true; zenIconId = R.drawable.stat_sys_dnd; - zenDescription = mContext.getString(R.string.interruption_level_priority); + zenDescription = mResources.getString(R.string.interruption_level_priority); } if (!ZenModeConfig.isZenOverridingRinger(zen, mZenController.getConsolidatedPolicy())) { - if (audioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_VIBRATE) { + if (mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_VIBRATE) { volumeVisible = true; volumeIconId = R.drawable.stat_sys_ringer_vibrate; - volumeDescription = mContext.getString(R.string.accessibility_ringer_vibrate); - } else if (audioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT) { + volumeDescription = mResources.getString(R.string.accessibility_ringer_vibrate); + } else if (mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT) { volumeVisible = true; volumeIconId = R.drawable.stat_sys_ringer_silent; - volumeDescription = mContext.getString(R.string.accessibility_ringer_silent); + volumeDescription = mResources.getString(R.string.accessibility_ringer_silent); } } @@ -395,13 +392,13 @@ public class PhoneStatusBarPolicy private final void updateBluetooth() { int iconId = R.drawable.stat_sys_data_bluetooth_connected; String contentDescription = - mContext.getString(R.string.accessibility_quick_settings_bluetooth_on); + mResources.getString(R.string.accessibility_quick_settings_bluetooth_on); boolean bluetoothVisible = false; if (mBluetooth != null) { if (mBluetooth.isBluetoothConnected() && (mBluetooth.isBluetoothAudioActive() || !mBluetooth.isBluetoothAudioProfileOnly())) { - contentDescription = mContext.getString( + contentDescription = mResources.getString( R.string.accessibility_bluetooth_connected); bluetoothVisible = mBluetooth.isBluetoothEnabled(); } @@ -412,12 +409,10 @@ public class PhoneStatusBarPolicy } private final void updateTTY() { - TelecomManager telecomManager = - (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE); - if (telecomManager == null) { + if (mTelecomManager == null) { updateTTY(TelecomManager.TTY_MODE_OFF); } else { - updateTTY(telecomManager.getCurrentTtyMode()); + updateTTY(mTelecomManager.getCurrentTtyMode()); } } @@ -430,7 +425,7 @@ public class PhoneStatusBarPolicy // TTY is on if (DEBUG) Log.v(TAG, "updateTTY: set TTY on"); mIconController.setIcon(mSlotTty, R.drawable.stat_sys_tty_mode, - mContext.getString(R.string.accessibility_tty_enabled)); + mResources.getString(R.string.accessibility_tty_enabled)); mIconController.setIconVisibility(mSlotTty, true); } else { // TTY is off @@ -452,7 +447,7 @@ public class PhoneStatusBarPolicy mHandler.removeCallbacks(mRemoveCastIconRunnable); if (isCasting && !mRecordingController.isRecording()) { // screen record has its own icon mIconController.setIcon(mSlotCast, R.drawable.stat_sys_cast, - mContext.getString(R.string.accessibility_casting)); + mResources.getString(R.string.accessibility_casting)); mIconController.setIconVisibility(mSlotCast, true); } else { // don't turn off the screen-record icon for a few seconds, just to make sure the user @@ -478,7 +473,7 @@ public class PhoneStatusBarPolicy showIcon = true; mIconController.setIcon(mSlotManagedProfile, R.drawable.stat_sys_managed_profile_status, - mContext.getString(R.string.accessibility_managed_profile)); + mResources.getString(R.string.accessibility_managed_profile)); } else { showIcon = false; } @@ -545,7 +540,7 @@ public class PhoneStatusBarPolicy @Override public void appTransitionStarting(int displayId, long startTime, long duration, boolean forced) { - if (mContext.getDisplayId() == displayId) { + if (mDisplayId == displayId) { updateManagedProfile(); } } @@ -567,14 +562,14 @@ public class PhoneStatusBarPolicy @Override public void onRotationLockStateChanged(boolean rotationLocked, boolean affordanceVisible) { boolean portrait = RotationLockTile.isCurrentOrientationLockPortrait( - mRotationLockController, mContext); + mRotationLockController, mResources); if (rotationLocked) { if (portrait) { mIconController.setIcon(mSlotRotate, R.drawable.stat_sys_rotate_portrait, - mContext.getString(R.string.accessibility_rotation_lock_on_portrait)); + mResources.getString(R.string.accessibility_rotation_lock_on_portrait)); } else { mIconController.setIcon(mSlotRotate, R.drawable.stat_sys_rotate_landscape, - mContext.getString(R.string.accessibility_rotation_lock_on_landscape)); + mResources.getString(R.string.accessibility_rotation_lock_on_landscape)); } mIconController.setIconVisibility(mSlotRotate, true); } else { @@ -586,7 +581,7 @@ public class PhoneStatusBarPolicy boolean connected = intent.getIntExtra("state", 0) != 0; boolean hasMic = intent.getIntExtra("microphone", 0) != 0; if (connected) { - String contentDescription = mContext.getString(hasMic + String contentDescription = mResources.getString(hasMic ? R.string.accessibility_status_bar_headset : R.string.accessibility_status_bar_headphones); mIconController.setIcon(mSlotHeadset, hasMic ? R.drawable.stat_sys_headset_mic @@ -630,7 +625,6 @@ public class PhoneStatusBarPolicy if (intent.getBooleanExtra(Intent.EXTRA_REBROADCAST_ON_UNLOCK, false)) { break; } - updateSimState(intent); break; case TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED: updateTTY(intent.getIntExtra(TelecomManager.EXTRA_CURRENT_TTY_MODE, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 0d3b09a634e47..b121eb0a59744 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -676,6 +676,7 @@ public class StatusBar extends SystemUI implements DemoMode, KeyguardDismissUtil keyguardDismissUtil, ExtensionController extensionController, UserInfoControllerImpl userInfoControllerImpl, + PhoneStatusBarPolicy phoneStatusBarPolicy, DismissCallbackRegistry dismissCallbackRegistry, StatusBarTouchableRegionManager statusBarTouchableRegionManager) { super(context); @@ -751,6 +752,7 @@ public class StatusBar extends SystemUI implements DemoMode, mKeyguardDismissUtil = keyguardDismissUtil; mExtensionController = extensionController; mUserInfoControllerImpl = userInfoControllerImpl; + mIconPolicy = phoneStatusBarPolicy; mDismissCallbackRegistry = dismissCallbackRegistry; mBubbleExpandListener = @@ -875,8 +877,7 @@ public class StatusBar extends SystemUI implements DemoMode, // end old BaseStatusBar.start(). // Lastly, call to the icon policy to install/update all the icons. - mIconPolicy = new PhoneStatusBarPolicy(mContext, mIconController, mCommandQueue, - mBroadcastDispatcher, mUiBgExecutor); + mIconPolicy.init(); mSignalPolicy = new StatusBarSignalPolicy(mContext, mIconController); mKeyguardStateController.addCallback(this); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java index e64f8214bb719..0a4fdc9eb9bcf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java @@ -79,6 +79,7 @@ import com.android.systemui.statusbar.phone.LockscreenLockIconController; import com.android.systemui.statusbar.phone.LockscreenWallpaper; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.NotificationShadeWindowController; +import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy; import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; @@ -193,6 +194,7 @@ public interface StatusBarPhoneModule { KeyguardDismissUtil keyguardDismissUtil, ExtensionController extensionController, UserInfoControllerImpl userInfoControllerImpl, + PhoneStatusBarPolicy phoneStatusBarPolicy, DismissCallbackRegistry dismissCallbackRegistry, StatusBarTouchableRegionManager statusBarTouchableRegionManager) { return new StatusBar( @@ -269,6 +271,7 @@ public interface StatusBarPhoneModule { keyguardDismissUtil, extensionController, userInfoControllerImpl, + phoneStatusBarPolicy, dismissCallbackRegistry, statusBarTouchableRegionManager); } diff --git a/packages/SystemUI/src/com/android/systemui/util/time/DateFormatUtil.java b/packages/SystemUI/src/com/android/systemui/util/time/DateFormatUtil.java new file mode 100644 index 0000000000000..d7c4e93bb26ea --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/util/time/DateFormatUtil.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.util.time; + +import android.app.ActivityManager; +import android.content.Context; +import android.text.format.DateFormat; + +import javax.inject.Inject; + +/** + * Instantiable wrapper around {@link DateFormat}. + */ +public class DateFormatUtil { + private final Context mContext; + + @Inject + public DateFormatUtil(Context context) { + mContext = context; + } + + /** Returns true if the phone is in 24 hour format. */ + public boolean is24HourFormat() { + return DateFormat.is24HourFormat(mContext, ActivityManager.getCurrentUser()); + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index d81b8c2af2467..5253e2ca9e42f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -247,6 +247,7 @@ public class StatusBarTest extends SysuiTestCase { @Mock private KeyguardDismissUtil mKeyguardDismissUtil; @Mock private ExtensionController mExtensionController; @Mock private UserInfoControllerImpl mUserInfoControllerImpl; + @Mock private PhoneStatusBarPolicy mPhoneStatusBarPolicy; private ShadeController mShadeController; private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock()); private InitController mInitController = new InitController(); @@ -400,6 +401,7 @@ public class StatusBarTest extends SysuiTestCase { mKeyguardDismissUtil, mExtensionController, mUserInfoControllerImpl, + mPhoneStatusBarPolicy, mDismissCallbackRegistry, mStatusBarTouchableRegionManager);