Loading packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt +9 −1 Original line number Diff line number Diff line Loading @@ -18,11 +18,14 @@ package com.android.systemui.keyguard.ui.composable import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import com.android.compose.animation.scene.SceneScope import com.android.compose.animation.scene.animateSceneFloatAsState import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.ui.viewmodel.LockscreenSceneViewModel import com.android.systemui.qs.ui.composable.QuickSettings import com.android.systemui.scene.shared.model.Direction import com.android.systemui.scene.shared.model.Edge import com.android.systemui.scene.shared.model.SceneKey Loading Loading @@ -87,10 +90,15 @@ constructor( } @Composable private fun LockscreenScene( private fun SceneScope.LockscreenScene( lockscreenContent: Lazy<LockscreenContent>, modifier: Modifier = Modifier, ) { animateSceneFloatAsState( value = QuickSettings.SharedValues.SquishinessValues.LockscreenSceneStarting, key = QuickSettings.SharedValues.TilesSquishiness, ) lockscreenContent .get() .Content( Loading packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt +30 −14 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.systemui.qs.ui.composable import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth Loading @@ -32,14 +31,12 @@ import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.MovableElementScenePicker import com.android.compose.animation.scene.SceneScope import com.android.compose.animation.scene.TransitionState import com.android.compose.animation.scene.ValueKey import com.android.compose.modifiers.thenIf import com.android.compose.theme.colorAttr import com.android.systemui.qs.ui.adapter.QSSceneAdapter import com.android.systemui.qs.ui.adapter.QSSceneAdapter.State.Companion.Collapsing import com.android.systemui.qs.ui.adapter.QSSceneAdapter.State.Expanding import com.android.systemui.res.R import com.android.systemui.scene.ui.composable.Gone import com.android.systemui.scene.ui.composable.Lockscreen import com.android.systemui.qs.ui.adapter.QSSceneAdapter.State.Unsquishing import com.android.systemui.scene.ui.composable.QuickSettings as QuickSettingsSceneKey import com.android.systemui.scene.ui.composable.Shade Loading @@ -51,15 +48,24 @@ object QuickSettings { ) object Elements { // TODO RENAME val Content = ElementKey("QuickSettingsContent", scenePicker = MovableElementScenePicker(SCENES)) val CollapsedGrid = ElementKey("QuickSettingsCollapsedGrid") val FooterActions = ElementKey("QuickSettingsFooterActions") } object SharedValues { val TilesSquishiness = ValueKey("QuickSettingsTileSquishiness") object SquishinessValues { val Default = 1f val LockscreenSceneStarting = 0f val GoneSceneStarting = 0.3f } } } private fun SceneScope.stateForQuickSettingsContent(): QSSceneAdapter.State { private fun SceneScope.stateForQuickSettingsContent( squishiness: Float = QuickSettings.SharedValues.SquishinessValues.Default ): QSSceneAdapter.State { return when (val transitionState = layoutState.transitionState) { is TransitionState.Idle -> { when (transitionState.currentScene) { Loading @@ -73,10 +79,10 @@ private fun SceneScope.stateForQuickSettingsContent(): QSSceneAdapter.State { when { fromScene == Shade && toScene == QuickSettingsSceneKey -> Expanding(progress) fromScene == QuickSettingsSceneKey && toScene == Shade -> Collapsing(progress) toScene == Shade -> QSSceneAdapter.State.QQS toScene == QuickSettingsSceneKey -> QSSceneAdapter.State.QS toScene == Gone -> QSSceneAdapter.State.CLOSED toScene == Lockscreen -> QSSceneAdapter.State.CLOSED fromScene == Shade || toScene == Shade -> Unsquishing(squishiness) fromScene == QuickSettingsSceneKey || toScene == QuickSettingsSceneKey -> { QSSceneAdapter.State.QS } else -> error( "Bad transition for QuickSettings: fromScene=$fromScene," + Loading @@ -90,14 +96,24 @@ private fun SceneScope.stateForQuickSettingsContent(): QSSceneAdapter.State { /** * This composable will show QuickSettingsContent in the correct state (as determined by its * [SceneScope]). * * If adding to scenes not in: * * QuickSettingsScene * * ShadeScene * * amend: * * [stateForQuickSettingsContent], * * [QuickSettings.SCENES], * * this doc. */ @Composable fun SceneScope.QuickSettings( qsSceneAdapter: QSSceneAdapter, heightProvider: () -> Int, modifier: Modifier = Modifier, squishiness: Float = QuickSettings.SharedValues.SquishinessValues.Default, ) { val contentState = stateForQuickSettingsContent() val contentState = stateForQuickSettingsContent(squishiness) MovableElement( key = QuickSettings.Elements.Content, Loading Loading @@ -136,7 +152,7 @@ private fun QuickSettingsContent( modifier.fillMaxWidth().thenIf(isCustomizing) { Modifier.fillMaxHeight() } ) { AndroidView( modifier = Modifier.fillMaxWidth().background(colorAttr(R.attr.underSurface)), modifier = Modifier.fillMaxWidth(), factory = { _ -> qsSceneAdapter.setState(state) view Loading packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt +2 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.unit.dp import com.android.compose.animation.scene.SceneScope import com.android.compose.animation.scene.TransitionState import com.android.compose.animation.scene.animateSceneFloatAsState import com.android.compose.windowsizeclass.LocalWindowSizeClass import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.compose.modifiers.sysuiResTag Loading Loading @@ -128,6 +129,7 @@ private fun SceneScope.QuickSettingsScene( remember(lifecycleOwner, viewModel) { viewModel.getFooterActionsViewModel(lifecycleOwner) } animateSceneFloatAsState(value = 1f, key = QuickSettings.SharedValues.TilesSquishiness) // ############## SCROLLING ################ Loading packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/GoneScene.kt +7 −0 Original line number Diff line number Diff line Loading @@ -19,9 +19,12 @@ package com.android.systemui.scene.ui.composable import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import com.android.compose.animation.scene.SceneScope 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.Direction import com.android.systemui.scene.shared.model.Edge import com.android.systemui.scene.shared.model.SceneKey Loading Loading @@ -63,6 +66,10 @@ constructor( override fun SceneScope.Content( modifier: Modifier, ) { animateSceneFloatAsState( value = QuickSettings.SharedValues.SquishinessValues.GoneSceneStarting, key = QuickSettings.SharedValues.TilesSquishiness, ) Spacer(modifier.fillMaxSize()) } } packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromLockscreenToShadeTransition.kt +6 −9 Original line number Diff line number Diff line package com.android.systemui.scene.ui.composable.transitions import androidx.compose.animation.core.tween import com.android.compose.animation.scene.Edge import com.android.compose.animation.scene.TransitionBuilder import com.android.systemui.notifications.ui.composable.Notifications import com.android.systemui.qs.ui.composable.QuickSettings import com.android.systemui.shade.ui.composable.Shade import com.android.systemui.shade.ui.composable.ShadeHeader import kotlin.time.Duration.Companion.milliseconds fun TransitionBuilder.lockscreenToShadeTransition( Loading @@ -13,15 +13,12 @@ fun TransitionBuilder.lockscreenToShadeTransition( ) { spec = tween(durationMillis = DefaultDuration.times(durationScale).inWholeMilliseconds.toInt()) fractionRange(end = 0.5f) { fade(Shade.Elements.BackgroundScrim) translate( QuickSettings.Elements.CollapsedGrid, Edge.Top, startsOutsideLayoutBounds = false, ) fractionRange(end = 0.5f) { fade(Shade.Elements.BackgroundScrim) } translate(QuickSettings.Elements.Content, y = -ShadeHeader.Dimensions.CollapsedHeight * .66f) fractionRange(start = 0.5f) { fade(QuickSettings.Elements.Content) fade(Notifications.Elements.NotificationScrim) } fractionRange(start = 0.5f) { fade(Notifications.Elements.NotificationScrim) } } private val DefaultDuration = 500.milliseconds Loading
packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt +9 −1 Original line number Diff line number Diff line Loading @@ -18,11 +18,14 @@ package com.android.systemui.keyguard.ui.composable import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import com.android.compose.animation.scene.SceneScope import com.android.compose.animation.scene.animateSceneFloatAsState import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.ui.viewmodel.LockscreenSceneViewModel import com.android.systemui.qs.ui.composable.QuickSettings import com.android.systemui.scene.shared.model.Direction import com.android.systemui.scene.shared.model.Edge import com.android.systemui.scene.shared.model.SceneKey Loading Loading @@ -87,10 +90,15 @@ constructor( } @Composable private fun LockscreenScene( private fun SceneScope.LockscreenScene( lockscreenContent: Lazy<LockscreenContent>, modifier: Modifier = Modifier, ) { animateSceneFloatAsState( value = QuickSettings.SharedValues.SquishinessValues.LockscreenSceneStarting, key = QuickSettings.SharedValues.TilesSquishiness, ) lockscreenContent .get() .Content( Loading
packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt +30 −14 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.systemui.qs.ui.composable import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth Loading @@ -32,14 +31,12 @@ import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.MovableElementScenePicker import com.android.compose.animation.scene.SceneScope import com.android.compose.animation.scene.TransitionState import com.android.compose.animation.scene.ValueKey import com.android.compose.modifiers.thenIf import com.android.compose.theme.colorAttr import com.android.systemui.qs.ui.adapter.QSSceneAdapter import com.android.systemui.qs.ui.adapter.QSSceneAdapter.State.Companion.Collapsing import com.android.systemui.qs.ui.adapter.QSSceneAdapter.State.Expanding import com.android.systemui.res.R import com.android.systemui.scene.ui.composable.Gone import com.android.systemui.scene.ui.composable.Lockscreen import com.android.systemui.qs.ui.adapter.QSSceneAdapter.State.Unsquishing import com.android.systemui.scene.ui.composable.QuickSettings as QuickSettingsSceneKey import com.android.systemui.scene.ui.composable.Shade Loading @@ -51,15 +48,24 @@ object QuickSettings { ) object Elements { // TODO RENAME val Content = ElementKey("QuickSettingsContent", scenePicker = MovableElementScenePicker(SCENES)) val CollapsedGrid = ElementKey("QuickSettingsCollapsedGrid") val FooterActions = ElementKey("QuickSettingsFooterActions") } object SharedValues { val TilesSquishiness = ValueKey("QuickSettingsTileSquishiness") object SquishinessValues { val Default = 1f val LockscreenSceneStarting = 0f val GoneSceneStarting = 0.3f } } } private fun SceneScope.stateForQuickSettingsContent(): QSSceneAdapter.State { private fun SceneScope.stateForQuickSettingsContent( squishiness: Float = QuickSettings.SharedValues.SquishinessValues.Default ): QSSceneAdapter.State { return when (val transitionState = layoutState.transitionState) { is TransitionState.Idle -> { when (transitionState.currentScene) { Loading @@ -73,10 +79,10 @@ private fun SceneScope.stateForQuickSettingsContent(): QSSceneAdapter.State { when { fromScene == Shade && toScene == QuickSettingsSceneKey -> Expanding(progress) fromScene == QuickSettingsSceneKey && toScene == Shade -> Collapsing(progress) toScene == Shade -> QSSceneAdapter.State.QQS toScene == QuickSettingsSceneKey -> QSSceneAdapter.State.QS toScene == Gone -> QSSceneAdapter.State.CLOSED toScene == Lockscreen -> QSSceneAdapter.State.CLOSED fromScene == Shade || toScene == Shade -> Unsquishing(squishiness) fromScene == QuickSettingsSceneKey || toScene == QuickSettingsSceneKey -> { QSSceneAdapter.State.QS } else -> error( "Bad transition for QuickSettings: fromScene=$fromScene," + Loading @@ -90,14 +96,24 @@ private fun SceneScope.stateForQuickSettingsContent(): QSSceneAdapter.State { /** * This composable will show QuickSettingsContent in the correct state (as determined by its * [SceneScope]). * * If adding to scenes not in: * * QuickSettingsScene * * ShadeScene * * amend: * * [stateForQuickSettingsContent], * * [QuickSettings.SCENES], * * this doc. */ @Composable fun SceneScope.QuickSettings( qsSceneAdapter: QSSceneAdapter, heightProvider: () -> Int, modifier: Modifier = Modifier, squishiness: Float = QuickSettings.SharedValues.SquishinessValues.Default, ) { val contentState = stateForQuickSettingsContent() val contentState = stateForQuickSettingsContent(squishiness) MovableElement( key = QuickSettings.Elements.Content, Loading Loading @@ -136,7 +152,7 @@ private fun QuickSettingsContent( modifier.fillMaxWidth().thenIf(isCustomizing) { Modifier.fillMaxHeight() } ) { AndroidView( modifier = Modifier.fillMaxWidth().background(colorAttr(R.attr.underSurface)), modifier = Modifier.fillMaxWidth(), factory = { _ -> qsSceneAdapter.setState(state) view Loading
packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt +2 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.unit.dp import com.android.compose.animation.scene.SceneScope import com.android.compose.animation.scene.TransitionState import com.android.compose.animation.scene.animateSceneFloatAsState import com.android.compose.windowsizeclass.LocalWindowSizeClass import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.compose.modifiers.sysuiResTag Loading Loading @@ -128,6 +129,7 @@ private fun SceneScope.QuickSettingsScene( remember(lifecycleOwner, viewModel) { viewModel.getFooterActionsViewModel(lifecycleOwner) } animateSceneFloatAsState(value = 1f, key = QuickSettings.SharedValues.TilesSquishiness) // ############## SCROLLING ################ Loading
packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/GoneScene.kt +7 −0 Original line number Diff line number Diff line Loading @@ -19,9 +19,12 @@ package com.android.systemui.scene.ui.composable import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import com.android.compose.animation.scene.SceneScope 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.Direction import com.android.systemui.scene.shared.model.Edge import com.android.systemui.scene.shared.model.SceneKey Loading Loading @@ -63,6 +66,10 @@ constructor( override fun SceneScope.Content( modifier: Modifier, ) { animateSceneFloatAsState( value = QuickSettings.SharedValues.SquishinessValues.GoneSceneStarting, key = QuickSettings.SharedValues.TilesSquishiness, ) Spacer(modifier.fillMaxSize()) } }
packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/transitions/FromLockscreenToShadeTransition.kt +6 −9 Original line number Diff line number Diff line package com.android.systemui.scene.ui.composable.transitions import androidx.compose.animation.core.tween import com.android.compose.animation.scene.Edge import com.android.compose.animation.scene.TransitionBuilder import com.android.systemui.notifications.ui.composable.Notifications import com.android.systemui.qs.ui.composable.QuickSettings import com.android.systemui.shade.ui.composable.Shade import com.android.systemui.shade.ui.composable.ShadeHeader import kotlin.time.Duration.Companion.milliseconds fun TransitionBuilder.lockscreenToShadeTransition( Loading @@ -13,15 +13,12 @@ fun TransitionBuilder.lockscreenToShadeTransition( ) { spec = tween(durationMillis = DefaultDuration.times(durationScale).inWholeMilliseconds.toInt()) fractionRange(end = 0.5f) { fade(Shade.Elements.BackgroundScrim) translate( QuickSettings.Elements.CollapsedGrid, Edge.Top, startsOutsideLayoutBounds = false, ) fractionRange(end = 0.5f) { fade(Shade.Elements.BackgroundScrim) } translate(QuickSettings.Elements.Content, y = -ShadeHeader.Dimensions.CollapsedHeight * .66f) fractionRange(start = 0.5f) { fade(QuickSettings.Elements.Content) fade(Notifications.Elements.NotificationScrim) } fractionRange(start = 0.5f) { fade(Notifications.Elements.NotificationScrim) } } private val DefaultDuration = 500.milliseconds