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

Commit 32725599 authored by Caitlin Shkuratov's avatar Caitlin Shkuratov Committed by Android (Google) Code Review
Browse files

Merge changes Iec247b60,I07b1931f into main

* changes:
  [SB] Add flow tracing for some status bar view model flows.
  [SB][Chips] Use hydrator for HomeStatusBarViewModel.ongoingActivityChips
parents 3fe3512c 0756a0ce
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -54,9 +54,7 @@ class FakeHomeStatusBarViewModel(
        MutableStateFlow(OngoingActivityChipModel.Inactive())

    override val ongoingActivityChips =
        MutableStateFlow(
        ChipsVisibilityModel(MultipleOngoingActivityChipsModel(), areChipsAllowed = false)
        )

    override val ongoingActivityChipsLegacy =
        MutableStateFlow(MultipleOngoingActivityChipsModelLegacy())
+14 −27
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ import com.android.systemui.kosmos.runCurrent
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.lifecycle.activateIn
import com.android.systemui.log.assertLogsWtf
import com.android.systemui.mediaprojection.data.model.MediaProjectionState
import com.android.systemui.mediaprojection.data.repository.fakeMediaProjectionRepository
@@ -107,7 +108,8 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class HomeStatusBarViewModelImplTest : SysuiTestCase() {
    private val kosmos = testKosmos().useUnconfinedTestDispatcher()
    private val Kosmos.underTest by Kosmos.Fixture { kosmos.homeStatusBarViewModel }
    private val Kosmos.underTest by
        Kosmos.Fixture { kosmos.homeStatusBarViewModel.also { it.activateIn(kosmos.testScope) } }

    @Before
    fun setUp() {
@@ -891,32 +893,26 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
    @EnableChipsModernization
    fun ongoingActivityChips_statusBarHidden_noSecureCamera_noHun_notAllowed() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.ongoingActivityChips)

            // home status bar not allowed
            kosmos.sceneContainerRepository.snapToScene(Scenes.Lockscreen)
            kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(false, taskInfo = null)

            assertThat(latest!!.areChipsAllowed).isFalse()
            assertThat(underTest.ongoingActivityChips.areChipsAllowed).isFalse()
        }

    @Test
    @EnableChipsModernization
    fun ongoingActivityChips_statusBarNotHidden_noSecureCamera_noHun_isAllowed() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.ongoingActivityChips)

            transitionKeyguardToGone()

            assertThat(latest!!.areChipsAllowed).isTrue()
            assertThat(underTest.ongoingActivityChips.areChipsAllowed).isTrue()
        }

    @Test
    @EnableChipsModernization
    fun ongoingActivityChips_statusBarNotHidden_secureCamera_noHun_notAllowed() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.ongoingActivityChips)

            fakeKeyguardTransitionRepository.sendTransitionSteps(
                from = KeyguardState.LOCKSCREEN,
                to = KeyguardState.OCCLUDED,
@@ -924,7 +920,7 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
            )
            kosmos.keyguardInteractor.onCameraLaunchDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)

            assertThat(latest!!.areChipsAllowed).isFalse()
            assertThat(underTest.ongoingActivityChips.areChipsAllowed).isFalse()
        }

    @Test
@@ -932,8 +928,6 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
    @EnableChipsModernization
    fun ongoingActivityChips_statusBarNotHidden_noSecureCamera_hunBySystem_noHunFlagOff_notAllowed() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.ongoingActivityChips)

            transitionKeyguardToGone()

            headsUpNotificationRepository.setNotifications(
@@ -943,7 +937,7 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
                )
            )

            assertThat(latest!!.areChipsAllowed).isFalse()
            assertThat(underTest.ongoingActivityChips.areChipsAllowed).isFalse()
        }

    @Test
@@ -951,8 +945,6 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
    @EnableChipsModernization
    fun ongoingActivityChips_statusBarNotHidden_noSecureCamera_hunByUser_noHunFlagOff_isAllowed() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.ongoingActivityChips)

            transitionKeyguardToGone()

            headsUpNotificationRepository.setNotifications(
@@ -962,16 +954,14 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
                )
            )

            assertThat(latest!!.areChipsAllowed).isTrue()
            assertThat(underTest.ongoingActivityChips.areChipsAllowed).isTrue()
        }

    @Test
    @EnableFlags(StatusBarNoHunBehavior.FLAG_NAME)
    @EnableChipsModernization
    fun ongoingActivityChips_tatusBarNotHidden_noSecureCamera_hunBySystem_noHunFlagOn_isAllowed() =
    fun ongoingActivityChips_statusBarNotHidden_noSecureCamera_hunBySystem_noHunFlagOn_isAllowed() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.ongoingActivityChips)

            transitionKeyguardToGone()

            headsUpNotificationRepository.setNotifications(
@@ -981,7 +971,7 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
                )
            )

            assertThat(latest!!.areChipsAllowed).isTrue()
            assertThat(underTest.ongoingActivityChips.areChipsAllowed).isTrue()
        }

    @Test
