Merge "[Split shade][Motion] Fix scrim not being fully opaque after shade expansion" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
0ec6e12771
@@ -20,6 +20,7 @@ import android.annotation.IntDef
|
||||
import android.util.Log
|
||||
import androidx.annotation.FloatRange
|
||||
import com.android.systemui.dagger.SysUISingleton
|
||||
import com.android.systemui.util.Compile
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
@@ -109,8 +110,8 @@ class PanelExpansionStateManager @Inject constructor() {
|
||||
|
||||
debugLog(
|
||||
"panelExpansionChanged:" +
|
||||
"start state=${oldState.stateToString()} " +
|
||||
"end state=${state.stateToString()} " +
|
||||
"start state=${oldState.panelStateToString()} " +
|
||||
"end state=${state.panelStateToString()} " +
|
||||
"f=$fraction " +
|
||||
"expanded=$expanded " +
|
||||
"tracking=$tracking" +
|
||||
@@ -126,14 +127,15 @@ class PanelExpansionStateManager @Inject constructor() {
|
||||
|
||||
/** Updates the panel state if necessary. */
|
||||
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) {
|
||||
updateStateInternal(state)
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
stateListeners.forEach { it.onPanelStateChanged(state) }
|
||||
}
|
||||
@@ -154,7 +156,7 @@ const val STATE_OPENING = 1
|
||||
const val STATE_OPEN = 2
|
||||
|
||||
@PanelState
|
||||
private fun Int.stateToString(): String {
|
||||
fun Int.panelStateToString(): String {
|
||||
return when (this) {
|
||||
STATE_CLOSED -> "CLOSED"
|
||||
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 DEBUG = Compile.IS_DEBUG && Log.isLoggable(TAG, Log.DEBUG)
|
||||
|
||||
@@ -11,6 +11,8 @@ 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.phone.panelstate.PanelState
|
||||
import com.android.systemui.statusbar.phone.panelstate.STATE_OPENING
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController
|
||||
import com.android.systemui.util.LargeScreenUtils
|
||||
import java.io.PrintWriter
|
||||
@@ -30,8 +32,9 @@ constructor(
|
||||
|
||||
private var inSplitShade = false
|
||||
private var splitShadeScrimTransitionDistance = 0
|
||||
private var lastExpansionFraction: Float = 0f
|
||||
private var lastExpansionFraction: Float? = null
|
||||
private var lastExpansionEvent: PanelExpansionChangeEvent? = null
|
||||
private var currentPanelState: Int? = null
|
||||
|
||||
init {
|
||||
updateResources()
|
||||
@@ -41,8 +44,8 @@ constructor(
|
||||
updateResources()
|
||||
}
|
||||
})
|
||||
dumpManager
|
||||
.registerDumpable(ScrimShadeTransitionController::class.java.simpleName, this::dump)
|
||||
dumpManager.registerDumpable(
|
||||
ScrimShadeTransitionController::class.java.simpleName, this::dump)
|
||||
}
|
||||
|
||||
private fun updateResources() {
|
||||
@@ -51,21 +54,38 @@ constructor(
|
||||
resources.getDimensionPixelSize(R.dimen.split_shade_scrim_transition_distance)
|
||||
}
|
||||
|
||||
fun onPanelExpansionChanged(panelExpansionChangeEvent: PanelExpansionChangeEvent) {
|
||||
val expansionFraction = calculateScrimExpansionFraction(panelExpansionChangeEvent)
|
||||
scrimController.setRawPanelExpansionFraction(expansionFraction)
|
||||
lastExpansionFraction = expansionFraction
|
||||
lastExpansionEvent = panelExpansionChangeEvent
|
||||
fun onPanelStateChanged(@PanelState state: Int) {
|
||||
currentPanelState = state
|
||||
onStateChanged()
|
||||
}
|
||||
|
||||
private fun calculateScrimExpansionFraction(expansionEvent: PanelExpansionChangeEvent): Float {
|
||||
return if (inSplitShade && isScreenUnlocked()) {
|
||||
fun onPanelExpansionChanged(panelExpansionChangeEvent: PanelExpansionChangeEvent) {
|
||||
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)
|
||||
} else {
|
||||
expansionEvent.fraction
|
||||
}
|
||||
}
|
||||
|
||||
private fun canUseCustomFraction(panelState: Int?) =
|
||||
inSplitShade && isScreenUnlocked() && panelState == STATE_OPENING
|
||||
|
||||
private fun isScreenUnlocked() =
|
||||
statusBarStateController.currentOrUpcomingState == StatusBarState.SHADE
|
||||
|
||||
@@ -78,9 +98,9 @@ constructor(
|
||||
isScreenUnlocked: ${isScreenUnlocked()}
|
||||
splitShadeScrimTransitionDistance: $splitShadeScrimTransitionDistance
|
||||
State:
|
||||
currentPanelState: $currentPanelState
|
||||
lastExpansionFraction: $lastExpansionFraction
|
||||
lastExpansionEvent: $lastExpansionEvent
|
||||
""".trimIndent()
|
||||
)
|
||||
""".trimIndent())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.PanelExpansionStateManager
|
||||
import com.android.systemui.statusbar.phone.panelstate.PanelState
|
||||
import com.android.systemui.statusbar.phone.panelstate.panelStateToString
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController
|
||||
import java.io.PrintWriter
|
||||
import javax.inject.Inject
|
||||
@@ -34,6 +35,8 @@ constructor(
|
||||
lateinit var qs: QS
|
||||
|
||||
private var inSplitShade = false
|
||||
private var currentPanelState: Int? = null
|
||||
private var lastPanelExpansionChangeEvent: PanelExpansionChangeEvent? = null
|
||||
|
||||
private val splitShadeOverScroller by lazy {
|
||||
splitShadeOverScrollerFactory.create({ qs }, { notificationStackScrollLayoutController })
|
||||
@@ -66,10 +69,13 @@ constructor(
|
||||
}
|
||||
|
||||
private fun onPanelStateChanged(@PanelState state: Int) {
|
||||
currentPanelState = state
|
||||
shadeOverScroller.onPanelStateChanged(state)
|
||||
scrimShadeTransitionController.onPanelStateChanged(state)
|
||||
}
|
||||
|
||||
private fun onPanelExpansionChanged(event: PanelExpansionChangeEvent) {
|
||||
lastPanelExpansionChangeEvent = event
|
||||
shadeOverScroller.onDragDownAmountChanged(event.dragDownPxAmount)
|
||||
scrimShadeTransitionController.onPanelExpansionChanged(event)
|
||||
}
|
||||
@@ -84,6 +90,8 @@ constructor(
|
||||
"""
|
||||
ShadeTransitionController:
|
||||
inSplitShade: $inSplitShade
|
||||
currentPanelState: ${currentPanelState?.panelStateToString()}
|
||||
lastPanelExpansionChangeEvent: $lastPanelExpansionChangeEvent
|
||||
qs.isInitialized: ${this::qs.isInitialized}
|
||||
npvc.isInitialized: ${this::notificationPanelViewController.isInitialized}
|
||||
nssl.isInitialized: ${this::notificationStackScrollLayoutController.isInitialized}
|
||||
|
||||
@@ -9,6 +9,9 @@ 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.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 org.junit.Before
|
||||
import org.junit.Test
|
||||
@@ -39,8 +42,9 @@ class ScrimShadeTransitionControllerTest : SysuiTestCase() {
|
||||
dumpManager,
|
||||
scrimController,
|
||||
context.resources,
|
||||
statusBarStateController
|
||||
)
|
||||
statusBarStateController)
|
||||
|
||||
controller.onPanelStateChanged(STATE_OPENING)
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -54,8 +58,7 @@ class ScrimShadeTransitionControllerTest : SysuiTestCase() {
|
||||
|
||||
@Test
|
||||
fun onPanelExpansionChanged_inSplitShade_unlockedShade_setsFractionBasedOnDragDownAmount() {
|
||||
whenever(statusBarStateController.currentOrUpcomingState)
|
||||
.thenReturn(StatusBarState.SHADE)
|
||||
whenever(statusBarStateController.currentOrUpcomingState).thenReturn(StatusBarState.SHADE)
|
||||
val scrimShadeTransitionDistance =
|
||||
context.resources.getDimensionPixelSize(R.dimen.split_shade_scrim_transition_distance)
|
||||
setSplitShadeEnabled(true)
|
||||
@@ -68,23 +71,20 @@ class ScrimShadeTransitionControllerTest : SysuiTestCase() {
|
||||
|
||||
@Test
|
||||
fun onPanelExpansionChanged_inSplitShade_largeDragDownAmount_fractionIsNotGreaterThan1() {
|
||||
whenever(statusBarStateController.currentOrUpcomingState)
|
||||
.thenReturn(StatusBarState.SHADE)
|
||||
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)
|
||||
)
|
||||
EXPANSION_EVENT.copy(dragDownPxAmount = 100f * scrimShadeTransitionDistance))
|
||||
|
||||
verify(scrimController).setRawPanelExpansionFraction(1f)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun onPanelExpansionChanged_inSplitShade_negativeDragDownAmount_fractionIsNotLessThan0() {
|
||||
whenever(statusBarStateController.currentOrUpcomingState)
|
||||
.thenReturn(StatusBarState.SHADE)
|
||||
whenever(statusBarStateController.currentOrUpcomingState).thenReturn(StatusBarState.SHADE)
|
||||
setSplitShadeEnabled(true)
|
||||
|
||||
controller.onPanelExpansionChanged(EXPANSION_EVENT.copy(dragDownPxAmount = -100f))
|
||||
@@ -114,6 +114,30 @@ class ScrimShadeTransitionControllerTest : SysuiTestCase() {
|
||||
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) {
|
||||
overrideResource(R.bool.config_use_split_notification_shade, enabled)
|
||||
configurationController.notifyConfigurationChanged()
|
||||
@@ -122,7 +146,6 @@ class ScrimShadeTransitionControllerTest : SysuiTestCase() {
|
||||
companion object {
|
||||
val EXPANSION_EVENT =
|
||||
PanelExpansionChangeEvent(
|
||||
fraction = 0.5f, expanded = true, tracking = true, dragDownPxAmount = 10f
|
||||
)
|
||||
fraction = 0.5f, expanded = true, tracking = true, dragDownPxAmount = 10f)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import com.android.systemui.dump.DumpManager
|
||||
import com.android.systemui.plugins.qs.QS
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
|
||||
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.STATE_OPENING
|
||||
import com.android.systemui.statusbar.policy.FakeConfigurationController
|
||||
@@ -49,8 +50,7 @@ class ShadeTransitionControllerTest : SysuiTestCase() {
|
||||
context,
|
||||
splitShadeOverScrollerFactory = { _, _ -> splitShadeOverScroller },
|
||||
noOpOverScroller,
|
||||
scrimShadeTransitionController
|
||||
)
|
||||
scrimShadeTransitionController)
|
||||
|
||||
// Resetting as they are notified upon initialization.
|
||||
reset(noOpOverScroller, splitShadeOverScroller)
|
||||
@@ -91,6 +91,16 @@ class ShadeTransitionControllerTest : SysuiTestCase() {
|
||||
verifyZeroInteractions(splitShadeOverScroller)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun onPanelStateChanged_forwardsToScrimTransitionController() {
|
||||
initLateProperties()
|
||||
|
||||
startPanelExpansion()
|
||||
|
||||
verify(scrimShadeTransitionController).onPanelStateChanged(STATE_OPENING)
|
||||
verify(scrimShadeTransitionController).onPanelExpansionChanged(DEFAULT_EXPANSION_EVENT)
|
||||
}
|
||||
|
||||
private fun initLateProperties() {
|
||||
controller.qs = qs
|
||||
controller.notificationStackScrollLayoutController = nsslController
|
||||
@@ -112,14 +122,20 @@ class ShadeTransitionControllerTest : SysuiTestCase() {
|
||||
|
||||
private fun startPanelExpansion() {
|
||||
panelExpansionStateManager.onPanelExpansionChanged(
|
||||
fraction = 0.5f,
|
||||
expanded = true,
|
||||
tracking = true,
|
||||
dragDownPxAmount = DEFAULT_DRAG_DOWN_AMOUNT
|
||||
DEFAULT_EXPANSION_EVENT.fraction,
|
||||
DEFAULT_EXPANSION_EVENT.expanded,
|
||||
DEFAULT_EXPANSION_EVENT.tracking,
|
||||
DEFAULT_EXPANSION_EVENT.dragDownPxAmount,
|
||||
)
|
||||
}
|
||||
|
||||
companion object {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user