Loading packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt +17 −5 Original line number Diff line number Diff line Loading @@ -39,7 +39,6 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn /** The lock screen scene shows when the device is locked. */ Loading @@ -54,8 +53,17 @@ constructor( override val key = Scenes.Lockscreen override val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> = combine(viewModel.upDestinationSceneKey, viewModel.leftDestinationSceneKey, ::Pair) .map { (upKey, leftKey) -> destinationScenes(up = upKey, left = leftKey) } combine( viewModel.upDestinationSceneKey, viewModel.leftDestinationSceneKey, viewModel.downFromTopEdgeDestinationSceneKey, ) { upKey, leftKey, downFromTopEdgeKey -> destinationScenes( up = upKey, left = leftKey, downFromTopEdge = downFromTopEdgeKey, ) } .stateIn( scope = applicationScope, started = SharingStarted.Eagerly, Loading @@ -63,6 +71,7 @@ constructor( destinationScenes( up = viewModel.upDestinationSceneKey.value, left = viewModel.leftDestinationSceneKey.value, downFromTopEdge = viewModel.downFromTopEdgeDestinationSceneKey.value, ) ) Loading @@ -79,12 +88,15 @@ constructor( private fun destinationScenes( up: SceneKey?, left: SceneKey?, downFromTopEdge: SceneKey?, ): Map<UserAction, UserActionResult> { return buildMap { up?.let { this[Swipe(SwipeDirection.Up)] = UserActionResult(up) } left?.let { this[Swipe(SwipeDirection.Left)] = UserActionResult(left) } downFromTopEdge?.let { this[Swipe(fromSource = Edge.Top, direction = SwipeDirection.Down)] = UserActionResult(Scenes.QuickSettings) UserActionResult(downFromTopEdge) } this[Swipe(direction = SwipeDirection.Down)] = UserActionResult(Scenes.Shade) } } Loading packages/SystemUI/compose/features/src/com/android/systemui/qs/footer/ui/compose/FooterActions.kt +23 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.qs.footer.ui.compose import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.Canvas import androidx.compose.foundation.LocalIndication Loading Loading @@ -76,9 +77,31 @@ import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsButtonViewModel import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsForegroundServicesButtonViewModel import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsSecurityButtonViewModel import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel import com.android.systemui.qs.ui.composable.QuickSettingsTheme import com.android.systemui.res.R import kotlinx.coroutines.launch @Composable fun FooterActionsWithAnimatedVisibility( viewModel: FooterActionsViewModel, isCustomizing: Boolean, lifecycleOwner: LifecycleOwner, footerActionsModifier: (Modifier) -> Modifier, modifier: Modifier = Modifier, ) { AnimatedVisibility(visible = !isCustomizing, modifier = modifier.fillMaxWidth()) { QuickSettingsTheme { // This view has its own horizontal padding // TODO(b/321716470) This should use a lifecycle tied to the scene. FooterActions( viewModel = viewModel, qsVisibilityLifecycleOwner = lifecycleOwner, modifier = footerActionsModifier(Modifier), ) } } } /** The Quick Settings footer actions row. */ @Composable fun FooterActions( Loading packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt +6 −2 Original line number Diff line number Diff line Loading @@ -63,12 +63,14 @@ object QuickSettings { } private fun SceneScope.stateForQuickSettingsContent( isSplitShade: Boolean, squishiness: Float = QuickSettings.SharedValues.SquishinessValues.Default ): QSSceneAdapter.State { return when (val transitionState = layoutState.transitionState) { is TransitionState.Idle -> { when (transitionState.currentScene) { Scenes.Shade -> QSSceneAdapter.State.QQS Scenes.Shade -> QSSceneAdapter.State.QQS.takeUnless { isSplitShade } ?: QSSceneAdapter.State.QS Scenes.QuickSettings -> QSSceneAdapter.State.QS else -> QSSceneAdapter.State.CLOSED } Loading @@ -76,6 +78,7 @@ private fun SceneScope.stateForQuickSettingsContent( is TransitionState.Transition -> with(transitionState) { when { isSplitShade -> QSSceneAdapter.State.QS fromScene == Scenes.Shade && toScene == Scenes.QuickSettings -> Expanding(progress) fromScene == Scenes.QuickSettings && toScene == Scenes.Shade -> Loading Loading @@ -111,10 +114,11 @@ private fun SceneScope.stateForQuickSettingsContent( fun SceneScope.QuickSettings( qsSceneAdapter: QSSceneAdapter, heightProvider: () -> Int, isSplitShade: Boolean, modifier: Modifier = Modifier, squishiness: Float = QuickSettings.SharedValues.SquishinessValues.Default, ) { val contentState = stateForQuickSettingsContent(squishiness) val contentState = stateForQuickSettingsContent(isSplitShade, squishiness) MovableElement( key = QuickSettings.Elements.Content, Loading packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt +12 −14 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import com.android.systemui.compose.modifiers.sysuiResTag import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.qs.footer.ui.compose.FooterActions import com.android.systemui.qs.footer.ui.compose.FooterActionsWithAnimatedVisibility import com.android.systemui.qs.ui.viewmodel.QuickSettingsSceneViewModel import com.android.systemui.res.R import com.android.systemui.scene.shared.model.Scenes Loading Loading @@ -238,24 +239,21 @@ private fun SceneScope.QuickSettingsScene( QuickSettings( viewModel.qsSceneAdapter, { viewModel.qsSceneAdapter.qsHeight }, isSplitShade = false, modifier = Modifier.sysuiResTag("expanded_qs_scroll_view"), ) } } AnimatedVisibility( visible = !isCustomizing, modifier = Modifier.align(Alignment.CenterHorizontally).fillMaxWidth() ) { QuickSettingsTheme { // This view has its own horizontal padding // TODO(b/321716470) This should use a lifecycle tied to the scene. FooterActions( FooterActionsWithAnimatedVisibility( viewModel = footerActionsViewModel, qsVisibilityLifecycleOwner = lifecycleOwner, modifier = Modifier.element(QuickSettings.Elements.FooterActions) isCustomizing = isCustomizing, lifecycleOwner = lifecycleOwner, footerActionsModifier = { modifier -> modifier.element(QuickSettings.Elements.FooterActions) }, modifier = Modifier.align(Alignment.CenterHorizontally), ) } } } } } packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/GoneScene.kt +3 −18 Original line number Diff line number Diff line Loading @@ -20,21 +20,16 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import com.android.compose.animation.scene.Edge import com.android.compose.animation.scene.SceneScope import com.android.compose.animation.scene.Swipe import com.android.compose.animation.scene.SwipeDirection import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult import com.android.compose.animation.scene.animateSceneFloatAsState import com.android.systemui.dagger.SysUISingleton import com.android.systemui.qs.ui.composable.QuickSettings import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel import com.android.systemui.scene.ui.viewmodel.GoneSceneViewModel import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow /** * "Gone" is not a real scene but rather the absence of scenes when we want to skip showing any Loading @@ -44,22 +39,12 @@ import kotlinx.coroutines.flow.asStateFlow class GoneScene @Inject constructor( private val notificationsViewModel: NotificationsPlaceholderViewModel, private val viewModel: GoneSceneViewModel, ) : ComposableScene { override val key = Scenes.Gone override val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> = MutableStateFlow<Map<UserAction, UserActionResult>>( mapOf( Swipe( pointerCount = 2, fromSource = Edge.Top, direction = SwipeDirection.Down, ) to UserActionResult(Scenes.QuickSettings), Swipe(direction = SwipeDirection.Down) to UserActionResult(Scenes.Shade), ) ) .asStateFlow() viewModel.destinationScenes @Composable override fun SceneScope.Content( Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt +17 −5 Original line number Diff line number Diff line Loading @@ -39,7 +39,6 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn /** The lock screen scene shows when the device is locked. */ Loading @@ -54,8 +53,17 @@ constructor( override val key = Scenes.Lockscreen override val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> = combine(viewModel.upDestinationSceneKey, viewModel.leftDestinationSceneKey, ::Pair) .map { (upKey, leftKey) -> destinationScenes(up = upKey, left = leftKey) } combine( viewModel.upDestinationSceneKey, viewModel.leftDestinationSceneKey, viewModel.downFromTopEdgeDestinationSceneKey, ) { upKey, leftKey, downFromTopEdgeKey -> destinationScenes( up = upKey, left = leftKey, downFromTopEdge = downFromTopEdgeKey, ) } .stateIn( scope = applicationScope, started = SharingStarted.Eagerly, Loading @@ -63,6 +71,7 @@ constructor( destinationScenes( up = viewModel.upDestinationSceneKey.value, left = viewModel.leftDestinationSceneKey.value, downFromTopEdge = viewModel.downFromTopEdgeDestinationSceneKey.value, ) ) Loading @@ -79,12 +88,15 @@ constructor( private fun destinationScenes( up: SceneKey?, left: SceneKey?, downFromTopEdge: SceneKey?, ): Map<UserAction, UserActionResult> { return buildMap { up?.let { this[Swipe(SwipeDirection.Up)] = UserActionResult(up) } left?.let { this[Swipe(SwipeDirection.Left)] = UserActionResult(left) } downFromTopEdge?.let { this[Swipe(fromSource = Edge.Top, direction = SwipeDirection.Down)] = UserActionResult(Scenes.QuickSettings) UserActionResult(downFromTopEdge) } this[Swipe(direction = SwipeDirection.Down)] = UserActionResult(Scenes.Shade) } } Loading
packages/SystemUI/compose/features/src/com/android/systemui/qs/footer/ui/compose/FooterActions.kt +23 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.qs.footer.ui.compose import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.Canvas import androidx.compose.foundation.LocalIndication Loading Loading @@ -76,9 +77,31 @@ import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsButtonViewModel import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsForegroundServicesButtonViewModel import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsSecurityButtonViewModel import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel import com.android.systemui.qs.ui.composable.QuickSettingsTheme import com.android.systemui.res.R import kotlinx.coroutines.launch @Composable fun FooterActionsWithAnimatedVisibility( viewModel: FooterActionsViewModel, isCustomizing: Boolean, lifecycleOwner: LifecycleOwner, footerActionsModifier: (Modifier) -> Modifier, modifier: Modifier = Modifier, ) { AnimatedVisibility(visible = !isCustomizing, modifier = modifier.fillMaxWidth()) { QuickSettingsTheme { // This view has its own horizontal padding // TODO(b/321716470) This should use a lifecycle tied to the scene. FooterActions( viewModel = viewModel, qsVisibilityLifecycleOwner = lifecycleOwner, modifier = footerActionsModifier(Modifier), ) } } } /** The Quick Settings footer actions row. */ @Composable fun FooterActions( Loading
packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt +6 −2 Original line number Diff line number Diff line Loading @@ -63,12 +63,14 @@ object QuickSettings { } private fun SceneScope.stateForQuickSettingsContent( isSplitShade: Boolean, squishiness: Float = QuickSettings.SharedValues.SquishinessValues.Default ): QSSceneAdapter.State { return when (val transitionState = layoutState.transitionState) { is TransitionState.Idle -> { when (transitionState.currentScene) { Scenes.Shade -> QSSceneAdapter.State.QQS Scenes.Shade -> QSSceneAdapter.State.QQS.takeUnless { isSplitShade } ?: QSSceneAdapter.State.QS Scenes.QuickSettings -> QSSceneAdapter.State.QS else -> QSSceneAdapter.State.CLOSED } Loading @@ -76,6 +78,7 @@ private fun SceneScope.stateForQuickSettingsContent( is TransitionState.Transition -> with(transitionState) { when { isSplitShade -> QSSceneAdapter.State.QS fromScene == Scenes.Shade && toScene == Scenes.QuickSettings -> Expanding(progress) fromScene == Scenes.QuickSettings && toScene == Scenes.Shade -> Loading Loading @@ -111,10 +114,11 @@ private fun SceneScope.stateForQuickSettingsContent( fun SceneScope.QuickSettings( qsSceneAdapter: QSSceneAdapter, heightProvider: () -> Int, isSplitShade: Boolean, modifier: Modifier = Modifier, squishiness: Float = QuickSettings.SharedValues.SquishinessValues.Default, ) { val contentState = stateForQuickSettingsContent(squishiness) val contentState = stateForQuickSettingsContent(isSplitShade, squishiness) MovableElement( key = QuickSettings.Elements.Content, Loading
packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt +12 −14 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import com.android.systemui.compose.modifiers.sysuiResTag import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.qs.footer.ui.compose.FooterActions import com.android.systemui.qs.footer.ui.compose.FooterActionsWithAnimatedVisibility import com.android.systemui.qs.ui.viewmodel.QuickSettingsSceneViewModel import com.android.systemui.res.R import com.android.systemui.scene.shared.model.Scenes Loading Loading @@ -238,24 +239,21 @@ private fun SceneScope.QuickSettingsScene( QuickSettings( viewModel.qsSceneAdapter, { viewModel.qsSceneAdapter.qsHeight }, isSplitShade = false, modifier = Modifier.sysuiResTag("expanded_qs_scroll_view"), ) } } AnimatedVisibility( visible = !isCustomizing, modifier = Modifier.align(Alignment.CenterHorizontally).fillMaxWidth() ) { QuickSettingsTheme { // This view has its own horizontal padding // TODO(b/321716470) This should use a lifecycle tied to the scene. FooterActions( FooterActionsWithAnimatedVisibility( viewModel = footerActionsViewModel, qsVisibilityLifecycleOwner = lifecycleOwner, modifier = Modifier.element(QuickSettings.Elements.FooterActions) isCustomizing = isCustomizing, lifecycleOwner = lifecycleOwner, footerActionsModifier = { modifier -> modifier.element(QuickSettings.Elements.FooterActions) }, modifier = Modifier.align(Alignment.CenterHorizontally), ) } } } } }
packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/GoneScene.kt +3 −18 Original line number Diff line number Diff line Loading @@ -20,21 +20,16 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import com.android.compose.animation.scene.Edge import com.android.compose.animation.scene.SceneScope import com.android.compose.animation.scene.Swipe import com.android.compose.animation.scene.SwipeDirection import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult import com.android.compose.animation.scene.animateSceneFloatAsState import com.android.systemui.dagger.SysUISingleton import com.android.systemui.qs.ui.composable.QuickSettings import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel import com.android.systemui.scene.ui.viewmodel.GoneSceneViewModel import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow /** * "Gone" is not a real scene but rather the absence of scenes when we want to skip showing any Loading @@ -44,22 +39,12 @@ import kotlinx.coroutines.flow.asStateFlow class GoneScene @Inject constructor( private val notificationsViewModel: NotificationsPlaceholderViewModel, private val viewModel: GoneSceneViewModel, ) : ComposableScene { override val key = Scenes.Gone override val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> = MutableStateFlow<Map<UserAction, UserActionResult>>( mapOf( Swipe( pointerCount = 2, fromSource = Edge.Top, direction = SwipeDirection.Down, ) to UserActionResult(Scenes.QuickSettings), Swipe(direction = SwipeDirection.Down) to UserActionResult(Scenes.Shade), ) ) .asStateFlow() viewModel.destinationScenes @Composable override fun SceneScope.Content( Loading