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

Commit a7d2f458 authored by Anton Potapov's avatar Anton Potapov
Browse files

Rework config to support absence of label and icon in CustomTile

Config would now be provided as a separated entity in a map tileSpec to
QSTileConfg. QSTileViewModelFactory uses provided tileSpec to get a valid
config from QSTileConfigProvider.

QSTIleConfigProviderTest ensures all the configs are injected for a
correct tile spec.

Bug: 299908705
Test: atest QSTielViewModelInterfaceComplianceTest
Test: atest QSTileConfigProviderTest
Flag: LEGACY QS_PIPELINE_NEW_TILES DISABLED
Change-Id: I87ae3223e9451b66b03ac732d4d598a6196203b5
parent 247efa91
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ import com.android.systemui.qs.external.QSExternalModule;
import com.android.systemui.qs.pipeline.dagger.QSPipelineModule;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.qs.tiles.di.QSTilesModule;
import com.android.systemui.qs.tiles.viewmodel.QSTileViewModel;
import com.android.systemui.statusbar.phone.AutoTileManager;
import com.android.systemui.statusbar.phone.ManagedProfileController;
import com.android.systemui.statusbar.policy.CastController;
@@ -73,13 +72,6 @@ public interface QSModule {
    @Multibinds
    Map<String, QSTileImpl<?>> tileMap();

    /**
     * A map of internal QS tile ViewModels. Ensures that this can be injected even if
     * it is empty
     */
    @Multibinds
    Map<String, QSTileViewModel> tileViewModelMap();

    @Provides
    @SysUISingleton
    static AutoTileManager provideAutoTileManager(
+9 −6
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.qs.tiles.base.viewmodel

import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.qs.pipeline.shared.TileSpec
import com.android.systemui.qs.tiles.base.analytics.QSTileAnalytics
import com.android.systemui.qs.tiles.base.interactor.DisabledByPolicyInteractor
import com.android.systemui.qs.tiles.base.interactor.QSTileDataInteractor
@@ -25,7 +26,7 @@ import com.android.systemui.qs.tiles.base.interactor.QSTileDataToStateMapper
import com.android.systemui.qs.tiles.base.interactor.QSTileUserActionInteractor
import com.android.systemui.qs.tiles.base.logging.QSTileLogger
import com.android.systemui.qs.tiles.impl.di.QSTileComponent
import com.android.systemui.qs.tiles.viewmodel.QSTileConfig
import com.android.systemui.qs.tiles.viewmodel.QSTileConfigProvider
import com.android.systemui.qs.tiles.viewmodel.QSTileState
import com.android.systemui.user.data.repository.UserRepository
import com.android.systemui.util.time.SystemClock
@@ -53,6 +54,7 @@ sealed interface QSTileViewModelFactory<T> {
        private val falsingManager: FalsingManager,
        private val qsTileAnalytics: QSTileAnalytics,
        private val qsTileLogger: QSTileLogger,
        private val qsTileConfigProvider: QSTileConfigProvider,
        private val systemClock: SystemClock,
        @Background private val backgroundDispatcher: CoroutineDispatcher,
    ) : QSTileViewModelFactory<T> {
@@ -61,9 +63,9 @@ sealed interface QSTileViewModelFactory<T> {
         * Creates [QSTileViewModelImpl] based on the interactors obtained from [component].
         * Reference of that [component] is then stored along the view model.
         */
        fun create(component: QSTileComponent<T>): QSTileViewModelImpl<T> =
        fun create(tileSpec: TileSpec, component: QSTileComponent<T>): QSTileViewModelImpl<T> =
            QSTileViewModelImpl(
                component::config,
                qsTileConfigProvider.getConfig(tileSpec.spec),
                component::userActionInteractor,
                component::dataInteractor,
                component::dataToStateMapper,
@@ -89,12 +91,13 @@ sealed interface QSTileViewModelFactory<T> {
        private val falsingManager: FalsingManager,
        private val qsTileAnalytics: QSTileAnalytics,
        private val qsTileLogger: QSTileLogger,
        private val qsTileConfigProvider: QSTileConfigProvider,
        private val systemClock: SystemClock,
        @Background private val backgroundDispatcher: CoroutineDispatcher,
    ) : QSTileViewModelFactory<T> {

        /**
         * @param config contains all the static information (like TileSpec) about the tile.
         * @param tileSpec of the created tile.
         * @param userActionInteractor encapsulates user input processing logic. Use it to start
         *   activities, show dialogs or otherwise update the tile state.
         * @param tileDataInteractor provides [DATA_TYPE] and its availability.
@@ -103,13 +106,13 @@ sealed interface QSTileViewModelFactory<T> {
         *   operations there.
         */
        fun create(
            config: QSTileConfig,
            tileSpec: TileSpec,
            userActionInteractor: QSTileUserActionInteractor<T>,
            tileDataInteractor: QSTileDataInteractor<T>,
            mapper: QSTileDataToStateMapper<T>,
        ): QSTileViewModelImpl<T> =
            QSTileViewModelImpl(
                { config },
                qsTileConfigProvider.getConfig(tileSpec.spec),
                { userActionInteractor },
                { tileDataInteractor },
                { mapper },
+1 −3
Original line number Diff line number Diff line
@@ -67,7 +67,7 @@ import kotlinx.coroutines.flow.stateIn
 */
@OptIn(ExperimentalCoroutinesApi::class)
class QSTileViewModelImpl<DATA_TYPE>(
    val tileConfig: () -> QSTileConfig,
    override val config: QSTileConfig,
    private val userActionInteractor: () -> QSTileUserActionInteractor<DATA_TYPE>,
    private val tileDataInteractor: () -> QSTileDataInteractor<DATA_TYPE>,
    private val mapper: () -> QSTileDataToStateMapper<DATA_TYPE>,
@@ -92,8 +92,6 @@ class QSTileViewModelImpl<DATA_TYPE>(

    private val tileData: SharedFlow<DATA_TYPE> = createTileDataFlow()

    override val config
        get() = tileConfig()
    override val state: SharedFlow<QSTileState> =
        tileData
            .map { data ->
+9 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.qs.tiles.di
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.plugins.qs.QSFactory
import com.android.systemui.plugins.qs.QSTile
import com.android.systemui.qs.tiles.viewmodel.QSTileConfigProvider
import com.android.systemui.qs.tiles.viewmodel.QSTileViewModel
import com.android.systemui.qs.tiles.viewmodel.QSTileViewModelAdapter
import javax.inject.Inject
@@ -29,11 +30,19 @@ import javax.inject.Provider
class NewQSTileFactory
@Inject
constructor(
    qsTileConfigProvider: QSTileConfigProvider,
    private val adapterFactory: QSTileViewModelAdapter.Factory,
    private val tileMap:
        Map<String, @JvmSuppressWildcards Provider<@JvmSuppressWildcards QSTileViewModel>>,
) : QSFactory {

    init {
        for (viewModelTileSpec in tileMap.keys) {
            // throws an exception when there is no config for a tileSpec of an injected viewModel
            qsTileConfigProvider.getConfig(viewModelTileSpec)
        }
    }

    override fun createTile(tileSpec: String): QSTile? =
        tileMap[tileSpec]?.let {
            val tile = it.get()
+20 −1
Original line number Diff line number Diff line
@@ -17,7 +17,13 @@
package com.android.systemui.qs.tiles.di

import com.android.systemui.qs.tiles.impl.custom.di.CustomTileComponent
import com.android.systemui.qs.tiles.viewmodel.QSTileConfig
import com.android.systemui.qs.tiles.viewmodel.QSTileConfigProvider
import com.android.systemui.qs.tiles.viewmodel.QSTileConfigProviderImpl
import com.android.systemui.qs.tiles.viewmodel.QSTileViewModel
import dagger.Binds
import dagger.Module
import dagger.multibindings.Multibinds

/** Module listing subcomponents */
@Module(
@@ -26,4 +32,17 @@ import dagger.Module
            CustomTileComponent::class,
        ]
)
interface QSTilesModule
interface QSTilesModule {

    /**
     * A map of internal QS tile ViewModels. Ensures that this can be injected even if it is empty
     */
    @Multibinds fun tileViewModelConfigs(): Map<String, QSTileConfig>

    /**
     * A map of internal QS tile ViewModels. Ensures that this can be injected even if it is empty
     */
    @Multibinds fun tileViewModelMap(): Map<String, QSTileViewModel>

    @Binds fun bindQSTileConfigProvider(impl: QSTileConfigProviderImpl): QSTileConfigProvider
}
Loading