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

Commit 4f400448 authored by andrewxu's avatar andrewxu Committed by Andrew Xu
Browse files

Fix Kosmos DynamicIconTilesViewModel

Before fix, Kosmos.dynamicIconTilesViewModel is created once and never
updates. This CL removes Kosmos.dynamicIconTilesViewModel and re-enables
QuickSettingsSceneTest.

InfiniteGridLayoutEditTileGridTest needs to access
DynamicIconTilesViewModel. Therefore, in that particular test, we inject
an InfiniteGridViewModel to the grid layout under test. Then we access
the DynamicIconTilesViewModel from the injected InfiniteGridViewModel.

Bug: 425752706
Flag: TEST_ONLY
Change-Id: If41a91733cfcd69525f0f76228a532a078ceaa24
parent 3df32c4e
Loading
Loading
Loading
Loading
+25 −6
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ import com.android.systemui.SysuiTestCase
import com.android.systemui.compose.modifiers.resIdToTestTag
import com.android.systemui.flags.DisableSceneContainer
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.haptics.msdl.tileHapticsViewModelFactoryProvider
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
@@ -53,9 +54,13 @@ import com.android.systemui.qs.composefragment.dagger.usingMediaInComposeFragmen
import com.android.systemui.qs.flags.QsEditModeTabs
import com.android.systemui.qs.panels.data.repository.defaultLargeTilesRepository
import com.android.systemui.qs.panels.domain.interactor.iconTilesInteractor
import com.android.systemui.qs.panels.ui.compose.infinitegrid.infiniteGridLayout
import com.android.systemui.qs.panels.ui.viewmodel.dynamicIconTilesViewModel
import com.android.systemui.qs.panels.ui.compose.infinitegrid.InfiniteGridLayout
import com.android.systemui.qs.panels.ui.viewmodel.detailsViewModel
import com.android.systemui.qs.panels.ui.viewmodel.InfiniteGridViewModel
import com.android.systemui.qs.panels.ui.viewmodel.editModeViewModel
import com.android.systemui.qs.panels.ui.viewmodel.iconTilesViewModel
import com.android.systemui.qs.panels.ui.viewmodel.infiniteGridViewModelFactory
import com.android.systemui.qs.panels.ui.viewmodel.textFeedbackContentViewModelFactory
import com.android.systemui.qs.pipeline.domain.interactor.currentTilesInteractor
import com.android.systemui.qs.pipeline.shared.TileSpec
import com.android.systemui.testKosmos
@@ -79,7 +84,23 @@ class InfiniteGridLayoutEditTileGridTest(flags: FlagsParameterization) : SysuiTe

    private val kosmos = testKosmos().useUnconfinedTestDispatcher()

    private val Kosmos.underTest by Kosmos.Fixture { infiniteGridLayout }
    private val Kosmos.viewModelUnderTest by Kosmos.Fixture {
        infiniteGridViewModelFactory.create()
    }

    private val Kosmos.underTest by Kosmos.Fixture {
        InfiniteGridLayout(
            detailsViewModel,
            iconTilesViewModel,
            viewModelFactory = object : InfiniteGridViewModel.Factory {
                override fun create(): InfiniteGridViewModel {
                    return viewModelUnderTest
                }
            },
            textFeedbackContentViewModelFactory,
            tileHapticsViewModelFactoryProvider,
        )
    }

    @Before
    fun setUp() {
@@ -303,8 +324,6 @@ class InfiniteGridLayoutEditTileGridTest(flags: FlagsParameterization) : SysuiTe
            // Perform second undo
            composeRule.onNodeWithContentDescription("Undo").performClick()
            assertLargeTiles(setOf("internet", "bt", "dnd", "cast"))
            assertThat(dynamicIconTilesViewModel.largeTilesState.value.map { it.spec })
                .containsExactly("internet", "bt", "dnd", "cast")
        }

    @Test
@@ -372,7 +391,7 @@ class InfiniteGridLayoutEditTileGridTest(flags: FlagsParameterization) : SysuiTe

    private fun assertLargeTiles(largeSpecs: Set<String>) =
        kosmos.run {
            assertThat(dynamicIconTilesViewModel.largeTilesState.value.map { it.spec })
            assertThat(viewModelUnderTest.iconTilesViewModel.largeTilesState.value.map { it.spec })
                .containsExactlyElementsIn(largeSpecs)
        }

