Loading packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt +8 −0 Original line number Diff line number Diff line Loading @@ -84,6 +84,10 @@ interface QSSceneAdapter { */ val qsHeight: Int /** Compatibility for use by LockscreenShadeTransitionController. Matches default from [QS] */ val isQsFullyCollapsed: Boolean get() = true sealed interface State { val isVisible: Boolean Loading Loading @@ -165,6 +169,10 @@ constructor( override val qsHeight: Int get() = qsImpl.value?.qsHeight ?: 0 // If value is null, there's no QS and therefore it's fully collapsed. override val isQsFullyCollapsed: Boolean get() = qsImpl.value?.isFullyCollapsed ?: true // Same config changes as in FragmentHostManager private val interestingChanges = InterestingConfigChanges( Loading packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeQsTransitionController.kt +5 −5 Original line number Diff line number Diff line Loading @@ -21,9 +21,9 @@ import android.util.IndentingPrintWriter import android.util.MathUtils import androidx.annotation.FloatRange import androidx.annotation.Px import com.android.systemui.res.R import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.qs.QS import com.android.systemui.res.R import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.SplitShadeStateController import dagger.assisted.Assisted Loading @@ -38,7 +38,7 @@ constructor( context: Context, configurationController: ConfigurationController, dumpManager: DumpManager, @Assisted private val qsProvider: () -> QS, @Assisted private val qsProvider: () -> QS?, splitShadeStateController: SplitShadeStateController ) : AbstractLockscreenShadeTransitionController( Loading @@ -48,7 +48,7 @@ constructor( splitShadeStateController ) { private val qs: QS private val qs: QS? get() = qsProvider() /** Loading Loading @@ -135,7 +135,7 @@ constructor( /* amount= */ MathUtils.saturate(qsDragDownAmount / qsSquishTransitionDistance) ) isTransitioningToFullShade = dragDownAmount > 0.0f qs.setTransitionToFullShadeProgress( qs?.setTransitionToFullShadeProgress( isTransitioningToFullShade, qsTransitionFraction, qsSquishTransitionFraction Loading Loading @@ -163,6 +163,6 @@ constructor( @AssistedFactory fun interface Factory { fun create(qsProvider: () -> QS): LockscreenShadeQsTransitionController fun create(qsProvider: () -> QS?): LockscreenShadeQsTransitionController } } packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt +10 −3 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import com.android.systemui.plugins.ActivityStarter.OnDismissAction import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.qs.QS import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.qs.ui.adapter.QSSceneAdapter import com.android.systemui.res.R import com.android.systemui.shade.ShadeLockscreenInteractor import com.android.systemui.shade.data.repository.ShadeRepository Loading Loading @@ -84,6 +85,7 @@ constructor( private val splitShadeStateController: SplitShadeStateController, private val shadeLockscreenInteractorLazy: Lazy<ShadeLockscreenInteractor>, naturalScrollingSettingObserver: NaturalScrollingSettingObserver, private val lazyQSSceneAdapter: Lazy<QSSceneAdapter>, ) : Dumpable { private var pulseHeight: Float = 0f Loading @@ -93,7 +95,11 @@ constructor( private var useSplitShade: Boolean = false private lateinit var nsslController: NotificationStackScrollLayoutController lateinit var centralSurfaces: CentralSurfaces lateinit var qS: QS // When in scene container mode, this will be null. In that case, we use the adapter if needed var qS: QS? = null private val isQsFullyCollapsed: Boolean get() = qS?.isFullyCollapsed ?: lazyQSSceneAdapter.get().isQsFullyCollapsed /** A handler that handles the next keyguard dismiss animation. */ private var animationHandlerOnKeyguardDismiss: ((Long) -> Unit)? = null Loading Loading @@ -286,7 +292,8 @@ constructor( /** @return true if the interaction is accepted, false if it should be cancelled */ internal fun canDragDown(): Boolean { return (statusBarStateController.state == StatusBarState.KEYGUARD || nsslController.isInLockedDownShade()) && (qS.isFullyCollapsed || useSplitShade) nsslController.isInLockedDownShade()) && (isQsFullyCollapsed || useSplitShade) } /** Called by the touch helper when when a gesture has completed all the way and released. */ Loading Loading @@ -410,7 +417,7 @@ constructor( get() = (statusBarStateController.getState() == StatusBarState.KEYGUARD && !keyguardBypassController.bypassEnabled && (qS.isFullyCollapsed || useSplitShade)) (isQsFullyCollapsed || useSplitShade)) /** The amount in pixels that the user has dragged down. */ internal var dragDownAmount = 0f Loading packages/SystemUI/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScroller.kt +5 −5 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ constructor( private val context: Context, private val scrimController: ScrimController, private val statusBarStateController: SysuiStatusBarStateController, @Assisted private val qSProvider: () -> QS, @Assisted private val qSProvider: () -> QS?, @Assisted private val nsslControllerProvider: () -> NotificationStackScrollLayoutController ) : LockScreenShadeOverScroller { Loading @@ -37,7 +37,7 @@ constructor( private var maxOverScrollAmount = 0 private var previousOverscrollAmount = 0 private val qS: QS private val qS: QS? get() = qSProvider() private val nsslController: NotificationStackScrollLayoutController Loading Loading @@ -90,7 +90,7 @@ constructor( } private fun applyOverscroll(overscrollAmount: Int) { qS.setOverScrollAmount(overscrollAmount) qS?.setOverScrollAmount(overscrollAmount) scrimController.setNotificationsOverScrollAmount(overscrollAmount) nsslController.setOverScrollAmount(overscrollAmount) } Loading @@ -109,7 +109,7 @@ constructor( val animator = ValueAnimator.ofInt(previousOverscrollAmount, 0) animator.addUpdateListener { val overScrollAmount = it.animatedValue as Int qS.setOverScrollAmount(overScrollAmount) qS?.setOverScrollAmount(overScrollAmount) scrimController.setNotificationsOverScrollAmount(overScrollAmount) nsslController.setOverScrollAmount(overScrollAmount) } Loading Loading @@ -143,7 +143,7 @@ constructor( @AssistedFactory fun interface Factory { fun create( qSProvider: () -> QS, qSProvider: () -> QS?, nsslControllerProvider: () -> NotificationStackScrollLayoutController ): SplitShadeLockScreenOverScroller } Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeQsTransitionControllerTest.kt +15 −3 Original line number Diff line number Diff line Loading @@ -18,12 +18,13 @@ package com.android.systemui.statusbar import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.systemui.res.R import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.qs.QS import com.android.systemui.res.R import com.android.systemui.statusbar.policy.FakeConfigurationController import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController import com.android.systemui.util.mockito.mock import com.google.common.truth.Expect import com.google.common.truth.Truth.assertThat import org.junit.Before Loading @@ -43,13 +44,15 @@ class LockscreenShadeQsTransitionControllerTest : SysuiTestCase() { @get:Rule val expect: Expect = Expect.create() @Mock private lateinit var dumpManager: DumpManager @Mock private lateinit var qS: QS private var qS: QS? = null private lateinit var controller: LockscreenShadeQsTransitionController @Before fun setUp() { MockitoAnnotations.initMocks(this) qS = mock() setTransitionDistance(TRANSITION_DISTANCE) setTransitionDelay(TRANSITION_DELAY) setSquishTransitionDistance(SQUISH_TRANSITION_DISTANCE) Loading Loading @@ -220,7 +223,7 @@ class LockscreenShadeQsTransitionControllerTest : SysuiTestCase() { controller.dragDownAmount = rawDragAmount verify(qS) verify(qS!!) .setTransitionToFullShadeProgress( /* isTransitioningToFullShade= */ true, /* transitionFraction= */ controller.qsTransitionFraction, Loading @@ -228,6 +231,15 @@ class LockscreenShadeQsTransitionControllerTest : SysuiTestCase() { ) } @Test fun nullQS_onDragAmountChanged_doesNotCrash() { qS = null val rawDragAmount = 200f controller.dragDownAmount = rawDragAmount } private fun setTransitionDistance(value: Int) { overrideResource(R.dimen.lockscreen_shade_qs_transition_distance, value) configurationController.notifyConfigurationChanged() Loading Loading
packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt +8 −0 Original line number Diff line number Diff line Loading @@ -84,6 +84,10 @@ interface QSSceneAdapter { */ val qsHeight: Int /** Compatibility for use by LockscreenShadeTransitionController. Matches default from [QS] */ val isQsFullyCollapsed: Boolean get() = true sealed interface State { val isVisible: Boolean Loading Loading @@ -165,6 +169,10 @@ constructor( override val qsHeight: Int get() = qsImpl.value?.qsHeight ?: 0 // If value is null, there's no QS and therefore it's fully collapsed. override val isQsFullyCollapsed: Boolean get() = qsImpl.value?.isFullyCollapsed ?: true // Same config changes as in FragmentHostManager private val interestingChanges = InterestingConfigChanges( Loading
packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeQsTransitionController.kt +5 −5 Original line number Diff line number Diff line Loading @@ -21,9 +21,9 @@ import android.util.IndentingPrintWriter import android.util.MathUtils import androidx.annotation.FloatRange import androidx.annotation.Px import com.android.systemui.res.R import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.qs.QS import com.android.systemui.res.R import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.SplitShadeStateController import dagger.assisted.Assisted Loading @@ -38,7 +38,7 @@ constructor( context: Context, configurationController: ConfigurationController, dumpManager: DumpManager, @Assisted private val qsProvider: () -> QS, @Assisted private val qsProvider: () -> QS?, splitShadeStateController: SplitShadeStateController ) : AbstractLockscreenShadeTransitionController( Loading @@ -48,7 +48,7 @@ constructor( splitShadeStateController ) { private val qs: QS private val qs: QS? get() = qsProvider() /** Loading Loading @@ -135,7 +135,7 @@ constructor( /* amount= */ MathUtils.saturate(qsDragDownAmount / qsSquishTransitionDistance) ) isTransitioningToFullShade = dragDownAmount > 0.0f qs.setTransitionToFullShadeProgress( qs?.setTransitionToFullShadeProgress( isTransitioningToFullShade, qsTransitionFraction, qsSquishTransitionFraction Loading Loading @@ -163,6 +163,6 @@ constructor( @AssistedFactory fun interface Factory { fun create(qsProvider: () -> QS): LockscreenShadeQsTransitionController fun create(qsProvider: () -> QS?): LockscreenShadeQsTransitionController } }
packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt +10 −3 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import com.android.systemui.plugins.ActivityStarter.OnDismissAction import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.qs.QS import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.qs.ui.adapter.QSSceneAdapter import com.android.systemui.res.R import com.android.systemui.shade.ShadeLockscreenInteractor import com.android.systemui.shade.data.repository.ShadeRepository Loading Loading @@ -84,6 +85,7 @@ constructor( private val splitShadeStateController: SplitShadeStateController, private val shadeLockscreenInteractorLazy: Lazy<ShadeLockscreenInteractor>, naturalScrollingSettingObserver: NaturalScrollingSettingObserver, private val lazyQSSceneAdapter: Lazy<QSSceneAdapter>, ) : Dumpable { private var pulseHeight: Float = 0f Loading @@ -93,7 +95,11 @@ constructor( private var useSplitShade: Boolean = false private lateinit var nsslController: NotificationStackScrollLayoutController lateinit var centralSurfaces: CentralSurfaces lateinit var qS: QS // When in scene container mode, this will be null. In that case, we use the adapter if needed var qS: QS? = null private val isQsFullyCollapsed: Boolean get() = qS?.isFullyCollapsed ?: lazyQSSceneAdapter.get().isQsFullyCollapsed /** A handler that handles the next keyguard dismiss animation. */ private var animationHandlerOnKeyguardDismiss: ((Long) -> Unit)? = null Loading Loading @@ -286,7 +292,8 @@ constructor( /** @return true if the interaction is accepted, false if it should be cancelled */ internal fun canDragDown(): Boolean { return (statusBarStateController.state == StatusBarState.KEYGUARD || nsslController.isInLockedDownShade()) && (qS.isFullyCollapsed || useSplitShade) nsslController.isInLockedDownShade()) && (isQsFullyCollapsed || useSplitShade) } /** Called by the touch helper when when a gesture has completed all the way and released. */ Loading Loading @@ -410,7 +417,7 @@ constructor( get() = (statusBarStateController.getState() == StatusBarState.KEYGUARD && !keyguardBypassController.bypassEnabled && (qS.isFullyCollapsed || useSplitShade)) (isQsFullyCollapsed || useSplitShade)) /** The amount in pixels that the user has dragged down. */ internal var dragDownAmount = 0f Loading
packages/SystemUI/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScroller.kt +5 −5 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ constructor( private val context: Context, private val scrimController: ScrimController, private val statusBarStateController: SysuiStatusBarStateController, @Assisted private val qSProvider: () -> QS, @Assisted private val qSProvider: () -> QS?, @Assisted private val nsslControllerProvider: () -> NotificationStackScrollLayoutController ) : LockScreenShadeOverScroller { Loading @@ -37,7 +37,7 @@ constructor( private var maxOverScrollAmount = 0 private var previousOverscrollAmount = 0 private val qS: QS private val qS: QS? get() = qSProvider() private val nsslController: NotificationStackScrollLayoutController Loading Loading @@ -90,7 +90,7 @@ constructor( } private fun applyOverscroll(overscrollAmount: Int) { qS.setOverScrollAmount(overscrollAmount) qS?.setOverScrollAmount(overscrollAmount) scrimController.setNotificationsOverScrollAmount(overscrollAmount) nsslController.setOverScrollAmount(overscrollAmount) } Loading @@ -109,7 +109,7 @@ constructor( val animator = ValueAnimator.ofInt(previousOverscrollAmount, 0) animator.addUpdateListener { val overScrollAmount = it.animatedValue as Int qS.setOverScrollAmount(overScrollAmount) qS?.setOverScrollAmount(overScrollAmount) scrimController.setNotificationsOverScrollAmount(overScrollAmount) nsslController.setOverScrollAmount(overScrollAmount) } Loading Loading @@ -143,7 +143,7 @@ constructor( @AssistedFactory fun interface Factory { fun create( qSProvider: () -> QS, qSProvider: () -> QS?, nsslControllerProvider: () -> NotificationStackScrollLayoutController ): SplitShadeLockScreenOverScroller } Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeQsTransitionControllerTest.kt +15 −3 Original line number Diff line number Diff line Loading @@ -18,12 +18,13 @@ package com.android.systemui.statusbar import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.systemui.res.R import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.qs.QS import com.android.systemui.res.R import com.android.systemui.statusbar.policy.FakeConfigurationController import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController import com.android.systemui.util.mockito.mock import com.google.common.truth.Expect import com.google.common.truth.Truth.assertThat import org.junit.Before Loading @@ -43,13 +44,15 @@ class LockscreenShadeQsTransitionControllerTest : SysuiTestCase() { @get:Rule val expect: Expect = Expect.create() @Mock private lateinit var dumpManager: DumpManager @Mock private lateinit var qS: QS private var qS: QS? = null private lateinit var controller: LockscreenShadeQsTransitionController @Before fun setUp() { MockitoAnnotations.initMocks(this) qS = mock() setTransitionDistance(TRANSITION_DISTANCE) setTransitionDelay(TRANSITION_DELAY) setSquishTransitionDistance(SQUISH_TRANSITION_DISTANCE) Loading Loading @@ -220,7 +223,7 @@ class LockscreenShadeQsTransitionControllerTest : SysuiTestCase() { controller.dragDownAmount = rawDragAmount verify(qS) verify(qS!!) .setTransitionToFullShadeProgress( /* isTransitioningToFullShade= */ true, /* transitionFraction= */ controller.qsTransitionFraction, Loading @@ -228,6 +231,15 @@ class LockscreenShadeQsTransitionControllerTest : SysuiTestCase() { ) } @Test fun nullQS_onDragAmountChanged_doesNotCrash() { qS = null val rawDragAmount = 200f controller.dragDownAmount = rawDragAmount } private fun setTransitionDistance(value: Int) { overrideResource(R.dimen.lockscreen_shade_qs_transition_distance, value) configurationController.notifyConfigurationChanged() Loading