Loading packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/EditModeScene.kt +17 −7 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.qs.ui.composable import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag Loading @@ -36,6 +37,7 @@ import com.android.systemui.res.R import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.ui.composable.Scene import com.android.systemui.shade.ui.composable.Shade import com.android.systemui.shade.ui.composable.ShadeHeader import javax.inject.Inject import kotlinx.coroutines.flow.Flow Loading Loading @@ -65,6 +67,7 @@ constructor( val viewModel = rememberViewModel("edit_mode_scene_view_model") { contentViewModelFactory.create() } Box(modifier = modifier.fillMaxSize()) { Box( modifier = Modifier.fillMaxSize() Loading @@ -72,6 +75,13 @@ constructor( .background(colorResource(R.color.shade_scrim_background_dark)) ) EditMode(viewModel.editModeViewModel, modifier.testTag("edit_mode_scene")) EditMode( viewModel.editModeViewModel, Modifier.fillMaxSize() .testTag("edit_mode_scene") .padding(horizontal = QuickSettingsShade.Dimensions.Padding) .padding(top = ShadeHeader.Dimensions.StatusBarHeight), ) } } } packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt +12 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.graphicsLayer Loading Loading @@ -258,6 +259,17 @@ private fun ContentScope.SingleShade( mediaHost.expansion = if (usingCollapsedLandscapeMedia && isLandscape()) COLLAPSED else EXPANDED var maxNotifScrimTop by remember { mutableIntStateOf(0) } val tileSquishiness by animateContentFloatAsState( value = 1f, key = QuickSettings.SharedValues.TilesSquishiness, canOverflow = false, ) LaunchedEffect(Unit) { snapshotFlow { tileSquishiness }.collect { viewModel.setTileSquishiness(it) } } val shouldPunchHoleBehindScrim = layoutState.isTransitioningBetween(Scenes.Gone, Scenes.Shade) || layoutState.isTransitioning(from = Scenes.Lockscreen, to = Scenes.Shade) Loading packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModelTest.kt +13 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.lifecycle.activateIn import com.android.systemui.media.controls.data.repository.mediaFilterRepository import com.android.systemui.media.controls.shared.model.MediaData import com.android.systemui.qs.panels.domain.interactor.tileSquishinessInteractor import com.android.systemui.res.R import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.scene.shared.model.Overlays Loading Loading @@ -221,6 +222,18 @@ class ShadeSceneContentViewModelTest : SysuiTestCase() { assertThat(underTest.isQsEnabled).isFalse() } @Test fun squishiness() = kosmos.runTest { val squishiness by collectLastValue(tileSquishinessInteractor.squishiness) underTest.setTileSquishiness(0f) assertThat(squishiness).isWithin(0.0001f).of(0.1f) underTest.setTileSquishiness(1f) assertThat(squishiness).isEqualTo(1f) } private fun Kosmos.prepareConfiguration(): Int { val configuration = context.resources.configuration configuration.setLayoutDirection(Locale.US) Loading packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModel.kt +13 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.shade.ui.viewmodel import androidx.annotation.FloatRange import androidx.compose.runtime.getValue import androidx.lifecycle.LifecycleOwner import com.android.app.tracing.coroutines.launchTraced as launch Loading @@ -26,6 +27,7 @@ import com.android.systemui.lifecycle.Hydrator import com.android.systemui.media.controls.domain.pipeline.interactor.MediaCarouselInteractor import com.android.systemui.qs.FooterActionsController import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel import com.android.systemui.qs.panels.domain.interactor.TileSquishinessInteractor import com.android.systemui.qs.panels.ui.viewmodel.QuickQuickSettingsViewModel import com.android.systemui.qs.ui.adapter.QSSceneAdapter import com.android.systemui.scene.domain.interactor.SceneInteractor Loading Loading @@ -69,6 +71,7 @@ constructor( unfoldTransitionInteractor: UnfoldTransitionInteractor, deviceEntryInteractor: DeviceEntryInteractor, private val sceneInteractor: SceneInteractor, private val tileSquishinessInteractor: TileSquishinessInteractor, ) : ExclusiveActivatable() { private val hydrator = Hydrator("ShadeSceneContentViewModel.hydrator") Loading Loading @@ -149,8 +152,18 @@ constructor( sceneInteractor.changeScene(Scenes.Lockscreen, "Shade empty space clicked.") } /** * Sets the squishiness for the tiles. The squishiness will be mapped between `[0.1, 1.0]` to * prevent visual artifacts caused by squishiness being too close to 0. */ fun setTileSquishiness(@FloatRange(0.0, 1.0) squishiness: Float) { tileSquishinessInteractor.setSquishinessValue(squishiness.constrainSquishiness()) } @AssistedFactory interface Factory { fun create(): ShadeSceneContentViewModel } } private fun Float.constrainSquishiness(): Float = (0.1f + this * 0.9f).coerceIn(0f, 1f) packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModelKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import com.android.systemui.kosmos.testDispatcher import com.android.systemui.media.controls.domain.pipeline.interactor.mediaCarouselInteractor import com.android.systemui.qs.footerActionsController import com.android.systemui.qs.footerActionsViewModelFactory import com.android.systemui.qs.panels.domain.interactor.tileSquishinessInteractor import com.android.systemui.qs.panels.ui.viewmodel.quickQuickSettingsViewModelFactory import com.android.systemui.qs.ui.adapter.qsSceneAdapter import com.android.systemui.scene.domain.interactor.sceneInteractor Loading @@ -46,6 +47,7 @@ val Kosmos.shadeSceneContentViewModel: ShadeSceneContentViewModel by Fixture { unfoldTransitionInteractor = unfoldTransitionInteractor, deviceEntryInteractor = deviceEntryInteractor, sceneInteractor = sceneInteractor, tileSquishinessInteractor = tileSquishinessInteractor, ) } Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/EditModeScene.kt +17 −7 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.qs.ui.composable import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag Loading @@ -36,6 +37,7 @@ import com.android.systemui.res.R import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.ui.composable.Scene import com.android.systemui.shade.ui.composable.Shade import com.android.systemui.shade.ui.composable.ShadeHeader import javax.inject.Inject import kotlinx.coroutines.flow.Flow Loading Loading @@ -65,6 +67,7 @@ constructor( val viewModel = rememberViewModel("edit_mode_scene_view_model") { contentViewModelFactory.create() } Box(modifier = modifier.fillMaxSize()) { Box( modifier = Modifier.fillMaxSize() Loading @@ -72,6 +75,13 @@ constructor( .background(colorResource(R.color.shade_scrim_background_dark)) ) EditMode(viewModel.editModeViewModel, modifier.testTag("edit_mode_scene")) EditMode( viewModel.editModeViewModel, Modifier.fillMaxSize() .testTag("edit_mode_scene") .padding(horizontal = QuickSettingsShade.Dimensions.Padding) .padding(top = ShadeHeader.Dimensions.StatusBarHeight), ) } } }
packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt +12 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.graphicsLayer Loading Loading @@ -258,6 +259,17 @@ private fun ContentScope.SingleShade( mediaHost.expansion = if (usingCollapsedLandscapeMedia && isLandscape()) COLLAPSED else EXPANDED var maxNotifScrimTop by remember { mutableIntStateOf(0) } val tileSquishiness by animateContentFloatAsState( value = 1f, key = QuickSettings.SharedValues.TilesSquishiness, canOverflow = false, ) LaunchedEffect(Unit) { snapshotFlow { tileSquishiness }.collect { viewModel.setTileSquishiness(it) } } val shouldPunchHoleBehindScrim = layoutState.isTransitioningBetween(Scenes.Gone, Scenes.Shade) || layoutState.isTransitioning(from = Scenes.Lockscreen, to = Scenes.Shade) Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModelTest.kt +13 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.lifecycle.activateIn import com.android.systemui.media.controls.data.repository.mediaFilterRepository import com.android.systemui.media.controls.shared.model.MediaData import com.android.systemui.qs.panels.domain.interactor.tileSquishinessInteractor import com.android.systemui.res.R import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.scene.shared.model.Overlays Loading Loading @@ -221,6 +222,18 @@ class ShadeSceneContentViewModelTest : SysuiTestCase() { assertThat(underTest.isQsEnabled).isFalse() } @Test fun squishiness() = kosmos.runTest { val squishiness by collectLastValue(tileSquishinessInteractor.squishiness) underTest.setTileSquishiness(0f) assertThat(squishiness).isWithin(0.0001f).of(0.1f) underTest.setTileSquishiness(1f) assertThat(squishiness).isEqualTo(1f) } private fun Kosmos.prepareConfiguration(): Int { val configuration = context.resources.configuration configuration.setLayoutDirection(Locale.US) Loading
packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModel.kt +13 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.shade.ui.viewmodel import androidx.annotation.FloatRange import androidx.compose.runtime.getValue import androidx.lifecycle.LifecycleOwner import com.android.app.tracing.coroutines.launchTraced as launch Loading @@ -26,6 +27,7 @@ import com.android.systemui.lifecycle.Hydrator import com.android.systemui.media.controls.domain.pipeline.interactor.MediaCarouselInteractor import com.android.systemui.qs.FooterActionsController import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel import com.android.systemui.qs.panels.domain.interactor.TileSquishinessInteractor import com.android.systemui.qs.panels.ui.viewmodel.QuickQuickSettingsViewModel import com.android.systemui.qs.ui.adapter.QSSceneAdapter import com.android.systemui.scene.domain.interactor.SceneInteractor Loading Loading @@ -69,6 +71,7 @@ constructor( unfoldTransitionInteractor: UnfoldTransitionInteractor, deviceEntryInteractor: DeviceEntryInteractor, private val sceneInteractor: SceneInteractor, private val tileSquishinessInteractor: TileSquishinessInteractor, ) : ExclusiveActivatable() { private val hydrator = Hydrator("ShadeSceneContentViewModel.hydrator") Loading Loading @@ -149,8 +152,18 @@ constructor( sceneInteractor.changeScene(Scenes.Lockscreen, "Shade empty space clicked.") } /** * Sets the squishiness for the tiles. The squishiness will be mapped between `[0.1, 1.0]` to * prevent visual artifacts caused by squishiness being too close to 0. */ fun setTileSquishiness(@FloatRange(0.0, 1.0) squishiness: Float) { tileSquishinessInteractor.setSquishinessValue(squishiness.constrainSquishiness()) } @AssistedFactory interface Factory { fun create(): ShadeSceneContentViewModel } } private fun Float.constrainSquishiness(): Float = (0.1f + this * 0.9f).coerceIn(0f, 1f)
packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModelKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import com.android.systemui.kosmos.testDispatcher import com.android.systemui.media.controls.domain.pipeline.interactor.mediaCarouselInteractor import com.android.systemui.qs.footerActionsController import com.android.systemui.qs.footerActionsViewModelFactory import com.android.systemui.qs.panels.domain.interactor.tileSquishinessInteractor import com.android.systemui.qs.panels.ui.viewmodel.quickQuickSettingsViewModelFactory import com.android.systemui.qs.ui.adapter.qsSceneAdapter import com.android.systemui.scene.domain.interactor.sceneInteractor Loading @@ -46,6 +47,7 @@ val Kosmos.shadeSceneContentViewModel: ShadeSceneContentViewModel by Fixture { unfoldTransitionInteractor = unfoldTransitionInteractor, deviceEntryInteractor = deviceEntryInteractor, sceneInteractor = sceneInteractor, tileSquishinessInteractor = tileSquishinessInteractor, ) } Loading