Loading packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt +10 −5 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.notifications.ui.composable import android.util.Log import android.util.Log import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.Animatable import androidx.compose.foundation.ScrollState import androidx.compose.foundation.background import androidx.compose.foundation.background import androidx.compose.foundation.gestures.scrollBy import androidx.compose.foundation.gestures.scrollBy import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box Loading @@ -30,7 +31,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme Loading @@ -40,7 +40,6 @@ import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.snapshotFlow import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment Loading Loading @@ -70,6 +69,8 @@ import com.android.compose.modifiers.height import com.android.systemui.common.ui.compose.windowinsets.LocalRawScreenHeight import com.android.systemui.common.ui.compose.windowinsets.LocalRawScreenHeight import com.android.systemui.common.ui.compose.windowinsets.LocalScreenCornerRadius import com.android.systemui.common.ui.compose.windowinsets.LocalScreenCornerRadius import com.android.systemui.res.R import com.android.systemui.res.R import com.android.systemui.scene.session.ui.composable.SaveableSession import com.android.systemui.scene.session.ui.composable.rememberSession import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.ui.composable.ShadeHeader import com.android.systemui.shade.ui.composable.ShadeHeader import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds Loading Loading @@ -156,6 +157,7 @@ fun SceneScope.ConstrainedNotificationStack( */ */ @Composable @Composable fun SceneScope.NotificationScrollingStack( fun SceneScope.NotificationScrollingStack( shadeSession: SaveableSession, viewModel: NotificationsPlaceholderViewModel, viewModel: NotificationsPlaceholderViewModel, maxScrimTop: () -> Float, maxScrimTop: () -> Float, shouldPunchHoleBehindScrim: Boolean, shouldPunchHoleBehindScrim: Boolean, Loading @@ -165,7 +167,10 @@ fun SceneScope.NotificationScrollingStack( val density = LocalDensity.current val density = LocalDensity.current val screenCornerRadius = LocalScreenCornerRadius.current val screenCornerRadius = LocalScreenCornerRadius.current val scrimCornerRadius = dimensionResource(R.dimen.notification_scrim_corner_radius) val scrimCornerRadius = dimensionResource(R.dimen.notification_scrim_corner_radius) val scrollState = rememberScrollState() val scrollState = shadeSession.rememberSaveableSession(saver = ScrollState.Saver, key = null) { ScrollState(initial = 0) } val syntheticScroll = viewModel.syntheticScroll.collectAsState(0f) val syntheticScroll = viewModel.syntheticScroll.collectAsState(0f) val isCurrentGestureOverscroll = viewModel.isCurrentGestureOverscroll.collectAsState(false) val isCurrentGestureOverscroll = viewModel.isCurrentGestureOverscroll.collectAsState(false) val expansionFraction by viewModel.expandFraction.collectAsState(0f) val expansionFraction by viewModel.expandFraction.collectAsState(0f) Loading @@ -184,7 +189,7 @@ fun SceneScope.NotificationScrollingStack( // When fully expanded (scrimOffset = minScrimOffset), its top bound is at minScrimStartY, // When fully expanded (scrimOffset = minScrimOffset), its top bound is at minScrimStartY, // which is equal to the height of the Shade Header. Thus, when the scrim is fully expanded, the // which is equal to the height of the Shade Header. Thus, when the scrim is fully expanded, the // entire height of the scrim is visible on screen. // entire height of the scrim is visible on screen. val scrimOffset = remember { Animatable(0f) } val scrimOffset = shadeSession.rememberSession { Animatable(0f) } // set the bounds to null when the scrim disappears // set the bounds to null when the scrim disappears DisposableEffect(Unit) { onDispose { viewModel.onScrimBoundsChanged(null) } } DisposableEffect(Unit) { onDispose { viewModel.onScrimBoundsChanged(null) } } Loading Loading @@ -303,7 +308,7 @@ fun SceneScope.NotificationScrollingStack( isExternalOverscrollGesture = { isCurrentGestureOverscroll.value } isExternalOverscrollGesture = { isCurrentGestureOverscroll.value } ) ) .nestedScroll( .nestedScroll( remember( shadeSession.rememberSession( scrimOffset, scrimOffset, maxScrimTop, maxScrimTop, minScrimTop, minScrimTop, Loading packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationsShadeSessionModule.kt 0 → 100644 +43 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.notifications.ui.composable import androidx.compose.runtime.Composable import androidx.compose.runtime.saveable.Saver import com.android.systemui.dagger.SysUISingleton import com.android.systemui.scene.session.shared.SessionStorage import com.android.systemui.scene.session.ui.composable.SaveableSession import com.android.systemui.scene.session.ui.composable.Session import dagger.Module import dagger.Provides @Module object NotificationsShadeSessionModule { @Provides @SysUISingleton fun provideShadeSessionStorage(): SessionStorage = SessionStorage() @Provides fun provideShadeSession(storage: SessionStorage): SaveableSession = object : SaveableSession, Session by Session(storage) { @Composable override fun <T : Any> rememberSaveableSession( vararg inputs: Any?, saver: Saver<T, out Any>, key: String?, init: () -> T ): T = rememberSession(key, inputs = inputs, init = init) } } packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt +5 −0 Original line number Original line Diff line number Diff line Loading @@ -80,6 +80,7 @@ import com.android.systemui.notifications.ui.composable.NotificationScrollingSta import com.android.systemui.qs.footer.ui.compose.FooterActionsWithAnimatedVisibility import com.android.systemui.qs.footer.ui.compose.FooterActionsWithAnimatedVisibility import com.android.systemui.qs.ui.viewmodel.QuickSettingsSceneViewModel import com.android.systemui.qs.ui.viewmodel.QuickSettingsSceneViewModel import com.android.systemui.res.R import com.android.systemui.res.R import com.android.systemui.scene.session.ui.composable.SaveableSession import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.ui.composable.ComposableScene import com.android.systemui.scene.ui.composable.ComposableScene import com.android.systemui.shade.ui.composable.CollapsedShadeHeader import com.android.systemui.shade.ui.composable.CollapsedShadeHeader Loading @@ -103,6 +104,7 @@ class QuickSettingsScene @Inject @Inject constructor( constructor( @Application private val applicationScope: CoroutineScope, @Application private val applicationScope: CoroutineScope, private val shadeSession: SaveableSession, private val viewModel: QuickSettingsSceneViewModel, private val viewModel: QuickSettingsSceneViewModel, private val notificationsPlaceholderViewModel: NotificationsPlaceholderViewModel, private val notificationsPlaceholderViewModel: NotificationsPlaceholderViewModel, private val tintedIconManagerFactory: TintedIconManager.Factory, private val tintedIconManagerFactory: TintedIconManager.Factory, Loading Loading @@ -133,6 +135,7 @@ constructor( mediaCarouselController = mediaCarouselController, mediaCarouselController = mediaCarouselController, mediaHost = mediaHost, mediaHost = mediaHost, modifier = modifier, modifier = modifier, shadeSession = shadeSession, ) ) } } } } Loading @@ -147,6 +150,7 @@ private fun SceneScope.QuickSettingsScene( mediaCarouselController: MediaCarouselController, mediaCarouselController: MediaCarouselController, mediaHost: MediaHost, mediaHost: MediaHost, modifier: Modifier = Modifier, modifier: Modifier = Modifier, shadeSession: SaveableSession, ) { ) { val brightnessMirrorShowing by viewModel.brightnessMirrorViewModel.isShowing.collectAsState() val brightnessMirrorShowing by viewModel.brightnessMirrorViewModel.isShowing.collectAsState() val contentAlpha by val contentAlpha by Loading Loading @@ -347,6 +351,7 @@ private fun SceneScope.QuickSettingsScene( } } NotificationScrollingStack( NotificationScrollingStack( viewModel = notificationsPlaceholderViewModel, viewModel = notificationsPlaceholderViewModel, shadeSession = shadeSession, maxScrimTop = { screenHeight }, maxScrimTop = { screenHeight }, shouldPunchHoleBehindScrim = shouldPunchHoleBehindScrim, shouldPunchHoleBehindScrim = shouldPunchHoleBehindScrim, modifier = modifier = Loading packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt +11 −0 Original line number Original line Diff line number Diff line Loading @@ -79,6 +79,7 @@ import com.android.systemui.qs.footer.ui.compose.FooterActionsWithAnimatedVisibi import com.android.systemui.qs.ui.composable.BrightnessMirror import com.android.systemui.qs.ui.composable.BrightnessMirror import com.android.systemui.qs.ui.composable.QuickSettings import com.android.systemui.qs.ui.composable.QuickSettings import com.android.systemui.res.R import com.android.systemui.res.R import com.android.systemui.scene.session.ui.composable.SaveableSession import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.ui.composable.ComposableScene import com.android.systemui.scene.ui.composable.ComposableScene import com.android.systemui.shade.shared.model.ShadeMode import com.android.systemui.shade.shared.model.ShadeMode Loading Loading @@ -119,6 +120,7 @@ object Shade { class ShadeScene class ShadeScene @Inject @Inject constructor( constructor( private val shadeSession: SaveableSession, private val viewModel: ShadeSceneViewModel, private val viewModel: ShadeSceneViewModel, private val tintedIconManagerFactory: TintedIconManager.Factory, private val tintedIconManagerFactory: TintedIconManager.Factory, private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory, private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory, Loading @@ -126,6 +128,7 @@ constructor( private val mediaCarouselController: MediaCarouselController, private val mediaCarouselController: MediaCarouselController, @Named(QUICK_QS_PANEL) private val mediaHost: MediaHost, @Named(QUICK_QS_PANEL) private val mediaHost: MediaHost, ) : ComposableScene { ) : ComposableScene { override val key = Scenes.Shade override val key = Scenes.Shade override val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> = override val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> = Loading @@ -143,6 +146,7 @@ constructor( mediaCarouselController = mediaCarouselController, mediaCarouselController = mediaCarouselController, mediaHost = mediaHost, mediaHost = mediaHost, modifier = modifier, modifier = modifier, shadeSession = shadeSession, ) ) init { init { Loading @@ -161,6 +165,7 @@ private fun SceneScope.ShadeScene( mediaCarouselController: MediaCarouselController, mediaCarouselController: MediaCarouselController, mediaHost: MediaHost, mediaHost: MediaHost, modifier: Modifier = Modifier, modifier: Modifier = Modifier, shadeSession: SaveableSession, ) { ) { val shadeMode by viewModel.shadeMode.collectAsState() val shadeMode by viewModel.shadeMode.collectAsState() when (shadeMode) { when (shadeMode) { Loading @@ -173,6 +178,7 @@ private fun SceneScope.ShadeScene( mediaCarouselController = mediaCarouselController, mediaCarouselController = mediaCarouselController, mediaHost = mediaHost, mediaHost = mediaHost, modifier = modifier, modifier = modifier, shadeSession = shadeSession, ) ) is ShadeMode.Split -> is ShadeMode.Split -> SplitShade( SplitShade( Loading @@ -183,6 +189,7 @@ private fun SceneScope.ShadeScene( mediaCarouselController = mediaCarouselController, mediaCarouselController = mediaCarouselController, mediaHost = mediaHost, mediaHost = mediaHost, modifier = modifier, modifier = modifier, shadeSession = shadeSession, ) ) is ShadeMode.Dual -> error("Dual shade is not yet implemented!") is ShadeMode.Dual -> error("Dual shade is not yet implemented!") } } Loading @@ -197,6 +204,7 @@ private fun SceneScope.SingleShade( mediaCarouselController: MediaCarouselController, mediaCarouselController: MediaCarouselController, mediaHost: MediaHost, mediaHost: MediaHost, modifier: Modifier = Modifier, modifier: Modifier = Modifier, shadeSession: SaveableSession, ) { ) { val maxNotifScrimTop = remember { mutableStateOf(0f) } val maxNotifScrimTop = remember { mutableStateOf(0f) } val tileSquishiness by val tileSquishiness by Loading Loading @@ -268,6 +276,7 @@ private fun SceneScope.SingleShade( }, }, { { NotificationScrollingStack( NotificationScrollingStack( shadeSession = shadeSession, viewModel = viewModel.notifications, viewModel = viewModel.notifications, maxScrimTop = { maxNotifScrimTop.value }, maxScrimTop = { maxNotifScrimTop.value }, shouldPunchHoleBehindScrim = shouldPunchHoleBehindScrim, shouldPunchHoleBehindScrim = shouldPunchHoleBehindScrim, Loading Loading @@ -301,6 +310,7 @@ private fun SceneScope.SplitShade( mediaCarouselController: MediaCarouselController, mediaCarouselController: MediaCarouselController, mediaHost: MediaHost, mediaHost: MediaHost, modifier: Modifier = Modifier, modifier: Modifier = Modifier, shadeSession: SaveableSession, ) { ) { val isCustomizing by viewModel.qsSceneAdapter.isCustomizing.collectAsState() val isCustomizing by viewModel.qsSceneAdapter.isCustomizing.collectAsState() val isCustomizerShowing by viewModel.qsSceneAdapter.isCustomizerShowing.collectAsState() val isCustomizerShowing by viewModel.qsSceneAdapter.isCustomizerShowing.collectAsState() Loading Loading @@ -450,6 +460,7 @@ private fun SceneScope.SplitShade( } } NotificationScrollingStack( NotificationScrollingStack( shadeSession = shadeSession, viewModel = viewModel.notifications, viewModel = viewModel.notifications, maxScrimTop = { 0f }, maxScrimTop = { 0f }, shouldPunchHoleBehindScrim = false, shouldPunchHoleBehindScrim = false, Loading packages/SystemUI/src/com/android/systemui/scene/KeyguardlessSceneContainerFrameworkModule.kt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.scene package com.android.systemui.scene import com.android.systemui.CoreStartable import com.android.systemui.CoreStartable import com.android.systemui.notifications.ui.composable.NotificationsShadeSessionModule import com.android.systemui.scene.domain.interactor.WindowRootViewVisibilityInteractor import com.android.systemui.scene.domain.interactor.WindowRootViewVisibilityInteractor import com.android.systemui.scene.domain.startable.SceneContainerStartable import com.android.systemui.scene.domain.startable.SceneContainerStartable import com.android.systemui.scene.shared.model.SceneContainerConfig import com.android.systemui.scene.shared.model.SceneContainerConfig Loading @@ -35,6 +36,7 @@ import dagger.multibindings.IntoMap EmptySceneModule::class, EmptySceneModule::class, GoneSceneModule::class, GoneSceneModule::class, NotificationsShadeSceneModule::class, NotificationsShadeSceneModule::class, NotificationsShadeSessionModule::class, QuickSettingsSceneModule::class, QuickSettingsSceneModule::class, ShadeSceneModule::class, ShadeSceneModule::class, ], ], Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt +10 −5 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.notifications.ui.composable import android.util.Log import android.util.Log import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.Animatable import androidx.compose.foundation.ScrollState import androidx.compose.foundation.background import androidx.compose.foundation.background import androidx.compose.foundation.gestures.scrollBy import androidx.compose.foundation.gestures.scrollBy import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box Loading @@ -30,7 +31,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme Loading @@ -40,7 +40,6 @@ import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.snapshotFlow import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment Loading Loading @@ -70,6 +69,8 @@ import com.android.compose.modifiers.height import com.android.systemui.common.ui.compose.windowinsets.LocalRawScreenHeight import com.android.systemui.common.ui.compose.windowinsets.LocalRawScreenHeight import com.android.systemui.common.ui.compose.windowinsets.LocalScreenCornerRadius import com.android.systemui.common.ui.compose.windowinsets.LocalScreenCornerRadius import com.android.systemui.res.R import com.android.systemui.res.R import com.android.systemui.scene.session.ui.composable.SaveableSession import com.android.systemui.scene.session.ui.composable.rememberSession import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.ui.composable.ShadeHeader import com.android.systemui.shade.ui.composable.ShadeHeader import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds Loading Loading @@ -156,6 +157,7 @@ fun SceneScope.ConstrainedNotificationStack( */ */ @Composable @Composable fun SceneScope.NotificationScrollingStack( fun SceneScope.NotificationScrollingStack( shadeSession: SaveableSession, viewModel: NotificationsPlaceholderViewModel, viewModel: NotificationsPlaceholderViewModel, maxScrimTop: () -> Float, maxScrimTop: () -> Float, shouldPunchHoleBehindScrim: Boolean, shouldPunchHoleBehindScrim: Boolean, Loading @@ -165,7 +167,10 @@ fun SceneScope.NotificationScrollingStack( val density = LocalDensity.current val density = LocalDensity.current val screenCornerRadius = LocalScreenCornerRadius.current val screenCornerRadius = LocalScreenCornerRadius.current val scrimCornerRadius = dimensionResource(R.dimen.notification_scrim_corner_radius) val scrimCornerRadius = dimensionResource(R.dimen.notification_scrim_corner_radius) val scrollState = rememberScrollState() val scrollState = shadeSession.rememberSaveableSession(saver = ScrollState.Saver, key = null) { ScrollState(initial = 0) } val syntheticScroll = viewModel.syntheticScroll.collectAsState(0f) val syntheticScroll = viewModel.syntheticScroll.collectAsState(0f) val isCurrentGestureOverscroll = viewModel.isCurrentGestureOverscroll.collectAsState(false) val isCurrentGestureOverscroll = viewModel.isCurrentGestureOverscroll.collectAsState(false) val expansionFraction by viewModel.expandFraction.collectAsState(0f) val expansionFraction by viewModel.expandFraction.collectAsState(0f) Loading @@ -184,7 +189,7 @@ fun SceneScope.NotificationScrollingStack( // When fully expanded (scrimOffset = minScrimOffset), its top bound is at minScrimStartY, // When fully expanded (scrimOffset = minScrimOffset), its top bound is at minScrimStartY, // which is equal to the height of the Shade Header. Thus, when the scrim is fully expanded, the // which is equal to the height of the Shade Header. Thus, when the scrim is fully expanded, the // entire height of the scrim is visible on screen. // entire height of the scrim is visible on screen. val scrimOffset = remember { Animatable(0f) } val scrimOffset = shadeSession.rememberSession { Animatable(0f) } // set the bounds to null when the scrim disappears // set the bounds to null when the scrim disappears DisposableEffect(Unit) { onDispose { viewModel.onScrimBoundsChanged(null) } } DisposableEffect(Unit) { onDispose { viewModel.onScrimBoundsChanged(null) } } Loading Loading @@ -303,7 +308,7 @@ fun SceneScope.NotificationScrollingStack( isExternalOverscrollGesture = { isCurrentGestureOverscroll.value } isExternalOverscrollGesture = { isCurrentGestureOverscroll.value } ) ) .nestedScroll( .nestedScroll( remember( shadeSession.rememberSession( scrimOffset, scrimOffset, maxScrimTop, maxScrimTop, minScrimTop, minScrimTop, Loading
packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationsShadeSessionModule.kt 0 → 100644 +43 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.notifications.ui.composable import androidx.compose.runtime.Composable import androidx.compose.runtime.saveable.Saver import com.android.systemui.dagger.SysUISingleton import com.android.systemui.scene.session.shared.SessionStorage import com.android.systemui.scene.session.ui.composable.SaveableSession import com.android.systemui.scene.session.ui.composable.Session import dagger.Module import dagger.Provides @Module object NotificationsShadeSessionModule { @Provides @SysUISingleton fun provideShadeSessionStorage(): SessionStorage = SessionStorage() @Provides fun provideShadeSession(storage: SessionStorage): SaveableSession = object : SaveableSession, Session by Session(storage) { @Composable override fun <T : Any> rememberSaveableSession( vararg inputs: Any?, saver: Saver<T, out Any>, key: String?, init: () -> T ): T = rememberSession(key, inputs = inputs, init = init) } }
packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt +5 −0 Original line number Original line Diff line number Diff line Loading @@ -80,6 +80,7 @@ import com.android.systemui.notifications.ui.composable.NotificationScrollingSta import com.android.systemui.qs.footer.ui.compose.FooterActionsWithAnimatedVisibility import com.android.systemui.qs.footer.ui.compose.FooterActionsWithAnimatedVisibility import com.android.systemui.qs.ui.viewmodel.QuickSettingsSceneViewModel import com.android.systemui.qs.ui.viewmodel.QuickSettingsSceneViewModel import com.android.systemui.res.R import com.android.systemui.res.R import com.android.systemui.scene.session.ui.composable.SaveableSession import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.ui.composable.ComposableScene import com.android.systemui.scene.ui.composable.ComposableScene import com.android.systemui.shade.ui.composable.CollapsedShadeHeader import com.android.systemui.shade.ui.composable.CollapsedShadeHeader Loading @@ -103,6 +104,7 @@ class QuickSettingsScene @Inject @Inject constructor( constructor( @Application private val applicationScope: CoroutineScope, @Application private val applicationScope: CoroutineScope, private val shadeSession: SaveableSession, private val viewModel: QuickSettingsSceneViewModel, private val viewModel: QuickSettingsSceneViewModel, private val notificationsPlaceholderViewModel: NotificationsPlaceholderViewModel, private val notificationsPlaceholderViewModel: NotificationsPlaceholderViewModel, private val tintedIconManagerFactory: TintedIconManager.Factory, private val tintedIconManagerFactory: TintedIconManager.Factory, Loading Loading @@ -133,6 +135,7 @@ constructor( mediaCarouselController = mediaCarouselController, mediaCarouselController = mediaCarouselController, mediaHost = mediaHost, mediaHost = mediaHost, modifier = modifier, modifier = modifier, shadeSession = shadeSession, ) ) } } } } Loading @@ -147,6 +150,7 @@ private fun SceneScope.QuickSettingsScene( mediaCarouselController: MediaCarouselController, mediaCarouselController: MediaCarouselController, mediaHost: MediaHost, mediaHost: MediaHost, modifier: Modifier = Modifier, modifier: Modifier = Modifier, shadeSession: SaveableSession, ) { ) { val brightnessMirrorShowing by viewModel.brightnessMirrorViewModel.isShowing.collectAsState() val brightnessMirrorShowing by viewModel.brightnessMirrorViewModel.isShowing.collectAsState() val contentAlpha by val contentAlpha by Loading Loading @@ -347,6 +351,7 @@ private fun SceneScope.QuickSettingsScene( } } NotificationScrollingStack( NotificationScrollingStack( viewModel = notificationsPlaceholderViewModel, viewModel = notificationsPlaceholderViewModel, shadeSession = shadeSession, maxScrimTop = { screenHeight }, maxScrimTop = { screenHeight }, shouldPunchHoleBehindScrim = shouldPunchHoleBehindScrim, shouldPunchHoleBehindScrim = shouldPunchHoleBehindScrim, modifier = modifier = Loading
packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt +11 −0 Original line number Original line Diff line number Diff line Loading @@ -79,6 +79,7 @@ import com.android.systemui.qs.footer.ui.compose.FooterActionsWithAnimatedVisibi import com.android.systemui.qs.ui.composable.BrightnessMirror import com.android.systemui.qs.ui.composable.BrightnessMirror import com.android.systemui.qs.ui.composable.QuickSettings import com.android.systemui.qs.ui.composable.QuickSettings import com.android.systemui.res.R import com.android.systemui.res.R import com.android.systemui.scene.session.ui.composable.SaveableSession import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.ui.composable.ComposableScene import com.android.systemui.scene.ui.composable.ComposableScene import com.android.systemui.shade.shared.model.ShadeMode import com.android.systemui.shade.shared.model.ShadeMode Loading Loading @@ -119,6 +120,7 @@ object Shade { class ShadeScene class ShadeScene @Inject @Inject constructor( constructor( private val shadeSession: SaveableSession, private val viewModel: ShadeSceneViewModel, private val viewModel: ShadeSceneViewModel, private val tintedIconManagerFactory: TintedIconManager.Factory, private val tintedIconManagerFactory: TintedIconManager.Factory, private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory, private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory, Loading @@ -126,6 +128,7 @@ constructor( private val mediaCarouselController: MediaCarouselController, private val mediaCarouselController: MediaCarouselController, @Named(QUICK_QS_PANEL) private val mediaHost: MediaHost, @Named(QUICK_QS_PANEL) private val mediaHost: MediaHost, ) : ComposableScene { ) : ComposableScene { override val key = Scenes.Shade override val key = Scenes.Shade override val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> = override val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> = Loading @@ -143,6 +146,7 @@ constructor( mediaCarouselController = mediaCarouselController, mediaCarouselController = mediaCarouselController, mediaHost = mediaHost, mediaHost = mediaHost, modifier = modifier, modifier = modifier, shadeSession = shadeSession, ) ) init { init { Loading @@ -161,6 +165,7 @@ private fun SceneScope.ShadeScene( mediaCarouselController: MediaCarouselController, mediaCarouselController: MediaCarouselController, mediaHost: MediaHost, mediaHost: MediaHost, modifier: Modifier = Modifier, modifier: Modifier = Modifier, shadeSession: SaveableSession, ) { ) { val shadeMode by viewModel.shadeMode.collectAsState() val shadeMode by viewModel.shadeMode.collectAsState() when (shadeMode) { when (shadeMode) { Loading @@ -173,6 +178,7 @@ private fun SceneScope.ShadeScene( mediaCarouselController = mediaCarouselController, mediaCarouselController = mediaCarouselController, mediaHost = mediaHost, mediaHost = mediaHost, modifier = modifier, modifier = modifier, shadeSession = shadeSession, ) ) is ShadeMode.Split -> is ShadeMode.Split -> SplitShade( SplitShade( Loading @@ -183,6 +189,7 @@ private fun SceneScope.ShadeScene( mediaCarouselController = mediaCarouselController, mediaCarouselController = mediaCarouselController, mediaHost = mediaHost, mediaHost = mediaHost, modifier = modifier, modifier = modifier, shadeSession = shadeSession, ) ) is ShadeMode.Dual -> error("Dual shade is not yet implemented!") is ShadeMode.Dual -> error("Dual shade is not yet implemented!") } } Loading @@ -197,6 +204,7 @@ private fun SceneScope.SingleShade( mediaCarouselController: MediaCarouselController, mediaCarouselController: MediaCarouselController, mediaHost: MediaHost, mediaHost: MediaHost, modifier: Modifier = Modifier, modifier: Modifier = Modifier, shadeSession: SaveableSession, ) { ) { val maxNotifScrimTop = remember { mutableStateOf(0f) } val maxNotifScrimTop = remember { mutableStateOf(0f) } val tileSquishiness by val tileSquishiness by Loading Loading @@ -268,6 +276,7 @@ private fun SceneScope.SingleShade( }, }, { { NotificationScrollingStack( NotificationScrollingStack( shadeSession = shadeSession, viewModel = viewModel.notifications, viewModel = viewModel.notifications, maxScrimTop = { maxNotifScrimTop.value }, maxScrimTop = { maxNotifScrimTop.value }, shouldPunchHoleBehindScrim = shouldPunchHoleBehindScrim, shouldPunchHoleBehindScrim = shouldPunchHoleBehindScrim, Loading Loading @@ -301,6 +310,7 @@ private fun SceneScope.SplitShade( mediaCarouselController: MediaCarouselController, mediaCarouselController: MediaCarouselController, mediaHost: MediaHost, mediaHost: MediaHost, modifier: Modifier = Modifier, modifier: Modifier = Modifier, shadeSession: SaveableSession, ) { ) { val isCustomizing by viewModel.qsSceneAdapter.isCustomizing.collectAsState() val isCustomizing by viewModel.qsSceneAdapter.isCustomizing.collectAsState() val isCustomizerShowing by viewModel.qsSceneAdapter.isCustomizerShowing.collectAsState() val isCustomizerShowing by viewModel.qsSceneAdapter.isCustomizerShowing.collectAsState() Loading Loading @@ -450,6 +460,7 @@ private fun SceneScope.SplitShade( } } NotificationScrollingStack( NotificationScrollingStack( shadeSession = shadeSession, viewModel = viewModel.notifications, viewModel = viewModel.notifications, maxScrimTop = { 0f }, maxScrimTop = { 0f }, shouldPunchHoleBehindScrim = false, shouldPunchHoleBehindScrim = false, Loading
packages/SystemUI/src/com/android/systemui/scene/KeyguardlessSceneContainerFrameworkModule.kt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.scene package com.android.systemui.scene import com.android.systemui.CoreStartable import com.android.systemui.CoreStartable import com.android.systemui.notifications.ui.composable.NotificationsShadeSessionModule import com.android.systemui.scene.domain.interactor.WindowRootViewVisibilityInteractor import com.android.systemui.scene.domain.interactor.WindowRootViewVisibilityInteractor import com.android.systemui.scene.domain.startable.SceneContainerStartable import com.android.systemui.scene.domain.startable.SceneContainerStartable import com.android.systemui.scene.shared.model.SceneContainerConfig import com.android.systemui.scene.shared.model.SceneContainerConfig Loading @@ -35,6 +36,7 @@ import dagger.multibindings.IntoMap EmptySceneModule::class, EmptySceneModule::class, GoneSceneModule::class, GoneSceneModule::class, NotificationsShadeSceneModule::class, NotificationsShadeSceneModule::class, NotificationsShadeSessionModule::class, QuickSettingsSceneModule::class, QuickSettingsSceneModule::class, ShadeSceneModule::class, ShadeSceneModule::class, ], ], Loading