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

Commit 60267f64 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Refresh Notification Shelf layout when it becomes visible" into main

parents 17ed26ef a450e972
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,