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

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

Migrate some viewmodel to activatables

This is the first step in for properly handling media in landscape.

Test: atest com.android.systemui.qs.panels
Test: atest com.android.systemui.qs.composefragment
Bug: 353253280
Flag: com.android.systemui.qs_ui_refactor_compose_fragment
Change-Id: I1d3cddf148c61e04cc117598108a18fd4234cb0a
parent 6078c273
Loading
Loading
Loading
Loading
+24 −21
Original line number Diff line number Diff line
@@ -20,21 +20,25 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.testCase
import com.android.systemui.kosmos.testScope
import com.android.systemui.lifecycle.activateIn
import com.android.systemui.qs.panels.domain.interactor.qsPreferencesInteractor
import com.android.systemui.qs.pipeline.domain.interactor.currentTilesInteractor
import com.android.systemui.qs.pipeline.shared.TileSpec
import com.android.systemui.res.R
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith

@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
class QuickQuickSettingsViewModelTest : SysuiTestCase() {
@@ -65,7 +69,8 @@ class QuickQuickSettingsViewModelTest : SysuiTestCase() {
            fakeConfigurationRepository.onConfigurationChange()
        }

    private val underTest = kosmos.quickQuickSettingsViewModel
    private val underTest =
        kosmos.quickQuickSettingsViewModelFactory.create().apply { activateIn(kosmos.testScope) }

