Loading packages/SystemUI/aconfig/systemui.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -1187,3 +1187,13 @@ flag { description: "Enables MSDL feedback in SysUI surfaces." bug: "352600066" } flag { name: "sim_pin_race_condition_on_restart" namespace: "systemui" description: "The SIM PIN screen may be shown incorrectly on reboot" bug: "351426938" metadata { purpose: PURPOSE_BUGFIX } } No newline at end of file packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractorTest.kt +6 −0 Original line number Diff line number Diff line Loading @@ -159,6 +159,12 @@ class PrimaryBouncerInteractorTest : SysuiTestCase() { verify(mPrimaryBouncerCallbackInteractor, never()).dispatchStartingToShow() } @Test fun testShowReturnsFalseWhenDelegateIsNotSet() { whenever(bouncerView.delegate).thenReturn(null) assertThat(underTest.show(true)).isEqualTo(false) } @Test fun testShow_isResumed() { whenever(repository.primaryBouncerShow.value).thenReturn(true) Loading packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt +35 −31 Original line number Diff line number Diff line Loading @@ -134,7 +134,7 @@ constructor( // TODO(b/243695312): Encapsulate all of the show logic for the bouncer. /** Show the bouncer if necessary and set the relevant states. */ @JvmOverloads fun show(isScrimmed: Boolean) { fun show(isScrimmed: Boolean): Boolean { // When the scene container framework is enabled, instead of calling this, call // SceneInteractor#changeScene(Scenes.Bouncer, ...). SceneContainerFlag.assertInLegacyMode() Loading @@ -146,9 +146,11 @@ constructor( "primaryBouncerDelegate is set. Let's exit early so we don't " + "set the wrong primaryBouncer state." ) return return false } try { Trace.beginSection("KeyguardBouncer#show") // Reset some states as we show the bouncer. repository.setKeyguardAuthenticatedBiometrics(null) repository.setPrimaryStartingToHide(false) Loading @@ -157,7 +159,6 @@ constructor( (isBouncerShowing() || repository.primaryBouncerShowingSoon.value) && needsFullscreenBouncer() Trace.beginSection("KeyguardBouncer#show") repository.setPrimaryScrimmed(isScrimmed) if (isScrimmed) { setPanelExpansion(KeyguardBouncerConstants.EXPANSION_VISIBLE) Loading @@ -171,7 +172,7 @@ constructor( if (primaryBouncerView.delegate?.showNextSecurityScreenOrFinish() == true) { // Keyguard is done. return return false } repository.setPrimaryShowingSoon(true) Loading @@ -183,8 +184,11 @@ constructor( } keyguardStateController.notifyPrimaryBouncerShowing(true) primaryBouncerCallbackInteractor.dispatchStartingToShow() return true } finally { Trace.endSection() } } /** Sets the correct bouncer states to hide the bouncer. */ fun hide() { Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +19 −3 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.keyguard.KeyguardViewController; import com.android.keyguard.TrustGrantFlags; import com.android.keyguard.ViewMediatorCallback; import com.android.systemui.Flags; import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor; import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor; import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerCallbackInteractor; Loading Loading @@ -708,16 +709,31 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb * {@link #needsFullscreenBouncer()}. */ protected void showBouncerOrKeyguard(boolean hideBouncerWhenShowing) { if (needsFullscreenBouncer() && !mDozing) { boolean isDozing = mDozing; if (Flags.simPinRaceConditionOnRestart()) { KeyguardState toState = mKeyguardTransitionInteractor.getTransitionState().getValue() .getTo(); isDozing = mDozing || toState == KeyguardState.DOZING || toState == KeyguardState.AOD; } if (needsFullscreenBouncer() && !isDozing) { // The keyguard might be showing (already). So we need to hide it. if (!primaryBouncerIsShowing()) { mCentralSurfaces.hideKeyguard(); if (SceneContainerFlag.isEnabled()) { mCentralSurfaces.hideKeyguard(); mSceneInteractorLazy.get().changeScene( Scenes.Bouncer, "StatusBarKeyguardViewManager.showBouncerOrKeyguard"); } else { if (Flags.simPinRaceConditionOnRestart()) { if (mPrimaryBouncerInteractor.show(/* isScrimmed= */ true)) { mCentralSurfaces.hideKeyguard(); } else { mCentralSurfaces.showKeyguard(); } } else { mCentralSurfaces.hideKeyguard(); mPrimaryBouncerInteractor.show(/* isScrimmed= */ true); } } } else { Log.e(TAG, "Attempted to show the sim bouncer when it is already showing."); } Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java +20 −1 Original line number Diff line number Diff line Loading @@ -116,6 +116,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; Loading Loading @@ -176,6 +177,8 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { private ViewRootImpl mViewRootImpl; @Mock private WindowOnBackInvokedDispatcher mOnBackInvokedDispatcher; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private KeyguardTransitionInteractor mKeyguardTransitionInteractor; @Captor private ArgumentCaptor<OnBackInvokedCallback> mBackCallbackCaptor; @Captor Loading Loading @@ -223,7 +226,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { mAlternateBouncerInteractor, mUdfpsOverlayInteractor, mActivityStarter, mock(KeyguardTransitionInteractor.class), mKeyguardTransitionInteractor, StandardTestDispatcher(null, null), () -> mock(WindowManagerLockscreenVisibilityInteractor.class), () -> mock(KeyguardDismissActionInteractor.class), Loading Loading @@ -1064,6 +1067,22 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { verify(mPrimaryBouncerInteractor).show(true); } @Test @DisableSceneContainer @EnableFlags(Flags.FLAG_SIM_PIN_RACE_CONDITION_ON_RESTART) public void testShowBouncerOrKeyguard_showsKeyguardIfShowBouncerReturnsFalse() { when(mKeyguardSecurityModel.getSecurityMode(anyInt())).thenReturn( KeyguardSecurityModel.SecurityMode.SimPin); when(mPrimaryBouncerInteractor.show(true)).thenReturn(false); when(mKeyguardTransitionInteractor.getTransitionState().getValue().getTo()) .thenReturn(KeyguardState.LOCKSCREEN); reset(mCentralSurfaces); mStatusBarKeyguardViewManager.showBouncerOrKeyguard(false); verify(mPrimaryBouncerInteractor).show(true); verify(mCentralSurfaces).showKeyguard(); } @Test @DisableSceneContainer public void testShowBouncerOrKeyguard_needsFullScreen_bouncerAlreadyShowing() { Loading Loading
packages/SystemUI/aconfig/systemui.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -1187,3 +1187,13 @@ flag { description: "Enables MSDL feedback in SysUI surfaces." bug: "352600066" } flag { name: "sim_pin_race_condition_on_restart" namespace: "systemui" description: "The SIM PIN screen may be shown incorrectly on reboot" bug: "351426938" metadata { purpose: PURPOSE_BUGFIX } } No newline at end of file
packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractorTest.kt +6 −0 Original line number Diff line number Diff line Loading @@ -159,6 +159,12 @@ class PrimaryBouncerInteractorTest : SysuiTestCase() { verify(mPrimaryBouncerCallbackInteractor, never()).dispatchStartingToShow() } @Test fun testShowReturnsFalseWhenDelegateIsNotSet() { whenever(bouncerView.delegate).thenReturn(null) assertThat(underTest.show(true)).isEqualTo(false) } @Test fun testShow_isResumed() { whenever(repository.primaryBouncerShow.value).thenReturn(true) Loading
packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt +35 −31 Original line number Diff line number Diff line Loading @@ -134,7 +134,7 @@ constructor( // TODO(b/243695312): Encapsulate all of the show logic for the bouncer. /** Show the bouncer if necessary and set the relevant states. */ @JvmOverloads fun show(isScrimmed: Boolean) { fun show(isScrimmed: Boolean): Boolean { // When the scene container framework is enabled, instead of calling this, call // SceneInteractor#changeScene(Scenes.Bouncer, ...). SceneContainerFlag.assertInLegacyMode() Loading @@ -146,9 +146,11 @@ constructor( "primaryBouncerDelegate is set. Let's exit early so we don't " + "set the wrong primaryBouncer state." ) return return false } try { Trace.beginSection("KeyguardBouncer#show") // Reset some states as we show the bouncer. repository.setKeyguardAuthenticatedBiometrics(null) repository.setPrimaryStartingToHide(false) Loading @@ -157,7 +159,6 @@ constructor( (isBouncerShowing() || repository.primaryBouncerShowingSoon.value) && needsFullscreenBouncer() Trace.beginSection("KeyguardBouncer#show") repository.setPrimaryScrimmed(isScrimmed) if (isScrimmed) { setPanelExpansion(KeyguardBouncerConstants.EXPANSION_VISIBLE) Loading @@ -171,7 +172,7 @@ constructor( if (primaryBouncerView.delegate?.showNextSecurityScreenOrFinish() == true) { // Keyguard is done. return return false } repository.setPrimaryShowingSoon(true) Loading @@ -183,8 +184,11 @@ constructor( } keyguardStateController.notifyPrimaryBouncerShowing(true) primaryBouncerCallbackInteractor.dispatchStartingToShow() return true } finally { Trace.endSection() } } /** Sets the correct bouncer states to hide the bouncer. */ fun hide() { Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +19 −3 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.keyguard.KeyguardViewController; import com.android.keyguard.TrustGrantFlags; import com.android.keyguard.ViewMediatorCallback; import com.android.systemui.Flags; import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor; import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor; import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerCallbackInteractor; Loading Loading @@ -708,16 +709,31 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb * {@link #needsFullscreenBouncer()}. */ protected void showBouncerOrKeyguard(boolean hideBouncerWhenShowing) { if (needsFullscreenBouncer() && !mDozing) { boolean isDozing = mDozing; if (Flags.simPinRaceConditionOnRestart()) { KeyguardState toState = mKeyguardTransitionInteractor.getTransitionState().getValue() .getTo(); isDozing = mDozing || toState == KeyguardState.DOZING || toState == KeyguardState.AOD; } if (needsFullscreenBouncer() && !isDozing) { // The keyguard might be showing (already). So we need to hide it. if (!primaryBouncerIsShowing()) { mCentralSurfaces.hideKeyguard(); if (SceneContainerFlag.isEnabled()) { mCentralSurfaces.hideKeyguard(); mSceneInteractorLazy.get().changeScene( Scenes.Bouncer, "StatusBarKeyguardViewManager.showBouncerOrKeyguard"); } else { if (Flags.simPinRaceConditionOnRestart()) { if (mPrimaryBouncerInteractor.show(/* isScrimmed= */ true)) { mCentralSurfaces.hideKeyguard(); } else { mCentralSurfaces.showKeyguard(); } } else { mCentralSurfaces.hideKeyguard(); mPrimaryBouncerInteractor.show(/* isScrimmed= */ true); } } } else { Log.e(TAG, "Attempted to show the sim bouncer when it is already showing."); } Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java +20 −1 Original line number Diff line number Diff line Loading @@ -116,6 +116,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; Loading Loading @@ -176,6 +177,8 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { private ViewRootImpl mViewRootImpl; @Mock private WindowOnBackInvokedDispatcher mOnBackInvokedDispatcher; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private KeyguardTransitionInteractor mKeyguardTransitionInteractor; @Captor private ArgumentCaptor<OnBackInvokedCallback> mBackCallbackCaptor; @Captor Loading Loading @@ -223,7 +226,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { mAlternateBouncerInteractor, mUdfpsOverlayInteractor, mActivityStarter, mock(KeyguardTransitionInteractor.class), mKeyguardTransitionInteractor, StandardTestDispatcher(null, null), () -> mock(WindowManagerLockscreenVisibilityInteractor.class), () -> mock(KeyguardDismissActionInteractor.class), Loading Loading @@ -1064,6 +1067,22 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { verify(mPrimaryBouncerInteractor).show(true); } @Test @DisableSceneContainer @EnableFlags(Flags.FLAG_SIM_PIN_RACE_CONDITION_ON_RESTART) public void testShowBouncerOrKeyguard_showsKeyguardIfShowBouncerReturnsFalse() { when(mKeyguardSecurityModel.getSecurityMode(anyInt())).thenReturn( KeyguardSecurityModel.SecurityMode.SimPin); when(mPrimaryBouncerInteractor.show(true)).thenReturn(false); when(mKeyguardTransitionInteractor.getTransitionState().getValue().getTo()) .thenReturn(KeyguardState.LOCKSCREEN); reset(mCentralSurfaces); mStatusBarKeyguardViewManager.showBouncerOrKeyguard(false); verify(mPrimaryBouncerInteractor).show(true); verify(mCentralSurfaces).showKeyguard(); } @Test @DisableSceneContainer public void testShowBouncerOrKeyguard_needsFullScreen_bouncerAlreadyShowing() { Loading