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

Commit 1376825f authored by Fabián Kozynski's avatar Fabián Kozynski
Browse files

Handle split shade and alpha

This adds the fade in when expanding in split shade.

Test: manual
Bug: 353253277
Bug: 356435605
Flag: com.android.systemui.qs_ui_refactor_compose_fragment

Change-Id: I7c3c715eceea75634d293d571de7fecf8247bb9b
parent c565bef9
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.layout.approachLayout
import androidx.compose.ui.layout.onPlaced
import androidx.compose.ui.layout.onSizeChanged
@@ -236,14 +237,16 @@ constructor(
            AnimatedVisibility(
                visible = viewModel.isQsVisible,
                modifier =
                    Modifier.windowInsetsPadding(WindowInsets.navigationBars)
                    Modifier.graphicsLayer { alpha = viewModel.viewAlpha }
                        .windowInsetsPadding(WindowInsets.navigationBars)
                        // Clipping before translation to match QSContainerImpl.onDraw
                        .offset {
                            IntOffset(x = 0, y = viewModel.viewTranslationY.fastRoundToInt())
                        }
                        .thenIf(notificationScrimClippingParams.isEnabled) {
                            Modifier.notificationScrimClip {
                                notificationScrimClippingParams.params
                            }
                        }
                        .offset {
                            IntOffset(x = 0, y = viewModel.viewTranslationY.fastRoundToInt())
                        },
            ) {
                val isEditing by
+49 −7
Original line number Diff line number Diff line
@@ -26,10 +26,15 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow
import androidx.lifecycle.LifecycleCoroutineScope
import com.android.keyguard.BouncerPanelExpansionCalculator
import com.android.systemui.Dumpable
import com.android.systemui.animation.ShadeInterpolation
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.Edge
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.lifecycle.ExclusiveActivatable
import com.android.systemui.lifecycle.Hydrator
import com.android.systemui.plugins.statusbar.StatusBarStateController
@@ -39,6 +44,7 @@ import com.android.systemui.qs.panels.domain.interactor.TileSquishinessInteracto
import com.android.systemui.qs.panels.ui.viewmodel.PaginatedGridViewModel
import com.android.systemui.qs.ui.viewmodel.QuickSettingsContainerViewModel
import com.android.systemui.res.R
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.LargeScreenHeaderHelper
import com.android.systemui.shade.transition.LargeScreenShadeInterpolator
import com.android.systemui.statusbar.StatusBarState
@@ -67,13 +73,14 @@ class QSFragmentComposeViewModel
constructor(
    val containerViewModel: QuickSettingsContainerViewModel,
    @Main private val resources: Resources,
    private val footerActionsViewModelFactory: FooterActionsViewModel.Factory,
    footerActionsViewModelFactory: FooterActionsViewModel.Factory,
    private val footerActionsController: FooterActionsController,
    private val sysuiStatusBarStateController: SysuiStatusBarStateController,
    private val deviceEntryInteractor: DeviceEntryInteractor,
    private val disableFlagsRepository: DisableFlagsRepository,
    deviceEntryInteractor: DeviceEntryInteractor,
    disableFlagsRepository: DisableFlagsRepository,
    keyguardTransitionInteractor: KeyguardTransitionInteractor,
    private val largeScreenShadeInterpolator: LargeScreenShadeInterpolator,
    private val configurationInteractor: ConfigurationInteractor,
    configurationInteractor: ConfigurationInteractor,
    private val largeScreenHeaderHelper: LargeScreenHeaderHelper,
    private val squishinessInteractor: TileSquishinessInteractor,
    private val paginatedGridViewModel: PaginatedGridViewModel,
@@ -203,6 +210,16 @@ constructor(
        if (onKeyguardAndExpanded) panelTranslationY else 0f
    }

    val viewAlpha by derivedStateOf {
        when {
            isInBouncerTransit ->
                BouncerPanelExpansionCalculator.aboutToShowBouncerProgress(alphaProgress)
            isKeyguardState -> alphaProgress
            isSmallScreen -> ShadeInterpolation.getContentAlpha(alphaProgress)
            else -> largeScreenShadeInterpolator.getQsAlpha(alphaProgress)
        }
    }

    private var qsBounds by mutableStateOf(Rect())

    private val constrainedSquishinessFraction: Float
@@ -210,8 +227,6 @@ constructor(

    private var _headerAnimating by mutableStateOf(false)

    private var keyguardAndExpanded by mutableStateOf(false)

    /**
     * Tracks the current [StatusBarState]. It will switch early if the upcoming state is
     * [StatusBarState.KEYGUARD]
@@ -271,12 +286,37 @@ constructor(
    }

    private val translationScaleY: Float
        get() = (qsExpansion - 1) * (if (isInSplitShade) 1f else SHORT_PARALLAX_AMOUNT)
        get() = ((qsExpansion - 1) * (if (isInSplitShade) 1f else SHORT_PARALLAX_AMOUNT))

    private val headerTranslation by derivedStateOf {
        if (isTransitioningToFullShade) 0f else proposedTranslation
    }

    private val alphaProgress by derivedStateOf {
        when {
            isSmallScreen -> 1f
            isInSplitShade ->
                if (isTransitioningToFullShade || isKeyguardState) {
                    lockscreenToShadeProgress
                } else {
                    panelExpansionFraction
                }
            isTransitioningToFullShade -> lockscreenToShadeProgress
            else -> panelExpansionFraction
        }
    }

    private val isInBouncerTransit by
        hydrator.hydratedStateOf(
            traceName = "isInBouncerTransit",
            initialValue = false,
            source =
                keyguardTransitionInteractor.isInTransition(
                    Edge.create(to = Scenes.Bouncer),
                    Edge.create(to = KeyguardState.PRIMARY_BOUNCER),
                ),
        )

    override suspend fun onActivated(): Nothing {
        coroutineScope {
            launch { hydrateSquishinessInteractor() }
@@ -310,10 +350,12 @@ constructor(
                    println("translationScaleY", translationScaleY)
                    println("viewTranslationY", viewTranslationY)
                    println("qsScrollTranslationY", qsScrollTranslationY)
                    println("viewAlpha", viewAlpha)
                }
            }
            printSection("Shade state") {
                println("stackOverscrolling", isStackScrollerOverscrolling)
                println("overscrollAmount", overScrollAmount)
                println("statusBarState", StatusBarState.toString(statusBarState))
                println("isKeyguardState", isKeyguardState)
                println("isSmallScreen", isSmallScreen)
+4 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.content.res.mainResources
import androidx.lifecycle.LifecycleCoroutineScope
import com.android.systemui.common.ui.domain.interactor.configurationInteractor
import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.qs.footerActionsController
import com.android.systemui.qs.footerActionsViewModelFactory
@@ -30,7 +31,9 @@ import com.android.systemui.shade.largeScreenHeaderHelper
import com.android.systemui.shade.transition.largeScreenShadeInterpolator
import com.android.systemui.statusbar.disableflags.data.repository.disableFlagsRepository
import com.android.systemui.statusbar.sysuiStatusBarStateController
import kotlinx.coroutines.ExperimentalCoroutinesApi

@OptIn(ExperimentalCoroutinesApi::class)
val Kosmos.qsFragmentComposeViewModelFactory by
    Kosmos.Fixture {
        object : QSFragmentComposeViewModel.Factory {
@@ -45,6 +48,7 @@ val Kosmos.qsFragmentComposeViewModelFactory by
                    sysuiStatusBarStateController,
                    deviceEntryInteractor,
                    disableFlagsRepository,
                    keyguardTransitionInteractor,
                    largeScreenShadeInterpolator,
                    configurationInteractor,
                    largeScreenHeaderHelper,