Loading packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt +6 −3 Original line number Diff line number Diff line Loading @@ -58,6 +58,8 @@ import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.common.ui.compose.windowinsets.CutoutLocation import com.android.systemui.common.ui.compose.windowinsets.LocalDisplayCutout import com.android.systemui.res.R import com.android.systemui.scene.ui.composable.QuickSettings import com.android.systemui.scene.ui.composable.Shade as ShadeKey import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel import com.android.systemui.statusbar.phone.StatusBarIconController import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager Loading Loading @@ -348,7 +350,7 @@ private fun ShadeCarrierGroup( } @Composable private fun StatusIcons( private fun SceneScope.StatusIcons( viewModel: ShadeHeaderViewModel, createTintedIconManager: (ViewGroup, StatusBarLocation) -> TintedIconManager, statusBarIconController: StatusBarIconController, Loading @@ -358,7 +360,6 @@ private fun StatusIcons( val carrierIconSlots = listOf(stringResource(id = com.android.internal.R.string.status_bar_mobile)) val isSingleCarrier by viewModel.isSingleCarrier.collectAsState() val isTransitioning by viewModel.isTransitioning.collectAsState() AndroidView( factory = { context -> Loading @@ -373,7 +374,9 @@ private fun StatusIcons( iconContainer }, update = { iconContainer -> iconContainer.setQsExpansionTransitioning(isTransitioning) iconContainer.setQsExpansionTransitioning( layoutState.isTransitioningBetween(ShadeKey, QuickSettings) ) if (isSingleCarrier || !useExpandedFormat) { iconContainer.removeIgnoredSlots(carrierIconSlots) } else { Loading packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt +0 −99 Original line number Diff line number Diff line Loading @@ -173,105 +173,6 @@ class SceneInteractorTest : SysuiTestCase() { assertThat(transitionTo).isNull() } @Test fun transitioning_idle_false() = testScope.runTest { val transitionState = MutableStateFlow<ObservableTransitionState>( ObservableTransitionState.Idle(SceneKey.Shade) ) val transitioning by collectLastValue(underTest.transitioning(SceneKey.Shade, SceneKey.Lockscreen)) underTest.setTransitionState(transitionState) assertThat(transitioning).isFalse() } @Test fun transitioning_wrongFromScene_false() = testScope.runTest { val transitionState = MutableStateFlow<ObservableTransitionState>( ObservableTransitionState.Transition( fromScene = SceneKey.Gone, toScene = SceneKey.Lockscreen, progress = flowOf(0.5f), isInitiatedByUserInput = false, isUserInputOngoing = flowOf(false), ) ) val transitioning by collectLastValue(underTest.transitioning(SceneKey.Shade, SceneKey.Lockscreen)) underTest.setTransitionState(transitionState) assertThat(transitioning).isFalse() } @Test fun transitioning_wrongToScene_false() = testScope.runTest { val transitionState = MutableStateFlow<ObservableTransitionState>( ObservableTransitionState.Transition( fromScene = SceneKey.Shade, toScene = SceneKey.QuickSettings, progress = flowOf(0.5f), isInitiatedByUserInput = false, isUserInputOngoing = flowOf(false), ) ) underTest.setTransitionState(transitionState) assertThat(underTest.transitioning(SceneKey.Shade, SceneKey.Lockscreen).value).isFalse() } @Test fun transitioning_correctFromAndToScenes_true() = testScope.runTest { val transitionState = MutableStateFlow<ObservableTransitionState>( ObservableTransitionState.Transition( fromScene = SceneKey.Shade, toScene = SceneKey.Lockscreen, progress = flowOf(0.5f), isInitiatedByUserInput = false, isUserInputOngoing = flowOf(false), ) ) val transitioning by collectLastValue(underTest.transitioning(SceneKey.Shade, SceneKey.Lockscreen)) underTest.setTransitionState(transitionState) assertThat(transitioning).isTrue() } @Test fun transitioning_updates() = testScope.runTest { val transitionState = MutableStateFlow<ObservableTransitionState>( ObservableTransitionState.Idle(SceneKey.Shade) ) val transitioning by collectLastValue(underTest.transitioning(SceneKey.Shade, SceneKey.Lockscreen)) underTest.setTransitionState(transitionState) assertThat(transitioning).isFalse() transitionState.value = ObservableTransitionState.Transition( fromScene = SceneKey.Shade, toScene = SceneKey.Lockscreen, progress = flowOf(0.5f), isInitiatedByUserInput = false, isUserInputOngoing = flowOf(false), ) assertThat(transitioning).isTrue() transitionState.value = ObservableTransitionState.Idle(SceneKey.Lockscreen) assertThat(transitioning).isFalse() } @Test fun isTransitionUserInputOngoing_idle_false() = testScope.runTest { Loading packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt +0 −72 Original line number Diff line number Diff line Loading @@ -9,8 +9,6 @@ import com.android.systemui.flags.FakeFeatureFlagsClassic import com.android.systemui.flags.Flags import com.android.systemui.kosmos.testScope import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.scene.shared.model.ObservableTransitionState import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionModel Loading @@ -22,8 +20,6 @@ import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnec import com.android.systemui.testKosmos import com.android.systemui.util.mockito.mock import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test Loading Loading @@ -73,74 +69,6 @@ class ShadeHeaderViewModelTest : SysuiTestCase() { ) } @Test fun isTransitioning_idle_false() = testScope.runTest { val isTransitioning by collectLastValue(underTest.isTransitioning) sceneInteractor.setTransitionState( MutableStateFlow(ObservableTransitionState.Idle(SceneKey.Shade)) ) assertThat(isTransitioning).isFalse() } @Test fun isTransitioning_shadeToQs_true() = testScope.runTest { val isTransitioning by collectLastValue(underTest.isTransitioning) sceneInteractor.setTransitionState( MutableStateFlow( ObservableTransitionState.Transition( fromScene = SceneKey.Shade, toScene = SceneKey.QuickSettings, progress = MutableStateFlow(0.5f), isInitiatedByUserInput = false, isUserInputOngoing = flowOf(false), ) ) ) assertThat(isTransitioning).isTrue() } @Test fun isTransitioning_qsToShade_true() = testScope.runTest { val isTransitioning by collectLastValue(underTest.isTransitioning) sceneInteractor.setTransitionState( MutableStateFlow( ObservableTransitionState.Transition( fromScene = SceneKey.QuickSettings, toScene = SceneKey.Shade, progress = MutableStateFlow(0.5f), isInitiatedByUserInput = false, isUserInputOngoing = flowOf(false), ) ) ) assertThat(isTransitioning).isTrue() } @Test fun isTransitioning_otherTransition_false() = testScope.runTest { val isTransitioning by collectLastValue(underTest.isTransitioning) sceneInteractor.setTransitionState( MutableStateFlow( ObservableTransitionState.Transition( fromScene = SceneKey.Gone, toScene = SceneKey.Shade, progress = MutableStateFlow(0.5f), isInitiatedByUserInput = false, isUserInputOngoing = flowOf(false), ) ) ) assertThat(isTransitioning).isFalse() } @Test fun mobileSubIds_update() = testScope.runTest { Loading packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt +0 −22 Original line number Diff line number Diff line Loading @@ -171,28 +171,6 @@ constructor( return repository.setVisible(isVisible) } /** True if there is a transition happening from and to the specified scenes. */ fun transitioning(from: SceneKey, to: SceneKey): StateFlow<Boolean> { fun transitioning( state: ObservableTransitionState, from: SceneKey, to: SceneKey, ): Boolean { return (state as? ObservableTransitionState.Transition)?.let { it.fromScene == from && it.toScene == to } ?: false } return transitionState .map { state -> transitioning(state, from, to) } .stateIn( scope = applicationScope, started = SharingStarted.WhileSubscribed(), initialValue = transitioning(transitionState.value, from, to), ) } /** * Binds the given flow so the system remembers it. * Loading packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt +1 −13 Original line number Diff line number Diff line Loading @@ -22,12 +22,11 @@ import android.content.IntentFilter import android.icu.text.DateFormat import android.icu.text.DisplayContext import android.os.UserHandle import com.android.systemui.res.R import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.res.R import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel import java.util.Date Loading @@ -38,7 +37,6 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach Loading @@ -57,16 +55,6 @@ constructor( val mobileIconsViewModel: MobileIconsViewModel, broadcastDispatcher: BroadcastDispatcher, ) { /** True if we are transitioning between Shade and QuickSettings scenes, in either direction. */ val isTransitioning = combine( sceneInteractor.transitioning(from = SceneKey.Shade, to = SceneKey.QuickSettings), sceneInteractor.transitioning(from = SceneKey.QuickSettings, to = SceneKey.Shade) ) { shadeToQuickSettings, quickSettingsToShade -> shadeToQuickSettings || quickSettingsToShade } .stateIn(applicationScope, SharingStarted.WhileSubscribed(), false) /** True if there is exactly one mobile connection. */ val isSingleCarrier: StateFlow<Boolean> = mobileIconsInteractor.isSingleCarrier Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt +6 −3 Original line number Diff line number Diff line Loading @@ -58,6 +58,8 @@ import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.common.ui.compose.windowinsets.CutoutLocation import com.android.systemui.common.ui.compose.windowinsets.LocalDisplayCutout import com.android.systemui.res.R import com.android.systemui.scene.ui.composable.QuickSettings import com.android.systemui.scene.ui.composable.Shade as ShadeKey import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel import com.android.systemui.statusbar.phone.StatusBarIconController import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager Loading Loading @@ -348,7 +350,7 @@ private fun ShadeCarrierGroup( } @Composable private fun StatusIcons( private fun SceneScope.StatusIcons( viewModel: ShadeHeaderViewModel, createTintedIconManager: (ViewGroup, StatusBarLocation) -> TintedIconManager, statusBarIconController: StatusBarIconController, Loading @@ -358,7 +360,6 @@ private fun StatusIcons( val carrierIconSlots = listOf(stringResource(id = com.android.internal.R.string.status_bar_mobile)) val isSingleCarrier by viewModel.isSingleCarrier.collectAsState() val isTransitioning by viewModel.isTransitioning.collectAsState() AndroidView( factory = { context -> Loading @@ -373,7 +374,9 @@ private fun StatusIcons( iconContainer }, update = { iconContainer -> iconContainer.setQsExpansionTransitioning(isTransitioning) iconContainer.setQsExpansionTransitioning( layoutState.isTransitioningBetween(ShadeKey, QuickSettings) ) if (isSingleCarrier || !useExpandedFormat) { iconContainer.removeIgnoredSlots(carrierIconSlots) } else { Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt +0 −99 Original line number Diff line number Diff line Loading @@ -173,105 +173,6 @@ class SceneInteractorTest : SysuiTestCase() { assertThat(transitionTo).isNull() } @Test fun transitioning_idle_false() = testScope.runTest { val transitionState = MutableStateFlow<ObservableTransitionState>( ObservableTransitionState.Idle(SceneKey.Shade) ) val transitioning by collectLastValue(underTest.transitioning(SceneKey.Shade, SceneKey.Lockscreen)) underTest.setTransitionState(transitionState) assertThat(transitioning).isFalse() } @Test fun transitioning_wrongFromScene_false() = testScope.runTest { val transitionState = MutableStateFlow<ObservableTransitionState>( ObservableTransitionState.Transition( fromScene = SceneKey.Gone, toScene = SceneKey.Lockscreen, progress = flowOf(0.5f), isInitiatedByUserInput = false, isUserInputOngoing = flowOf(false), ) ) val transitioning by collectLastValue(underTest.transitioning(SceneKey.Shade, SceneKey.Lockscreen)) underTest.setTransitionState(transitionState) assertThat(transitioning).isFalse() } @Test fun transitioning_wrongToScene_false() = testScope.runTest { val transitionState = MutableStateFlow<ObservableTransitionState>( ObservableTransitionState.Transition( fromScene = SceneKey.Shade, toScene = SceneKey.QuickSettings, progress = flowOf(0.5f), isInitiatedByUserInput = false, isUserInputOngoing = flowOf(false), ) ) underTest.setTransitionState(transitionState) assertThat(underTest.transitioning(SceneKey.Shade, SceneKey.Lockscreen).value).isFalse() } @Test fun transitioning_correctFromAndToScenes_true() = testScope.runTest { val transitionState = MutableStateFlow<ObservableTransitionState>( ObservableTransitionState.Transition( fromScene = SceneKey.Shade, toScene = SceneKey.Lockscreen, progress = flowOf(0.5f), isInitiatedByUserInput = false, isUserInputOngoing = flowOf(false), ) ) val transitioning by collectLastValue(underTest.transitioning(SceneKey.Shade, SceneKey.Lockscreen)) underTest.setTransitionState(transitionState) assertThat(transitioning).isTrue() } @Test fun transitioning_updates() = testScope.runTest { val transitionState = MutableStateFlow<ObservableTransitionState>( ObservableTransitionState.Idle(SceneKey.Shade) ) val transitioning by collectLastValue(underTest.transitioning(SceneKey.Shade, SceneKey.Lockscreen)) underTest.setTransitionState(transitionState) assertThat(transitioning).isFalse() transitionState.value = ObservableTransitionState.Transition( fromScene = SceneKey.Shade, toScene = SceneKey.Lockscreen, progress = flowOf(0.5f), isInitiatedByUserInput = false, isUserInputOngoing = flowOf(false), ) assertThat(transitioning).isTrue() transitionState.value = ObservableTransitionState.Idle(SceneKey.Lockscreen) assertThat(transitioning).isFalse() } @Test fun isTransitionUserInputOngoing_idle_false() = testScope.runTest { Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt +0 −72 Original line number Diff line number Diff line Loading @@ -9,8 +9,6 @@ import com.android.systemui.flags.FakeFeatureFlagsClassic import com.android.systemui.flags.Flags import com.android.systemui.kosmos.testScope import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.scene.shared.model.ObservableTransitionState import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionModel Loading @@ -22,8 +20,6 @@ import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnec import com.android.systemui.testKosmos import com.android.systemui.util.mockito.mock import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test Loading Loading @@ -73,74 +69,6 @@ class ShadeHeaderViewModelTest : SysuiTestCase() { ) } @Test fun isTransitioning_idle_false() = testScope.runTest { val isTransitioning by collectLastValue(underTest.isTransitioning) sceneInteractor.setTransitionState( MutableStateFlow(ObservableTransitionState.Idle(SceneKey.Shade)) ) assertThat(isTransitioning).isFalse() } @Test fun isTransitioning_shadeToQs_true() = testScope.runTest { val isTransitioning by collectLastValue(underTest.isTransitioning) sceneInteractor.setTransitionState( MutableStateFlow( ObservableTransitionState.Transition( fromScene = SceneKey.Shade, toScene = SceneKey.QuickSettings, progress = MutableStateFlow(0.5f), isInitiatedByUserInput = false, isUserInputOngoing = flowOf(false), ) ) ) assertThat(isTransitioning).isTrue() } @Test fun isTransitioning_qsToShade_true() = testScope.runTest { val isTransitioning by collectLastValue(underTest.isTransitioning) sceneInteractor.setTransitionState( MutableStateFlow( ObservableTransitionState.Transition( fromScene = SceneKey.QuickSettings, toScene = SceneKey.Shade, progress = MutableStateFlow(0.5f), isInitiatedByUserInput = false, isUserInputOngoing = flowOf(false), ) ) ) assertThat(isTransitioning).isTrue() } @Test fun isTransitioning_otherTransition_false() = testScope.runTest { val isTransitioning by collectLastValue(underTest.isTransitioning) sceneInteractor.setTransitionState( MutableStateFlow( ObservableTransitionState.Transition( fromScene = SceneKey.Gone, toScene = SceneKey.Shade, progress = MutableStateFlow(0.5f), isInitiatedByUserInput = false, isUserInputOngoing = flowOf(false), ) ) ) assertThat(isTransitioning).isFalse() } @Test fun mobileSubIds_update() = testScope.runTest { Loading
packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt +0 −22 Original line number Diff line number Diff line Loading @@ -171,28 +171,6 @@ constructor( return repository.setVisible(isVisible) } /** True if there is a transition happening from and to the specified scenes. */ fun transitioning(from: SceneKey, to: SceneKey): StateFlow<Boolean> { fun transitioning( state: ObservableTransitionState, from: SceneKey, to: SceneKey, ): Boolean { return (state as? ObservableTransitionState.Transition)?.let { it.fromScene == from && it.toScene == to } ?: false } return transitionState .map { state -> transitioning(state, from, to) } .stateIn( scope = applicationScope, started = SharingStarted.WhileSubscribed(), initialValue = transitioning(transitionState.value, from, to), ) } /** * Binds the given flow so the system remembers it. * Loading
packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt +1 −13 Original line number Diff line number Diff line Loading @@ -22,12 +22,11 @@ import android.content.IntentFilter import android.icu.text.DateFormat import android.icu.text.DisplayContext import android.os.UserHandle import com.android.systemui.res.R import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.res.R import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel import java.util.Date Loading @@ -38,7 +37,6 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach Loading @@ -57,16 +55,6 @@ constructor( val mobileIconsViewModel: MobileIconsViewModel, broadcastDispatcher: BroadcastDispatcher, ) { /** True if we are transitioning between Shade and QuickSettings scenes, in either direction. */ val isTransitioning = combine( sceneInteractor.transitioning(from = SceneKey.Shade, to = SceneKey.QuickSettings), sceneInteractor.transitioning(from = SceneKey.QuickSettings, to = SceneKey.Shade) ) { shadeToQuickSettings, quickSettingsToShade -> shadeToQuickSettings || quickSettingsToShade } .stateIn(applicationScope, SharingStarted.WhileSubscribed(), false) /** True if there is exactly one mobile connection. */ val isSingleCarrier: StateFlow<Boolean> = mobileIconsInteractor.isSingleCarrier Loading