+28 −12
Original line number Diff line number Diff line
@@ -30,7 +30,11 @@ import com.android.systemui.SysuiTestCase
import com.android.systemui.compose.modifiers.resIdToTestTag
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.jank.interactionJankMonitor
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
import com.android.systemui.qs.composefragment.dagger.usingMediaInComposeFragment
import com.android.systemui.qs.pipeline.domain.interactor.currentTilesInteractor
import com.android.systemui.qs.pipeline.shared.TileSpec
import com.android.systemui.qs.ui.viewmodel.quickSettingsSceneContentViewModelFactory
import com.android.systemui.qs.ui.viewmodel.quickSettingsUserActionsViewModelFactory
import com.android.systemui.scene.session.shared.SessionStorage
@@ -42,7 +46,8 @@ import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScr
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationsPlaceholderViewModelFactory
import com.android.systemui.statusbar.phone.ui.tintedIconManagerFactory
import com.android.systemui.testKosmos
import org.junit.Ignore
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -53,13 +58,14 @@ import org.mockito.Mockito.mock
@TestableLooper.RunWithLooper
@EnableSceneContainer
class QuickSettingsSceneTest : SysuiTestCase() {
    @get:Rule val composeTestRule = createComposeRule()
    @get:Rule
    val composeTestRule = createComposeRule()

    private val kosmos = testKosmos()

    @OptIn(ExperimentalCoroutinesApi::class)
    @Test
    @Ignore("http://b/425752706")
    fun testViewHierarchy() {
    fun testViewHierarchy() = kosmos.runTest {
        val shadeSession =
            object : SaveableSession, Session by Session(SessionStorage()) {
                @Composable
@@ -71,22 +77,31 @@ class QuickSettingsSceneTest : SysuiTestCase() {
                ): T = rememberSession(key, inputs = inputs, init = init)
            }

        kosmos.usingMediaInComposeFragment = true
        usingMediaInComposeFragment = true

        currentTilesInteractor.setTiles(
            listOf(
                TileSpec.create("internet"),
                TileSpec.create("bt"),
            )
        )

        testScope.runCurrent()

        val scene =
            QuickSettingsScene(
                shadeSession = shadeSession,
                notificationStackScrollView = { mock(NotificationScrollView::class.java) },
                notificationsPlaceholderViewModelFactory =
                    kosmos.notificationsPlaceholderViewModelFactory,
                actionsViewModelFactory = kosmos.quickSettingsUserActionsViewModelFactory,
                contentViewModelFactory = kosmos.quickSettingsSceneContentViewModelFactory,
                jankMonitor = kosmos.interactionJankMonitor,
                    notificationsPlaceholderViewModelFactory,
                actionsViewModelFactory = quickSettingsUserActionsViewModelFactory,
                contentViewModelFactory = quickSettingsSceneContentViewModelFactory,
                jankMonitor = interactionJankMonitor,
            )

        composeTestRule.setContent {
            PlatformTheme {
                WithStatusIconContext(kosmos.tintedIconManagerFactory) {
                WithStatusIconContext(tintedIconManagerFactory) {
                    with(scene) {
                        TestContentScope(currentScene = Scenes.QuickSettings) { Content(Modifier) }
                    }
@@ -99,7 +114,8 @@ class QuickSettingsSceneTest : SysuiTestCase() {
        // Verify that the brightness slider exists.
        composeTestRule.onNodeWithTag(resIdToTestTag("brightness_slider")).assertExists()

        // Verify that the tile grid exists.
        composeTestRule.onNodeWithTag(resIdToTestTag("quick_settings_panel")).assertExists()
        // Verify that the tiles exist.
        composeTestRule.onNodeWithTag("element:internet").assertExists()
        composeTestRule.onNodeWithTag("element:bt").assertExists()
    }
}
+5 −10
Original line number Diff line number Diff line
@@ -19,16 +19,11 @@ package com.android.systemui.qs.panels.ui.viewmodel
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.qs.panels.domain.interactor.dynamicIconTilesInteractorFactory

val Kosmos.dynamicIconTilesViewModel by
    Kosmos.Fixture {
        DynamicIconTilesViewModel(dynamicIconTilesInteractorFactory, iconTilesViewModel)
    }

val Kosmos.dynamicIconTilesViewModelFactory by
Kosmos.Fixture {
    object : DynamicIconTilesViewModel.Factory {
        override fun create(): DynamicIconTilesViewModel {
                return dynamicIconTilesViewModel
            return DynamicIconTilesViewModel(dynamicIconTilesInteractorFactory, iconTilesViewModel)
        }
    }
}