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

Commit 3b3aa1d0 authored by Darrell Shi's avatar Darrell Shi
Browse files

Animate grid paddings change for edit mode transition

This change animates the change to content paddings around the
glanceable hub grid, so that edit mode transitions look smoother.

Test: visual; see recordings in bug
Bug: 419361764
Flag: com.android.systemui.hub_edit_mode_transition
Change-Id: Id32b9bc55fe044f645d72ef9a70e6dffd7436067
parent 00b125e4
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -258,11 +258,15 @@ fun CommunalHub(
        viewModel.isCommunalContentVisible.collectAsStateWithLifecycle(
            initialValue = hubEditModeTransition() || !viewModel.isEditMode
        )

    val shouldShowEditModeLayout by
        viewModel.shouldShowEditModeLayout.collectAsStateWithLifecycle(
            initialValue = viewModel.isEditMode
        )
    val minContentPadding =
        if (hubEditModeTransition())
            gridContentPadding(viewModel.isEditMode, Dimensions.ToolbarHeight)
            gridContentPadding(shouldShowEditModeLayout, Dimensions.ToolbarHeight)
        else gridContentPadding(viewModel.isEditMode, toolbarSize)

    ObserveScrollEffect(gridState, viewModel)

    val context = LocalContext.current
@@ -462,7 +466,7 @@ fun CommunalHub(

        if (onOpenWidgetPicker != null && onEditDone != null) {
            AnimatedVisibility(
                visible = viewModel.isEditMode && isCommunalContentVisible,
                visible = shouldShowEditModeLayout && isCommunalContentVisible,
                enter =
                    fadeIn(animationSpec = tween(durationMillis = 250, easing = LinearEasing)) +
                        slideInVertically(
@@ -852,6 +856,7 @@ private fun HorizontalGridWrapper(
            state = gridState,
            flingBehavior = flingBehavior,
            minContentPadding = minContentPadding,
            animateContentPadding = hubEditModeTransition(),
            minHorizontalArrangement = minHorizontalArrangement,
            minVerticalArrangement = minVerticalArrangement,
            setContentOffset = setContentOffset,
+27 −7
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.communal.ui.compose

import android.content.res.Configuration
import androidx.compose.animation.core.animateDpAsState
import androidx.compose.foundation.OverscrollEffect
import androidx.compose.foundation.gestures.FlingBehavior
import androidx.compose.foundation.gestures.ScrollableDefaults
@@ -33,6 +34,7 @@ import androidx.compose.foundation.lazy.grid.LazyHorizontalGrid
import androidx.compose.foundation.lazy.grid.rememberLazyGridState
import androidx.compose.foundation.rememberOverscrollEffect
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
@@ -66,6 +68,7 @@ fun ResponsiveLazyHorizontalGrid(
    state: LazyGridState = rememberLazyGridState(),
    setContentOffset: (offset: Offset) -> Unit = {},
    minContentPadding: PaddingValues = PaddingValues(0.dp),
    animateContentPadding: Boolean = false,
    minHorizontalArrangement: Dp = 0.dp,
    minVerticalArrangement: Dp = 0.dp,
    flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(),
@@ -148,14 +151,31 @@ fun ResponsiveLazyHorizontalGrid(
        val finalStartPadding = minStartPadding + evenlyDistributedWidth
        val finalEndPadding = minEndPadding + evenlyDistributedWidth
        val finalTopPadding = minTopPadding + extraHeight / 2
        val finalBottomPadding = minBottomPadding + extraHeight / 2

        val finalContentPadding =
        val finalContentPadding: PaddingValues
        if (animateContentPadding) {
            val finalStartPaddingAnimated by animateDpAsState(finalStartPadding)
            val finalTopPaddingAnimated by animateDpAsState(finalTopPadding)
            val finalEndPaddingAnimated by animateDpAsState(finalEndPadding)
            val finalBottomPaddingAnimated by animateDpAsState(finalBottomPadding)

            finalContentPadding =
                PaddingValues(
                    start = finalStartPaddingAnimated,
                    top = finalTopPaddingAnimated,
                    end = finalEndPaddingAnimated,
                    bottom = finalBottomPaddingAnimated,
                )
        } else {
            finalContentPadding =
                PaddingValues(
                    start = finalStartPadding,
                end = finalEndPadding,
                    top = finalTopPadding,
                bottom = minBottomPadding + extraHeight / 2,
                    end = finalEndPadding,
                    bottom = finalBottomPadding,
                )
        }

        with(density) { setContentOffset(Offset(finalStartPadding.toPx(), finalTopPadding.toPx())) }

+6 −0
Original line number Diff line number Diff line
@@ -106,6 +106,12 @@ abstract class BaseCommunalViewModel(
     */
    private var currentScrollIndex = 0

    /**
     * Whether to show edit mode layout, like pushing the widgets down to make space for the toolbar
     * on top.
     */
    abstract val shouldShowEditModeLayout: Flow<Boolean>

    fun signalUserInteraction() {
        communalInteractor.signalUserInteraction()
    }
+2 −0
Original line number Diff line number Diff line
@@ -112,6 +112,8 @@ constructor(
    override val isCommunalContentVisible: Flow<Boolean> =
        if (Flags.hubEditModeTransition()) flowOf(true) else editModeShowing

    override val shouldShowEditModeLayout: Flow<Boolean> = flowOf(true)

    val showDisclaimer: Flow<Boolean> =
        allOf(editModeShowing, not(communalInteractor.isDisclaimerDismissed))

+9 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.content.ComponentName
import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.compose.animation.scene.SceneKey
import com.android.systemui.Flags
import com.android.systemui.Flags.hubEditModeTransition
import com.android.systemui.classifier.Classifier
import com.android.systemui.classifier.domain.interactor.FalsingInteractor
import com.android.systemui.communal.dagger.CommunalModule.Companion.SWIPE_TO_HUB
@@ -237,6 +238,14 @@ constructor(
    val isEnableWorkProfileDialogShowing: Flow<Boolean> =
        _isEnableWorkProfileDialogShowing.asStateFlow()

    // SystemUI begins animating to the edit mode layout (e.g., pushing down widgets) as soon as the
    // transition to edit mode starts. It then animates back to the original layout before the edit
    // mode activity fully finishes, ensuring a smooth visual transition.
    override val shouldShowEditModeLayout: Flow<Boolean> =
        if (hubEditModeTransition())
            communalSceneInteractor.editModeState.map { it != null && it > EditModeState.STARTING }
        else flowOf(false)

    private val isUiBlurredByBouncer =
        if (Flags.bouncerUiRevamp()) {
            keyguardInteractor.primaryBouncerShowing