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

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

Update NewQSTileFactory and QSTileConfigProvider to provide custom tile

ViewModel

Test: atest QSTileConfigProviderTest
Flag: LEGACY QS_PIPELINE_NEW_TILES DISABLED
Fixes: 301055700
Change-Id: I32060e12eaadb673b5491538d118b48b2bb799f4
parent fd49807d
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