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

Commit 7a4952e5 authored by Olivier St-Onge's avatar Olivier St-Onge Committed by Android (Google) Code Review
Browse files

Merge "Add columns configuration for split shade" into main

parents bea86c1d 4d62615f
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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)
            }
        }
+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)
            }
        }
}
+3 −0
Original line number Diff line number Diff line
@@ -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 -->
+11 −20
Original line number Diff line number Diff line
@@ -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)
}
+26 −2
Original line number Diff line number Diff line
@@ -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