From c0d9a7d88981208fa2453a909ad5d56c83a23469 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Thu, 27 Feb 2020 17:15:52 -0500 Subject: [PATCH 1/3] Pass LockscreenIconController around instead of LockIcon. This also makes KeyguardIndicationController properly injectable, and moves some of the LockIcon touch-handling that was happening inside of it into the LockscreenIconController. To make KeyguardIndicationController injectable, a new WakeLock.Builder was added that can be injected and used to create new WakeLocks as needed. Bug: 150393918 Test: atest SystemUITests && manual Change-Id: I3ad871164a822c0c63c0e32da777beb287144a35 --- .../systemui/statusbar/car/CarStatusBar.java | 3 + .../statusbar/car/CarStatusBarModule.java | 3 + .../com/android/systemui/SystemUIFactory.java | 7 -- .../systemui/dagger/SystemServicesModule.java | 9 ++ .../KeyguardIndicationController.java | 94 ++++--------------- .../statusbar/SuperStatusBarViewFactory.java | 16 ++-- .../phone/LockscreenLockIconController.java | 76 ++++++++++++++- .../systemui/statusbar/phone/StatusBar.java | 8 +- .../phone/dagger/StatusBarPhoneModule.java | 3 + .../systemui/util/wakelock/WakeLock.java | 30 ++++++ .../bubbles/BubbleControllerTest.java | 6 +- .../NewNotifPipelineBubbleControllerTest.java | 6 +- .../KeyguardIndicationControllerTest.java | 41 ++------ .../phone/LockscreenIconControllerTest.java | 91 ++++++++++++++++++ .../statusbar/phone/StatusBarTest.java | 1 + .../systemui/util/wakelock/WakeLockFake.java | 22 +++++ 16 files changed, 283 insertions(+), 133 deletions(-) create mode 100644 packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.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 f39f9124efbb5..0374a5cef0ae7 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -88,6 +88,7 @@ import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.stackdivider.Divider; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.FlingAnimationUtils; +import com.android.systemui.statusbar.KeyguardIndicationController; import com.android.systemui.statusbar.NavigationBarController; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationMediaManager; @@ -326,6 +327,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt ExtensionController extensionController, UserInfoControllerImpl userInfoControllerImpl, PhoneStatusBarPolicy phoneStatusBarPolicy, + KeyguardIndicationController keyguardIndicationController, DismissCallbackRegistry dismissCallbackRegistry, StatusBarTouchableRegionManager statusBarTouchableRegionManager, /* Car Settings injected components. */ @@ -410,6 +412,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt extensionController, userInfoControllerImpl, phoneStatusBarPolicy, + keyguardIndicationController, 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 843e7c55852a0..07c42e17d006d 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java @@ -48,6 +48,7 @@ import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.stackdivider.Divider; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.FlingAnimationUtils; +import com.android.systemui.statusbar.KeyguardIndicationController; import com.android.systemui.statusbar.NavigationBarController; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationMediaManager; @@ -199,6 +200,7 @@ public class CarStatusBarModule { ExtensionController extensionController, UserInfoControllerImpl userInfoControllerImpl, PhoneStatusBarPolicy phoneStatusBarPolicy, + KeyguardIndicationController keyguardIndicationController, DismissCallbackRegistry dismissCallbackRegistry, StatusBarTouchableRegionManager statusBarTouchableRegionManager, CarServiceProvider carServiceProvider, @@ -281,6 +283,7 @@ public class CarStatusBarModule { extensionController, userInfoControllerImpl, phoneStatusBarPolicy, + keyguardIndicationController, dismissCallbackRegistry, statusBarTouchableRegionManager, carServiceProvider, diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java index 7b0bd9cadb9bb..fb40774a1f5c2 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java @@ -34,14 +34,12 @@ import com.android.systemui.keyguard.DismissCallbackRegistry; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider; -import com.android.systemui.statusbar.KeyguardIndicationController; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.KeyguardBouncer; import com.android.systemui.statusbar.phone.KeyguardBypassController; -import com.android.systemui.statusbar.phone.LockIcon; import com.android.systemui.statusbar.phone.NotificationIconAreaController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -158,11 +156,6 @@ public class SystemUIFactory { Dependency.get(DozeParameters.class)); } - public KeyguardIndicationController createKeyguardIndicationController(Context context, - ViewGroup indicationArea, LockIcon lockIcon) { - return new KeyguardIndicationController(context, indicationArea, lockIcon); - } - @Module public static class ContextHolder { private Context mContext; diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java index 352ee33049645..a6a0bba0b6f22 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java @@ -34,6 +34,7 @@ import android.content.res.Resources; import android.hardware.SensorPrivacyManager; import android.media.AudioManager; import android.net.ConnectivityManager; +import android.os.BatteryStats; import android.os.Handler; import android.os.PowerManager; import android.os.ServiceManager; @@ -49,6 +50,7 @@ import android.view.WindowManager; import android.view.WindowManagerGlobal; import android.view.accessibility.AccessibilityManager; +import com.android.internal.app.IBatteryStats; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.util.LatencyTracker; import com.android.settingslib.bluetooth.LocalBluetoothManager; @@ -121,6 +123,13 @@ public class SystemServicesModule { return ActivityManager.getService(); } + @Provides + @Singleton + static IBatteryStats provideIBatteryStats() { + return IBatteryStats.Stub.asInterface( + ServiceManager.getService(BatteryStats.SERVICE_NAME)); + } + @Provides @Singleton static IDreamManager provideIDreamManager() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 4f8e6cfdf767e..a7bf4a246acc1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -25,12 +25,9 @@ import android.hardware.biometrics.BiometricSourceType; import android.hardware.face.FaceManager; import android.hardware.fingerprint.FingerprintManager; import android.os.BatteryManager; -import android.os.BatteryStats; import android.os.Handler; import android.os.Message; import android.os.RemoteException; -import android.os.ServiceManager; -import android.os.UserManager; import android.text.TextUtils; import android.text.format.Formatter; import android.util.Log; @@ -39,27 +36,20 @@ import android.view.ViewGroup; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.IBatteryStats; -import com.android.internal.logging.nano.MetricsProto; -import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.ViewClippingUtil; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.settingslib.Utils; import com.android.settingslib.fuelgauge.BatteryStatus; -import com.android.systemui.Dependency; import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.dock.DockManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; import com.android.systemui.statusbar.phone.KeyguardIndicationTextView; -import com.android.systemui.statusbar.phone.LockIcon; -import com.android.systemui.statusbar.phone.LockscreenGestureLogger; -import com.android.systemui.statusbar.phone.ShadeController; +import com.android.systemui.statusbar.phone.LockscreenLockIconController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; -import com.android.systemui.statusbar.policy.AccessibilityController; import com.android.systemui.statusbar.policy.KeyguardStateController; -import com.android.systemui.statusbar.policy.UserInfoController; import com.android.systemui.util.wakelock.SettableWakeLock; import com.android.systemui.util.wakelock.WakeLock; @@ -68,9 +58,13 @@ import java.io.PrintWriter; import java.text.NumberFormat; import java.util.IllegalFormatConversionException; +import javax.inject.Inject; +import javax.inject.Singleton; + /** * Controls the indications and error messages shown on the Keyguard */ +@Singleton public class KeyguardIndicationController implements StateListener, KeyguardStateController.Callback { @@ -84,22 +78,17 @@ public class KeyguardIndicationController implements StateListener, private static final float BOUNCE_ANIMATION_FINAL_Y = 0f; private final Context mContext; - private final ShadeController mShadeController; - private final AccessibilityController mAccessibilityController; private final KeyguardStateController mKeyguardStateController; private final StatusBarStateController mStatusBarStateController; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private ViewGroup mIndicationArea; private KeyguardIndicationTextView mTextView; - private final UserManager mUserManager; private final IBatteryStats mBatteryInfo; private final SettableWakeLock mWakeLock; - private final LockPatternUtils mLockPatternUtils; private final DockManager mDockManager; - private final LockIcon mLockIcon; + private LockscreenLockIconController mLockIconController; private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; - private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger(); private String mRestingIndication; private String mAlignmentIndication; @@ -132,55 +121,25 @@ public class KeyguardIndicationController implements StateListener, /** * Creates a new KeyguardIndicationController and registers callbacks. */ - public KeyguardIndicationController(Context context, ViewGroup indicationArea, - LockIcon lockIcon) { - this(context, indicationArea, lockIcon, new LockPatternUtils(context), - WakeLock.createPartial(context, "Doze:KeyguardIndication"), - Dependency.get(ShadeController.class), - Dependency.get(AccessibilityController.class), - Dependency.get(KeyguardStateController.class), - Dependency.get(StatusBarStateController.class), - Dependency.get(KeyguardUpdateMonitor.class), - Dependency.get(DockManager.class), - IBatteryStats.Stub.asInterface( - ServiceManager.getService(BatteryStats.SERVICE_NAME))); - } - - /** - * Creates a new KeyguardIndicationController for testing. - */ - @VisibleForTesting - KeyguardIndicationController(Context context, ViewGroup indicationArea, LockIcon lockIcon, - LockPatternUtils lockPatternUtils, WakeLock wakeLock, ShadeController shadeController, - AccessibilityController accessibilityController, + @Inject + KeyguardIndicationController(Context context, + WakeLock.Builder wakeLockBuilder, KeyguardStateController keyguardStateController, StatusBarStateController statusBarStateController, KeyguardUpdateMonitor keyguardUpdateMonitor, DockManager dockManager, IBatteryStats iBatteryStats) { mContext = context; - mLockIcon = lockIcon; - mShadeController = shadeController; - mAccessibilityController = accessibilityController; mKeyguardStateController = keyguardStateController; mStatusBarStateController = statusBarStateController; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mDockManager = dockManager; mDockManager.addAlignmentStateListener( alignState -> mHandler.post(() -> handleAlignStateChanged(alignState))); - // lock icon is not used on all form factors. - if (mLockIcon != null) { - mLockIcon.setOnLongClickListener(this::handleLockLongClick); - mLockIcon.setOnClickListener(this::handleLockClick); - } - mWakeLock = new SettableWakeLock(wakeLock, TAG); - mLockPatternUtils = lockPatternUtils; - - mUserManager = context.getSystemService(UserManager.class); + mWakeLock = new SettableWakeLock( + wakeLockBuilder.setTag("Doze:KeyguardIndication").build(), TAG); mBatteryInfo = iBatteryStats; - setIndicationArea(indicationArea); - mKeyguardUpdateMonitor.registerCallback(getKeyguardCallback()); mKeyguardUpdateMonitor.registerCallback(mTickReceiver); mStatusBarStateController.addCallback(this); @@ -195,21 +154,8 @@ public class KeyguardIndicationController implements StateListener, updateIndication(false /* animate */); } - private boolean handleLockLongClick(View view) { - mLockscreenGestureLogger.write(MetricsProto.MetricsEvent.ACTION_LS_LOCK, - 0 /* lengthDp - N/A */, 0 /* velocityDp - N/A */); - showTransientIndication(R.string.keyguard_indication_trust_disabled); - mKeyguardUpdateMonitor.onLockIconPressed(); - mLockPatternUtils.requireCredentialEntry(KeyguardUpdateMonitor.getCurrentUser()); - - return true; - } - - private void handleLockClick(View view) { - if (!mAccessibilityController.isAccessibilityEnabled()) { - return; - } - mShadeController.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */); + public void setLockIconController(LockscreenLockIconController lockIconController) { + mLockIconController = lockIconController; } private void handleAlignStateChanged(int alignState) { @@ -268,12 +214,6 @@ public class KeyguardIndicationController implements StateListener, updateIndication(false); } - /** - * Sets the active controller managing changes and callbacks to user information. - */ - public void setUserInfoController(UserInfoController userInfoController) { - } - /** * Returns the indication text indicating that trust has been granted. * @@ -545,7 +485,9 @@ public class KeyguardIndicationController implements StateListener, if (msg.what == MSG_HIDE_TRANSIENT) { hideTransientIndication(); } else if (msg.what == MSG_CLEAR_BIOMETRIC_MSG) { - mLockIcon.setTransientBiometricsError(false); + if (mLockIconController != null) { + mLockIconController.setTransientBiometricsError(false); + } } else if (msg.what == MSG_SWIPE_UP_TO_UNLOCK) { showSwipeUpToUnlock(); } @@ -694,7 +636,9 @@ public class KeyguardIndicationController implements StateListener, } private void animatePadlockError() { - mLockIcon.setTransientBiometricsError(true); + if (mLockIconController != null) { + mLockIconController.setTransientBiometricsError(true); + } mHandler.removeMessages(MSG_CLEAR_BIOMETRIC_MSG); mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CLEAR_BIOMETRIC_MSG), TRANSIENT_BIOMETRIC_ERROR_TIMEOUT); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SuperStatusBarViewFactory.java b/packages/SystemUI/src/com/android/systemui/statusbar/SuperStatusBarViewFactory.java index 405f32ad72310..7cda23544ca07 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SuperStatusBarViewFactory.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SuperStatusBarViewFactory.java @@ -23,6 +23,7 @@ import android.view.ViewGroup; import com.android.systemui.R; import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent; import com.android.systemui.statusbar.phone.LockIcon; +import com.android.systemui.statusbar.phone.LockscreenLockIconController; import com.android.systemui.statusbar.phone.NotificationPanelView; import com.android.systemui.statusbar.phone.NotificationShadeWindowView; import com.android.systemui.statusbar.phone.StatusBarWindowView; @@ -41,6 +42,7 @@ public class SuperStatusBarViewFactory { private final Context mContext; private final InjectionInflationController mInjectionInflationController; private final NotificationRowComponent.Builder mNotificationRowComponentBuilder; + private final LockscreenLockIconController mLockIconController; private NotificationShadeWindowView mNotificationShadeWindowView; private StatusBarWindowView mStatusBarWindowView; @@ -49,10 +51,12 @@ public class SuperStatusBarViewFactory { @Inject public SuperStatusBarViewFactory(Context context, InjectionInflationController injectionInflationController, - NotificationRowComponent.Builder notificationRowComponentBuilder) { + NotificationRowComponent.Builder notificationRowComponentBuilder, + LockscreenLockIconController lockIconController) { mContext = context; mInjectionInflationController = injectionInflationController; mNotificationRowComponentBuilder = notificationRowComponentBuilder; + mLockIconController = lockIconController; } /** @@ -73,12 +77,12 @@ public class SuperStatusBarViewFactory { throw new IllegalStateException( "R.layout.super_notification_shade could not be properly inflated"); } - return mNotificationShadeWindowView; - } + LockIcon lockIcon = mNotificationShadeWindowView.findViewById(R.id.lock_icon); + if (lockIcon != null) { + mLockIconController.attach(lockIcon); + } - /** Gets the {@link LockIcon} inside of {@link R.layout#super_status_bar}. */ - public LockIcon getLockIcon() { - return getNotificationShadeWindowView().findViewById(R.id.lock_icon); + return mNotificationShadeWindowView; } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java index 1e35b46db774d..f764a2780a536 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java @@ -16,7 +16,15 @@ package com.android.systemui.statusbar.phone; -import com.android.systemui.statusbar.SuperStatusBarViewFactory; +import android.view.View; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.internal.widget.LockPatternUtils; +import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.systemui.R; +import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.KeyguardIndicationController; +import com.android.systemui.statusbar.policy.AccessibilityController; import javax.inject.Inject; import javax.inject.Singleton; @@ -25,11 +33,43 @@ import javax.inject.Singleton; @Singleton public class LockscreenLockIconController { - private final LockIcon mLockIcon; + private final LockscreenGestureLogger mLockscreenGestureLogger; + private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; + private final LockPatternUtils mLockPatternUtils; + private final ShadeController mShadeController; + private final AccessibilityController mAccessibilityController; + private final KeyguardIndicationController mKeyguardIndicationController; + private LockIcon mLockIcon; @Inject - public LockscreenLockIconController(SuperStatusBarViewFactory superStatusBarViewFactory) { - mLockIcon = superStatusBarViewFactory.getLockIcon(); + public LockscreenLockIconController(LockscreenGestureLogger lockscreenGestureLogger, + KeyguardUpdateMonitor keyguardUpdateMonitor, + LockPatternUtils lockPatternUtils, + ShadeController shadeController, + AccessibilityController accessibilityController, + KeyguardIndicationController keyguardIndicationController) { + mLockscreenGestureLogger = lockscreenGestureLogger; + mKeyguardUpdateMonitor = keyguardUpdateMonitor; + mLockPatternUtils = lockPatternUtils; + mShadeController = shadeController; + mAccessibilityController = accessibilityController; + mKeyguardIndicationController = keyguardIndicationController; + + mKeyguardIndicationController.setLockIconController(this); + } + + /** + * Associate the controller with a {@link LockIcon} + */ + public void attach(LockIcon lockIcon) { + mLockIcon = lockIcon; + + mLockIcon.setOnClickListener(this::handleClick); + mLockIcon.setOnLongClickListener(this::handleLongClick); + } + + public LockIcon getView() { + return mLockIcon; } /** @@ -86,4 +126,32 @@ public class LockscreenLockIconController { mLockIcon.onBouncerPreHideAnimation(); } } + + /** + * If we're currently presenting an authentication error message. + */ + public void setTransientBiometricsError(boolean transientBiometricsError) { + if (mLockIcon != null) { + mLockIcon.setTransientBiometricsError(transientBiometricsError); + } + } + + private boolean handleLongClick(View view) { + mLockscreenGestureLogger.write(MetricsProto.MetricsEvent.ACTION_LS_LOCK, + 0 /* lengthDp - N/A */, 0 /* velocityDp - N/A */); + mKeyguardIndicationController.showTransientIndication( + R.string.keyguard_indication_trust_disabled); + mKeyguardUpdateMonitor.onLockIconPressed(); + mLockPatternUtils.requireCredentialEntry(KeyguardUpdateMonitor.getCurrentUser()); + + return true; + } + + + private void handleClick(View view) { + if (!mAccessibilityController.isAccessibilityEnabled()) { + return; + } + mShadeController.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */); + } } 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 b620d17541b2b..0351dc71673ec 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -677,6 +677,7 @@ public class StatusBar extends SystemUI implements DemoMode, ExtensionController extensionController, UserInfoControllerImpl userInfoControllerImpl, PhoneStatusBarPolicy phoneStatusBarPolicy, + KeyguardIndicationController keyguardIndicationController, DismissCallbackRegistry dismissCallbackRegistry, StatusBarTouchableRegionManager statusBarTouchableRegionManager) { super(context); @@ -690,6 +691,7 @@ public class StatusBar extends SystemUI implements DemoMode, mKeyguardBypassController = keyguardBypassController; mKeyguardStateController = keyguardStateController; mHeadsUpManager = headsUpManagerPhone; + mKeyguardIndicationController = keyguardIndicationController; mStatusBarTouchableRegionManager = statusBarTouchableRegionManager; mDynamicPrivacyController = dynamicPrivacyController; mBypassHeadsUpNotifier = bypassHeadsUpNotifier; @@ -1048,10 +1050,8 @@ public class StatusBar extends SystemUI implements DemoMode, mLockscreenWallpaper = mLockscreenWallpaperLazy.get(); } - mKeyguardIndicationController = - SystemUIFactory.getInstance().createKeyguardIndicationController(mContext, - mNotificationShadeWindowView.findViewById(R.id.keyguard_indication_area), - mNotificationShadeWindowView.findViewById(R.id.lock_icon)); + mKeyguardIndicationController.setIndicationArea( + mNotificationShadeWindowView.findViewById(R.id.keyguard_indication_area)); mNotificationPanelViewController.setKeyguardIndicationController( mKeyguardIndicationController); 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 0a4fdc9eb9bcf..eec8d50f00dee 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 @@ -46,6 +46,7 @@ import com.android.systemui.recents.ScreenPinningRequest; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.stackdivider.Divider; import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.KeyguardIndicationController; import com.android.systemui.statusbar.NavigationBarController; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationMediaManager; @@ -195,6 +196,7 @@ public interface StatusBarPhoneModule { ExtensionController extensionController, UserInfoControllerImpl userInfoControllerImpl, PhoneStatusBarPolicy phoneStatusBarPolicy, + KeyguardIndicationController keyguardIndicationController, DismissCallbackRegistry dismissCallbackRegistry, StatusBarTouchableRegionManager statusBarTouchableRegionManager) { return new StatusBar( @@ -272,6 +274,7 @@ public interface StatusBarPhoneModule { extensionController, userInfoControllerImpl, phoneStatusBarPolicy, + keyguardIndicationController, dismissCallbackRegistry, statusBarTouchableRegionManager); } diff --git a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java index 775a3ab3360c8..08cd6e383897a 100644 --- a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java +++ b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java @@ -24,6 +24,8 @@ import androidx.annotation.VisibleForTesting; import java.util.HashMap; +import javax.inject.Inject; + /** WakeLock wrapper for testability */ public interface WakeLock { @@ -121,4 +123,32 @@ public interface WakeLock { } }; } + + /** + * An injectable Builder that wraps {@link #createPartial(Context, String, long)}. + */ + class Builder { + private final Context mContext; + private String mTag; + private long mMaxTimeout = DEFAULT_MAX_TIMEOUT; + + @Inject + public Builder(Context context) { + mContext = context; + } + + public Builder setTag(String tag) { + this.mTag = tag; + return this; + } + + public Builder setMaxTimeout(long maxTimeout) { + this.mMaxTimeout = maxTimeout; + return this; + } + + public WakeLock build() { + return WakeLock.createPartial(mContext, mTag, mMaxTimeout); + } + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java index 30095935aed5f..6e50adc5b91cc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java @@ -77,6 +77,7 @@ import com.android.systemui.statusbar.notification.row.NotificationTestHelper; import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.KeyguardBypassController; +import com.android.systemui.statusbar.phone.LockscreenLockIconController; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.ShadeController; @@ -170,6 +171,8 @@ public class BubbleControllerTest extends SysuiTestCase { private FeatureFlags mFeatureFlagsOldPipeline; @Mock private DumpManager mDumpManager; + @Mock + private LockscreenLockIconController mLockIconController; private SuperStatusBarViewFactory mSuperStatusBarViewFactory; private BubbleData mBubbleData; @@ -198,7 +201,8 @@ public class BubbleControllerTest extends SysuiTestCase { public NotificationRowComponent build() { return mNotificationRowComponent; } - }); + }, + mLockIconController); // Bubbles get added to status bar window view mNotificationShadeWindowController = new NotificationShadeWindowController(mContext, diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/NewNotifPipelineBubbleControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/NewNotifPipelineBubbleControllerTest.java index 1187ceed37807..22ef3f34cb4d0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/NewNotifPipelineBubbleControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/NewNotifPipelineBubbleControllerTest.java @@ -72,6 +72,7 @@ import com.android.systemui.statusbar.notification.row.NotificationTestHelper; import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.KeyguardBypassController; +import com.android.systemui.statusbar.phone.LockscreenLockIconController; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.ShadeController; @@ -164,6 +165,8 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase { private FeatureFlags mFeatureFlagsNewPipeline; @Mock private DumpManager mDumpManager; + @Mock + private LockscreenLockIconController mLockIconController; private SuperStatusBarViewFactory mSuperStatusBarViewFactory; private BubbleData mBubbleData; @@ -192,7 +195,8 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase { public NotificationRowComponent build() { return mNotificationRowComponent; } - }); + }, + mLockIconController); // Bubbles get added to status bar window view mNotificationShadeWindowController = new NotificationShadeWindowController(mContext, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java index 581d795af3df0..d8774bce4edb6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java @@ -44,7 +44,6 @@ import android.os.BatteryManager; import android.os.Looper; import android.os.RemoteException; import android.os.UserManager; -import android.view.View; import android.view.ViewGroup; import androidx.test.InstrumentationRegistry; @@ -52,7 +51,6 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.internal.app.IBatteryStats; -import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.settingslib.Utils; import com.android.settingslib.fuelgauge.BatteryStatus; @@ -61,10 +59,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.dock.DockManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.phone.KeyguardIndicationTextView; -import com.android.systemui.statusbar.phone.LockIcon; -import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; -import com.android.systemui.statusbar.policy.AccessibilityController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.wakelock.WakeLockFake; @@ -85,14 +80,6 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { @Mock private ViewGroup mIndicationArea; @Mock - private LockIcon mLockIcon; - @Mock - private LockPatternUtils mLockPatternUtils; - @Mock - private ShadeController mShadeController; - @Mock - private AccessibilityController mAccessibilityController; - @Mock private KeyguardStateController mKeyguardStateController; @Mock private StatusBarStateController mStatusBarStateController; @@ -111,6 +98,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { private KeyguardIndicationTextView mTextView; private KeyguardIndicationController mController; + private WakeLockFake.Builder mWakeLockBuilder; private WakeLockFake mWakeLock; private Instrumentation mInstrumentation; @@ -131,16 +119,19 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { when(mIndicationArea.findViewById(R.id.keyguard_indication_text)).thenReturn(mTextView); mWakeLock = new WakeLockFake(); + mWakeLockBuilder = new WakeLockFake.Builder(mContext); + mWakeLockBuilder.setWakeLock(mWakeLock); } private void createController() { if (Looper.myLooper() == null) { Looper.prepare(); } - mController = new KeyguardIndicationController(mContext, mIndicationArea, mLockIcon, - mLockPatternUtils, mWakeLock, mShadeController, mAccessibilityController, + + mController = new KeyguardIndicationController(mContext, mWakeLockBuilder, mKeyguardStateController, mStatusBarStateController, mKeyguardUpdateMonitor, mDockManager, mIBatteryStats); + mController.setIndicationArea(mIndicationArea); mController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); clearInvocations(mIBatteryStats); } @@ -318,26 +309,6 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { verify(mStatusBarKeyguardViewManager).showBouncerMessage(eq(message), any()); } - @Test - public void lockIcon_click() { - createController(); - - ArgumentCaptor longClickCaptor = ArgumentCaptor.forClass( - View.OnLongClickListener.class); - ArgumentCaptor clickCaptor = ArgumentCaptor.forClass( - View.OnClickListener.class); - verify(mLockIcon).setOnLongClickListener(longClickCaptor.capture()); - verify(mLockIcon).setOnClickListener(clickCaptor.capture()); - - when(mAccessibilityController.isAccessibilityEnabled()).thenReturn(true); - clickCaptor.getValue().onClick(mLockIcon); - verify(mShadeController).animateCollapsePanels(anyInt(), eq(true)); - - longClickCaptor.getValue().onLongClick(mLockIcon); - verify(mLockPatternUtils).requireCredentialEntry(anyInt()); - verify(mKeyguardUpdateMonitor).onLockIconPressed(); - } - @Test public void updateMonitor_listenerUpdatesIndication() { createController(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java new file mode 100644 index 0000000000000..db0db5f3921a9 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java @@ -0,0 +1,91 @@ +/* + * 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.statusbar.phone; + +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.view.View; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import com.android.internal.widget.LockPatternUtils; +import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.statusbar.KeyguardIndicationController; +import com.android.systemui.statusbar.policy.AccessibilityController; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@SmallTest +@RunWith(AndroidJUnit4.class) +public class LockscreenIconControllerTest extends SysuiTestCase { + private LockscreenLockIconController mLockIconController; + @Mock + private LockscreenGestureLogger mLockscreenGestureLogger; + @Mock + private KeyguardUpdateMonitor mKeyguardUpdateMonitor; + @Mock + private LockPatternUtils mLockPatternUtils; + @Mock + private ShadeController mShadeController; + @Mock + private AccessibilityController mAccessibilityController; + @Mock + private KeyguardIndicationController mKeyguardIndicationController; + @Mock + private LockIcon mLockIcon; // TODO: make this not a mock once inject is removed. + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + mLockIconController = new LockscreenLockIconController( + mLockscreenGestureLogger, mKeyguardUpdateMonitor, mLockPatternUtils, + mShadeController, mAccessibilityController, mKeyguardIndicationController); + + mLockIconController.attach(mLockIcon); + } + + @Test + public void lockIcon_click() { + ArgumentCaptor longClickCaptor = ArgumentCaptor.forClass( + View.OnLongClickListener.class); + ArgumentCaptor clickCaptor = ArgumentCaptor.forClass( + View.OnClickListener.class); + + // TODO: once we use a real LockIcon instead of a mock, remove all this. + verify(mLockIcon).setOnLongClickListener(longClickCaptor.capture()); + verify(mLockIcon).setOnClickListener(clickCaptor.capture()); + + when(mAccessibilityController.isAccessibilityEnabled()).thenReturn(true); + clickCaptor.getValue().onClick(new View(mContext)); + verify(mShadeController).animateCollapsePanels(anyInt(), eq(true)); + + longClickCaptor.getValue().onLongClick(new View(mContext)); + verify(mLockPatternUtils).requireCredentialEntry(anyInt()); + verify(mKeyguardUpdateMonitor).onLockIconPressed(); + } +} 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 5253e2ca9e42f..0adefe82f66a9 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 @@ -402,6 +402,7 @@ public class StatusBarTest extends SysuiTestCase { mExtensionController, mUserInfoControllerImpl, mPhoneStatusBarPolicy, + mKeyguardIndicationController, mDismissCallbackRegistry, mStatusBarTouchableRegionManager); diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockFake.java b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockFake.java index ef20df2f02143..553b8a42edc80 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockFake.java +++ b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockFake.java @@ -16,6 +16,8 @@ package com.android.systemui.util.wakelock; +import android.content.Context; + import com.android.internal.util.Preconditions; public class WakeLockFake implements WakeLock { @@ -48,4 +50,24 @@ public class WakeLockFake implements WakeLock { public boolean isHeld() { return mAcquired > 0; } + + public static class Builder extends WakeLock.Builder { + private WakeLock mWakeLock; + + public Builder(Context context) { + super(context); + } + + public void setWakeLock(WakeLock wakeLock) { + mWakeLock = wakeLock; + } + + public WakeLock build() { + if (mWakeLock != null) { + return mWakeLock; + } + + return super.build(); + } + } } From e8c6f05e691ab72cc8d953c094262b7281da619b Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Thu, 27 Feb 2020 17:45:28 -0500 Subject: [PATCH 2/3] Remove the OnUserInfoChangedListener implementation from LockIcon. Evidently this isn't used? Bug: 150393918 Test: atest SystemUITests && manual Change-Id: I47524687462bb300351f86a6bc1184ca9613b1c4 --- .../com/android/systemui/statusbar/phone/LockIcon.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index 61cef6827bd3f..672581665d36f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -54,7 +54,6 @@ import com.android.systemui.statusbar.policy.AccessibilityController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; -import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -65,7 +64,7 @@ import javax.inject.Named; /** * Manages the different states and animations of the unlock icon. */ -public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChangedListener, +public class LockIcon extends KeyguardAffordanceView implements StatusBarStateController.StateListener, ConfigurationController.ConfigurationListener, KeyguardStateController.Callback, NotificationWakeUpCoordinator.WakeUpListener, ViewTreeObserver.OnPreDrawListener, OnHeadsUpChangedListener { @@ -236,11 +235,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange updateDarkTint(); } - @Override - public void onUserInfoChanged(String name, Drawable picture, String userAccount) { - update(); - } - /** * If we're currently presenting an authentication error message. */ From eba1eba35ba7a2db2bbfff848b9473b4cda65162 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Thu, 27 Feb 2020 17:57:26 -0500 Subject: [PATCH 3/3] Move SB.StateListener from LockIcon to Controller. Remove StatusBarStateController from LockIcon constructor. Bug: 150393918 Test: atest SystemUITests Change-Id: I43579f0a1d32b1dc9d8cdd06f59878081d456013 --- .../systemui/statusbar/phone/LockIcon.java | 82 +++++------------- .../phone/LockscreenLockIconController.java | 86 ++++++++++++++++++- .../phone/LockscreenIconControllerTest.java | 9 +- 3 files changed, 116 insertions(+), 61 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index 672581665d36f..c29ec9eeaf56f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -22,7 +22,6 @@ import android.annotation.IntDef; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Configuration; -import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.drawable.Animatable2; import android.graphics.drawable.AnimatedVectorDrawable; @@ -32,7 +31,6 @@ import android.os.Trace; import android.provider.Settings; import android.text.TextUtils; import android.util.AttributeSet; -import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityNodeInfo; @@ -45,13 +43,11 @@ import com.android.systemui.Dependency; import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.dock.DockManager; -import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.KeyguardAffordanceView; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; import com.android.systemui.statusbar.phone.ScrimController.ScrimVisibility; import com.android.systemui.statusbar.policy.AccessibilityController; -import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; @@ -65,7 +61,6 @@ import javax.inject.Named; * Manages the different states and animations of the unlock icon. */ public class LockIcon extends KeyguardAffordanceView implements - StatusBarStateController.StateListener, ConfigurationController.ConfigurationListener, KeyguardStateController.Callback, NotificationWakeUpCoordinator.WakeUpListener, ViewTreeObserver.OnPreDrawListener, OnHeadsUpChangedListener { @@ -73,8 +68,6 @@ public class LockIcon extends KeyguardAffordanceView implements private static final int STATE_LOCK_OPEN = 1; private static final int STATE_SCANNING_FACE = 2; private static final int STATE_BIOMETRICS_ERROR = 3; - private final ConfigurationController mConfigurationController; - private final StatusBarStateController mStatusBarStateController; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final AccessibilityController mAccessibilityController; private final DockManager mDockManager; @@ -102,6 +95,7 @@ public class LockIcon extends KeyguardAffordanceView implements private boolean mKeyguardJustShown; private boolean mUpdatePending; private boolean mBouncerPreHideAnimation; + private int mStatusBarState = StatusBarState.SHADE; private final KeyguardStateController.Callback mKeyguardMonitorCallback = new KeyguardStateController.Callback() { @@ -176,8 +170,6 @@ public class LockIcon extends KeyguardAffordanceView implements @Inject public LockIcon(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, - StatusBarStateController statusBarStateController, - ConfigurationController configurationController, AccessibilityController accessibilityController, KeyguardBypassController bypassController, NotificationWakeUpCoordinator wakeUpCoordinator, @@ -188,8 +180,6 @@ public class LockIcon extends KeyguardAffordanceView implements mContext = context; mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class); mAccessibilityController = accessibilityController; - mConfigurationController = configurationController; - mStatusBarStateController = statusBarStateController; mBypassController = bypassController; mWakeUpCoordinator = wakeUpCoordinator; mKeyguardStateController = keyguardStateController; @@ -200,8 +190,6 @@ public class LockIcon extends KeyguardAffordanceView implements @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - mStatusBarStateController.addCallback(this); - mConfigurationController.addCallback(this); mKeyguardStateController.addCallback(mKeyguardMonitorCallback); mKeyguardUpdateMonitor.registerCallback(mUpdateMonitorCallback); mWakeUpCoordinator.addListener(this); @@ -209,15 +197,12 @@ public class LockIcon extends KeyguardAffordanceView implements if (mDockManager != null) { mDockManager.addListener(mDockEventListener); } - onThemeChanged(); update(); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - mStatusBarStateController.removeCallback(this); - mConfigurationController.removeCallback(this); mKeyguardUpdateMonitor.removeCallback(mUpdateMonitorCallback); mKeyguardStateController.removeCallback(mKeyguardMonitorCallback); mWakeUpCoordinator.removeListener(this); @@ -226,15 +211,6 @@ public class LockIcon extends KeyguardAffordanceView implements } } - @Override - public void onThemeChanged() { - TypedArray typedArray = mContext.getTheme().obtainStyledAttributes( - null, new int[]{ R.attr.wallpaperTextColor }, 0, 0); - mIconColor = typedArray.getColor(0, Color.WHITE); - typedArray.recycle(); - updateDarkTint(); - } - /** * If we're currently presenting an authentication error message. */ @@ -336,7 +312,7 @@ public class LockIcon extends KeyguardAffordanceView implements || mShowingLaunchAffordance; if (mBypassController.getBypassEnabled() && !mBouncerShowingScrimmed) { if ((mHeadsUpManager.isHeadsUpGoingAway() || mHeadsUpManager.hasPinnedHeadsUp() - || mStatusBarStateController.getState() == StatusBarState.KEYGUARD) + || mStatusBarState == StatusBarState.KEYGUARD) && !mWakeUpCoordinator.getNotificationsFullyHidden()) { invisible = true; } @@ -473,6 +449,11 @@ public class LockIcon extends KeyguardAffordanceView implements update(); } + void setIconColor(int iconColor) { + mIconColor = iconColor; + updateDarkTint(); + } + @Retention(RetentionPolicy.SOURCE) @IntDef({ERROR, UNLOCK, LOCK, SCANNING}) @interface LockAnimIndex {} @@ -532,12 +513,6 @@ public class LockIcon extends KeyguardAffordanceView implements } } - @Override - public void onDozeAmountChanged(float linear, float eased) { - mDozeAmount = eased; - updateDarkTint(); - } - /** * When keyguard is in pulsing (AOD2) state. * @param pulsing {@code true} when pulsing. @@ -547,38 +522,11 @@ public class LockIcon extends KeyguardAffordanceView implements update(); } - /** - * Sets the dozing state of the keyguard. - */ - @Override - public void onDozingChanged(boolean dozing) { - mDozing = dozing; - update(); - } - private void updateDarkTint() { int color = ColorUtils.blendARGB(mIconColor, Color.WHITE, mDozeAmount); setImageTintList(ColorStateList.valueOf(color)); } - @Override - public void onDensityOrFontScaleChanged() { - ViewGroup.LayoutParams lp = getLayoutParams(); - if (lp == null) { - return; - } - lp.width = getResources().getDimensionPixelSize(R.dimen.keyguard_lock_width); - lp.height = getResources().getDimensionPixelSize(R.dimen.keyguard_lock_height); - setLayoutParams(lp); - update(true /* force */); - } - - @Override - public void onLocaleListChanged() { - setContentDescription(getContext().getText(R.string.accessibility_unlock_button)); - update(true /* force */); - } - /** * We need to hide the lock whenever there's a fingerprint unlock, otherwise you'll see the * icon on top of the black front scrim. @@ -614,4 +562,20 @@ public class LockIcon extends KeyguardAffordanceView implements update(); } } + + void setDozing(boolean dozing) { + mDozing = dozing; + update(); + } + + void setDozeAmount(float dozeAmount) { + mDozeAmount = dozeAmount; + updateDarkTint(); + } + + /** Set the StatusBarState. */ + public void setStatusBarState(int statusBarState) { + mStatusBarState = statusBarState; + updateIconVisibility(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java index f764a2780a536..698a430c389ec 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java @@ -16,15 +16,21 @@ package com.android.systemui.statusbar.phone; +import android.content.res.TypedArray; +import android.graphics.Color; import android.view.View; +import android.view.ViewGroup; import com.android.internal.logging.nano.MetricsProto; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.R; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.KeyguardIndicationController; import com.android.systemui.statusbar.policy.AccessibilityController; +import com.android.systemui.statusbar.policy.ConfigurationController; +import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; import javax.inject.Inject; import javax.inject.Singleton; @@ -39,21 +45,93 @@ public class LockscreenLockIconController { private final ShadeController mShadeController; private final AccessibilityController mAccessibilityController; private final KeyguardIndicationController mKeyguardIndicationController; + private final StatusBarStateController mStatusBarStateController; + private final ConfigurationController mConfigurationController; private LockIcon mLockIcon; + private View.OnAttachStateChangeListener mOnAttachStateChangeListener = + new View.OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View v) { + mStatusBarStateController.addCallback(mSBStateListener); + mConfigurationController.addCallback(mConfigurationListener); + + mConfigurationListener.onThemeChanged(); + } + + @Override + public void onViewDetachedFromWindow(View v) { + mStatusBarStateController.removeCallback(mSBStateListener); + mConfigurationController.removeCallback(mConfigurationListener); + } + }; + + private final StatusBarStateController.StateListener mSBStateListener = + new StatusBarStateController.StateListener() { + @Override + public void onDozingChanged(boolean isDozing) { + mLockIcon.setDozing(isDozing); + } + + @Override + public void onDozeAmountChanged(float linear, float eased) { + mLockIcon.setDozeAmount(eased); + } + + @Override + public void onStateChanged(int newState) { + mLockIcon.setStatusBarState(newState); + } + }; + + private final ConfigurationListener mConfigurationListener = new ConfigurationListener() { + @Override + public void onThemeChanged() { + TypedArray typedArray = mLockIcon.getContext().getTheme().obtainStyledAttributes( + null, new int[]{ R.attr.wallpaperTextColor }, 0, 0); + int iconColor = typedArray.getColor(0, Color.WHITE); + typedArray.recycle(); + mLockIcon.setIconColor(iconColor); + } + + @Override + public void onDensityOrFontScaleChanged() { + ViewGroup.LayoutParams lp = mLockIcon.getLayoutParams(); + if (lp == null) { + return; + } + lp.width = mLockIcon.getResources().getDimensionPixelSize(R.dimen.keyguard_lock_width); + lp.height = mLockIcon.getResources().getDimensionPixelSize( + R.dimen.keyguard_lock_height); + mLockIcon.setLayoutParams(lp); + mLockIcon.update(true /* force */); + } + + @Override + public void onLocaleListChanged() { + mLockIcon.setContentDescription( + mLockIcon.getResources().getText(R.string.accessibility_unlock_button)); + mLockIcon.update(true /* force */); + } + }; + @Inject public LockscreenLockIconController(LockscreenGestureLogger lockscreenGestureLogger, KeyguardUpdateMonitor keyguardUpdateMonitor, LockPatternUtils lockPatternUtils, ShadeController shadeController, AccessibilityController accessibilityController, - KeyguardIndicationController keyguardIndicationController) { + KeyguardIndicationController keyguardIndicationController, + StatusBarStateController statusBarStateController, + ConfigurationController configurationController) { mLockscreenGestureLogger = lockscreenGestureLogger; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mLockPatternUtils = lockPatternUtils; mShadeController = shadeController; mAccessibilityController = accessibilityController; mKeyguardIndicationController = keyguardIndicationController; + mStatusBarStateController = statusBarStateController; + mConfigurationController = configurationController; mKeyguardIndicationController.setLockIconController(this); } @@ -66,6 +144,12 @@ public class LockscreenLockIconController { mLockIcon.setOnClickListener(this::handleClick); mLockIcon.setOnLongClickListener(this::handleLongClick); + + if (mLockIcon.isAttachedToWindow()) { + mOnAttachStateChangeListener.onViewAttachedToWindow(mLockIcon); + } + mLockIcon.addOnAttachStateChangeListener(mOnAttachStateChangeListener); + mLockIcon.setStatusBarState(mStatusBarStateController.getState()); } public LockIcon getView() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java index db0db5f3921a9..05f10e376f619 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java @@ -29,8 +29,10 @@ import androidx.test.runner.AndroidJUnit4; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.KeyguardIndicationController; import com.android.systemui.statusbar.policy.AccessibilityController; +import com.android.systemui.statusbar.policy.ConfigurationController; import org.junit.Before; import org.junit.Test; @@ -57,6 +59,10 @@ public class LockscreenIconControllerTest extends SysuiTestCase { private KeyguardIndicationController mKeyguardIndicationController; @Mock private LockIcon mLockIcon; // TODO: make this not a mock once inject is removed. + @Mock + private StatusBarStateController mStatusBarStateController; + @Mock + private ConfigurationController mConfigurationController; @Before public void setUp() { @@ -64,7 +70,8 @@ public class LockscreenIconControllerTest extends SysuiTestCase { mLockIconController = new LockscreenLockIconController( mLockscreenGestureLogger, mKeyguardUpdateMonitor, mLockPatternUtils, - mShadeController, mAccessibilityController, mKeyguardIndicationController); + mShadeController, mAccessibilityController, mKeyguardIndicationController, + mStatusBarStateController, mConfigurationController); mLockIconController.attach(mLockIcon); }