    @Before
    fun setUp() {
@@ -77,17 +82,15 @@ class QuickQuickSettingsViewModelTest : SysuiTestCase() {
        with(kosmos) {
            testScope.runTest {
                setRows(2)
                val columns by collectLastValue(underTest.columns)
                val tileViewModels by collectLastValue(underTest.tileViewModels)

                assertThat(columns).isEqualTo(4)
                assertThat(underTest.columns).isEqualTo(4)
                // All tiles in 4 columns
                // [1] [2] [3 3]
                // [4] [5 5]
                // [6 6] [7] [8]
                // [9 9]

                assertThat(tileViewModels!!.map { it.tile.spec }).isEqualTo(tiles.take(5))
                assertThat(underTest.tileViewModels.map { it.tile.spec }).isEqualTo(tiles.take(5))
            }
        }

@@ -96,10 +99,8 @@ class QuickQuickSettingsViewModelTest : SysuiTestCase() {
        with(kosmos) {
            testScope.runTest {
                setRows(2)
                val columns by collectLastValue(underTest.columns)
                val tileViewModels by collectLastValue(underTest.tileViewModels)

                assertThat(columns).isEqualTo(4)
                assertThat(underTest.columns).isEqualTo(4)
                // All tiles in 4 columns
                // [1] [2] [3 3]
                // [4] [5 5]
@@ -107,9 +108,9 @@ class QuickQuickSettingsViewModelTest : SysuiTestCase() {
                // [9 9]

                setRows(3)
                assertThat(tileViewModels!!.map { it.tile.spec }).isEqualTo(tiles.take(8))
                assertThat(underTest.tileViewModels.map { it.tile.spec }).isEqualTo(tiles.take(8))
                setRows(1)
                assertThat(tileViewModels!!.map { it.tile.spec }).isEqualTo(tiles.take(3))
                assertThat(underTest.tileViewModels.map { it.tile.spec }).isEqualTo(tiles.take(3))
            }
        }

@@ -118,10 +119,8 @@ class QuickQuickSettingsViewModelTest : SysuiTestCase() {
        with(kosmos) {
            testScope.runTest {
                setRows(2)
                val columns by collectLastValue(underTest.columns)
                val tileViewModels by collectLastValue(underTest.tileViewModels)

                assertThat(columns).isEqualTo(4)
                assertThat(underTest.columns).isEqualTo(4)
                // All tiles in 4 columns
                // [1] [2] [3 3]
                // [4] [5 5]
@@ -130,8 +129,9 @@ class QuickQuickSettingsViewModelTest : SysuiTestCase() {

                // Remove tile small:4
                currentTilesInteractor.removeTiles(setOf(tiles[3]))
                runCurrent()

                assertThat(tileViewModels!!.map { it.tile.spec })
                assertThat(underTest.tileViewModels.map { it.tile.spec })
                    .isEqualTo(
                        listOf(
                                "$PREFIX_SMALL:1",
@@ -149,13 +149,16 @@ class QuickQuickSettingsViewModelTest : SysuiTestCase() {
        currentTilesInteractor.setTiles(tiles)
    }

    private fun Kosmos.setRows(rows: Int) {
    private fun TestScope.setRows(rows: Int) {
        with(kosmos) {
            testCase.context.orCreateTestableResources.addOverride(
                R.integer.quick_qs_paginated_grid_num_rows,
                rows,
            )
            fakeConfigurationRepository.onConfigurationChange()
        }
        runCurrent()
    }

    private companion object {
        const val PREFIX_SMALL = "small"
+3 −3
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ import com.android.systemui.qs.FooterActionsController
import com.android.systemui.qs.composefragment.dagger.QSFragmentComposeModule
import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel
import com.android.systemui.qs.panels.domain.interactor.TileSquishinessInteractor
import com.android.systemui.qs.panels.ui.viewmodel.PaginatedGridViewModel
import com.android.systemui.qs.panels.ui.viewmodel.InFirstPageViewModel
import com.android.systemui.qs.ui.viewmodel.QuickSettingsContainerViewModel
import com.android.systemui.res.R
import com.android.systemui.scene.shared.model.Scenes
@@ -93,7 +93,7 @@ constructor(
    configurationInteractor: ConfigurationInteractor,
    private val largeScreenHeaderHelper: LargeScreenHeaderHelper,
    private val squishinessInteractor: TileSquishinessInteractor,
    private val paginatedGridViewModel: PaginatedGridViewModel,
    private val inFirstPageViewModel: InFirstPageViewModel,
    @Named(QUICK_QS_PANEL) val qqsMediaHost: MediaHost,
    @Named(QS_PANEL) val qsMediaHost: MediaHost,
    @Named(QSFragmentComposeModule.QS_USING_MEDIA_PLAYER) private val usingMedia: Boolean,
@@ -204,7 +204,7 @@ constructor(
    var collapseExpandAccessibilityAction: Runnable? = null

    val inFirstPage: Boolean
        get() = paginatedGridViewModel.inFirstPage
        get() = inFirstPageViewModel.inFirstPage

    var overScrollAmount by mutableStateOf(0)

+9 −4
Original line number Diff line number Diff line
@@ -40,9 +40,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.compose.animation.scene.SceneScope
import com.android.systemui.compose.modifiers.sysuiResTag
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.qs.panels.dagger.PaginatedBaseLayoutType
import com.android.systemui.qs.panels.ui.compose.PaginatedGridLayout.Dimensions.FooterHeight
import com.android.systemui.qs.panels.ui.compose.PaginatedGridLayout.Dimensions.InterPageSpacing
@@ -54,7 +54,7 @@ import javax.inject.Inject
class PaginatedGridLayout
@Inject
constructor(
    private val viewModel: PaginatedGridViewModel,
    private val viewModelFactory: PaginatedGridViewModel.Factory,
    @PaginatedBaseLayoutType private val delegateGridLayout: PaginatableGridLayout,
) : GridLayout by delegateGridLayout {
    @Composable
@@ -63,13 +63,18 @@ constructor(
        modifier: Modifier,
        editModeStart: () -> Unit,
    ) {
        val viewModel =
            rememberViewModel(traceName = "PaginatedGridLayout-TileGrid") {
                viewModelFactory.create()
            }

        DisposableEffect(tiles) {
            val token = Any()
            tiles.forEach { it.startListening(token) }
            onDispose { tiles.forEach { it.stopListening(token) } }
        }
        val columns by viewModel.columns.collectAsStateWithLifecycle()
        val rows by viewModel.rows.collectAsStateWithLifecycle()
        val columns by viewModel.columns
        val rows = viewModel.rows

        val pages =
            remember(tiles, columns, rows) {
+3 −2
Original line number Diff line number Diff line
@@ -41,7 +41,8 @@ fun SceneScope.QuickQuickSettings(
    viewModel: QuickQuickSettingsViewModel,
    modifier: Modifier = Modifier,
) {
    val sizedTiles by viewModel.tileViewModels.collectAsStateWithLifecycle()

    val sizedTiles = viewModel.tileViewModels
    val tiles = sizedTiles.fastMap { it.tile }
    val bounceables = remember(sizedTiles) { List(sizedTiles.size) { BounceableTileViewModel() } }
    val squishiness by viewModel.squishinessViewModel.squishiness.collectAsStateWithLifecycle()
@@ -52,7 +53,7 @@ fun SceneScope.QuickQuickSettings(
        tiles.forEach { it.startListening(token) }
        onDispose { tiles.forEach { it.stopListening(token) } }
    }
    val columns by viewModel.columns.collectAsStateWithLifecycle()
    val columns = viewModel.columns
    var cellIndex = 0
    Box(modifier = modifier) {
        GridAnchor()
+2 −2
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ constructor(
            rememberViewModel(traceName = "InfiniteGridLayout.TileGrid") {
                viewModel.dynamicIconTilesViewModelFactory.create()
            }
        val columns by viewModel.gridSizeViewModel.columns.collectAsStateWithLifecycle()
        val columns by viewModel.gridSizeViewModel.columns
        val sizedTiles = tiles.map { SizedTileImpl(it, it.spec.width()) }
        val bounceables =
            remember(sizedTiles) { List(sizedTiles.size) { BounceableTileViewModel() } }
@@ -118,7 +118,7 @@ constructor(
            rememberViewModel(traceName = "InfiniteGridLayout.EditTileGrid") {
                viewModel.dynamicIconTilesViewModelFactory.create()
            }
        val columns by viewModel.gridSizeViewModel.columns.collectAsStateWithLifecycle()
        val columns by viewModel.gridSizeViewModel.columns
        val largeTiles by iconTilesViewModel.largeTiles.collectAsStateWithLifecycle()

        // Non-current tiles should always be displayed as icon tiles.
Loading