From 94d6c35f3305afd0f29c913a6df3ba06c1b98fb3 Mon Sep 17 00:00:00 2001 From: Beverly Date: Wed, 7 Jul 2021 16:41:47 -0400 Subject: [PATCH] Allow bypass + show errors on alt bouncer - Show the keyguard bouncer errors so users are aware of auth errors - Also fixes a bug where we wouldn't proceed to the activity (ie: notification click) if the user authenticated from the alt bouncer using passive auth. now, the bypass logic includes when the alt bouncer is showing. Test: manual Fixes: 186313318 Fixes: 192355757 Change-Id: I3caffd2e89b9ae596b11ca4a05665db53491c2d2 --- .../android/keyguard/KeyguardMessageArea.java | 14 +++++- .../KeyguardMessageAreaController.java | 9 +++- .../KeyguardIndicationController.java | 13 +++++- .../phone/BiometricUnlockController.java | 3 +- .../phone/KeyguardBypassController.kt | 3 ++ .../phone/StatusBarKeyguardViewManager.java | 43 ++++++++++++++----- .../StatusBarKeyguardViewManagerTest.java | 11 ++++- 7 files changed, 79 insertions(+), 17 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java b/packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java index 568bea0e2d24b..62411dbff5fdc 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java @@ -54,6 +54,7 @@ public class KeyguardMessageArea extends TextView implements SecurityMessageDisp private CharSequence mMessage; private ColorStateList mNextMessageColorState = ColorStateList.valueOf(DEFAULT_COLOR); private boolean mBouncerVisible; + private boolean mAltBouncerShowing; public KeyguardMessageArea(Context context, AttributeSet attrs) { super(context, attrs); @@ -144,7 +145,8 @@ public class KeyguardMessageArea extends TextView implements SecurityMessageDisp void update() { CharSequence status = mMessage; - setVisibility(TextUtils.isEmpty(status) || !mBouncerVisible ? INVISIBLE : VISIBLE); + setVisibility(TextUtils.isEmpty(status) || (!mBouncerVisible && !mAltBouncerShowing) + ? INVISIBLE : VISIBLE); setText(status); ColorStateList colorState = mDefaultColorState; if (mNextMessageColorState.getDefaultColor() != DEFAULT_COLOR) { @@ -158,6 +160,16 @@ public class KeyguardMessageArea extends TextView implements SecurityMessageDisp mBouncerVisible = bouncerVisible; } + /** + * Set whether the alt bouncer is showing + */ + void setAltBouncerShowing(boolean showing) { + if (mAltBouncerShowing != showing) { + mAltBouncerShowing = showing; + update(); + } + } + /** * Runnable used to delay accessibility announcements. */ diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardMessageAreaController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardMessageAreaController.java index 6e40f025da503..51ded3fcafdf1 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardMessageAreaController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardMessageAreaController.java @@ -28,7 +28,7 @@ import javax.inject.Inject; public class KeyguardMessageAreaController extends ViewController { private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final ConfigurationController mConfigurationController; - + private boolean mAltBouncerShowing; private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { public void onFinishedGoingToSleep(int why) { @@ -81,6 +81,13 @@ public class KeyguardMessageAreaController extends ViewController true + altBouncerShowing -> true statusBarStateController.state != StatusBarState.KEYGUARD -> false launchingAffordance -> false isPulseExpanding || qSExpanded -> false @@ -210,6 +212,7 @@ open class KeyguardBypassController : Dumpable { pw.println(" bypassEnabled: $bypassEnabled") pw.println(" canBypass: ${canBypass()}") pw.println(" bouncerShowing: $bouncerShowing") + pw.println(" altBouncerShowing: $altBouncerShowing") pw.println(" isPulseExpanding: $isPulseExpanding") pw.println(" launchingAffordance: $launchingAffordance") pw.println(" qSExpanded: $qSExpanded") diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index a6613d0b8d3d4..6f63b1780d685 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -42,6 +42,8 @@ import androidx.annotation.VisibleForTesting; import com.android.internal.util.LatencyTracker; import com.android.internal.widget.LockPatternUtils; +import com.android.keyguard.KeyguardMessageArea; +import com.android.keyguard.KeyguardMessageAreaController; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.keyguard.KeyguardViewController; @@ -107,6 +109,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb private final KeyguardBouncer.Factory mKeyguardBouncerFactory; private final WakefulnessLifecycle mWakefulnessLifecycle; private final UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; + private final KeyguardMessageAreaController.Factory mKeyguardMessageAreaFactory; + private KeyguardMessageAreaController mKeyguardMessageAreaController; private final BouncerExpansionCallback mExpansionCallback = new BouncerExpansionCallback() { @Override public void onFullyShown() { @@ -238,7 +242,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb NotificationMediaManager notificationMediaManager, KeyguardBouncer.Factory keyguardBouncerFactory, WakefulnessLifecycle wakefulnessLifecycle, - UnlockedScreenOffAnimationController unlockedScreenOffAnimationController) { + UnlockedScreenOffAnimationController unlockedScreenOffAnimationController, + KeyguardMessageAreaController.Factory keyguardMessageAreaFactory) { mContext = context; mViewMediatorCallback = callback; mLockPatternUtils = lockPatternUtils; @@ -254,6 +259,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mKeyguardBouncerFactory = keyguardBouncerFactory; mWakefulnessLifecycle = wakefulnessLifecycle; mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController; + mKeyguardMessageAreaFactory = keyguardMessageAreaFactory; } @Override @@ -271,6 +277,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb notificationPanelViewController.addExpansionListener(this); mBypassController = bypassController; mNotificationContainer = notificationContainer; + mKeyguardMessageAreaController = mKeyguardMessageAreaFactory.create( + KeyguardMessageArea.findSecurityMessageDisplay(container)); mFaceAuthScreenBrightnessController.ifPresent((it) -> { View overlay = new View(mContext); container.addView(overlay); @@ -412,9 +420,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb */ public void showGenericBouncer(boolean scrimmed) { if (mAlternateAuthInterceptor != null) { - if (mAlternateAuthInterceptor.showAlternateAuthBouncer()) { - mStatusBar.updateScrimController(); - } + updateAlternateAuthShowing(mAlternateAuthInterceptor.showAlternateAuthBouncer()); return; } @@ -481,9 +487,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mKeyguardGoneCancelAction = null; } - if (mAlternateAuthInterceptor.showAlternateAuthBouncer()) { - mStatusBar.updateScrimController(); - } + updateAlternateAuthShowing(mAlternateAuthInterceptor.showAlternateAuthBouncer()); return; } @@ -536,9 +540,19 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb * Stop showing any alternate auth methods */ public void resetAlternateAuth(boolean forceUpdateScrim) { - if ((mAlternateAuthInterceptor != null + final boolean updateScrim = (mAlternateAuthInterceptor != null && mAlternateAuthInterceptor.hideAlternateAuthBouncer()) - || forceUpdateScrim) { + || forceUpdateScrim; + updateAlternateAuthShowing(updateScrim); + } + + private void updateAlternateAuthShowing(boolean updateScrim) { + if (mKeyguardMessageAreaController != null) { + mKeyguardMessageAreaController.setAltBouncerShowing(isShowingAlternateAuth()); + } + mBypassController.setAltBouncerShowing(isShowingAlternateAuth()); + + if (updateScrim) { mStatusBar.updateScrimController(); } } @@ -875,7 +889,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @Override public boolean isBouncerShowing() { - return mBouncer.isShowing(); + return mBouncer.isShowing() || isShowingAlternateAuth(); } @Override @@ -1089,7 +1103,14 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } public void showBouncerMessage(String message, ColorStateList colorState) { - mBouncer.showMessage(message, colorState); + if (isShowingAlternateAuth()) { + if (mKeyguardMessageAreaController != null) { + mKeyguardMessageAreaController.setNextMessageColor(colorState); + mKeyguardMessageAreaController.setMessage(message); + } + } else { + mBouncer.showMessage(message, colorState); + } } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java index d293bb64552ee..c39a9061f95d4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyFloat; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doReturn; @@ -38,6 +39,8 @@ import android.view.ViewGroup; import androidx.test.filters.SmallTest; import com.android.internal.widget.LockPatternUtils; +import com.android.keyguard.KeyguardMessageArea; +import com.android.keyguard.KeyguardMessageAreaController; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.ViewMediatorCallback; import com.android.systemui.SysuiTestCase; @@ -93,9 +96,13 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { @Mock private KeyguardBouncer.Factory mKeyguardBouncerFactory; @Mock + private KeyguardMessageAreaController.Factory mKeyguardMessageAreaFactory; + @Mock private KeyguardBouncer mBouncer; @Mock private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; + @Mock + private KeyguardMessageArea mKeyguardMessageArea; private WakefulnessLifecycle mWakefulnessLifecycle; private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; @@ -108,6 +115,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { any(KeyguardBouncer.BouncerExpansionCallback.class))) .thenReturn(mBouncer); + when(mContainer.findViewById(anyInt())).thenReturn(mKeyguardMessageArea); mWakefulnessLifecycle = new WakefulnessLifecycle(getContext(), null); mStatusBarKeyguardViewManager = new StatusBarKeyguardViewManager( getContext(), @@ -124,7 +132,8 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { mock(NotificationMediaManager.class), mKeyguardBouncerFactory, mWakefulnessLifecycle, - mUnlockedScreenOffAnimationController); + mUnlockedScreenOffAnimationController, + mKeyguardMessageAreaFactory); mStatusBarKeyguardViewManager.registerStatusBar(mStatusBar, mContainer, mNotificationPanelView, mBiometrucUnlockController, mNotificationContainer, mBypassController);