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

Commit 6758405d authored by Fabián Kozynski's avatar Fabián Kozynski
Browse files

Track StatusBarState

This adds tracking in the view model for the state. The flow is not
wired into anything yet.

Test: atest QSFragmentComposeViewModelTest
Bug: 353253277
Flag: com.android.systemui.qs_ui_refactor_compose_fragment
Change-Id: I5d18421d43d914e27a50a75eccb236e2371ec6f0
parent 81ff9a0e
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@ import com.android.systemui.kosmos.testScope
import com.android.systemui.qs.fgsManagerController
import com.android.systemui.res.R
import com.android.systemui.shade.largeScreenHeaderHelper
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.sysuiStatusBarStateController
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.Dispatchers
@@ -140,6 +142,42 @@ class QSFragmentComposeViewModelTest : SysuiTestCase() {
            }
        }

    @Test
    fun statusBarState_followsController() =
        with(kosmos) {
            testScope.testWithinLifecycle {
                val statusBarState by collectLastValue(underTest.statusBarState)
                runCurrent()

                sysuiStatusBarStateController.setState(StatusBarState.SHADE)
                assertThat(statusBarState).isEqualTo(StatusBarState.SHADE)

                sysuiStatusBarStateController.setState(StatusBarState.KEYGUARD)
                assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD)

                sysuiStatusBarStateController.setState(StatusBarState.SHADE_LOCKED)
                assertThat(statusBarState).isEqualTo(StatusBarState.SHADE_LOCKED)
            }
        }

    @Test
    fun statusBarState_changesEarlyIfUpcomingStateIsKeyguard() =
        with(kosmos) {
            testScope.testWithinLifecycle {
                val statusBarState by collectLastValue(underTest.statusBarState)

                sysuiStatusBarStateController.setState(StatusBarState.SHADE)
                sysuiStatusBarStateController.setUpcomingState(StatusBarState.SHADE_LOCKED)
                assertThat(statusBarState).isEqualTo(StatusBarState.SHADE)

                sysuiStatusBarStateController.setUpcomingState(StatusBarState.KEYGUARD)
                assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD)

                sysuiStatusBarStateController.setUpcomingState(StatusBarState.SHADE)
                assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD)
            }
        }

    private inline fun TestScope.testWithinLifecycle(
        crossinline block: suspend TestScope.() -> TestResult
    ): TestResult {
+33 −1
Original line number Diff line number Diff line
@@ -19,21 +19,26 @@ package com.android.systemui.qs.composefragment.viewmodel
import android.content.res.Resources
import android.graphics.Rect
import androidx.annotation.FloatRange
import androidx.annotation.VisibleForTesting
import androidx.lifecycle.LifecycleCoroutineScope
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.qs.FooterActionsController
import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel
import com.android.systemui.qs.ui.viewmodel.QuickSettingsContainerViewModel
import com.android.systemui.shade.LargeScreenHeaderHelper
import com.android.systemui.shade.transition.LargeScreenShadeInterpolator
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.SysuiStatusBarStateController
import com.android.systemui.statusbar.disableflags.data.repository.DisableFlagsRepository
import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.util.LargeScreenUtils
import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
@@ -140,7 +145,34 @@ constructor(

    private val _keyguardAndExpanded = MutableStateFlow(false)

    private val _statusBarState = MutableStateFlow(-1)
    /**
     * Tracks the current [StatusBarState]. It will switch early if the upcoming state is
     * [StatusBarState.KEYGUARD]
     */
    @get:VisibleForTesting
    val statusBarState =
        conflatedCallbackFlow {
                val callback =
                    object : StatusBarStateController.StateListener {
                        override fun onStateChanged(newState: Int) {
                            trySend(newState)
                        }

                        override fun onUpcomingStateChanged(upcomingState: Int) {
                            if (upcomingState == StatusBarState.KEYGUARD) {
                                trySend(upcomingState)
                            }
                        }
                    }
                sysuiStatusBarStateController.addCallback(callback)

                awaitClose { sysuiStatusBarStateController.removeCallback(callback) }
            }
            .stateIn(
                lifecycleScope,
                SharingStarted.WhileSubscribed(),
                sysuiStatusBarStateController.state,
            )

    private val _viewHeight = MutableStateFlow(0)