From 50b6ecd924089bc1f00f941e9ed3b1f442bd4683 Mon Sep 17 00:00:00 2001 From: Beverly Date: Thu, 17 Nov 2022 19:05:03 +0000 Subject: [PATCH] Fix NPE before CentralSurfaces is registered Test: atest StatusBarKeyguardViewManagerTest Fixes: 259351782 Change-Id: Id397230fbd2b67ef8516e17254e13b5c79284e24 --- .../phone/StatusBarKeyguardViewManager.java | 10 ++++-- .../StatusBarKeyguardViewManagerTest.java | 36 +++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) 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 01a1ebe7fd686..5f5af22acfd2c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -218,7 +218,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb protected LockPatternUtils mLockPatternUtils; protected ViewMediatorCallback mViewMediatorCallback; - protected CentralSurfaces mCentralSurfaces; + @Nullable protected CentralSurfaces mCentralSurfaces; private NotificationPanelViewController mNotificationPanelViewController; private BiometricUnlockController mBiometricUnlockController; private boolean mCentralSurfacesRegistered; @@ -266,7 +266,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb private final KeyguardUpdateMonitor mKeyguardUpdateManager; private final LatencyTracker mLatencyTracker; private final KeyguardSecurityModel mKeyguardSecurityModel; - private KeyguardBypassController mBypassController; + @Nullable private KeyguardBypassController mBypassController; @Nullable private AlternateBouncer mAlternateBouncer; private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback = @@ -742,6 +742,12 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } private void updateAlternateBouncerShowing(boolean updateScrim) { + if (!mCentralSurfacesRegistered) { + // if CentralSurfaces hasn't been registered yet, then the controllers below haven't + // been initialized yet so there's no need to attempt to forward them events. + return; + } + final boolean isShowingAlternateBouncer = isShowingAlternateBouncer(); if (mKeyguardMessageAreaController != null) { mKeyguardMessageAreaController.setIsVisible(isShowingAlternateBouncer); 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 9f70565749dfc..6ff8256046b9b 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 @@ -570,4 +570,40 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { mStatusBarKeyguardViewManager.hideBouncer(false); verify(mPrimaryBouncerInteractor, never()).hide(); } + + @Test + public void hideAlternateBouncer_beforeCentralSurfacesRegistered() { + mStatusBarKeyguardViewManager = + new StatusBarKeyguardViewManager( + getContext(), + mViewMediatorCallback, + mLockPatternUtils, + mStatusBarStateController, + mock(ConfigurationController.class), + mKeyguardUpdateMonitor, + mDreamOverlayStateController, + mock(NavigationModeController.class), + mock(DockManager.class), + mock(NotificationShadeWindowController.class), + mKeyguardStateController, + mock(NotificationMediaManager.class), + mKeyguardBouncerFactory, + mKeyguardMessageAreaFactory, + Optional.of(mSysUiUnfoldComponent), + () -> mShadeController, + mLatencyTracker, + mKeyguardSecurityModel, + mFeatureFlags, + mPrimaryBouncerCallbackInteractor, + mPrimaryBouncerInteractor, + mBouncerView) { + @Override + public ViewRootImpl getViewRootImpl() { + return mViewRootImpl; + } + }; + + // the following call before registering centralSurfaces should NOT throw a NPE: + mStatusBarKeyguardViewManager.hideAlternateBouncer(true); + } }