Fix bouncer scrim animation on split shade
The problem was caused by a wrong expansion fraction being applied to the scrim when on lockscreen. That fraction was only intended for non-lockscreen. + Drive by refactor to make sure the fraction is always between 0 and 1. Fixes: 236394769 Test: Manually Test: ScrimShadeTransitionControllerTest.kt Change-Id: I63de0f7beda616772e7d97498be91b712d477d57
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user