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

Commit 4ad9e3da authored by Luzanne Batoon's avatar Luzanne Batoon Committed by Android (Google) Code Review
Browse files

Merge "Enable all qs default tiles for headless system user" into main

parents 5fcd115b bf8d2288
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import com.android.systemui.qs.panels.data.repository.defaultLargeTilesRepositor
import com.android.systemui.qs.panels.domain.interactor.qsPreferencesInteractor
import com.android.systemui.qs.pipeline.data.repository.DefaultTilesQSHostRepository
import com.android.systemui.qs.pipeline.data.repository.defaultTilesRepository
import com.android.systemui.qs.pipeline.data.repository.hsuTilesRepository
import com.android.systemui.qs.pipeline.shared.TileSpec
import com.android.systemui.qs.pipeline.shared.TilesUpgradePath
import com.android.systemui.settings.userFileManager
@@ -48,9 +49,11 @@ import org.junit.runner.RunWith
class LargeTilesUpgradePathsTest : SysuiTestCase() {

    private val kosmos =
        testKosmos().apply { defaultTilesRepository = DefaultTilesQSHostRepository(mainResources) }
        testKosmos().apply {
            defaultTilesRepository = DefaultTilesQSHostRepository(mainResources, hsuTilesRepository)
        }

    private val defaultTiles = kosmos.defaultTilesRepository.defaultTiles.toSet()
    private val defaultTiles = kosmos.defaultTilesRepository.getDefaultTiles(false).toSet()

    private val underTest = kosmos.qsPreferencesInteractor

+110 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.qs.pipeline.data.repository

import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.kosmos.testCase
import com.android.systemui.kosmos.testScope
import com.android.systemui.res.R
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith

@SmallTest
@RunWith(AndroidJUnit4::class)
class DefaultTilesQSHostRepositoryTest : SysuiTestCase() {

    private val kosmos = testKosmos()

    @Before
    fun setup() {
        overrideDefaultTilesResource(DEFAULT_TILES)
    }

    @Test
    fun getDefaultTiles_notHeadlessSystemUser_returnDefault() =
        with(kosmos) {
            testScope.runTest {
                val isHeadlessSystemUser = false
                val underTest =
                    DefaultTilesQSHostRepository(testCase.context.resources, hsuTilesRepository)

                val result = underTest.getDefaultTiles(isHeadlessSystemUser)

                assertThat(result).isEqualTo(TilesSettingConverter.toTilesList(DEFAULT_TILES))
            }
        }

    @Test
    fun getDefaultTiles_isHeadlessSystemUser_returnHsuAllowList() =
        with(kosmos) {
            testScope.runTest {
                val isHeadlessSystemUser = true
                overrideHsuAllowListResource(arrayOf("x", "y", "z"))
                val underTest =
                    DefaultTilesQSHostRepository(testCase.context.resources, hsuTilesRepository)

                val result = underTest.getDefaultTiles(isHeadlessSystemUser)

                assertThat(result).isEqualTo(TilesSettingConverter.toTilesList("x,y,z"))
            }
        }

    @Test
    fun getDefaultTiles_isHeadlessSystemUserWithEmptyHsuAllowList_returnDefault() =
        with(kosmos) {
            testScope.runTest {
                val isHeadlessSystemUser = true
                overrideHsuAllowListResource(emptyArray())
                val underTest =
                    DefaultTilesQSHostRepository(testCase.context.resources, hsuTilesRepository)

                val result = underTest.getDefaultTiles(isHeadlessSystemUser)

                assertThat(result).isEqualTo(TilesSettingConverter.toTilesList(DEFAULT_TILES))
            }
        }

    private fun overrideDefaultTilesResource(defaultTiles: String) =
        with(kosmos) {
            testCase.context.orCreateTestableResources.addOverride(
                R.string.quick_settings_tiles_default,
                defaultTiles,
            )
            testCase.context.orCreateTestableResources.addOverride(
                R.string.quick_settings_tiles_new_default,
                defaultTiles,
            )
        }

    private fun overrideHsuAllowListResource(allowList: Array<String>) =
        with(kosmos) {
            testCase.context.orCreateTestableResources.addOverride(
                R.array.hsu_allow_list_qs_tiles,
                allowList,
            )
        }

