Merge "[Split shade][Motion] Fix scrim not being fully opaque after shade expansion" into tm-qpr-dev am: 0ec6e12771

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19084488

Change-Id: Ib3cb9a76ffc31576fff946ee2ee9f097d837ad42
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
TreeHugger Robot
2022-06-30 17:13:59 +00:00
committed by Automerger Merge Worker
5 changed files with 105 additions and 36 deletions

View File

@@ -20,6 +20,7 @@ import android.annotation.IntDef
import android.util.Log import android.util.Log
import androidx.annotation.FloatRange import androidx.annotation.FloatRange
import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.util.Compile
import javax.inject.Inject import javax.inject.Inject
/** /**
@@ -109,8 +110,8 @@ class PanelExpansionStateManager @Inject constructor() {
debugLog( debugLog(
"panelExpansionChanged:" + "panelExpansionChanged:" +
"start state=${oldState.stateToString()} " + "start state=${oldState.panelStateToString()} " +
"end state=${state.stateToString()} " + "end state=${state.panelStateToString()} " +
"f=$fraction " + "f=$fraction " +
"expanded=$expanded " + "expanded=$expanded " +
"tracking=$tracking" + "tracking=$tracking" +
@@ -126,14 +127,15 @@ class PanelExpansionStateManager @Inject constructor() {
/** Updates the panel state if necessary. */ /** Updates the panel state if necessary. */
fun updateState(@PanelState state: Int) { fun updateState(@PanelState state: Int) {
debugLog("update state: ${this.state.stateToString()} -> ${state.stateToString()}") debugLog(
"update state: ${this.state.panelStateToString()} -> ${state.panelStateToString()}")
if (this.state != state) { if (this.state != state) {
updateStateInternal(state) updateStateInternal(state)
} }
} }
private fun updateStateInternal(@PanelState state: Int) { private fun updateStateInternal(@PanelState state: Int) {
debugLog("go state: ${this.state.stateToString()} -> ${state.stateToString()}") debugLog("go state: ${this.state.panelStateToString()} -> ${state.panelStateToString()}")
this.state = state this.state = state
stateListeners.forEach { it.onPanelStateChanged(state) } stateListeners.forEach { it.onPanelStateChanged(state) }
} }
@@ -154,7 +156,7 @@ const val STATE_OPENING = 1
const val STATE_OPEN = 2 const val STATE_OPEN = 2
@PanelState @PanelState
private fun Int.stateToString(): String { fun Int.panelStateToString(): String {
return when (this) { return when (this) {
STATE_CLOSED -> "CLOSED" STATE_CLOSED -> "CLOSED"
STATE_OPENING -> "OPENING" STATE_OPENING -> "OPENING"
@@ -163,5 +165,5 @@ private fun Int.stateToString(): String {
} }
} }
private const val DEBUG = false
private val TAG = PanelExpansionStateManager::class.simpleName private val TAG = PanelExpansionStateManager::class.simpleName
private val DEBUG = Compile.IS_DEBUG && Log.isLoggable(TAG, Log.DEBUG)

View File

@@ -11,6 +11,8 @@ import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.SysuiStatusBarStateController import com.android.systemui.statusbar.SysuiStatusBarStateController
import com.android.systemui.statusbar.phone.ScrimController import com.android.systemui.statusbar.phone.ScrimController
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionChangeEvent import com.android.systemui.statusbar.phone.panelstate.PanelExpansionChangeEvent
import com.android.systemui.statusbar.phone.panelstate.PanelState
import com.android.systemui.statusbar.phone.panelstate.STATE_OPENING
import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.LargeScreenUtils import com.android.systemui.util.LargeScreenUtils
import java.io.PrintWriter import java.io.PrintWriter
@@ -30,8 +32,9 @@ constructor(
private var inSplitShade = false private var inSplitShade = false
private var splitShadeScrimTransitionDistance = 0 private var splitShadeScrimTransitionDistance = 0
private var lastExpansionFraction: Float = 0f private var lastExpansionFraction: Float? = null
private var lastExpansionEvent: PanelExpansionChangeEvent? = null private var lastExpansionEvent: PanelExpansionChangeEvent? = null
private var currentPanelState: Int? = null
init { init {
updateResources() updateResources()
@@ -41,8 +44,8 @@ constructor(
updateResources() updateResources()
} }
}) })
dumpManager dumpManager.registerDumpable(
.registerDumpable(ScrimShadeTransitionController::class.java.simpleName, this::dump) ScrimShadeTransitionController::class.java.simpleName, this::dump)
} }
private fun updateResources() { private fun updateResources() {
@@ -51,21 +54,38 @@ constructor(
resources.getDimensionPixelSize(R.dimen.split_shade_scrim_transition_distance) resources.getDimensionPixelSize(R.dimen.split_shade_scrim_transition_distance)
} }
fun onPanelExpansionChanged(panelExpansionChangeEvent: PanelExpansionChangeEvent) { fun onPanelStateChanged(@PanelState state: Int) {
val expansionFraction = calculateScrimExpansionFraction(panelExpansionChangeEvent) currentPanelState = state
scrimController.setRawPanelExpansionFraction(expansionFraction) onStateChanged()
lastExpansionFraction = expansionFraction
lastExpansionEvent = panelExpansionChangeEvent
} }
private fun calculateScrimExpansionFraction(expansionEvent: PanelExpansionChangeEvent): Float { fun onPanelExpansionChanged(panelExpansionChangeEvent: PanelExpansionChangeEvent) {
return if (inSplitShade && isScreenUnlocked()) { lastExpansionEvent = panelExpansionChangeEvent
onStateChanged()
}
private fun onStateChanged() {
val expansionEvent = lastExpansionEvent ?: return
val panelState = currentPanelState
val expansionFraction = calculateScrimExpansionFraction(expansionEvent, panelState)
scrimController.setRawPanelExpansionFraction(expansionFraction)
lastExpansionFraction = expansionFraction
}
private fun calculateScrimExpansionFraction(
expansionEvent: PanelExpansionChangeEvent,
@PanelState panelState: Int?
): Float {
return if (canUseCustomFraction(panelState)) {
constrain(expansionEvent.dragDownPxAmount / splitShadeScrimTransitionDistance, 0f, 1f) constrain(expansionEvent.dragDownPxAmount / splitShadeScrimTransitionDistance, 0f, 1f)
} else { } else {
expansionEvent.fraction expansionEvent.fraction
} }
} }
private fun canUseCustomFraction(panelState: Int?) =
inSplitShade && isScreenUnlocked() && panelState == STATE_OPENING
private fun isScreenUnlocked() = private fun isScreenUnlocked() =
statusBarStateController.currentOrUpcomingState == StatusBarState.SHADE statusBarStateController.currentOrUpcomingState == StatusBarState.SHADE
@@ -78,9 +98,9 @@ constructor(
isScreenUnlocked: ${isScreenUnlocked()} isScreenUnlocked: ${isScreenUnlocked()}
splitShadeScrimTransitionDistance: $splitShadeScrimTransitionDistance splitShadeScrimTransitionDistance: $splitShadeScrimTransitionDistance
State: State:
currentPanelState: $currentPanelState
lastExpansionFraction: $lastExpansionFraction lastExpansionFraction: $lastExpansionFraction
lastExpansionEvent: $lastExpansionEvent lastExpansionEvent: $lastExpansionEvent
""".trimIndent() """.trimIndent())
)
} }
} }

