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

Commit e968b57b authored by Anton Potapov's avatar Anton Potapov Committed by Android (Google) Code Review
Browse files

Merge "Update NewQSTileFactory and QSTileConfigProvider to provide custom tile ViewModel" into main

parents fddb69d3 d95160a8
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -26,6 +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
@@ -60,12 +61,17 @@ sealed interface QSTileViewModelFactory<T> {
    ) : QSTileViewModelFactory<T> {

        /**
         * Creates [QSTileViewModelImpl] based on the interactors obtained from [component].
         * Reference of that [component] is then stored along the view model.
         * Creates [QSTileViewModelImpl] based on the interactors obtained from [QSTileComponent].
         * Reference of that [QSTileComponent] is then stored along the view model.
         */
        fun create(tileSpec: TileSpec, component: QSTileComponent<T>): QSTileViewModelImpl<T> =
            QSTileViewModelImpl(
                qsTileConfigProvider.getConfig(tileSpec.spec),
        fun create(
            tileSpec: TileSpec,
            componentFactory: (config: QSTileConfig) -> QSTileComponent<T>
        ): QSTileViewModelImpl<T> {
            val config = qsTileConfigProvider.getConfig(tileSpec.spec)
            val component = componentFactory(config)
            return QSTileViewModelImpl(
                config,
                component::userActionInteractor,
                component::dataInteractor,
                component::dataToStateMapper,
@@ -78,6 +84,7 @@ sealed interface QSTileViewModelFactory<T> {
                backgroundDispatcher,
            )
        }
    }

    /**
     * This factory passes by necessary implementations to the [QSTileViewModelImpl]. This is a
+24 −6
Original line number Diff line number Diff line
@@ -19,6 +19,11 @@ 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.pipeline.shared.TileSpec
import com.android.systemui.qs.tiles.base.viewmodel.QSTileViewModelFactory
import com.android.systemui.qs.tiles.impl.custom.di.CustomTileComponent
import com.android.systemui.qs.tiles.impl.custom.di.QSTileConfigModule
import com.android.systemui.qs.tiles.impl.custom.domain.entity.CustomTileDataModel
import com.android.systemui.qs.tiles.viewmodel.QSTileConfigProvider
import com.android.systemui.qs.tiles.viewmodel.QSTileViewModel
import com.android.systemui.qs.tiles.viewmodel.QSTileViewModelAdapter
@@ -34,18 +39,31 @@ constructor(
    private val adapterFactory: QSTileViewModelAdapter.Factory,
    private val tileMap:
        Map<String, @JvmSuppressWildcards Provider<@JvmSuppressWildcards QSTileViewModel>>,
    private val customTileComponentBuilder: CustomTileComponent.Builder,
    private val customTileViewModelFactory: QSTileViewModelFactory.Component<CustomTileDataModel>,
) : 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)
            require(qsTileConfigProvider.hasConfig(viewModelTileSpec)) {
                "No config for $viewModelTileSpec"
            }
        }
    }

    override fun createTile(tileSpec: String): QSTile? {
        val viewModel: QSTileViewModel =
            when (val spec = TileSpec.create(tileSpec)) {
                is TileSpec.CustomTileSpec -> createCustomTileViewModel(spec)
                is TileSpec.PlatformTileSpec -> tileMap[tileSpec]?.get()
                is TileSpec.Invalid -> null
            }
                ?: return null
        return adapterFactory.create(viewModel)
    }

    override fun createTile(tileSpec: String): QSTile? =
        tileMap[tileSpec]?.let {
            val tile = it.get()
            adapterFactory.create(tile)
    private fun createCustomTileViewModel(spec: TileSpec.CustomTileSpec): QSTileViewModel =
        customTileViewModelFactory.create(spec) { config ->
            customTileComponentBuilder.qsTileConfigModule(QSTileConfigModule(config)).build()
        }
}
+3 −2
Original line number Diff line number Diff line
@@ -19,17 +19,18 @@ package com.android.systemui.qs.tiles.impl.custom
import android.os.UserHandle
import com.android.systemui.qs.tiles.base.interactor.DataUpdateTrigger
import com.android.systemui.qs.tiles.base.interactor.QSTileDataInteractor
import com.android.systemui.qs.tiles.impl.custom.domain.entity.CustomTileDataModel
import com.android.systemui.qs.tiles.impl.di.QSTileScope
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow

@QSTileScope
class CustomTileInteractor @Inject constructor() : QSTileDataInteractor<CustomTileData> {
class CustomTileInteractor @Inject constructor() : QSTileDataInteractor<CustomTileDataModel> {

    override fun tileData(
        user: UserHandle,
        triggers: Flow<DataUpdateTrigger>
    ): Flow<CustomTileData> {
    ): Flow<CustomTileDataModel> {
        TODO("Not yet implemented")
    }

+3 −2
Original line number Diff line number Diff line
@@ -17,15 +17,16 @@
package com.android.systemui.qs.tiles.impl.custom

import com.android.systemui.qs.tiles.base.interactor.QSTileDataToStateMapper
import com.android.systemui.qs.tiles.impl.custom.domain.entity.CustomTileDataModel
import com.android.systemui.qs.tiles.impl.di.QSTileScope
import com.android.systemui.qs.tiles.viewmodel.QSTileConfig
import com.android.systemui.qs.tiles.viewmodel.QSTileState
import javax.inject.Inject

@QSTileScope
class CustomTileMapper @Inject constructor() : QSTileDataToStateMapper<CustomTileData> {
class CustomTileMapper @Inject constructor() : QSTileDataToStateMapper<CustomTileDataModel> {

    override fun map(config: QSTileConfig, data: CustomTileData): QSTileState {
    override fun map(config: QSTileConfig, data: CustomTileDataModel): QSTileState {
        TODO("Not yet implemented")
    }
}
+3 −2
Original line number Diff line number Diff line
@@ -18,14 +18,15 @@ package com.android.systemui.qs.tiles.impl.custom

import com.android.systemui.qs.tiles.base.interactor.QSTileInput
import com.android.systemui.qs.tiles.base.interactor.QSTileUserActionInteractor
import com.android.systemui.qs.tiles.impl.custom.domain.entity.CustomTileDataModel
import com.android.systemui.qs.tiles.impl.di.QSTileScope
import javax.inject.Inject

@QSTileScope
class CustomTileUserActionInteractor @Inject constructor() :
    QSTileUserActionInteractor<CustomTileData> {
    QSTileUserActionInteractor<CustomTileDataModel> {

    override suspend fun handleInput(input: QSTileInput<CustomTileData>) {
    override suspend fun handleInput(input: QSTileInput<CustomTileDataModel>) {
        TODO("Not yet implemented")
    }
}
Loading