@@ -989,8 +979,6 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
    @EnableChipsModernization
    fun ongoingActivityChips_statusBarNotHidden_noSecureCamera_hunByUser_noHunFlagOn_isAllowed() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.ongoingActivityChips)

            transitionKeyguardToGone()

            headsUpNotificationRepository.setNotifications(
@@ -1000,7 +988,7 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
                )
            )

            assertThat(latest!!.areChipsAllowed).isTrue()
            assertThat(underTest.ongoingActivityChips.areChipsAllowed).isTrue()
        }

    @Test
@@ -1008,17 +996,16 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
    @EnableChipsModernization
    fun ongoingActivityChips_followsChipsViewModel() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.ongoingActivityChips)
            transitionKeyguardToGone()

            screenRecordRepository.screenRecordState.value = ScreenRecordModel.Recording

            assertIsScreenRecordChip(latest!!.chips.active[0])
            assertIsScreenRecordChip(underTest.ongoingActivityChips.chips.active[0])

            addOngoingCallState(key = "call")

            assertIsScreenRecordChip(latest!!.chips.active[0])
            assertIsCallChip(latest!!.chips.active[1], "call", context)
            assertIsScreenRecordChip(underTest.ongoingActivityChips.chips.active[0])
            assertIsCallChip(underTest.ongoingActivityChips.chips.active[1], "call", context)
        }

    @Test
+1 −2
Original line number Diff line number Diff line
@@ -196,9 +196,8 @@ fun StatusBarRoot(

                                setContent {
                                    PlatformTheme {
                                        val chipsVisibilityModel by
                                        val chipsVisibilityModel =
                                            statusBarViewModel.ongoingActivityChips
                                                .collectAsStateWithLifecycle()
                                        if (chipsVisibilityModel.areChipsAllowed) {
                                            OngoingActivityChips(
                                                chips = chipsVisibilityModel.chips,
+24 −17
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ import android.graphics.Rect
import android.view.Display
import android.view.View
import androidx.compose.runtime.getValue
import com.android.app.tracing.FlowTracing.traceEach
import com.android.app.tracing.TrackGroupUtils.trackGroup
import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
@@ -130,7 +132,7 @@ interface HomeStatusBarViewModel : Activatable {
    val primaryOngoingActivityChip: StateFlow<OngoingActivityChipModel>

    /** All supported activity chips, whether they are currently active or not. */
    val ongoingActivityChips: StateFlow<ChipsVisibilityModel>
    val ongoingActivityChips: ChipsVisibilityModel

    /**
     * The multiple ongoing activity chips that should be shown on the left-hand side of the status
@@ -386,11 +388,9 @@ constructor(
        }

    override val isHomeStatusBarAllowed =
        isHomeStatusBarAllowedCompat.stateIn(
            bgScope,
            SharingStarted.WhileSubscribed(),
            initialValue = false,
        )
        isHomeStatusBarAllowedCompat
            .traceEach(trackGroup(TRACK_GROUP, "isHomeStatusBarAllowed"), logcat = true)
            .stateIn(bgScope, SharingStarted.WhileSubscribed(), initialValue = false)

    private val shouldHomeStatusBarBeVisible =
        combine(
@@ -461,24 +461,29 @@ constructor(
            isHomeStatusBarAllowed && !isSecureCameraActive && !hideStartSideContentForHeadsUp
        }

    override val ongoingActivityChips =
    private val chipsVisibilityModel: Flow<ChipsVisibilityModel> =
        combine(ongoingActivityChipsViewModel.chips, canShowOngoingActivityChips) { chips, canShow
                ->
                ChipsVisibilityModel(chips, areChipsAllowed = canShow)
            }
            .stateIn(
                bgScope,
                SharingStarted.WhileSubscribed(),
            .traceEach(trackGroup(TRACK_GROUP, "chips"), logcat = true) {
                "Chips[allowed=${it.areChipsAllowed} numChips=${it.chips.active.size}]"
            }

    override val ongoingActivityChips: ChipsVisibilityModel by
        hydrator.hydratedStateOf(
            traceName = "ongoingActivityChips",
            initialValue =
                ChipsVisibilityModel(
                    chips = MultipleOngoingActivityChipsModel(),
                    areChipsAllowed = false,
                ),
            source = chipsVisibilityModel,
        )

    private val hasOngoingActivityChips =
        if (StatusBarChipsModernization.isEnabled) {
            ongoingActivityChips.map { it.chips.active.any { chip -> !chip.isHidden } }
            chipsVisibilityModel.map { it.chips.active.any { chip -> !chip.isHidden } }
        } else if (StatusBarNotifChips.isEnabled) {
            ongoingActivityChipsLegacy.map { it.primary is OngoingActivityChipModel.Active }
        } else {
@@ -607,6 +612,8 @@ constructor(
        private const val COL_PREFIX_NOTIF_CONTAINER = "notifContainer"
        private const val COL_PREFIX_SYSTEM_INFO = "systemInfo"

        private const val TRACK_GROUP = "StatusBar"

        fun tableLogBufferName(displayId: Int) = "HomeStatusBarViewModel[$displayId]"
    }
}