Loading packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt +8 −7 Original line number Diff line number Diff line Loading @@ -334,13 +334,14 @@ private fun ContentScope.SingleShade( dimensionResource(id = R.dimen.qs_horizontal_margin) ) ) { val qqsViewModel = rememberViewModel(traceName = "shade_scene_qqs") { val qqsViewModel = rememberViewModel(traceName = "shade_scene_qqs") { viewModel.quickQuickSettingsViewModel.create() } QuickQuickSettings( qqsViewModel, listening = { true }, modifier = Modifier.sysuiResTag("quick_qs_panel") modifier = Modifier.sysuiResTag("quick_qs_panel"), ) } Loading Loading @@ -428,8 +429,6 @@ private fun ContentScope.SplitShade( key = QuickSettings.SharedValues.TilesSquishiness, canOverflow = false, ) val unfoldTranslationXForStartSide by viewModel.unfoldTranslationX(isOnStartSide = true).collectAsStateWithLifecycle(0f) val notificationStackPadding = dimensionResource(id = R.dimen.notification_side_paddings) val navBarBottomHeight = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() Loading Loading @@ -494,6 +493,8 @@ private fun ContentScope.SplitShade( ) Column(modifier = Modifier.fillMaxSize()) { val unfoldTranslationXForStartSide = viewModel.unfoldTranslationXForStartSide CollapsedShadeHeader( viewModel = headerViewModel, isSplitShade = true, Loading packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModelTest.kt +17 −21 Original line number Diff line number Diff line Loading @@ -33,8 +33,10 @@ import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintA import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.collectLastValue import com.android.systemui.kosmos.runCurrent import com.android.systemui.kosmos.runTest import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.useStandardTestDispatcher import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.lifecycle.activateIn import com.android.systemui.media.controls.data.repository.mediaFilterRepository Loading @@ -51,7 +53,6 @@ import com.android.systemui.testKosmos import com.android.systemui.unfold.fakeUnfoldTransitionProgressProvider import com.google.common.truth.Truth.assertThat import java.util.Locale import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.update Loading Loading @@ -137,38 +138,35 @@ class ShadeSceneContentViewModelTest : SysuiTestCase() { @Test fun unfoldTransitionProgress() = kosmos.runTest { testKosmos().useStandardTestDispatcher().runTest { // Set up and activate a new `underTest` which uses the StandardTestDispatcher. val underTest = shadeSceneContentViewModel underTest.activateIn(testScope) enableSingleShade() runCurrent() val maxTranslation = prepareConfiguration() val translations by collectLastValue( combine( underTest.unfoldTranslationX(isOnStartSide = true), underTest.unfoldTranslationX(isOnStartSide = false), ) { start, end -> Translations(start = start, end = end) } ) val unfoldProvider = fakeUnfoldTransitionProgressProvider unfoldProvider.onTransitionStarted() assertThat(translations?.start).isEqualTo(0f) assertThat(translations?.end).isEqualTo(-0f) assertThat(underTest.unfoldTranslationXForStartSide).isEqualTo(0f) repeat(10) { repetition -> val transitionProgress = 0.1f * (repetition + 1) unfoldProvider.onTransitionProgress(transitionProgress) assertThat(translations?.start).isEqualTo((1 - transitionProgress) * maxTranslation) assertThat(translations?.end).isEqualTo(-(1 - transitionProgress) * maxTranslation) runCurrent() assertThat(underTest.unfoldTranslationXForStartSide) .isEqualTo((1 - transitionProgress) * maxTranslation) } unfoldProvider.onTransitionFinishing() assertThat(translations?.start).isEqualTo(0f) assertThat(translations?.end).isEqualTo(-0f) runCurrent() assertThat(underTest.unfoldTranslationXForStartSide).isEqualTo(0f) unfoldProvider.onTransitionFinished() assertThat(translations?.start).isEqualTo(0f) assertThat(translations?.end).isEqualTo(-0f) runCurrent() assertThat(underTest.unfoldTranslationXForStartSide).isEqualTo(0f) } @Test Loading Loading @@ -213,6 +211,4 @@ class ShadeSceneContentViewModelTest : SysuiTestCase() { sceneInteractor.changeScene(key, "test") sceneInteractor.setTransitionState(flowOf(ObservableTransitionState.Idle(key))) } private data class Translations(val start: Float, val end: Float) } packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModel.kt +12 −10 Original line number Diff line number Diff line Loading @@ -39,7 +39,6 @@ import dagger.assisted.AssistedInject import java.util.concurrent.atomic.AtomicBoolean import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map /** Loading @@ -60,7 +59,7 @@ constructor( disableFlagsInteractor: DisableFlagsInteractor, private val footerActionsViewModelFactory: FooterActionsViewModel.Factory, private val footerActionsController: FooterActionsController, private val unfoldTransitionInteractor: UnfoldTransitionInteractor, unfoldTransitionInteractor: UnfoldTransitionInteractor, deviceEntryInteractor: DeviceEntryInteractor, private val sceneInteractor: SceneInteractor, ) : ExclusiveActivatable() { Loading Loading @@ -91,6 +90,17 @@ constructor( source = disableFlagsInteractor.disableFlags.map { it.isQuickSettingsEnabled() }, ) /** * Amount of X-axis translation to apply to various elements as the unfolded foldable is folded * slightly, in pixels. */ val unfoldTranslationXForStartSide: Float by hydrator.hydratedStateOf( traceName = "unfoldTranslationXForStartSide", initialValue = 0f, source = unfoldTransitionInteractor.unfoldTranslationX(isOnStartSide = true), ) private val footerActionsControllerInitialized = AtomicBoolean(false) override suspend fun onActivated(): Nothing { Loading @@ -101,14 +111,6 @@ constructor( } } /** * Amount of X-axis translation to apply to various elements as the unfolded foldable is folded * slightly, in pixels. */ fun unfoldTranslationX(isOnStartSide: Boolean): Flow<Float> { return unfoldTransitionInteractor.unfoldTranslationX(isOnStartSide) } fun getFooterActionsViewModel(lifecycleOwner: LifecycleOwner): FooterActionsViewModel { if (footerActionsControllerInitialized.compareAndSet(false, true)) { footerActionsController.init() Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt +8 −7 Original line number Diff line number Diff line Loading @@ -334,13 +334,14 @@ private fun ContentScope.SingleShade( dimensionResource(id = R.dimen.qs_horizontal_margin) ) ) { val qqsViewModel = rememberViewModel(traceName = "shade_scene_qqs") { val qqsViewModel = rememberViewModel(traceName = "shade_scene_qqs") { viewModel.quickQuickSettingsViewModel.create() } QuickQuickSettings( qqsViewModel, listening = { true }, modifier = Modifier.sysuiResTag("quick_qs_panel") modifier = Modifier.sysuiResTag("quick_qs_panel"), ) } Loading Loading @@ -428,8 +429,6 @@ private fun ContentScope.SplitShade( key = QuickSettings.SharedValues.TilesSquishiness, canOverflow = false, ) val unfoldTranslationXForStartSide by viewModel.unfoldTranslationX(isOnStartSide = true).collectAsStateWithLifecycle(0f) val notificationStackPadding = dimensionResource(id = R.dimen.notification_side_paddings) val navBarBottomHeight = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() Loading Loading @@ -494,6 +493,8 @@ private fun ContentScope.SplitShade( ) Column(modifier = Modifier.fillMaxSize()) { val unfoldTranslationXForStartSide = viewModel.unfoldTranslationXForStartSide CollapsedShadeHeader( viewModel = headerViewModel, isSplitShade = true, Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModelTest.kt +17 −21 Original line number Diff line number Diff line Loading @@ -33,8 +33,10 @@ import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintA import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.collectLastValue import com.android.systemui.kosmos.runCurrent import com.android.systemui.kosmos.runTest import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.useStandardTestDispatcher import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.lifecycle.activateIn import com.android.systemui.media.controls.data.repository.mediaFilterRepository Loading @@ -51,7 +53,6 @@ import com.android.systemui.testKosmos import com.android.systemui.unfold.fakeUnfoldTransitionProgressProvider import com.google.common.truth.Truth.assertThat import java.util.Locale import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.update Loading Loading @@ -137,38 +138,35 @@ class ShadeSceneContentViewModelTest : SysuiTestCase() { @Test fun unfoldTransitionProgress() = kosmos.runTest { testKosmos().useStandardTestDispatcher().runTest { // Set up and activate a new `underTest` which uses the StandardTestDispatcher. val underTest = shadeSceneContentViewModel underTest.activateIn(testScope) enableSingleShade() runCurrent() val maxTranslation = prepareConfiguration() val translations by collectLastValue( combine( underTest.unfoldTranslationX(isOnStartSide = true), underTest.unfoldTranslationX(isOnStartSide = false), ) { start, end -> Translations(start = start, end = end) } ) val unfoldProvider = fakeUnfoldTransitionProgressProvider unfoldProvider.onTransitionStarted() assertThat(translations?.start).isEqualTo(0f) assertThat(translations?.end).isEqualTo(-0f) assertThat(underTest.unfoldTranslationXForStartSide).isEqualTo(0f) repeat(10) { repetition -> val transitionProgress = 0.1f * (repetition + 1) unfoldProvider.onTransitionProgress(transitionProgress) assertThat(translations?.start).isEqualTo((1 - transitionProgress) * maxTranslation) assertThat(translations?.end).isEqualTo(-(1 - transitionProgress) * maxTranslation) runCurrent() assertThat(underTest.unfoldTranslationXForStartSide) .isEqualTo((1 - transitionProgress) * maxTranslation) } unfoldProvider.onTransitionFinishing() assertThat(translations?.start).isEqualTo(0f) assertThat(translations?.end).isEqualTo(-0f) runCurrent() assertThat(underTest.unfoldTranslationXForStartSide).isEqualTo(0f) unfoldProvider.onTransitionFinished() assertThat(translations?.start).isEqualTo(0f) assertThat(translations?.end).isEqualTo(-0f) runCurrent() assertThat(underTest.unfoldTranslationXForStartSide).isEqualTo(0f) } @Test Loading Loading @@ -213,6 +211,4 @@ class ShadeSceneContentViewModelTest : SysuiTestCase() { sceneInteractor.changeScene(key, "test") sceneInteractor.setTransitionState(flowOf(ObservableTransitionState.Idle(key))) } private data class Translations(val start: Float, val end: Float) }
packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModel.kt +12 −10 Original line number Diff line number Diff line Loading @@ -39,7 +39,6 @@ import dagger.assisted.AssistedInject import java.util.concurrent.atomic.AtomicBoolean import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map /** Loading @@ -60,7 +59,7 @@ constructor( disableFlagsInteractor: DisableFlagsInteractor, private val footerActionsViewModelFactory: FooterActionsViewModel.Factory, private val footerActionsController: FooterActionsController, private val unfoldTransitionInteractor: UnfoldTransitionInteractor, unfoldTransitionInteractor: UnfoldTransitionInteractor, deviceEntryInteractor: DeviceEntryInteractor, private val sceneInteractor: SceneInteractor, ) : ExclusiveActivatable() { Loading Loading @@ -91,6 +90,17 @@ constructor( source = disableFlagsInteractor.disableFlags.map { it.isQuickSettingsEnabled() }, ) /** * Amount of X-axis translation to apply to various elements as the unfolded foldable is folded * slightly, in pixels. */ val unfoldTranslationXForStartSide: Float by hydrator.hydratedStateOf( traceName = "unfoldTranslationXForStartSide", initialValue = 0f, source = unfoldTransitionInteractor.unfoldTranslationX(isOnStartSide = true), ) private val footerActionsControllerInitialized = AtomicBoolean(false) override suspend fun onActivated(): Nothing { Loading @@ -101,14 +111,6 @@ constructor( } } /** * Amount of X-axis translation to apply to various elements as the unfolded foldable is folded * slightly, in pixels. */ fun unfoldTranslationX(isOnStartSide: Boolean): Flow<Float> { return unfoldTransitionInteractor.unfoldTranslationX(isOnStartSide) } fun getFooterActionsViewModel(lifecycleOwner: LifecycleOwner): FooterActionsViewModel { if (footerActionsControllerInitialized.compareAndSet(false, true)) { footerActionsController.init() Loading