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 c29ec9eeaf56f..cf9d43eeff73d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -26,7 +26,6 @@ import android.graphics.Color; import android.graphics.drawable.Animatable2; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; -import android.hardware.biometrics.BiometricSourceType; import android.os.Trace; import android.provider.Settings; import android.text.TextUtils; @@ -34,22 +33,17 @@ import android.util.AttributeSet; import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityNodeInfo; -import androidx.annotation.Nullable; - import com.android.internal.graphics.ColorUtils; import com.android.keyguard.KeyguardUpdateMonitor; -import com.android.keyguard.KeyguardUpdateMonitorCallback; 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.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.KeyguardStateController; -import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -61,8 +55,7 @@ import javax.inject.Named; * Manages the different states and animations of the unlock icon. */ public class LockIcon extends KeyguardAffordanceView implements - KeyguardStateController.Callback, NotificationWakeUpCoordinator.WakeUpListener, - ViewTreeObserver.OnPreDrawListener, OnHeadsUpChangedListener { + ViewTreeObserver.OnPreDrawListener { private static final int STATE_LOCKED = 0; private static final int STATE_LOCK_OPEN = 1; @@ -70,7 +63,6 @@ public class LockIcon extends KeyguardAffordanceView implements private static final int STATE_BIOMETRICS_ERROR = 3; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final AccessibilityController mAccessibilityController; - private final DockManager mDockManager; private final KeyguardStateController mKeyguardStateController; private final KeyguardBypassController mBypassController; private final NotificationWakeUpCoordinator mWakeUpCoordinator; @@ -130,43 +122,6 @@ public class LockIcon extends KeyguardAffordanceView implements update(); } }; - private final DockManager.DockEventListener mDockEventListener = - new DockManager.DockEventListener() { - @Override - public void onEvent(int event) { - boolean docked = event == DockManager.STATE_DOCKED - || event == DockManager.STATE_DOCKED_HIDE; - if (docked != mDocked) { - mDocked = docked; - update(); - } - } - }; - - private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback = - new KeyguardUpdateMonitorCallback() { - @Override - public void onSimStateChanged(int subId, int slotId, int simState) { - mSimLocked = mKeyguardUpdateMonitor.isSimPinSecure(); - update(); - } - - @Override - public void onKeyguardVisibilityChanged(boolean showing) { - update(); - } - - @Override - public void onBiometricRunningStateChanged(boolean running, - BiometricSourceType biometricSourceType) { - update(); - } - - @Override - public void onStrongAuthStateChanged(int userId) { - update(); - } - }; @Inject public LockIcon(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, @@ -174,7 +129,6 @@ public class LockIcon extends KeyguardAffordanceView implements KeyguardBypassController bypassController, NotificationWakeUpCoordinator wakeUpCoordinator, KeyguardStateController keyguardStateController, - @Nullable DockManager dockManager, HeadsUpManagerPhone headsUpManager) { super(context, attrs); mContext = context; @@ -183,7 +137,6 @@ public class LockIcon extends KeyguardAffordanceView implements mBypassController = bypassController; mWakeUpCoordinator = wakeUpCoordinator; mKeyguardStateController = keyguardStateController; - mDockManager = dockManager; mHeadsUpManager = headsUpManager; } @@ -191,24 +144,14 @@ public class LockIcon extends KeyguardAffordanceView implements protected void onAttachedToWindow() { super.onAttachedToWindow(); mKeyguardStateController.addCallback(mKeyguardMonitorCallback); - mKeyguardUpdateMonitor.registerCallback(mUpdateMonitorCallback); - mWakeUpCoordinator.addListener(this); mSimLocked = mKeyguardUpdateMonitor.isSimPinSecure(); - if (mDockManager != null) { - mDockManager.addListener(mDockEventListener); - } update(); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - mKeyguardUpdateMonitor.removeCallback(mUpdateMonitorCallback); mKeyguardStateController.removeCallback(mKeyguardMonitorCallback); - mWakeUpCoordinator.removeListener(this); - if (mDockManager != null) { - mDockManager.removeListener(mDockEventListener); - } } /** @@ -306,7 +249,7 @@ public class LockIcon extends KeyguardAffordanceView implements * Update the icon visibility * @return true if the visibility changed */ - private boolean updateIconVisibility() { + boolean updateIconVisibility() { boolean onAodNotPulsingOrDocked = mDozing && (!mPulsing || mDocked); boolean invisible = onAodNotPulsingOrDocked || mWakeAndUnlockRunning || mShowingLaunchAffordance; @@ -424,16 +367,6 @@ public class LockIcon extends KeyguardAffordanceView implements return -1; } - @Override - public void onFullyHiddenChanged(boolean isFullyHidden) { - if (mBypassController.getBypassEnabled()) { - boolean changed = updateIconVisibility(); - if (changed) { - update(); - } - } - } - public void setBouncerShowingScrimmed(boolean bouncerShowing) { mBouncerShowingScrimmed = bouncerShowing; if (mBypassController.getBypassEnabled()) { @@ -454,6 +387,18 @@ public class LockIcon extends KeyguardAffordanceView implements updateDarkTint(); } + void setSimLocked(boolean simLocked) { + mSimLocked = simLocked; + } + + /** Set if the device is docked. */ + public void setDocked(boolean docked) { + if (mDocked != docked) { + mDocked = docked; + update(); + } + } + @Retention(RetentionPolicy.SOURCE) @IntDef({ERROR, UNLOCK, LOCK, SCANNING}) @interface LockAnimIndex {} 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 698a430c389ec..2b1a8a472d9e0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java @@ -18,20 +18,29 @@ package com.android.systemui.statusbar.phone; import android.content.res.TypedArray; import android.graphics.Color; +import android.hardware.biometrics.BiometricSourceType; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.Nullable; + import com.android.internal.logging.nano.MetricsProto; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.R; +import com.android.systemui.dock.DockManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.KeyguardIndicationController; +import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; +import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator.WakeUpListener; import com.android.systemui.statusbar.policy.AccessibilityController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; +import java.util.Optional; + import javax.inject.Inject; import javax.inject.Singleton; @@ -47,6 +56,9 @@ public class LockscreenLockIconController { private final KeyguardIndicationController mKeyguardIndicationController; private final StatusBarStateController mStatusBarStateController; private final ConfigurationController mConfigurationController; + private final NotificationWakeUpCoordinator mNotificationWakeUpCoordinator; + private final KeyguardBypassController mKeyguardBypassController; + private final Optional mDockManager; private LockIcon mLockIcon; private View.OnAttachStateChangeListener mOnAttachStateChangeListener = @@ -55,6 +67,10 @@ public class LockscreenLockIconController { public void onViewAttachedToWindow(View v) { mStatusBarStateController.addCallback(mSBStateListener); mConfigurationController.addCallback(mConfigurationListener); + mNotificationWakeUpCoordinator.addListener(mWakeUpListener); + mKeyguardUpdateMonitor.registerCallback(mUpdateMonitorCallback); + + mDockManager.ifPresent(dockManager -> dockManager.addListener(mDockEventListener)); mConfigurationListener.onThemeChanged(); } @@ -63,6 +79,11 @@ public class LockscreenLockIconController { public void onViewDetachedFromWindow(View v) { mStatusBarStateController.removeCallback(mSBStateListener); mConfigurationController.removeCallback(mConfigurationListener); + mNotificationWakeUpCoordinator.removeListener(mWakeUpListener); + mKeyguardUpdateMonitor.removeCallback(mUpdateMonitorCallback); + + + mDockManager.ifPresent(dockManager -> dockManager.removeListener(mDockEventListener)); } }; @@ -115,6 +136,47 @@ public class LockscreenLockIconController { } }; + private final WakeUpListener mWakeUpListener = new WakeUpListener() { + @Override + public void onFullyHiddenChanged(boolean isFullyHidden) { + if (mKeyguardBypassController.getBypassEnabled()) { + boolean changed = mLockIcon.updateIconVisibility(); + if (changed) { + mLockIcon.update(); + } + } + } + }; + + private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback = + new KeyguardUpdateMonitorCallback() { + @Override + public void onSimStateChanged(int subId, int slotId, int simState) { + mLockIcon.setSimLocked(mKeyguardUpdateMonitor.isSimPinSecure()); + mLockIcon.update(); + } + + @Override + public void onKeyguardVisibilityChanged(boolean showing) { + mLockIcon.update(); + } + + @Override + public void onBiometricRunningStateChanged(boolean running, + BiometricSourceType biometricSourceType) { + mLockIcon.update(); + } + + @Override + public void onStrongAuthStateChanged(int userId) { + mLockIcon.update(); + } + }; + + private final DockManager.DockEventListener mDockEventListener = + event -> mLockIcon.setDocked(event == DockManager.STATE_DOCKED + || event == DockManager.STATE_DOCKED_HIDE); + @Inject public LockscreenLockIconController(LockscreenGestureLogger lockscreenGestureLogger, KeyguardUpdateMonitor keyguardUpdateMonitor, @@ -123,7 +185,10 @@ public class LockscreenLockIconController { AccessibilityController accessibilityController, KeyguardIndicationController keyguardIndicationController, StatusBarStateController statusBarStateController, - ConfigurationController configurationController) { + ConfigurationController configurationController, + NotificationWakeUpCoordinator notificationWakeUpCoordinator, + KeyguardBypassController keyguardBypassController, + @Nullable DockManager dockManager) { mLockscreenGestureLogger = lockscreenGestureLogger; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mLockPatternUtils = lockPatternUtils; @@ -132,6 +197,9 @@ public class LockscreenLockIconController { mKeyguardIndicationController = keyguardIndicationController; mStatusBarStateController = statusBarStateController; mConfigurationController = configurationController; + mNotificationWakeUpCoordinator = notificationWakeUpCoordinator; + mKeyguardBypassController = keyguardBypassController; + mDockManager = dockManager == null ? Optional.empty() : Optional.of(dockManager); mKeyguardIndicationController.setLockIconController(this); } 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 05f10e376f619..487885ac244e6 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.dock.DockManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.KeyguardIndicationController; +import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; import com.android.systemui.statusbar.policy.AccessibilityController; import com.android.systemui.statusbar.policy.ConfigurationController; @@ -63,6 +65,13 @@ public class LockscreenIconControllerTest extends SysuiTestCase { private StatusBarStateController mStatusBarStateController; @Mock private ConfigurationController mConfigurationController; + @Mock + private NotificationWakeUpCoordinator mNotificationWakeUpCoordinator; + @Mock + private KeyguardBypassController mKeyguardBypassController; + @Mock + private DockManager mDockManager; + @Before public void setUp() { @@ -71,7 +80,8 @@ public class LockscreenIconControllerTest extends SysuiTestCase { mLockIconController = new LockscreenLockIconController( mLockscreenGestureLogger, mKeyguardUpdateMonitor, mLockPatternUtils, mShadeController, mAccessibilityController, mKeyguardIndicationController, - mStatusBarStateController, mConfigurationController); + mStatusBarStateController, mConfigurationController, mNotificationWakeUpCoordinator, + mKeyguardBypassController, mDockManager); mLockIconController.attach(mLockIcon); }