Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModel.kt +8 −3 Original line number Diff line number Diff line Loading @@ -19,11 +19,13 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel import com.android.systemui.common.shared.model.NotificationContainerBounds import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.model.ObservableTransitionState import com.android.systemui.scene.shared.model.SceneKey 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.flow.Flow import kotlinx.coroutines.flow.StateFlow Loading @@ -35,10 +37,11 @@ import kotlinx.coroutines.flow.distinctUntilChanged class NotificationStackAppearanceViewModel @Inject constructor( dumpManager: DumpManager, stackAppearanceInteractor: NotificationStackAppearanceInteractor, shadeInteractor: ShadeInteractor, sceneInteractor: SceneInteractor, ) { ) : FlowDumperImpl(dumpManager) { /** * The expansion fraction of the notification stack. It should go from 0 to 1 when transitioning * from Gone to Shade scenes, and remain at 1 when in Lockscreen or Shade scenes and while Loading Loading @@ -72,10 +75,12 @@ constructor( } } .distinctUntilChanged() .dumpWhileCollecting("expandFraction") /** The bounds of the notification stack in the current scene. */ val stackBounds: Flow<NotificationContainerBounds> = stackAppearanceInteractor.stackBounds val stackBounds: Flow<NotificationContainerBounds> = stackAppearanceInteractor.stackBounds.dumpValue("stackBounds") /** The y-coordinate in px of top of the contents of the notification stack. */ val contentTop: StateFlow<Float> = stackAppearanceInteractor.contentTop val contentTop: StateFlow<Float> = stackAppearanceInteractor.contentTop.dumpValue("contentTop") } packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt +25 −3 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import com.android.systemui.common.shared.model.NotificationContainerBounds import com.android.systemui.communal.domain.interactor.CommunalInteractor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dump.DumpManager import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.KeyguardState Loading Loading @@ -60,6 +61,7 @@ import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToLockscreenTran import com.android.systemui.keyguard.ui.viewmodel.ViewStateAccessor import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor import com.android.systemui.util.kotlin.FlowDumperImpl import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine import javax.inject.Inject import kotlinx.coroutines.CoroutineScope Loading Loading @@ -88,6 +90,7 @@ class SharedNotificationContainerViewModel @Inject constructor( private val interactor: SharedNotificationContainerInteractor, dumpManager: DumpManager, @Application applicationScope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, private val keyguardTransitionInteractor: KeyguardTransitionInteractor, Loading Loading @@ -116,7 +119,7 @@ constructor( private val primaryBouncerToLockscreenTransitionViewModel: PrimaryBouncerToLockscreenTransitionViewModel, private val aodBurnInViewModel: AodBurnInViewModel, ) { ) : FlowDumperImpl(dumpManager) { private val statesForConstrainedNotifications: Set<KeyguardState> = setOf(AOD, LOCKSCREEN, DOZING, ALTERNATE_BOUNCER, PRIMARY_BOUNCER) Loading @@ -126,6 +129,7 @@ constructor( .map { it.transitionState == STARTED || it.transitionState == RUNNING } .distinctUntilChanged() .onStart { emit(false) } .dumpWhileCollecting("lockscreenToGlanceableHubRunning") private val glanceableHubToLockscreenRunning = keyguardTransitionInteractor Loading @@ -133,6 +137,7 @@ constructor( .map { it.transitionState == STARTED || it.transitionState == RUNNING } .distinctUntilChanged() .onStart { emit(false) } .dumpWhileCollecting("glanceableHubToLockscreenRunning") /** * Shade locked is a legacy concept, but necessary to mimic current functionality. Listen for Loading @@ -148,8 +153,10 @@ constructor( isShadeLocked && (isQsExpanded || isShadeExpanded) } .distinctUntilChanged() .dumpWhileCollecting("isShadeLocked") val shadeCollapseFadeInComplete = MutableStateFlow(false) private val shadeCollapseFadeInComplete = MutableStateFlow(false) .dumpValue("shadeCollapseFadeInComplete") val configurationBasedDimensions: Flow<ConfigurationBasedDimensions> = interactor.configurationBasedDimensions Loading @@ -171,6 +178,7 @@ constructor( ) } .distinctUntilChanged() .dumpWhileCollecting("configurationBasedDimensions") /** If the user is visually on one of the unoccluded lockscreen states. */ val isOnLockscreen: Flow<Boolean> = Loading @@ -186,6 +194,7 @@ constructor( constrainedNotificationState || transitioningToOrFromLockscreen } .distinctUntilChanged() .dumpWhileCollecting("isOnLockscreen") /** Are we purely on the keyguard without the shade/qs? */ val isOnLockscreenWithoutShade: Flow<Boolean> = Loading @@ -204,6 +213,7 @@ constructor( started = SharingStarted.Eagerly, initialValue = false, ) .dumpValue("isOnLockscreenWithoutShade") /** Are we purely on the glanceable hub without the shade/qs? */ val isOnGlanceableHubWithoutShade: Flow<Boolean> = Loading @@ -222,6 +232,7 @@ constructor( started = SharingStarted.WhileSubscribed(), initialValue = false, ) .dumpWhileCollecting("isOnGlanceableHubWithoutShade") /** * Fade in if the user swipes the shade back up, not if collapsed by going to AOD. This is Loading Loading @@ -284,6 +295,7 @@ constructor( started = SharingStarted.WhileSubscribed(), initialValue = false, ) .dumpWhileCollecting("shadeCollapseFadeIn") /** * The container occupies the entire screen, and must be positioned relative to other elements. Loading Loading @@ -322,6 +334,7 @@ constructor( started = SharingStarted.Lazily, initialValue = NotificationContainerBounds(), ) .dumpValue("bounds") /** * Ensure view is visible when the shade/qs are expanded. Also, as QS is expanding, fade out Loading @@ -345,6 +358,7 @@ constructor( } } .onStart { emit(0f) } .dumpWhileCollecting("alphaForShadeAndQsExpansion") private val alphaWhenGoneAndShadeState: Flow<Float> = combineTransform( Loading @@ -357,6 +371,7 @@ constructor( emit(1f) } } .dumpWhileCollecting("alphaWhenGoneAndShadeState") fun expansionAlpha(viewState: ViewStateAccessor): Flow<Float> { // All transition view models are mututally exclusive, and safe to merge Loading Loading @@ -389,7 +404,9 @@ constructor( isOnLockscreenWithoutShade, shadeCollapseFadeIn, alphaForShadeAndQsExpansion, keyguardInteractor.dismissAlpha, keyguardInteractor.dismissAlpha.dumpWhileCollecting( "keyguardInteractor.keyguardAlpha" ), ) { isOnLockscreenWithoutShade, shadeCollapseFadeIn, Loading @@ -405,6 +422,7 @@ constructor( }, ) .distinctUntilChanged() .dumpWhileCollecting("expansionAlpha") } /** Loading Loading @@ -438,6 +456,7 @@ constructor( } } } .dumpWhileCollecting("glanceableHubAlpha") /** * Under certain scenarios, such as swiping up on the lockscreen, the container will need to be Loading @@ -458,6 +477,7 @@ constructor( 0f } } .dumpWhileCollecting("translationY") } /** Loading @@ -469,6 +489,7 @@ constructor( lockscreenToGlanceableHubTransitionViewModel.notificationTranslationX, glanceableHubToLockscreenTransitionViewModel.notificationTranslationX, ) .dumpWhileCollecting("translationX") /** * When on keyguard, there is limited space to display notifications so calculate how many could Loading Loading @@ -510,6 +531,7 @@ constructor( } } .distinctUntilChanged() .dumpWhileCollecting("maxNotifications") } fun notificationStackChanged() { Loading 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 @@ -16,6 +16,7 @@ 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.scene.domain.interactor.sceneInteractor Loading @@ -24,6 +25,7 @@ import com.android.systemui.statusbar.notification.stack.domain.interactor.notif val Kosmos.notificationStackAppearanceViewModel by Fixture { NotificationStackAppearanceViewModel( dumpManager = dumpManager, stackAppearanceInteractor = notificationStackAppearanceInteractor, shadeInteractor = shadeInteractor, sceneInteractor = sceneInteractor, Loading packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel import com.android.systemui.communal.domain.interactor.communalInteractor import com.android.systemui.dump.dumpManager import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.keyguard.ui.viewmodel.alternateBouncerToGoneTransitionViewModel Loading Loading @@ -48,6 +49,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.sharedNotificationContainerViewModel by Fixture { SharedNotificationContainerViewModel( interactor = sharedNotificationContainerInteractor, dumpManager = dumpManager, applicationScope = applicationCoroutineScope, keyguardInteractor = keyguardInteractor, keyguardTransitionInteractor = keyguardTransitionInteractor, Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModel.kt +8 −3 Original line number Diff line number Diff line Loading @@ -19,11 +19,13 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel import com.android.systemui.common.shared.model.NotificationContainerBounds import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.model.ObservableTransitionState import com.android.systemui.scene.shared.model.SceneKey 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.flow.Flow import kotlinx.coroutines.flow.StateFlow Loading @@ -35,10 +37,11 @@ import kotlinx.coroutines.flow.distinctUntilChanged class NotificationStackAppearanceViewModel @Inject constructor( dumpManager: DumpManager, stackAppearanceInteractor: NotificationStackAppearanceInteractor, shadeInteractor: ShadeInteractor, sceneInteractor: SceneInteractor, ) { ) : FlowDumperImpl(dumpManager) { /** * The expansion fraction of the notification stack. It should go from 0 to 1 when transitioning * from Gone to Shade scenes, and remain at 1 when in Lockscreen or Shade scenes and while Loading Loading @@ -72,10 +75,12 @@ constructor( } } .distinctUntilChanged() .dumpWhileCollecting("expandFraction") /** The bounds of the notification stack in the current scene. */ val stackBounds: Flow<NotificationContainerBounds> = stackAppearanceInteractor.stackBounds val stackBounds: Flow<NotificationContainerBounds> = stackAppearanceInteractor.stackBounds.dumpValue("stackBounds") /** The y-coordinate in px of top of the contents of the notification stack. */ val contentTop: StateFlow<Float> = stackAppearanceInteractor.contentTop val contentTop: StateFlow<Float> = stackAppearanceInteractor.contentTop.dumpValue("contentTop") }
packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt +25 −3 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import com.android.systemui.common.shared.model.NotificationContainerBounds import com.android.systemui.communal.domain.interactor.CommunalInteractor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dump.DumpManager import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.KeyguardState Loading Loading @@ -60,6 +61,7 @@ import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToLockscreenTran import com.android.systemui.keyguard.ui.viewmodel.ViewStateAccessor import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor import com.android.systemui.util.kotlin.FlowDumperImpl import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine import javax.inject.Inject import kotlinx.coroutines.CoroutineScope Loading Loading @@ -88,6 +90,7 @@ class SharedNotificationContainerViewModel @Inject constructor( private val interactor: SharedNotificationContainerInteractor, dumpManager: DumpManager, @Application applicationScope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, private val keyguardTransitionInteractor: KeyguardTransitionInteractor, Loading Loading @@ -116,7 +119,7 @@ constructor( private val primaryBouncerToLockscreenTransitionViewModel: PrimaryBouncerToLockscreenTransitionViewModel, private val aodBurnInViewModel: AodBurnInViewModel, ) { ) : FlowDumperImpl(dumpManager) { private val statesForConstrainedNotifications: Set<KeyguardState> = setOf(AOD, LOCKSCREEN, DOZING, ALTERNATE_BOUNCER, PRIMARY_BOUNCER) Loading @@ -126,6 +129,7 @@ constructor( .map { it.transitionState == STARTED || it.transitionState == RUNNING } .distinctUntilChanged() .onStart { emit(false) } .dumpWhileCollecting("lockscreenToGlanceableHubRunning") private val glanceableHubToLockscreenRunning = keyguardTransitionInteractor Loading @@ -133,6 +137,7 @@ constructor( .map { it.transitionState == STARTED || it.transitionState == RUNNING } .distinctUntilChanged() .onStart { emit(false) } .dumpWhileCollecting("glanceableHubToLockscreenRunning") /** * Shade locked is a legacy concept, but necessary to mimic current functionality. Listen for Loading @@ -148,8 +153,10 @@ constructor( isShadeLocked && (isQsExpanded || isShadeExpanded) } .distinctUntilChanged() .dumpWhileCollecting("isShadeLocked") val shadeCollapseFadeInComplete = MutableStateFlow(false) private val shadeCollapseFadeInComplete = MutableStateFlow(false) .dumpValue("shadeCollapseFadeInComplete") val configurationBasedDimensions: Flow<ConfigurationBasedDimensions> = interactor.configurationBasedDimensions Loading @@ -171,6 +178,7 @@ constructor( ) } .distinctUntilChanged() .dumpWhileCollecting("configurationBasedDimensions") /** If the user is visually on one of the unoccluded lockscreen states. */ val isOnLockscreen: Flow<Boolean> = Loading @@ -186,6 +194,7 @@ constructor( constrainedNotificationState || transitioningToOrFromLockscreen } .distinctUntilChanged() .dumpWhileCollecting("isOnLockscreen") /** Are we purely on the keyguard without the shade/qs? */ val isOnLockscreenWithoutShade: Flow<Boolean> = Loading @@ -204,6 +213,7 @@ constructor( started = SharingStarted.Eagerly, initialValue = false, ) .dumpValue("isOnLockscreenWithoutShade") /** Are we purely on the glanceable hub without the shade/qs? */ val isOnGlanceableHubWithoutShade: Flow<Boolean> = Loading @@ -222,6 +232,7 @@ constructor( started = SharingStarted.WhileSubscribed(), initialValue = false, ) .dumpWhileCollecting("isOnGlanceableHubWithoutShade") /** * Fade in if the user swipes the shade back up, not if collapsed by going to AOD. This is Loading Loading @@ -284,6 +295,7 @@ constructor( started = SharingStarted.WhileSubscribed(), initialValue = false, ) .dumpWhileCollecting("shadeCollapseFadeIn") /** * The container occupies the entire screen, and must be positioned relative to other elements. Loading Loading @@ -322,6 +334,7 @@ constructor( started = SharingStarted.Lazily, initialValue = NotificationContainerBounds(), ) .dumpValue("bounds") /** * Ensure view is visible when the shade/qs are expanded. Also, as QS is expanding, fade out Loading @@ -345,6 +358,7 @@ constructor( } } .onStart { emit(0f) } .dumpWhileCollecting("alphaForShadeAndQsExpansion") private val alphaWhenGoneAndShadeState: Flow<Float> = combineTransform( Loading @@ -357,6 +371,7 @@ constructor( emit(1f) } } .dumpWhileCollecting("alphaWhenGoneAndShadeState") fun expansionAlpha(viewState: ViewStateAccessor): Flow<Float> { // All transition view models are mututally exclusive, and safe to merge Loading Loading @@ -389,7 +404,9 @@ constructor( isOnLockscreenWithoutShade, shadeCollapseFadeIn, alphaForShadeAndQsExpansion, keyguardInteractor.dismissAlpha, keyguardInteractor.dismissAlpha.dumpWhileCollecting( "keyguardInteractor.keyguardAlpha" ), ) { isOnLockscreenWithoutShade, shadeCollapseFadeIn, Loading @@ -405,6 +422,7 @@ constructor( }, ) .distinctUntilChanged() .dumpWhileCollecting("expansionAlpha") } /** Loading Loading @@ -438,6 +456,7 @@ constructor( } } } .dumpWhileCollecting("glanceableHubAlpha") /** * Under certain scenarios, such as swiping up on the lockscreen, the container will need to be Loading @@ -458,6 +477,7 @@ constructor( 0f } } .dumpWhileCollecting("translationY") } /** Loading @@ -469,6 +489,7 @@ constructor( lockscreenToGlanceableHubTransitionViewModel.notificationTranslationX, glanceableHubToLockscreenTransitionViewModel.notificationTranslationX, ) .dumpWhileCollecting("translationX") /** * When on keyguard, there is limited space to display notifications so calculate how many could Loading Loading @@ -510,6 +531,7 @@ constructor( } } .distinctUntilChanged() .dumpWhileCollecting("maxNotifications") } fun notificationStackChanged() { Loading
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 @@ -16,6 +16,7 @@ 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.scene.domain.interactor.sceneInteractor Loading @@ -24,6 +25,7 @@ import com.android.systemui.statusbar.notification.stack.domain.interactor.notif val Kosmos.notificationStackAppearanceViewModel by Fixture { NotificationStackAppearanceViewModel( dumpManager = dumpManager, stackAppearanceInteractor = notificationStackAppearanceInteractor, shadeInteractor = shadeInteractor, sceneInteractor = sceneInteractor, Loading
packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel import com.android.systemui.communal.domain.interactor.communalInteractor import com.android.systemui.dump.dumpManager import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.keyguard.ui.viewmodel.alternateBouncerToGoneTransitionViewModel Loading Loading @@ -48,6 +49,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.sharedNotificationContainerViewModel by Fixture { SharedNotificationContainerViewModel( interactor = sharedNotificationContainerInteractor, dumpManager = dumpManager, applicationScope = applicationCoroutineScope, keyguardInteractor = keyguardInteractor, keyguardTransitionInteractor = keyguardTransitionInteractor, Loading