From f0e825f2f4736db7142b58289eb28586ca3010a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Go=CC=88llner?= Date: Fri, 15 Jul 2022 16:49:52 +0200 Subject: [PATCH] [Split shade] Fix QS showing briefly on AOD after turning off the screen This was caused by the SplitShadeOverScroller being invoked while on lockscreen and setting a translationY value to 0 on QSFragment. That class is not supposed to be used on lockscreen, therefore the fix was to make sure it is only used on non-lockscreen. Change-Id: I6f89303c4fcdc04c77b5b2dac8d71cf66fe08ff4 Bug: 208255733 Test: ShadeTransitionControllerTest.kt Test: Manually --- .../transition/ShadeTransitionController.kt | 11 +++- .../ShadeTransitionControllerTest.kt | 64 ++++++++++++++++++- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/shade/transition/ShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/shade/transition/ShadeTransitionController.kt index 1c4911de1d458..58acfb40ee448 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/transition/ShadeTransitionController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/transition/ShadeTransitionController.kt @@ -7,6 +7,8 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.qs.QS import com.android.systemui.shade.NotificationPanelViewController +import com.android.systemui.statusbar.StatusBarState +import com.android.systemui.statusbar.SysuiStatusBarStateController import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController import com.android.systemui.statusbar.phone.panelstate.PanelExpansionChangeEvent import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager @@ -27,7 +29,8 @@ constructor( private val context: Context, private val splitShadeOverScrollerFactory: SplitShadeOverScroller.Factory, private val noOpOverScroller: NoOpOverScroller, - private val scrimShadeTransitionController: ScrimShadeTransitionController + private val scrimShadeTransitionController: ScrimShadeTransitionController, + private val statusBarStateController: SysuiStatusBarStateController, ) { lateinit var notificationPanelViewController: NotificationPanelViewController @@ -43,7 +46,7 @@ constructor( } private val shadeOverScroller: ShadeOverScroller get() = - if (inSplitShade && propertiesInitialized()) { + if (inSplitShade && isScreenUnlocked() && propertiesInitialized()) { splitShadeOverScroller } else { noOpOverScroller @@ -90,6 +93,7 @@ constructor( """ ShadeTransitionController: inSplitShade: $inSplitShade + isScreenUnlocked: ${isScreenUnlocked()} currentPanelState: ${currentPanelState?.panelStateToString()} lastPanelExpansionChangeEvent: $lastPanelExpansionChangeEvent qs.isInitialized: ${this::qs.isInitialized} @@ -97,4 +101,7 @@ constructor( nssl.isInitialized: ${this::notificationStackScrollLayoutController.isInitialized} """.trimIndent()) } + + private fun isScreenUnlocked() = + statusBarStateController.currentOrUpcomingState == StatusBarState.SHADE } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/transition/ShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/transition/ShadeTransitionControllerTest.kt index d6faaee51087d..b6f8326394fa3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/transition/ShadeTransitionControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/transition/ShadeTransitionControllerTest.kt @@ -7,6 +7,8 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.qs.QS import com.android.systemui.shade.NotificationPanelViewController +import com.android.systemui.statusbar.StatusBarState +import com.android.systemui.statusbar.SysuiStatusBarStateController import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController import com.android.systemui.statusbar.phone.panelstate.PanelExpansionChangeEvent import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager @@ -19,6 +21,7 @@ import org.mockito.Mock import org.mockito.Mockito.reset import org.mockito.Mockito.verify import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations @RunWith(AndroidTestingRunner::class) @@ -32,6 +35,7 @@ class ShadeTransitionControllerTest : SysuiTestCase() { @Mock private lateinit var splitShadeOverScroller: SplitShadeOverScroller @Mock private lateinit var scrimShadeTransitionController: ScrimShadeTransitionController @Mock private lateinit var dumpManager: DumpManager + @Mock private lateinit var statusBarStateController: SysuiStatusBarStateController private lateinit var controller: ShadeTransitionController @@ -50,7 +54,9 @@ class ShadeTransitionControllerTest : SysuiTestCase() { context, splitShadeOverScrollerFactory = { _, _ -> splitShadeOverScroller }, noOpOverScroller, - scrimShadeTransitionController) + scrimShadeTransitionController, + statusBarStateController, + ) // Resetting as they are notified upon initialization. reset(noOpOverScroller, splitShadeOverScroller) @@ -79,6 +85,45 @@ class ShadeTransitionControllerTest : SysuiTestCase() { verifyZeroInteractions(splitShadeOverScroller) } + @Test + fun onPanelStateChanged_inSplitShade_onKeyguard_forwardsToNoOpOverScroller() { + initLateProperties() + enableSplitShade() + setOnKeyguard() + + startPanelExpansion() + + verify(noOpOverScroller).onPanelStateChanged(STATE_OPENING) + verify(noOpOverScroller).onDragDownAmountChanged(DEFAULT_DRAG_DOWN_AMOUNT) + verifyZeroInteractions(splitShadeOverScroller) + } + + @Test + fun onPanelStateChanged_inSplitShade_onLockedShade_forwardsToNoOpOverScroller() { + initLateProperties() + enableSplitShade() + setOnLockedShade() + + startPanelExpansion() + + verify(noOpOverScroller).onPanelStateChanged(STATE_OPENING) + verify(noOpOverScroller).onDragDownAmountChanged(DEFAULT_DRAG_DOWN_AMOUNT) + verifyZeroInteractions(splitShadeOverScroller) + } + + @Test + fun onPanelExpansionChanged_inSplitShade_onUnlockedShade_forwardsToSplitShadeOverScroller() { + initLateProperties() + enableSplitShade() + setOnUnlockedShade() + + startPanelExpansion() + + verify(splitShadeOverScroller).onPanelStateChanged(STATE_OPENING) + verify(splitShadeOverScroller).onDragDownAmountChanged(DEFAULT_DRAG_DOWN_AMOUNT) + verifyZeroInteractions(noOpOverScroller) + } + @Test fun onPanelStateChanged_notInSplitShade_forwardsToNoOpOverScroller() { initLateProperties() @@ -129,6 +174,23 @@ class ShadeTransitionControllerTest : SysuiTestCase() { ) } + private fun setOnKeyguard() { + setShadeState(StatusBarState.KEYGUARD) + } + + private fun setOnLockedShade() { + setShadeState(StatusBarState.SHADE_LOCKED) + } + + private fun setOnUnlockedShade() { + setShadeState(StatusBarState.SHADE) + } + + private fun setShadeState(state: Int) { + whenever(statusBarStateController.state).thenReturn(state) + whenever(statusBarStateController.currentOrUpcomingState).thenReturn(state) + } + companion object { private const val DEFAULT_DRAG_DOWN_AMOUNT = 123f private val DEFAULT_EXPANSION_EVENT =