Loading packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt +21 −3 Original line number Diff line number Diff line Loading @@ -47,10 +47,14 @@ import com.android.systemui.scene.data.repository.setSceneTransition import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.shadeTestUtil import com.android.systemui.statusbar.notification.data.model.activeNotificationModel import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationsStore import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationsKeyguardInteractor import com.android.systemui.statusbar.phone.dozeParameters import com.android.systemui.statusbar.phone.screenOffAnimationController import com.android.systemui.testKosmos import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever import com.android.systemui.util.ui.isAnimating import com.android.systemui.util.ui.stopAnimating Loading @@ -73,7 +77,7 @@ import platform.test.runner.parameterized.Parameters @EnableFlags( FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT, FLAG_NEW_AOD_TRANSITION, FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR, ) class KeyguardRootViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { private val kosmos = testKosmos() Loading Loading @@ -110,6 +114,20 @@ class KeyguardRootViewModelTest(flags: FlagsParameterization) : SysuiTestCase() @Before fun setUp() { kosmos.sceneContainerRepository.setTransitionState(transitionState) // Add sample notif so that the notif shelf has something to display kosmos.activeNotificationListRepository.activeNotifications.value = ActiveNotificationsStore.Builder() .apply { addIndividualNotif( activeNotificationModel( key = "notif", aodIcon = mock(), groupKey = "testGroup", ) ) } .build() } @Test Loading @@ -129,7 +147,7 @@ class KeyguardRootViewModelTest(flags: FlagsParameterization) : SysuiTestCase() from = KeyguardState.LOCKSCREEN, to = KeyguardState.AOD, value = 0f, transitionState = TransitionState.STARTED transitionState = TransitionState.STARTED, ), validateStep = false, ) Loading Loading @@ -393,7 +411,7 @@ class KeyguardRootViewModelTest(flags: FlagsParameterization) : SysuiTestCase() flowOf(Scenes.Communal), flowOf(0.5f), false, emptyFlow() emptyFlow(), ) keyguardTransitionRepository.sendTransitionSteps( Loading packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt +3 −0 Original line number Diff line number Diff line Loading @@ -324,6 +324,9 @@ object KeyguardRootViewBinder { .getDimensionPixelSize(R.dimen.shelf_appear_translation) .stateIn(this) viewModel.isNotifIconContainerVisible.collect { isVisible -> if (isVisible.value) { blueprintViewModel.refreshBlueprint() } childViews[aodNotificationIconContainerId] ?.setAodNotifIconContainerIsVisible( isVisible, Loading packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBlueprintViewModel.kt +8 −7 Original line number Diff line number Diff line Loading @@ -25,20 +25,18 @@ import androidx.constraintlayout.widget.ConstraintLayout import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor import com.android.systemui.keyguard.ui.view.layout.blueprints.transitions.IntraBlueprintTransition.Config import com.android.systemui.keyguard.ui.view.layout.blueprints.transitions.IntraBlueprintTransition.Type import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow data class TransitionData( val config: Config, val start: Long = System.currentTimeMillis(), ) data class TransitionData(val config: Config, val start: Long = System.currentTimeMillis()) class KeyguardBlueprintViewModel @Inject constructor( @Main private val handler: Handler, keyguardBlueprintInteractor: KeyguardBlueprintInteractor, private val keyguardBlueprintInteractor: KeyguardBlueprintInteractor, ) { val blueprint = keyguardBlueprintInteractor.blueprint val blueprintId = keyguardBlueprintInteractor.blueprintId Loading Loading @@ -76,6 +74,9 @@ constructor( } } fun refreshBlueprint(type: Type = Type.NoTransition) = keyguardBlueprintInteractor.refreshBlueprint(type) fun updateTransitions(data: TransitionData?, mutate: MutableSet<Transition>.() -> Unit) { runningTransitions.mutate() Loading @@ -95,7 +96,7 @@ constructor( Log.w( TAG, "runTransition: skipping ${transition::class.simpleName}: " + "currentPriority=$currentPriority; config=$config" "currentPriority=$currentPriority; config=$config", ) } apply() Loading @@ -106,7 +107,7 @@ constructor( Log.i( TAG, "runTransition: running ${transition::class.simpleName}: " + "currentPriority=$currentPriority; config=$config" "currentPriority=$currentPriority; config=$config", ) } Loading packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt +11 −6 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.shade.ui.viewmodel.NotificationShadeWindowModel import com.android.systemui.statusbar.notification.domain.interactor.NotificationsKeyguardInteractor import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerAlwaysOnDisplayViewModel import com.android.systemui.statusbar.phone.DozeParameters import com.android.systemui.statusbar.phone.ScreenOffAnimationController import com.android.systemui.util.kotlin.BooleanFlowOperators.anyOf Loading Loading @@ -81,6 +82,7 @@ constructor( private val keyguardTransitionInteractor: KeyguardTransitionInteractor, private val notificationsKeyguardInteractor: NotificationsKeyguardInteractor, notificationShadeWindowModel: NotificationShadeWindowModel, private val aodNotificationIconViewModel: NotificationIconContainerAlwaysOnDisplayViewModel, private val alternateBouncerToAodTransitionViewModel: AlternateBouncerToAodTransitionViewModel, private val alternateBouncerToGoneTransitionViewModel: AlternateBouncerToGoneTransitionViewModel, Loading Loading @@ -130,7 +132,7 @@ constructor( val goneToAodTransition = keyguardTransitionInteractor.transition( edge = Edge.create(Scenes.Gone, AOD), edgeWithoutSceneContainer = Edge.create(GONE, AOD) edgeWithoutSceneContainer = Edge.create(GONE, AOD), ) private val goneToAodTransitionRunning: Flow<Boolean> = Loading Loading @@ -183,7 +185,7 @@ constructor( /* rangeMax = */ 1f, /* valueMin = */ 0f, /* valueMax = */ 0.2f, /* value = */ max(qsExpansion, shadeExpansion) /* value = */ max(qsExpansion, shadeExpansion), ) emit(alpha) } Loading Loading @@ -254,7 +256,7 @@ constructor( primaryBouncerToGoneTransitionViewModel.lockscreenAlpha, primaryBouncerToLockscreenTransitionViewModel.lockscreenAlpha(viewState), ) .onStart { emit(1f) } .onStart { emit(1f) }, ) { hideKeyguard, alpha -> if (hideKeyguard) { 0f Loading Loading @@ -304,11 +306,12 @@ constructor( .onStart { emit(false) }, keyguardTransitionInteractor.isFinishedIn( scene = Scenes.Gone, stateWithoutSceneContainer = GONE stateWithoutSceneContainer = GONE, ), deviceEntryInteractor.isBypassEnabled, areNotifsFullyHiddenAnimated(), isPulseExpandingAnimated(), aodNotificationIconViewModel.icons.map { it.visibleIcons.isNotEmpty() }, ) { flows -> val goneToAodTransitionRunning = flows[0] as Boolean val isOnLockscreen = flows[1] as Boolean Loading @@ -316,6 +319,7 @@ constructor( val isBypassEnabled = flows[3] as Boolean val notifsFullyHidden = flows[4] as AnimatedValue<Boolean> val pulseExpanding = flows[5] as AnimatedValue<Boolean> val hasAodIcons = flows[6] as Boolean when { // Hide the AOD icons if we're not in the KEYGUARD state unless the screen off Loading @@ -327,9 +331,10 @@ constructor( else -> zip(notifsFullyHidden, pulseExpanding) { areNotifsFullyHidden, isPulseExpanding, -> isPulseExpanding -> when { // If there are no notification icons to show, then it can be hidden !hasAodIcons -> false // If we're bypassing, then we're visible isBypassEnabled -> true // If we are pulsing (and not bypassing), then we are hidden Loading packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.shade.ui.viewmodel.notificationShadeWindowModel import com.android.systemui.statusbar.notification.icon.ui.viewmodel.notificationIconContainerAlwaysOnDisplayViewModel import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationsKeyguardInteractor import com.android.systemui.statusbar.phone.dozeParameters import com.android.systemui.statusbar.phone.screenOffAnimationController Loading @@ -40,6 +41,7 @@ val Kosmos.keyguardRootViewModel by Fixture { communalInteractor = communalInteractor, keyguardTransitionInteractor = keyguardTransitionInteractor, notificationsKeyguardInteractor = notificationsKeyguardInteractor, aodNotificationIconViewModel = notificationIconContainerAlwaysOnDisplayViewModel, notificationShadeWindowModel = notificationShadeWindowModel, alternateBouncerToAodTransitionViewModel = alternateBouncerToAodTransitionViewModel, alternateBouncerToGoneTransitionViewModel = alternateBouncerToGoneTransitionViewModel, Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt +21 −3 Original line number Diff line number Diff line Loading @@ -47,10 +47,14 @@ import com.android.systemui.scene.data.repository.setSceneTransition import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.shadeTestUtil import com.android.systemui.statusbar.notification.data.model.activeNotificationModel import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationsStore import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationsKeyguardInteractor import com.android.systemui.statusbar.phone.dozeParameters import com.android.systemui.statusbar.phone.screenOffAnimationController import com.android.systemui.testKosmos import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever import com.android.systemui.util.ui.isAnimating import com.android.systemui.util.ui.stopAnimating Loading @@ -73,7 +77,7 @@ import platform.test.runner.parameterized.Parameters @EnableFlags( FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT, FLAG_NEW_AOD_TRANSITION, FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR, ) class KeyguardRootViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { private val kosmos = testKosmos() Loading Loading @@ -110,6 +114,20 @@ class KeyguardRootViewModelTest(flags: FlagsParameterization) : SysuiTestCase() @Before fun setUp() { kosmos.sceneContainerRepository.setTransitionState(transitionState) // Add sample notif so that the notif shelf has something to display kosmos.activeNotificationListRepository.activeNotifications.value = ActiveNotificationsStore.Builder() .apply { addIndividualNotif( activeNotificationModel( key = "notif", aodIcon = mock(), groupKey = "testGroup", ) ) } .build() } @Test Loading @@ -129,7 +147,7 @@ class KeyguardRootViewModelTest(flags: FlagsParameterization) : SysuiTestCase() from = KeyguardState.LOCKSCREEN, to = KeyguardState.AOD, value = 0f, transitionState = TransitionState.STARTED transitionState = TransitionState.STARTED, ), validateStep = false, ) Loading Loading @@ -393,7 +411,7 @@ class KeyguardRootViewModelTest(flags: FlagsParameterization) : SysuiTestCase() flowOf(Scenes.Communal), flowOf(0.5f), false, emptyFlow() emptyFlow(), ) keyguardTransitionRepository.sendTransitionSteps( Loading
packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt +3 −0 Original line number Diff line number Diff line Loading @@ -324,6 +324,9 @@ object KeyguardRootViewBinder { .getDimensionPixelSize(R.dimen.shelf_appear_translation) .stateIn(this) viewModel.isNotifIconContainerVisible.collect { isVisible -> if (isVisible.value) { blueprintViewModel.refreshBlueprint() } childViews[aodNotificationIconContainerId] ?.setAodNotifIconContainerIsVisible( isVisible, Loading
packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBlueprintViewModel.kt +8 −7 Original line number Diff line number Diff line Loading @@ -25,20 +25,18 @@ import androidx.constraintlayout.widget.ConstraintLayout import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor import com.android.systemui.keyguard.ui.view.layout.blueprints.transitions.IntraBlueprintTransition.Config import com.android.systemui.keyguard.ui.view.layout.blueprints.transitions.IntraBlueprintTransition.Type import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow data class TransitionData( val config: Config, val start: Long = System.currentTimeMillis(), ) data class TransitionData(val config: Config, val start: Long = System.currentTimeMillis()) class KeyguardBlueprintViewModel @Inject constructor( @Main private val handler: Handler, keyguardBlueprintInteractor: KeyguardBlueprintInteractor, private val keyguardBlueprintInteractor: KeyguardBlueprintInteractor, ) { val blueprint = keyguardBlueprintInteractor.blueprint val blueprintId = keyguardBlueprintInteractor.blueprintId Loading Loading @@ -76,6 +74,9 @@ constructor( } } fun refreshBlueprint(type: Type = Type.NoTransition) = keyguardBlueprintInteractor.refreshBlueprint(type) fun updateTransitions(data: TransitionData?, mutate: MutableSet<Transition>.() -> Unit) { runningTransitions.mutate() Loading @@ -95,7 +96,7 @@ constructor( Log.w( TAG, "runTransition: skipping ${transition::class.simpleName}: " + "currentPriority=$currentPriority; config=$config" "currentPriority=$currentPriority; config=$config", ) } apply() Loading @@ -106,7 +107,7 @@ constructor( Log.i( TAG, "runTransition: running ${transition::class.simpleName}: " + "currentPriority=$currentPriority; config=$config" "currentPriority=$currentPriority; config=$config", ) } Loading
packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt +11 −6 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.shade.ui.viewmodel.NotificationShadeWindowModel import com.android.systemui.statusbar.notification.domain.interactor.NotificationsKeyguardInteractor import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerAlwaysOnDisplayViewModel import com.android.systemui.statusbar.phone.DozeParameters import com.android.systemui.statusbar.phone.ScreenOffAnimationController import com.android.systemui.util.kotlin.BooleanFlowOperators.anyOf Loading Loading @@ -81,6 +82,7 @@ constructor( private val keyguardTransitionInteractor: KeyguardTransitionInteractor, private val notificationsKeyguardInteractor: NotificationsKeyguardInteractor, notificationShadeWindowModel: NotificationShadeWindowModel, private val aodNotificationIconViewModel: NotificationIconContainerAlwaysOnDisplayViewModel, private val alternateBouncerToAodTransitionViewModel: AlternateBouncerToAodTransitionViewModel, private val alternateBouncerToGoneTransitionViewModel: AlternateBouncerToGoneTransitionViewModel, Loading Loading @@ -130,7 +132,7 @@ constructor( val goneToAodTransition = keyguardTransitionInteractor.transition( edge = Edge.create(Scenes.Gone, AOD), edgeWithoutSceneContainer = Edge.create(GONE, AOD) edgeWithoutSceneContainer = Edge.create(GONE, AOD), ) private val goneToAodTransitionRunning: Flow<Boolean> = Loading Loading @@ -183,7 +185,7 @@ constructor( /* rangeMax = */ 1f, /* valueMin = */ 0f, /* valueMax = */ 0.2f, /* value = */ max(qsExpansion, shadeExpansion) /* value = */ max(qsExpansion, shadeExpansion), ) emit(alpha) } Loading Loading @@ -254,7 +256,7 @@ constructor( primaryBouncerToGoneTransitionViewModel.lockscreenAlpha, primaryBouncerToLockscreenTransitionViewModel.lockscreenAlpha(viewState), ) .onStart { emit(1f) } .onStart { emit(1f) }, ) { hideKeyguard, alpha -> if (hideKeyguard) { 0f Loading Loading @@ -304,11 +306,12 @@ constructor( .onStart { emit(false) }, keyguardTransitionInteractor.isFinishedIn( scene = Scenes.Gone, stateWithoutSceneContainer = GONE stateWithoutSceneContainer = GONE, ), deviceEntryInteractor.isBypassEnabled, areNotifsFullyHiddenAnimated(), isPulseExpandingAnimated(), aodNotificationIconViewModel.icons.map { it.visibleIcons.isNotEmpty() }, ) { flows -> val goneToAodTransitionRunning = flows[0] as Boolean val isOnLockscreen = flows[1] as Boolean Loading @@ -316,6 +319,7 @@ constructor( val isBypassEnabled = flows[3] as Boolean val notifsFullyHidden = flows[4] as AnimatedValue<Boolean> val pulseExpanding = flows[5] as AnimatedValue<Boolean> val hasAodIcons = flows[6] as Boolean when { // Hide the AOD icons if we're not in the KEYGUARD state unless the screen off Loading @@ -327,9 +331,10 @@ constructor( else -> zip(notifsFullyHidden, pulseExpanding) { areNotifsFullyHidden, isPulseExpanding, -> isPulseExpanding -> when { // If there are no notification icons to show, then it can be hidden !hasAodIcons -> false // If we're bypassing, then we're visible isBypassEnabled -> true // If we are pulsing (and not bypassing), then we are hidden Loading
packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.shade.ui.viewmodel.notificationShadeWindowModel import com.android.systemui.statusbar.notification.icon.ui.viewmodel.notificationIconContainerAlwaysOnDisplayViewModel import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationsKeyguardInteractor import com.android.systemui.statusbar.phone.dozeParameters import com.android.systemui.statusbar.phone.screenOffAnimationController Loading @@ -40,6 +41,7 @@ val Kosmos.keyguardRootViewModel by Fixture { communalInteractor = communalInteractor, keyguardTransitionInteractor = keyguardTransitionInteractor, notificationsKeyguardInteractor = notificationsKeyguardInteractor, aodNotificationIconViewModel = notificationIconContainerAlwaysOnDisplayViewModel, notificationShadeWindowModel = notificationShadeWindowModel, alternateBouncerToAodTransitionViewModel = alternateBouncerToAodTransitionViewModel, alternateBouncerToGoneTransitionViewModel = alternateBouncerToGoneTransitionViewModel, Loading