Loading packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/data/repository/QSColumnsRepositoryTest.kt +12 −6 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.systemui.qs.panels.data.repository import android.platform.test.annotations.EnableFlags import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase Loading @@ -25,7 +24,7 @@ import com.android.systemui.coroutines.collectLastValue import com.android.systemui.kosmos.testCase import com.android.systemui.kosmos.testScope import com.android.systemui.res.R import com.android.systemui.shade.shared.flag.DualShade import com.android.systemui.shade.data.repository.fakeShadeRepository import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.runTest Loading Loading @@ -59,15 +58,22 @@ class QSColumnsRepositoryTest : SysuiTestCase() { } @Test @EnableFlags(DualShade.FLAG_NAME) fun withDualShade_returnsCorrectValue() = with(kosmos) { testScope.runTest { val latest by collectLastValue(underTest.columns) val latest by collectLastValue(underTest.dualShadeColumns) assertThat(latest).isEqualTo(4) } } @Test fun withSplitShade_returnsCorrectValue() = with(kosmos) { testScope.runTest { val latest by collectLastValue(underTest.splitShadeColumns) fakeShadeRepository.setShadeLayoutWide(true) setColumnsInConfig(8, id = R.integer.quick_settings_dual_shade_num_columns) // Asserts config changes are ignored assertThat(latest).isEqualTo(4) } } Loading packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/QSColumnsInteractorTest.kt 0 → 100644 +101 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 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.panels.domain.interactor import android.content.res.mainResources import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags 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.configurationRepository import com.android.systemui.coroutines.collectLastValue import com.android.systemui.kosmos.testCase import com.android.systemui.kosmos.testScope import com.android.systemui.qs.panels.data.repository.QSColumnsRepository import com.android.systemui.qs.panels.data.repository.qsColumnsRepository import com.android.systemui.res.R import com.android.systemui.shade.data.repository.fakeShadeRepository import com.android.systemui.shade.shared.flag.DualShade 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 QSColumnsInteractorTest : SysuiTestCase() { private val kosmos = testKosmos().apply { testCase.context.orCreateTestableResources.addOverride( R.integer.quick_settings_infinite_grid_num_columns, 1, ) testCase.context.orCreateTestableResources.addOverride( R.integer.quick_settings_dual_shade_num_columns, 2, ) testCase.context.orCreateTestableResources.addOverride( R.integer.quick_settings_split_shade_num_columns, 3, ) qsColumnsRepository = QSColumnsRepository(mainResources, configurationRepository) } private lateinit var underTest: QSColumnsInteractor @Before fun setUp() { underTest = with(kosmos) { qsColumnsInteractor } } @Test @DisableFlags(DualShade.FLAG_NAME) fun withSingleShade_returnsCorrectValue() = with(kosmos) { testScope.runTest { val latest by collectLastValue(underTest.columns) assertThat(latest).isEqualTo(1) } } @Test @EnableFlags(DualShade.FLAG_NAME) fun withDualShade_returnsCorrectValue() = with(kosmos) { testScope.runTest { val latest by collectLastValue(underTest.columns) assertThat(latest).isEqualTo(2) } } @Test @DisableFlags(DualShade.FLAG_NAME) fun withSplitShade_returnsCorrectValue() = with(kosmos) { testScope.runTest { val latest by collectLastValue(underTest.columns) fakeShadeRepository.setShadeLayoutWide(true) assertThat(latest).isEqualTo(3) } } } packages/SystemUI/res/values/config.xml +3 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,9 @@ <!-- The number of columns in the Dual Shade QuickSettings --> <integer name="quick_settings_dual_shade_num_columns">4</integer> <!-- The number of columns in the Split Shade QuickSettings --> <integer name="quick_settings_split_shade_num_columns">4</integer> <!-- Override column number for quick settings. For now, this value has effect only when flag lockscreen.enable_landscape is enabled. TODO (b/293252410) - change this comment/resource when flag is enabled --> Loading packages/SystemUI/src/com/android/systemui/qs/panels/data/repository/QSColumnsRepository.kt +11 −20 Original line number Diff line number Diff line Loading @@ -19,40 +19,31 @@ package com.android.systemui.qs.panels.data.repository import android.content.res.Resources import com.android.systemui.common.ui.data.repository.ConfigurationRepository import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.res.R import com.android.systemui.shade.shared.flag.DualShade import com.android.systemui.util.kotlin.emitOnStart import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.stateIn @OptIn(ExperimentalCoroutinesApi::class) @SysUISingleton class QSColumnsRepository @Inject constructor( @Application scope: CoroutineScope, @Main private val resources: Resources, configurationRepository: ConfigurationRepository, ) { val columns: StateFlow<Int> = if (DualShade.isEnabled) { val splitShadeColumns: Flow<Int> = flowOf(resources.getInteger(R.integer.quick_settings_split_shade_num_columns)) val dualShadeColumns: Flow<Int> = flowOf(resources.getInteger(R.integer.quick_settings_dual_shade_num_columns)) } else { val columns: Flow<Int> = configurationRepository.onConfigurationChange.emitOnStart().mapLatest { resources.getInteger(R.integer.quick_settings_infinite_grid_num_columns) } } .stateIn( scope, SharingStarted.WhileSubscribed(), resources.getInteger(R.integer.quick_settings_infinite_grid_num_columns), ) val defaultColumns: Int = resources.getInteger(R.integer.quick_settings_infinite_grid_num_columns) } packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/QSColumnsInteractor.kt +26 −2 Original line number Diff line number Diff line Loading @@ -17,11 +17,35 @@ package com.android.systemui.qs.panels.domain.interactor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.qs.panels.data.repository.QSColumnsRepository import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.shade.shared.model.ShadeMode import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.stateIn @SysUISingleton class QSColumnsInteractor @Inject constructor(repo: QSColumnsRepository) { val columns: StateFlow<Int> = repo.columns class QSColumnsInteractor @Inject constructor( @Application scope: CoroutineScope, repo: QSColumnsRepository, shadeInteractor: ShadeInteractor, ) { @OptIn(ExperimentalCoroutinesApi::class) val columns: StateFlow<Int> = shadeInteractor.shadeMode .flatMapLatest { when (it) { ShadeMode.Dual -> repo.dualShadeColumns ShadeMode.Split -> repo.splitShadeColumns ShadeMode.Single -> repo.columns } } .stateIn(scope, SharingStarted.WhileSubscribed(), repo.defaultColumns) } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/data/repository/QSColumnsRepositoryTest.kt +12 −6 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.systemui.qs.panels.data.repository import android.platform.test.annotations.EnableFlags import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase Loading @@ -25,7 +24,7 @@ import com.android.systemui.coroutines.collectLastValue import com.android.systemui.kosmos.testCase import com.android.systemui.kosmos.testScope import com.android.systemui.res.R import com.android.systemui.shade.shared.flag.DualShade import com.android.systemui.shade.data.repository.fakeShadeRepository import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.runTest Loading Loading @@ -59,15 +58,22 @@ class QSColumnsRepositoryTest : SysuiTestCase() { } @Test @EnableFlags(DualShade.FLAG_NAME) fun withDualShade_returnsCorrectValue() = with(kosmos) { testScope.runTest { val latest by collectLastValue(underTest.columns) val latest by collectLastValue(underTest.dualShadeColumns) assertThat(latest).isEqualTo(4) } } @Test fun withSplitShade_returnsCorrectValue() = with(kosmos) { testScope.runTest { val latest by collectLastValue(underTest.splitShadeColumns) fakeShadeRepository.setShadeLayoutWide(true) setColumnsInConfig(8, id = R.integer.quick_settings_dual_shade_num_columns) // Asserts config changes are ignored assertThat(latest).isEqualTo(4) } } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/QSColumnsInteractorTest.kt 0 → 100644 +101 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 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.panels.domain.interactor import android.content.res.mainResources import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags 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.configurationRepository import com.android.systemui.coroutines.collectLastValue import com.android.systemui.kosmos.testCase import com.android.systemui.kosmos.testScope import com.android.systemui.qs.panels.data.repository.QSColumnsRepository import com.android.systemui.qs.panels.data.repository.qsColumnsRepository import com.android.systemui.res.R import com.android.systemui.shade.data.repository.fakeShadeRepository import com.android.systemui.shade.shared.flag.DualShade 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 QSColumnsInteractorTest : SysuiTestCase() { private val kosmos = testKosmos().apply { testCase.context.orCreateTestableResources.addOverride( R.integer.quick_settings_infinite_grid_num_columns, 1, ) testCase.context.orCreateTestableResources.addOverride( R.integer.quick_settings_dual_shade_num_columns, 2, ) testCase.context.orCreateTestableResources.addOverride( R.integer.quick_settings_split_shade_num_columns, 3, ) qsColumnsRepository = QSColumnsRepository(mainResources, configurationRepository) } private lateinit var underTest: QSColumnsInteractor @Before fun setUp() { underTest = with(kosmos) { qsColumnsInteractor } } @Test @DisableFlags(DualShade.FLAG_NAME) fun withSingleShade_returnsCorrectValue() = with(kosmos) { testScope.runTest { val latest by collectLastValue(underTest.columns) assertThat(latest).isEqualTo(1) } } @Test @EnableFlags(DualShade.FLAG_NAME) fun withDualShade_returnsCorrectValue() = with(kosmos) { testScope.runTest { val latest by collectLastValue(underTest.columns) assertThat(latest).isEqualTo(2) } } @Test @DisableFlags(DualShade.FLAG_NAME) fun withSplitShade_returnsCorrectValue() = with(kosmos) { testScope.runTest { val latest by collectLastValue(underTest.columns) fakeShadeRepository.setShadeLayoutWide(true) assertThat(latest).isEqualTo(3) } } }
packages/SystemUI/res/values/config.xml +3 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,9 @@ <!-- The number of columns in the Dual Shade QuickSettings --> <integer name="quick_settings_dual_shade_num_columns">4</integer> <!-- The number of columns in the Split Shade QuickSettings --> <integer name="quick_settings_split_shade_num_columns">4</integer> <!-- Override column number for quick settings. For now, this value has effect only when flag lockscreen.enable_landscape is enabled. TODO (b/293252410) - change this comment/resource when flag is enabled --> Loading
packages/SystemUI/src/com/android/systemui/qs/panels/data/repository/QSColumnsRepository.kt +11 −20 Original line number Diff line number Diff line Loading @@ -19,40 +19,31 @@ package com.android.systemui.qs.panels.data.repository import android.content.res.Resources import com.android.systemui.common.ui.data.repository.ConfigurationRepository import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.res.R import com.android.systemui.shade.shared.flag.DualShade import com.android.systemui.util.kotlin.emitOnStart import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.stateIn @OptIn(ExperimentalCoroutinesApi::class) @SysUISingleton class QSColumnsRepository @Inject constructor( @Application scope: CoroutineScope, @Main private val resources: Resources, configurationRepository: ConfigurationRepository, ) { val columns: StateFlow<Int> = if (DualShade.isEnabled) { val splitShadeColumns: Flow<Int> = flowOf(resources.getInteger(R.integer.quick_settings_split_shade_num_columns)) val dualShadeColumns: Flow<Int> = flowOf(resources.getInteger(R.integer.quick_settings_dual_shade_num_columns)) } else { val columns: Flow<Int> = configurationRepository.onConfigurationChange.emitOnStart().mapLatest { resources.getInteger(R.integer.quick_settings_infinite_grid_num_columns) } } .stateIn( scope, SharingStarted.WhileSubscribed(), resources.getInteger(R.integer.quick_settings_infinite_grid_num_columns), ) val defaultColumns: Int = resources.getInteger(R.integer.quick_settings_infinite_grid_num_columns) }
packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/QSColumnsInteractor.kt +26 −2 Original line number Diff line number Diff line Loading @@ -17,11 +17,35 @@ package com.android.systemui.qs.panels.domain.interactor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.qs.panels.data.repository.QSColumnsRepository import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.shade.shared.model.ShadeMode import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.stateIn @SysUISingleton class QSColumnsInteractor @Inject constructor(repo: QSColumnsRepository) { val columns: StateFlow<Int> = repo.columns class QSColumnsInteractor @Inject constructor( @Application scope: CoroutineScope, repo: QSColumnsRepository, shadeInteractor: ShadeInteractor, ) { @OptIn(ExperimentalCoroutinesApi::class) val columns: StateFlow<Int> = shadeInteractor.shadeMode .flatMapLatest { when (it) { ShadeMode.Dual -> repo.dualShadeColumns ShadeMode.Split -> repo.splitShadeColumns ShadeMode.Single -> repo.columns } } .stateIn(scope, SharingStarted.WhileSubscribed(), repo.defaultColumns) }