Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 36dcd63c authored by 0's avatar 0 Committed by Shawn Lee
Browse files

Delete SceneInteractor.transitioning

This function was leaking coroutines. It looks like the only usage can be replaced with layout.isTransitioningBetween, so we can delete it.

Bug: 317226761
Test: verified status icons behavior
Flag: ACONFIG com.android.systemui.scene_container DEVELOPMENT
Change-Id: I6a361786d0bbd19650298a5e3aad0b89da55c249
parent 262f4c9e
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -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
@@ -348,7 +350,7 @@ private fun ShadeCarrierGroup(
}

@Composable
private fun StatusIcons(
private fun SceneScope.StatusIcons(
    viewModel: ShadeHeaderViewModel,
    createTintedIconManager: (ViewGroup, StatusBarLocation) -> TintedIconManager,
    statusBarIconController: StatusBarIconController,
@@ -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 ->
@@ -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 {
+0 −99
Original line number Diff line number Diff line
@@ -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 {
+0 −72
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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 {
+0 −22
Original line number Diff line number Diff line
@@ -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.
     *
+1 −13
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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