summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Fabián Kozynski <kozynski@google.com> 2024-10-16 10:56:53 -0400
committer Fabián Kozynski <kozynski@google.com> 2024-10-16 12:35:55 -0400
commit1376825f1182eee30cdb9e8f81fd2bd35eeaf5ae (patch)
treebd1fe2fb43d8430ed4c1aeae27627d7c51e0a10e
parentc565bef9929dc4f02d391cffc9dbdd9e65ad6446 (diff)
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
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt11
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt56
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt4
3 files changed, 60 insertions, 11 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
index f4d91627fdab..6db91ac073ba 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
@@ -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
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt
index dd83fc928dad..e21485b3e85a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt
@@ -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)
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt
index c218ff6ba966..dff56257a93c 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt
@@ -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,