    companion object {
        private const val DEFAULT_TILES = "a,b,c"
    }
}
+4 −5
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.systemui.qs.pipeline.shared.TilesUpgradePath
import com.android.systemui.qs.pipeline.shared.logging.QSPipelineLogger
import com.android.systemui.res.R
import com.android.systemui.retail.data.repository.FakeRetailModeRepository
import com.android.systemui.user.domain.interactor.HeadlessSystemUserModeFake
import com.android.systemui.util.settings.FakeSettings
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.flow.consumeAsFlow
@@ -46,11 +47,8 @@ class TileSpecSettingsRepositoryTest : SysuiTestCase() {

    private lateinit var secureSettings: FakeSettings
    private lateinit var retailModeRepository: FakeRetailModeRepository
    private val defaultTilesRepository =
        object : DefaultTilesRepository {
            override val defaultTiles: List<TileSpec>
                get() = DEFAULT_TILES.toTileSpecs()
        }
    private val hsum = HeadlessSystemUserModeFake()
    private val defaultTilesRepository = FakeDefaultTilesRepository(DEFAULT_TILES.toTileSpecs())

    @Mock private lateinit var logger: QSPipelineLogger

@@ -61,6 +59,7 @@ class TileSpecSettingsRepositoryTest : SysuiTestCase() {
                    userId,
                    defaultTilesRepository,
                    secureSettings,
                    hsum,
                    logger,
                    testScope.backgroundScope,
                    testDispatcher,
+74 −13
Original line number Diff line number Diff line
package com.android.systemui.qs.pipeline.data.repository

import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.FlagsParameterization
import android.provider.Settings
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.qs.pipeline.data.model.RestoreData
import com.android.systemui.qs.pipeline.shared.TileSpec
import com.android.systemui.qs.pipeline.shared.TilesUpgradePath
import com.android.systemui.qs.pipeline.shared.logging.QSPipelineLogger
import com.android.systemui.user.domain.interactor.HeadlessSystemUserModeFake
import com.android.systemui.util.settings.FakeSettings
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.consumeAsFlow
import kotlinx.coroutines.test.StandardTestDispatcher
@@ -22,16 +27,17 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.MockitoAnnotations
import platform.test.runner.parameterized.ParameterizedAndroidJunit4
import platform.test.runner.parameterized.Parameters

@ExperimentalCoroutinesApi
@SmallTest
@RunWith(AndroidJUnit4::class)
class UserTileSpecRepositoryTest : SysuiTestCase() {
@RunWith(ParameterizedAndroidJunit4::class)
class UserTileSpecRepositoryTest(flags: FlagsParameterization) : SysuiTestCase() {
    private val secureSettings = FakeSettings()
    private val hsum = HeadlessSystemUserModeFake()
    private val defaultTilesRepository =
        object : DefaultTilesRepository {
            override val defaultTiles: List<TileSpec>
                get() = DEFAULT_TILES.toTileSpecs()
        }
        FakeDefaultTilesRepository(DEFAULT_TILES.toTileSpecs(), DEFAULT_HSU_TILES.toTileSpecs())

    @Mock private lateinit var logger: QSPipelineLogger

@@ -40,6 +46,10 @@ class UserTileSpecRepositoryTest : SysuiTestCase() {

    private lateinit var underTest: UserTileSpecRepository

    init {
        mSetFlagsRule.setFlagsParameterization(flags)
    }

    @Before
    fun setup() {
        MockitoAnnotations.initMocks(this)
@@ -49,6 +59,7 @@ class UserTileSpecRepositoryTest : SysuiTestCase() {
                USER,
                defaultTilesRepository,
                secureSettings,
                hsum,
                logger,
                testScope.backgroundScope,
                testDispatcher,
@@ -56,10 +67,53 @@ class UserTileSpecRepositoryTest : SysuiTestCase() {
    }

    @Test
    @DisableFlags(Flags.FLAG_HSU_QS_CHANGES)
    fun emptySetting_usesDefaultValue() =
        testScope.runTest {
            val isHeadlessSystemUser = false
            val tiles by collectLastValue(underTest.tiles())
            assertThat(tiles).isEqualTo(getDefaultTileSpecs(isHeadlessSystemUser))
        }

    @Test
    @EnableFlags(Flags.FLAG_HSU_QS_CHANGES)
    fun emptySetting_hsuQsFlagEnabledAndIsHsum_usesHsuDefaultValue() =
        testScope.runTest {
            hsum.setIsHeadlessSystemUser(true)
            underTest =
                UserTileSpecRepository(
                    USER,
                    defaultTilesRepository,
                    secureSettings,
                    hsum,
                    logger,
                    testScope.backgroundScope,
                    testDispatcher,
                )
            runCurrent()
            val tiles by collectLastValue(underTest.tiles())

            assertThat(tiles).isEqualTo(getDefaultTileSpecs(true))
        }

    @Test
    @EnableFlags(Flags.FLAG_HSU_QS_CHANGES)
    fun emptySetting_hsuQsFlagEnabledAndIsNotHsum_usesDefaultValue() =
        testScope.runTest {
            hsum.setIsHeadlessSystemUser(false)
            underTest =
                UserTileSpecRepository(
                    USER,
                    defaultTilesRepository,
                    secureSettings,
                    hsum,
                    logger,
                    testScope.backgroundScope,
                    testDispatcher,
                )
            runCurrent()
            val tiles by collectLastValue(underTest.tiles())
            assertThat(tiles).isEqualTo(getDefaultTileSpecs())
            assertThat(tiles).isEqualTo(getDefaultTileSpecs(false))
        }

    @Test
@@ -103,7 +157,7 @@ class UserTileSpecRepositoryTest : SysuiTestCase() {

            val tiles by collectLastValue(underTest.tiles())

            assertThat(tiles).isEqualTo(getDefaultTileSpecs())
            assertThat(tiles).isEqualTo(getDefaultTileSpecs(false))
        }

    /*
@@ -293,7 +347,7 @@ class UserTileSpecRepositoryTest : SysuiTestCase() {
            runCurrent()

            assertThat(loadTiles())
                .isEqualTo(getDefaultTileSpecs().map { it.spec }.joinToString(","))
                .isEqualTo(getDefaultTileSpecs(false).map { it.spec }.joinToString(","))
        }

    @Test
@@ -353,7 +407,7 @@ class UserTileSpecRepositoryTest : SysuiTestCase() {
            val tilesRead by collectLastValue(underTest.tilesUpgradePath.consumeAsFlow())
            val tiles by collectLastValue(underTest.tiles())

            assertThat(tiles).isEqualTo(getDefaultTileSpecs())
            assertThat(tiles).isEqualTo(getDefaultTileSpecs(false))
            assertThat(tilesRead).isEqualTo(TilesUpgradePath.DefaultSet)
        }

@@ -415,8 +469,8 @@ class UserTileSpecRepositoryTest : SysuiTestCase() {
                .isEqualTo(TilesUpgradePath.RestoreFromBackup(expected.toTilesSet()))
        }

    private fun getDefaultTileSpecs(): List<TileSpec> {
        return defaultTilesRepository.defaultTiles
    private fun getDefaultTileSpecs(isHeadlessSystemUser: Boolean): List<TileSpec> {
        return defaultTilesRepository.getDefaultTiles(isHeadlessSystemUser)
    }

    private fun TestScope.storeTiles(specs: String) {
@@ -431,10 +485,17 @@ class UserTileSpecRepositoryTest : SysuiTestCase() {
    companion object {
        private const val USER = 10
        private const val DEFAULT_TILES = "a,b,c"
        private const val DEFAULT_HSU_TILES = "a,c"
        private const val SETTING = Settings.Secure.QS_TILES

        private fun String.toTileSpecs() = TilesSettingConverter.toTilesList(this)

        private fun String.toTilesSet() = TilesSettingConverter.toTilesSet(this)

        @JvmStatic
        @Parameters(name = "{0}")
        fun getParams(): List<FlagsParameterization> {
            return FlagsParameterization.allCombinationsOf(Flags.FLAG_HSU_QS_CHANGES)
        }
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ sealed interface AllowedTiles {
    }

    /** Implementation of [AllowedTiles] that allows only specific tiles. */
    class SpecificTiles(private val tiles: List<TileSpec>) : AllowedTiles {
    class SpecificTiles(val tiles: List<TileSpec>) : AllowedTiles {
        override fun isTileAllowed(spec: TileSpec): Boolean {
            return spec in tiles
        }
Loading