From eba1eba35ba7a2db2bbfff848b9473b4cda65162 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Thu, 27 Feb 2020 17:57:26 -0500 Subject: [PATCH] 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); }