diff options
5 files changed, 102 insertions, 33 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/panelstate/PanelExpansionStateManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/panelstate/PanelExpansionStateManager.kt index 911e750f666e..a6160aaf7756 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/panelstate/PanelExpansionStateManager.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/panelstate/PanelExpansionStateManager.kt @@ -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) 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 16f28e7d1a21..1b8afb9ddc1d 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 @@ -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 onPanelStateChanged(@PanelState state: Int) { + currentPanelState = state + onStateChanged() + } + fun onPanelExpansionChanged(panelExpansionChangeEvent: PanelExpansionChangeEvent) { - val expansionFraction = calculateScrimExpansionFraction(panelExpansionChangeEvent) + lastExpansionEvent = panelExpansionChangeEvent + onStateChanged() + } + + private fun onStateChanged() { + val expansionEvent = lastExpansionEvent ?: return + val panelState = currentPanelState + val expansionFraction = calculateScrimExpansionFraction(expansionEvent, panelState) scrimController.setRawPanelExpansionFraction(expansionFraction) lastExpansionFraction = expansionFraction - lastExpansionEvent = panelExpansionChangeEvent } - private fun calculateScrimExpansionFraction(expansionEvent: PanelExpansionChangeEvent): Float { - return if (inSplitShade && isScreenUnlocked()) { + 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()) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/shade/transition/ShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/shade/transition/ShadeTransitionController.kt index e967d4af19b1..71c61597ff11 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/shade/transition/ShadeTransitionController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/shade/transition/ShadeTransitionController.kt @@ -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} 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 cafe113e7872..304a274576b7 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 @@ -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) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/shade/transition/ShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/shade/transition/ShadeTransitionControllerTest.kt index 85a8c6bf7d95..8b7e04bbab1b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/shade/transition/ShadeTransitionControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/shade/transition/ShadeTransitionControllerTest.kt @@ -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) } } |