diff options
2 files changed, 72 insertions, 5 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/shade/transition/ScrimShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/shade/transition/ScrimShadeTransitionController.kt index 1740bcbbefc8..16f28e7d1a21 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/shade/transition/ScrimShadeTransitionController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/shade/transition/ScrimShadeTransitionController.kt @@ -2,10 +2,13 @@ package com.android.systemui.statusbar.phone.shade.transition import android.content.res.Configuration import android.content.res.Resources +import android.util.MathUtils.constrain import com.android.systemui.R import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager +import com.android.systemui.statusbar.StatusBarState +import com.android.systemui.statusbar.SysuiStatusBarStateController import com.android.systemui.statusbar.phone.ScrimController import com.android.systemui.statusbar.phone.panelstate.PanelExpansionChangeEvent import com.android.systemui.statusbar.policy.ConfigurationController @@ -21,7 +24,8 @@ constructor( configurationController: ConfigurationController, dumpManager: DumpManager, private val scrimController: ScrimController, - @Main private val resources: Resources + @Main private val resources: Resources, + private val statusBarStateController: SysuiStatusBarStateController, ) { private var inSplitShade = false @@ -55,19 +59,23 @@ constructor( } private fun calculateScrimExpansionFraction(expansionEvent: PanelExpansionChangeEvent): Float { - return if (inSplitShade) { - expansionEvent.dragDownPxAmount / splitShadeScrimTransitionDistance + return if (inSplitShade && isScreenUnlocked()) { + constrain(expansionEvent.dragDownPxAmount / splitShadeScrimTransitionDistance, 0f, 1f) } else { expansionEvent.fraction } } + private fun isScreenUnlocked() = + statusBarStateController.currentOrUpcomingState == StatusBarState.SHADE + private fun dump(printWriter: PrintWriter, args: Array<String>) { printWriter.println( """ ScrimShadeTransitionController: Resources: inSplitShade: $inSplitShade + isScreenUnlocked: ${isScreenUnlocked()} splitShadeScrimTransitionDistance: $splitShadeScrimTransitionDistance State: lastExpansionFraction: $lastExpansionFraction diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/shade/transition/ScrimShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/shade/transition/ScrimShadeTransitionControllerTest.kt index b24b348ac316..cafe113e7872 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/shade/transition/ScrimShadeTransitionControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/shade/transition/ScrimShadeTransitionControllerTest.kt @@ -5,6 +5,8 @@ import androidx.test.filters.SmallTest import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager +import com.android.systemui.statusbar.StatusBarState +import com.android.systemui.statusbar.SysuiStatusBarStateController import com.android.systemui.statusbar.phone.ScrimController import com.android.systemui.statusbar.phone.panelstate.PanelExpansionChangeEvent import com.android.systemui.statusbar.policy.FakeConfigurationController @@ -13,6 +15,7 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations @RunWith(AndroidTestingRunner::class) @@ -21,6 +24,7 @@ class ScrimShadeTransitionControllerTest : SysuiTestCase() { @Mock private lateinit var scrimController: ScrimController @Mock private lateinit var dumpManager: DumpManager + @Mock private lateinit var statusBarStateController: SysuiStatusBarStateController private val configurationController = FakeConfigurationController() private lateinit var controller: ScrimShadeTransitionController @@ -31,9 +35,14 @@ class ScrimShadeTransitionControllerTest : SysuiTestCase() { context.ensureTestableResources() controller = ScrimShadeTransitionController( - configurationController, dumpManager, scrimController, context.resources + configurationController, + dumpManager, + scrimController, + context.resources, + statusBarStateController ) } + @Test fun onPanelExpansionChanged_inSingleShade_setsFractionEqualToEventFraction() { setSplitShadeEnabled(false) @@ -44,7 +53,9 @@ class ScrimShadeTransitionControllerTest : SysuiTestCase() { } @Test - fun onPanelExpansionChanged_inSplitShade_setsFractionBasedOnDragDownAmount() { + fun onPanelExpansionChanged_inSplitShade_unlockedShade_setsFractionBasedOnDragDownAmount() { + whenever(statusBarStateController.currentOrUpcomingState) + .thenReturn(StatusBarState.SHADE) val scrimShadeTransitionDistance = context.resources.getDimensionPixelSize(R.dimen.split_shade_scrim_transition_distance) setSplitShadeEnabled(true) @@ -55,6 +66,54 @@ class ScrimShadeTransitionControllerTest : SysuiTestCase() { verify(scrimController).setRawPanelExpansionFraction(expectedFraction) } + @Test + fun onPanelExpansionChanged_inSplitShade_largeDragDownAmount_fractionIsNotGreaterThan1() { + whenever(statusBarStateController.currentOrUpcomingState) + .thenReturn(StatusBarState.SHADE) + val scrimShadeTransitionDistance = + context.resources.getDimensionPixelSize(R.dimen.split_shade_scrim_transition_distance) + setSplitShadeEnabled(true) + + controller.onPanelExpansionChanged( + EXPANSION_EVENT.copy(dragDownPxAmount = 100f * scrimShadeTransitionDistance) + ) + + verify(scrimController).setRawPanelExpansionFraction(1f) + } + + @Test + fun onPanelExpansionChanged_inSplitShade_negativeDragDownAmount_fractionIsNotLessThan0() { + whenever(statusBarStateController.currentOrUpcomingState) + .thenReturn(StatusBarState.SHADE) + setSplitShadeEnabled(true) + + controller.onPanelExpansionChanged(EXPANSION_EVENT.copy(dragDownPxAmount = -100f)) + + verify(scrimController).setRawPanelExpansionFraction(0f) + } + + @Test + fun onPanelExpansionChanged_inSplitShade_onLockedShade_setsFractionEqualToEventFraction() { + whenever(statusBarStateController.currentOrUpcomingState) + .thenReturn(StatusBarState.SHADE_LOCKED) + setSplitShadeEnabled(true) + + controller.onPanelExpansionChanged(EXPANSION_EVENT) + + verify(scrimController).setRawPanelExpansionFraction(EXPANSION_EVENT.fraction) + } + + @Test + fun onPanelExpansionChanged_inSplitShade_onKeyguard_setsFractionEqualToEventFraction() { + whenever(statusBarStateController.currentOrUpcomingState) + .thenReturn(StatusBarState.KEYGUARD) + setSplitShadeEnabled(true) + + controller.onPanelExpansionChanged(EXPANSION_EVENT) + + verify(scrimController).setRawPanelExpansionFraction(EXPANSION_EVENT.fraction) + } + private fun setSplitShadeEnabled(enabled: Boolean) { overrideResource(R.bool.config_use_split_notification_shade, enabled) configurationController.notifyConfigurationChanged() |