Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt +11 −0 Original line number Diff line number Diff line Loading @@ -97,6 +97,8 @@ class NotificationStackAppearanceIntegrationTest : SysuiTestCase() { sceneInteractor.setTransitionState(transitionState) val expandFraction by collectLastValue(appearanceViewModel.expandFraction) assertThat(expandFraction).isEqualTo(0f) val isScrollable by collectLastValue(appearanceViewModel.isScrollable) assertThat(isScrollable).isFalse() fakeSceneDataSource.pause() sceneInteractor.changeScene(Scenes.Shade, "reason") Loading @@ -119,6 +121,7 @@ class NotificationStackAppearanceIntegrationTest : SysuiTestCase() { fakeSceneDataSource.unpause(expectedScene = Scenes.Shade) assertThat(expandFraction).isWithin(0.01f).of(1f) assertThat(isScrollable).isTrue() } @Test Loading @@ -131,6 +134,8 @@ class NotificationStackAppearanceIntegrationTest : SysuiTestCase() { sceneInteractor.setTransitionState(transitionState) val expandFraction by collectLastValue(appearanceViewModel.expandFraction) assertThat(expandFraction).isEqualTo(1f) val isScrollable by collectLastValue(appearanceViewModel.isScrollable) assertThat(isScrollable).isFalse() } @Test Loading @@ -144,7 +149,12 @@ class NotificationStackAppearanceIntegrationTest : SysuiTestCase() { val expandFraction by collectLastValue(appearanceViewModel.expandFraction) assertThat(expandFraction).isEqualTo(1f) fakeSceneDataSource.changeScene(toScene = Scenes.Shade) val isScrollable by collectLastValue(appearanceViewModel.isScrollable) assertThat(isScrollable).isTrue() fakeSceneDataSource.pause() sceneInteractor.changeScene(Scenes.QuickSettings, "reason") val transitionProgress = MutableStateFlow(0f) transitionState.value = Loading @@ -165,5 +175,6 @@ class NotificationStackAppearanceIntegrationTest : SysuiTestCase() { fakeSceneDataSource.unpause(expectedScene = Scenes.QuickSettings) assertThat(expandFraction).isEqualTo(1f) assertThat(isScrollable).isFalse() } } packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java +4 −2 Original line number Diff line number Diff line Loading @@ -982,8 +982,10 @@ public class QuickSettingsControllerImpl implements QuickSettingsController, Dum if (!FooterViewRefactor.isEnabled()) { mNotificationStackScrollLayoutController.setQsFullScreen(qsFullScreen); } if (!SceneContainerFlag.isEnabled()) { mNotificationStackScrollLayoutController.setScrollingEnabled( mBarState != KEYGUARD && (!qsFullScreen || mExpansionFromOverscroll)); } if (mQsStateUpdateListener != null) { mQsStateUpdateListener.onQsStateUpdated(getExpanded(), mStackScrollerOverscrolling); Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationStackAppearanceViewBinder.kt +2 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,8 @@ object NotificationStackAppearanceViewBinder { wasExpanding = nowExpanding } } launch { viewModel.isScrollable.collect { controller.setScrollingEnabled(it) } } } } } Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModel.kt +9 −0 Original line number Diff line number Diff line Loading @@ -20,23 +20,28 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel import com.android.compose.animation.scene.ObservableTransitionState import com.android.systemui.common.shared.model.NotificationContainerBounds import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dump.DumpManager import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.Scenes.Shade import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor import com.android.systemui.util.kotlin.FlowDumperImpl import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map /** ViewModel which represents the state of the NSSL/Controller in the world of flexiglass */ @SysUISingleton class NotificationStackAppearanceViewModel @Inject constructor( @Application applicationScope: CoroutineScope, dumpManager: DumpManager, stackAppearanceInteractor: NotificationStackAppearanceInteractor, shadeInteractor: ShadeInteractor, Loading Loading @@ -83,4 +88,8 @@ constructor( /** The y-coordinate in px of top of the contents of the notification stack. */ val contentTop: StateFlow<Float> = stackAppearanceInteractor.contentTop.dumpValue("contentTop") /** Whether the notification stack is scrollable or not. */ val isScrollable: Flow<Boolean> = sceneInteractor.currentScene.map { it == Shade }.dumpWhileCollecting("isScrollable") } packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModelKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -19,12 +19,14 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel import com.android.systemui.dump.dumpManager import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationStackAppearanceInteractor val Kosmos.notificationStackAppearanceViewModel by Fixture { NotificationStackAppearanceViewModel( applicationScope = applicationCoroutineScope, dumpManager = dumpManager, stackAppearanceInteractor = notificationStackAppearanceInteractor, shadeInteractor = shadeInteractor, Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt +11 −0 Original line number Diff line number Diff line Loading @@ -97,6 +97,8 @@ class NotificationStackAppearanceIntegrationTest : SysuiTestCase() { sceneInteractor.setTransitionState(transitionState) val expandFraction by collectLastValue(appearanceViewModel.expandFraction) assertThat(expandFraction).isEqualTo(0f) val isScrollable by collectLastValue(appearanceViewModel.isScrollable) assertThat(isScrollable).isFalse() fakeSceneDataSource.pause() sceneInteractor.changeScene(Scenes.Shade, "reason") Loading @@ -119,6 +121,7 @@ class NotificationStackAppearanceIntegrationTest : SysuiTestCase() { fakeSceneDataSource.unpause(expectedScene = Scenes.Shade) assertThat(expandFraction).isWithin(0.01f).of(1f) assertThat(isScrollable).isTrue() } @Test Loading @@ -131,6 +134,8 @@ class NotificationStackAppearanceIntegrationTest : SysuiTestCase() { sceneInteractor.setTransitionState(transitionState) val expandFraction by collectLastValue(appearanceViewModel.expandFraction) assertThat(expandFraction).isEqualTo(1f) val isScrollable by collectLastValue(appearanceViewModel.isScrollable) assertThat(isScrollable).isFalse() } @Test Loading @@ -144,7 +149,12 @@ class NotificationStackAppearanceIntegrationTest : SysuiTestCase() { val expandFraction by collectLastValue(appearanceViewModel.expandFraction) assertThat(expandFraction).isEqualTo(1f) fakeSceneDataSource.changeScene(toScene = Scenes.Shade) val isScrollable by collectLastValue(appearanceViewModel.isScrollable) assertThat(isScrollable).isTrue() fakeSceneDataSource.pause() sceneInteractor.changeScene(Scenes.QuickSettings, "reason") val transitionProgress = MutableStateFlow(0f) transitionState.value = Loading @@ -165,5 +175,6 @@ class NotificationStackAppearanceIntegrationTest : SysuiTestCase() { fakeSceneDataSource.unpause(expectedScene = Scenes.QuickSettings) assertThat(expandFraction).isEqualTo(1f) assertThat(isScrollable).isFalse() } }
packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java +4 −2 Original line number Diff line number Diff line Loading @@ -982,8 +982,10 @@ public class QuickSettingsControllerImpl implements QuickSettingsController, Dum if (!FooterViewRefactor.isEnabled()) { mNotificationStackScrollLayoutController.setQsFullScreen(qsFullScreen); } if (!SceneContainerFlag.isEnabled()) { mNotificationStackScrollLayoutController.setScrollingEnabled( mBarState != KEYGUARD && (!qsFullScreen || mExpansionFromOverscroll)); } if (mQsStateUpdateListener != null) { mQsStateUpdateListener.onQsStateUpdated(getExpanded(), mStackScrollerOverscrolling); Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationStackAppearanceViewBinder.kt +2 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,8 @@ object NotificationStackAppearanceViewBinder { wasExpanding = nowExpanding } } launch { viewModel.isScrollable.collect { controller.setScrollingEnabled(it) } } } } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModel.kt +9 −0 Original line number Diff line number Diff line Loading @@ -20,23 +20,28 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel import com.android.compose.animation.scene.ObservableTransitionState import com.android.systemui.common.shared.model.NotificationContainerBounds import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dump.DumpManager import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.Scenes.Shade import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor import com.android.systemui.util.kotlin.FlowDumperImpl import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map /** ViewModel which represents the state of the NSSL/Controller in the world of flexiglass */ @SysUISingleton class NotificationStackAppearanceViewModel @Inject constructor( @Application applicationScope: CoroutineScope, dumpManager: DumpManager, stackAppearanceInteractor: NotificationStackAppearanceInteractor, shadeInteractor: ShadeInteractor, Loading Loading @@ -83,4 +88,8 @@ constructor( /** The y-coordinate in px of top of the contents of the notification stack. */ val contentTop: StateFlow<Float> = stackAppearanceInteractor.contentTop.dumpValue("contentTop") /** Whether the notification stack is scrollable or not. */ val isScrollable: Flow<Boolean> = sceneInteractor.currentScene.map { it == Shade }.dumpWhileCollecting("isScrollable") }
packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModelKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -19,12 +19,14 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel import com.android.systemui.dump.dumpManager import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationStackAppearanceInteractor val Kosmos.notificationStackAppearanceViewModel by Fixture { NotificationStackAppearanceViewModel( applicationScope = applicationCoroutineScope, dumpManager = dumpManager, stackAppearanceInteractor = notificationStackAppearanceInteractor, shadeInteractor = shadeInteractor, Loading