Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a450e972 authored by Hawkwood Glazier's avatar Hawkwood Glazier
Browse files

Refresh Notification Shelf layout when it becomes visible

Bug: 363260606
Test: Manual; presumbits
Flag: com.android.systemui.migrate_clocks_to_blueprint
Change-Id: Iabb3aaea746030cd5483c3f1b17d0aeda5e1dbff
parent 0c06c085
Loading
Loading
Loading
Loading
+21 −3
Original line number Diff line number Diff line
@@ -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
@@ -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()
@@ -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
@@ -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,
            )
@@ -393,7 +411,7 @@ class KeyguardRootViewModelTest(flags: FlagsParameterization) : SysuiTestCase()
                    flowOf(Scenes.Communal),
                    flowOf(0.5f),
                    false,
                    emptyFlow()
                    emptyFlow(),
                )

            keyguardTransitionRepository.sendTransitionSteps(
+3 −0
Original line number Diff line number Diff line
@@ -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,
+8 −7
Original line number Diff line number Diff line
@@ -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
@@ -76,6 +74,9 @@ constructor(
            }
        }

    fun refreshBlueprint(type: Type = Type.NoTransition) =
        keyguardBlueprintInteractor.refreshBlueprint(type)

    fun updateTransitions(data: TransitionData?, mutate: MutableSet<Transition>.() -> Unit) {
        runningTransitions.mutate()

@@ -95,7 +96,7 @@ constructor(
                Log.w(
                    TAG,
                    "runTransition: skipping ${transition::class.simpleName}: " +
                        "currentPriority=$currentPriority; config=$config"
                        "currentPriority=$currentPriority; config=$config",
                )
            }
            apply()
@@ -106,7 +107,7 @@ constructor(
            Log.i(
                TAG,
                "runTransition: running ${transition::class.simpleName}: " +
                    "currentPriority=$currentPriority; config=$config"
                    "currentPriority=$currentPriority; config=$config",
            )
        }

+11 −6
Original line number Diff line number Diff line
@@ -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
@@ -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,
@@ -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> =
@@ -183,7 +185,7 @@ constructor(
                                /* rangeMax = */ 1f,
                                /* valueMin = */ 0f,
                                /* valueMax = */ 0.2f,
                                /* value = */ max(qsExpansion, shadeExpansion)
                                /* value = */ max(qsExpansion, shadeExpansion),
                            )
                    emit(alpha)
                }
@@ -254,7 +256,7 @@ constructor(
                        primaryBouncerToGoneTransitionViewModel.lockscreenAlpha,
                        primaryBouncerToLockscreenTransitionViewModel.lockscreenAlpha(viewState),
                    )
                    .onStart { emit(1f) }
                    .onStart { emit(1f) },
            ) { hideKeyguard, alpha ->
                if (hideKeyguard) {
                    0f
@@ -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
@@ -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
@@ -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
+2 −0
Original line number Diff line number Diff line
@@ -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
@@ -40,6 +41,7 @@ val Kosmos.keyguardRootViewModel by Fixture {
        communalInteractor = communalInteractor,
        keyguardTransitionInteractor = keyguardTransitionInteractor,
        notificationsKeyguardInteractor = notificationsKeyguardInteractor,
        aodNotificationIconViewModel = notificationIconContainerAlwaysOnDisplayViewModel,
        notificationShadeWindowModel = notificationShadeWindowModel,
        alternateBouncerToAodTransitionViewModel = alternateBouncerToAodTransitionViewModel,
        alternateBouncerToGoneTransitionViewModel = alternateBouncerToGoneTransitionViewModel,