summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationLockscreenScrim.kt13
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationLockscreenScrimViewModel.kt76
3 files changed, 87 insertions, 6 deletions
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationLockscreenScrim.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationLockscreenScrim.kt
index 4279be3efad0..48067ce3c4a0 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationLockscreenScrim.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationLockscreenScrim.kt
@@ -21,7 +21,6 @@ import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember
@@ -99,12 +98,18 @@ fun SceneScope.NotificationLockscreenScrim(
}
}
+ val isBouncerToLockscreen =
+ layoutState.currentTransition?.isTransitioning(
+ from = Scenes.Bouncer,
+ to = Scenes.Lockscreen,
+ ) ?: false
+
Box(
modifier
.fillMaxSize()
- .element(Notifications.Elements.NotificationScrim)
+ .element(viewModel.element.key)
.graphicsLayer { alpha = alphaAnimatable.value }
- .background(MaterialTheme.colorScheme.surface)
+ .background(viewModel.element.color(isBouncerToLockscreen))
)
}
@@ -112,7 +117,7 @@ private fun shouldShowScrimFadeOut(
currentTransition: TransitionState.Transition,
shadeMode: ShadeMode,
): Boolean {
- return shadeMode == ShadeMode.Single &&
+ return shadeMode != ShadeMode.Dual &&
currentTransition.isInitiatedByUserInput &&
(currentTransition.isTransitioning(from = Scenes.Shade, to = Scenes.Lockscreen) ||
currentTransition.isTransitioning(from = Scenes.Bouncer, to = Scenes.Lockscreen))
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt
index dc545b8bf7c2..67f412ed27ac 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainerTransitions.kt
@@ -80,6 +80,7 @@ val SceneContainerTransitions = transitions {
from(Scenes.Lockscreen, to = Scenes.Shade) { lockscreenToShadeTransition() }
from(Scenes.Lockscreen, to = Scenes.Shade, key = ToSplitShade) {
lockscreenToSplitShadeTransition()
+ sharedElement(Shade.Elements.BackgroundScrim, enabled = false)
}
from(Scenes.Lockscreen, to = Scenes.Shade, key = SlightlyFasterShadeCollapse) {
lockscreenToShadeTransition(durationScale = 0.9)
@@ -96,6 +97,9 @@ val SceneContainerTransitions = transitions {
sharedElement(Notifications.Elements.NotificationStackPlaceholder, enabled = false)
sharedElement(Notifications.Elements.HeadsUpNotificationPlaceholder, enabled = false)
}
+ from(Scenes.Shade, to = Scenes.Lockscreen, key = ToSplitShade) {
+ reversed { lockscreenToSplitShadeTransition() }
+ }
from(Scenes.Communal, to = Scenes.Shade) { communalToShadeTransition() }
from(Scenes.Communal, to = Scenes.Bouncer) { communalToBouncerTransition() }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationLockscreenScrimViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationLockscreenScrimViewModel.kt
index 84aa997cf0e1..d68f769dffdf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationLockscreenScrimViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationLockscreenScrimViewModel.kt
@@ -16,14 +16,31 @@
package com.android.systemui.statusbar.notification.stack.ui.viewmodel
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.colorResource
+import com.android.app.tracing.coroutines.coroutineScopeTraced
+import com.android.compose.animation.scene.ElementKey
import com.android.systemui.dump.DumpManager
import com.android.systemui.lifecycle.ExclusiveActivatable
+import com.android.systemui.lifecycle.Hydrator
+import com.android.systemui.notifications.ui.composable.Notifications
+import com.android.systemui.res.R
import com.android.systemui.shade.domain.interactor.ShadeInteractor
+import com.android.systemui.shade.shared.model.ShadeMode
+import com.android.systemui.shade.ui.composable.Shade
import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor
import com.android.systemui.util.kotlin.ActivatableFlowDumper
import com.android.systemui.util.kotlin.ActivatableFlowDumperImpl
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
+import kotlinx.coroutines.awaitCancellation
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.launch
class NotificationLockscreenScrimViewModel
@AssistedInject
@@ -35,7 +52,17 @@ constructor(
ActivatableFlowDumper by ActivatableFlowDumperImpl(dumpManager, "NotificationScrollViewModel"),
ExclusiveActivatable() {
- val shadeMode = shadeInteractor.shadeMode
+ private val hydrator = Hydrator("NotificationLockscreenScrimViewModel.hydrator")
+
+ val shadeMode: StateFlow<ShadeMode> = shadeInteractor.shadeMode
+
+ /** The [ElementKey] to use for the scrim. */
+ val element: ElementViewModel by
+ hydrator.hydratedStateOf(
+ traceName = "elementKey",
+ initialValue = element(shadeMode.value),
+ source = shadeMode.map { element(it) },
+ )
/** Sets the alpha to apply to the NSSL for fade-in on lockscreen */
fun setAlphaForLockscreenFadeIn(alpha: Float) {
@@ -43,11 +70,56 @@ constructor(
}
override suspend fun onActivated(): Nothing {
- activateFlowDumper()
+ coroutineScopeTraced("NotificationLockscreenScrimViewModel") {
+ launch { activateFlowDumper() }
+ launch { hydrator.activate() }
+ awaitCancellation()
+ }
}
+ private fun element(shadeMode: ShadeMode): ElementViewModel {
+ return if (shadeMode == ShadeMode.Single) {
+ ElementViewModel(
+ key = Notifications.Elements.NotificationScrim,
+ color = { SingleShadeBackground },
+ )
+ } else {
+ ElementViewModel(
+ key = Shade.Elements.BackgroundScrim,
+ color = { isBouncerToLockscreen ->
+ if (isBouncerToLockscreen) {
+ SplitShadeBouncerToLockscreenBackground
+ } else {
+ SplitShadeDefaultBackground
+ }
+ },
+ )
+ }
+ }
+
+ /** Models the UI state of the scrim. */
+ data class ElementViewModel(
+ /** The [ElementKey] to use with an `element` modifier. */
+ val key: ElementKey,
+ /** A function that returns the color to use within a `background` modifier. */
+ val color: @Composable (isBouncerToLockscreen: Boolean) -> Color,
+ )
+
@AssistedFactory
interface Factory {
fun create(): NotificationLockscreenScrimViewModel
}
+
+ companion object {
+ private val SingleShadeBackground: Color
+ @Composable @ReadOnlyComposable get() = MaterialTheme.colorScheme.surface
+
+ private val SplitShadeBouncerToLockscreenBackground: Color
+ @Composable @ReadOnlyComposable get() = MaterialTheme.colorScheme.surface
+
+ private val SplitShadeDefaultBackground: Color
+ @Composable
+ @ReadOnlyComposable
+ get() = colorResource(R.color.shade_scrim_background_dark)
+ }
}