View File

@@ -11,6 +11,7 @@ import com.android.systemui.statusbar.phone.NotificationPanelViewController
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionChangeEvent import com.android.systemui.statusbar.phone.panelstate.PanelExpansionChangeEvent
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager
import com.android.systemui.statusbar.phone.panelstate.PanelState import com.android.systemui.statusbar.phone.panelstate.PanelState
import com.android.systemui.statusbar.phone.panelstate.panelStateToString
import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.ConfigurationController
import java.io.PrintWriter import java.io.PrintWriter
import javax.inject.Inject import javax.inject.Inject
@@ -34,6 +35,8 @@ constructor(
lateinit var qs: QS lateinit var qs: QS
private var inSplitShade = false private var inSplitShade = false
private var currentPanelState: Int? = null
private var lastPanelExpansionChangeEvent: PanelExpansionChangeEvent? = null
private val splitShadeOverScroller by lazy { private val splitShadeOverScroller by lazy {
splitShadeOverScrollerFactory.create({ qs }, { notificationStackScrollLayoutController }) splitShadeOverScrollerFactory.create({ qs }, { notificationStackScrollLayoutController })
@@ -66,10 +69,13 @@ constructor(
} }
private fun onPanelStateChanged(@PanelState state: Int) { private fun onPanelStateChanged(@PanelState state: Int) {
currentPanelState = state
shadeOverScroller.onPanelStateChanged(state) shadeOverScroller.onPanelStateChanged(state)
scrimShadeTransitionController.onPanelStateChanged(state)
} }
private fun onPanelExpansionChanged(event: PanelExpansionChangeEvent) { private fun onPanelExpansionChanged(event: PanelExpansionChangeEvent) {
lastPanelExpansionChangeEvent = event
shadeOverScroller.onDragDownAmountChanged(event.dragDownPxAmount) shadeOverScroller.onDragDownAmountChanged(event.dragDownPxAmount)
scrimShadeTransitionController.onPanelExpansionChanged(event) scrimShadeTransitionController.onPanelExpansionChanged(event)
} }
@@ -84,6 +90,8 @@ constructor(
""" """
ShadeTransitionController: ShadeTransitionController:
inSplitShade: $inSplitShade inSplitShade: $inSplitShade
currentPanelState: ${currentPanelState?.panelStateToString()}
lastPanelExpansionChangeEvent: $lastPanelExpansionChangeEvent
qs.isInitialized: ${this::qs.isInitialized} qs.isInitialized: ${this::qs.isInitialized}
npvc.isInitialized: ${this::notificationPanelViewController.isInitialized} npvc.isInitialized: ${this::notificationPanelViewController.isInitialized}
nssl.isInitialized: ${this::notificationStackScrollLayoutController.isInitialized} nssl.isInitialized: ${this::notificationStackScrollLayoutController.isInitialized}

View File

@@ -9,6 +9,9 @@ import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.SysuiStatusBarStateController import com.android.systemui.statusbar.SysuiStatusBarStateController
import com.android.systemui.statusbar.phone.ScrimController import com.android.systemui.statusbar.phone.ScrimController
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionChangeEvent import com.android.systemui.statusbar.phone.panelstate.PanelExpansionChangeEvent
import com.android.systemui.statusbar.phone.panelstate.STATE_CLOSED
import com.android.systemui.statusbar.phone.panelstate.STATE_OPEN
import com.android.systemui.statusbar.phone.panelstate.STATE_OPENING
import com.android.systemui.statusbar.policy.FakeConfigurationController import com.android.systemui.statusbar.policy.FakeConfigurationController
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
@@ -39,8 +42,9 @@ class ScrimShadeTransitionControllerTest : SysuiTestCase() {
dumpManager, dumpManager,
scrimController, scrimController,
context.resources, context.resources,
statusBarStateController statusBarStateController)
)
controller.onPanelStateChanged(STATE_OPENING)
} }
@Test @Test
@@ -54,8 +58,7 @@ class ScrimShadeTransitionControllerTest : SysuiTestCase() {
@Test @Test
fun onPanelExpansionChanged_inSplitShade_unlockedShade_setsFractionBasedOnDragDownAmount() { fun onPanelExpansionChanged_inSplitShade_unlockedShade_setsFractionBasedOnDragDownAmount() {
whenever(statusBarStateController.currentOrUpcomingState) whenever(statusBarStateController.currentOrUpcomingState).thenReturn(StatusBarState.SHADE)
.thenReturn(StatusBarState.SHADE)
val scrimShadeTransitionDistance = val scrimShadeTransitionDistance =
context.resources.getDimensionPixelSize(R.dimen.split_shade_scrim_transition_distance) context.resources.getDimensionPixelSize(R.dimen.split_shade_scrim_transition_distance)
setSplitShadeEnabled(true) setSplitShadeEnabled(true)
@@ -68,23 +71,20 @@ class ScrimShadeTransitionControllerTest : SysuiTestCase() {
@Test @Test
fun onPanelExpansionChanged_inSplitShade_largeDragDownAmount_fractionIsNotGreaterThan1() { fun onPanelExpansionChanged_inSplitShade_largeDragDownAmount_fractionIsNotGreaterThan1() {
whenever(statusBarStateController.currentOrUpcomingState) whenever(statusBarStateController.currentOrUpcomingState).thenReturn(StatusBarState.SHADE)
.thenReturn(StatusBarState.SHADE)
val scrimShadeTransitionDistance = val scrimShadeTransitionDistance =
context.resources.getDimensionPixelSize(R.dimen.split_shade_scrim_transition_distance) context.resources.getDimensionPixelSize(R.dimen.split_shade_scrim_transition_distance)
setSplitShadeEnabled(true) setSplitShadeEnabled(true)
controller.onPanelExpansionChanged( controller.onPanelExpansionChanged(
EXPANSION_EVENT.copy(dragDownPxAmount = 100f * scrimShadeTransitionDistance) EXPANSION_EVENT.copy(dragDownPxAmount = 100f * scrimShadeTransitionDistance))
)
verify(scrimController).setRawPanelExpansionFraction(1f) verify(scrimController).setRawPanelExpansionFraction(1f)
} }
@Test @Test
fun onPanelExpansionChanged_inSplitShade_negativeDragDownAmount_fractionIsNotLessThan0() { fun onPanelExpansionChanged_inSplitShade_negativeDragDownAmount_fractionIsNotLessThan0() {
whenever(statusBarStateController.currentOrUpcomingState) whenever(statusBarStateController.currentOrUpcomingState).thenReturn(StatusBarState.SHADE)
.thenReturn(StatusBarState.SHADE)
setSplitShadeEnabled(true) setSplitShadeEnabled(true)
controller.onPanelExpansionChanged(EXPANSION_EVENT.copy(dragDownPxAmount = -100f)) controller.onPanelExpansionChanged(EXPANSION_EVENT.copy(dragDownPxAmount = -100f))
@@ -114,6 +114,30 @@ class ScrimShadeTransitionControllerTest : SysuiTestCase() {
verify(scrimController).setRawPanelExpansionFraction(EXPANSION_EVENT.fraction) verify(scrimController).setRawPanelExpansionFraction(EXPANSION_EVENT.fraction)
} }
@Test
fun onPanelExpansionChanged_inSplitShade_panelOpen_setsFractionEqualToEventFraction() {
controller.onPanelStateChanged(STATE_OPEN)
whenever(statusBarStateController.currentOrUpcomingState)
.thenReturn(StatusBarState.KEYGUARD)
setSplitShadeEnabled(true)
controller.onPanelExpansionChanged(EXPANSION_EVENT)
verify(scrimController).setRawPanelExpansionFraction(EXPANSION_EVENT.fraction)
}
@Test
fun onPanelExpansionChanged_inSplitShade_panelClosed_setsFractionEqualToEventFraction() {
controller.onPanelStateChanged(STATE_CLOSED)
whenever(statusBarStateController.currentOrUpcomingState)
.thenReturn(StatusBarState.KEYGUARD)
setSplitShadeEnabled(true)
controller.onPanelExpansionChanged(EXPANSION_EVENT)
verify(scrimController).setRawPanelExpansionFraction(EXPANSION_EVENT.fraction)
}
private fun setSplitShadeEnabled(enabled: Boolean) { private fun setSplitShadeEnabled(enabled: Boolean) {
overrideResource(R.bool.config_use_split_notification_shade, enabled) overrideResource(R.bool.config_use_split_notification_shade, enabled)
configurationController.notifyConfigurationChanged() configurationController.notifyConfigurationChanged()
@@ -122,7 +146,6 @@ class ScrimShadeTransitionControllerTest : SysuiTestCase() {
companion object { companion object {
val EXPANSION_EVENT = val EXPANSION_EVENT =
PanelExpansionChangeEvent( PanelExpansionChangeEvent(
fraction = 0.5f, expanded = true, tracking = true, dragDownPxAmount = 10f fraction = 0.5f, expanded = true, tracking = true, dragDownPxAmount = 10f)
)
} }
} }

View File

@@ -8,6 +8,7 @@ import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.qs.QS import com.android.systemui.plugins.qs.QS
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
import com.android.systemui.statusbar.phone.NotificationPanelViewController import com.android.systemui.statusbar.phone.NotificationPanelViewController
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionChangeEvent
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager
import com.android.systemui.statusbar.phone.panelstate.STATE_OPENING import com.android.systemui.statusbar.phone.panelstate.STATE_OPENING
import com.android.systemui.statusbar.policy.FakeConfigurationController import com.android.systemui.statusbar.policy.FakeConfigurationController
@@ -49,8 +50,7 @@ class ShadeTransitionControllerTest : SysuiTestCase() {
context, context,
splitShadeOverScrollerFactory = { _, _ -> splitShadeOverScroller }, splitShadeOverScrollerFactory = { _, _ -> splitShadeOverScroller },
noOpOverScroller, noOpOverScroller,
scrimShadeTransitionController scrimShadeTransitionController)
)
// Resetting as they are notified upon initialization. // Resetting as they are notified upon initialization.
reset(noOpOverScroller, splitShadeOverScroller) reset(noOpOverScroller, splitShadeOverScroller)
@@ -91,6 +91,16 @@ class ShadeTransitionControllerTest : SysuiTestCase() {
verifyZeroInteractions(splitShadeOverScroller) verifyZeroInteractions(splitShadeOverScroller)
} }
@Test
fun onPanelStateChanged_forwardsToScrimTransitionController() {
initLateProperties()
startPanelExpansion()
verify(scrimShadeTransitionController).onPanelStateChanged(STATE_OPENING)
verify(scrimShadeTransitionController).onPanelExpansionChanged(DEFAULT_EXPANSION_EVENT)
}
private fun initLateProperties() { private fun initLateProperties() {
controller.qs = qs controller.qs = qs
controller.notificationStackScrollLayoutController = nsslController controller.notificationStackScrollLayoutController = nsslController
@@ -112,14 +122,20 @@ class ShadeTransitionControllerTest : SysuiTestCase() {
private fun startPanelExpansion() { private fun startPanelExpansion() {
panelExpansionStateManager.onPanelExpansionChanged( panelExpansionStateManager.onPanelExpansionChanged(
fraction = 0.5f, DEFAULT_EXPANSION_EVENT.fraction,
expanded = true, DEFAULT_EXPANSION_EVENT.expanded,
tracking = true, DEFAULT_EXPANSION_EVENT.tracking,
dragDownPxAmount = DEFAULT_DRAG_DOWN_AMOUNT DEFAULT_EXPANSION_EVENT.dragDownPxAmount,
) )
} }
companion object { companion object {
private const val DEFAULT_DRAG_DOWN_AMOUNT = 123f private const val DEFAULT_DRAG_DOWN_AMOUNT = 123f
private val DEFAULT_EXPANSION_EVENT =
PanelExpansionChangeEvent(
fraction = 0.5f,
expanded = true,
tracking = true,
dragDownPxAmount = DEFAULT_DRAG_DOWN_AMOUNT)
} }
} }