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

Commit bf8d2288 authored by Luzanne Batoon's avatar Luzanne Batoon
Browse files

Enable all qs default tiles for headless system user

Bug: 438037334
Flag: com.android.systemui.hsu_qs_changes
Test: atest UserTileSpecRepositoryTest DefaultTilesQSHostRepositoryTest
Test: atest LargeTilesUpgradePathsTest TileSpecSettingsRepositoryTest
Change-Id: I493f262d8b0a7eafbe38c5dd03c6de398872c289
parent c4655419
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