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 Original line 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.interactor.QSTileUserActionInteractor
import com.android.systemui.qs.tiles.base.logging.QSTileLogger
import com.android.systemui.qs.tiles.base.logging.QSTileLogger
import com.android.systemui.qs.tiles.impl.di.QSTileComponent
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.QSTileConfigProvider
import com.android.systemui.qs.tiles.viewmodel.QSTileState
import com.android.systemui.qs.tiles.viewmodel.QSTileState
import com.android.systemui.user.data.repository.UserRepository
import com.android.systemui.user.data.repository.UserRepository
@@ -60,12 +61,17 @@ sealed interface QSTileViewModelFactory<T> {
    ) : QSTileViewModelFactory<T> {
    ) : QSTileViewModelFactory<T> {


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


    /**
    /**
     * This factory passes by necessary implementations to the [QSTileViewModelImpl]. This is a
     * This factory passes by necessary implementations to the [QSTileViewModelImpl]. This is a
+24 −6
Original line number Original line 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.dagger.SysUISingleton
import com.android.systemui.plugins.qs.QSFactory
import com.android.systemui.plugins.qs.QSFactory
import com.android.systemui.plugins.qs.QSTile
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.QSTileConfigProvider
import com.android.systemui.qs.tiles.viewmodel.QSTileViewModel
import com.android.systemui.qs.tiles.viewmodel.QSTileViewModel
import com.android.systemui.qs.tiles.viewmodel.QSTileViewModelAdapter
import com.android.systemui.qs.tiles.viewmodel.QSTileViewModelAdapter
@@ -34,18 +39,31 @@ constructor(
    private val adapterFactory: QSTileViewModelAdapter.Factory,
    private val adapterFactory: QSTileViewModelAdapter.Factory,
    private val tileMap:
    private val tileMap:
        Map<String, @JvmSuppressWildcards Provider<@JvmSuppressWildcards QSTileViewModel>>,
        Map<String, @JvmSuppressWildcards Provider<@JvmSuppressWildcards QSTileViewModel>>,
    private val customTileComponentBuilder: CustomTileComponent.Builder,
    private val customTileViewModelFactory: QSTileViewModelFactory.Component<CustomTileDataModel>,
) : QSFactory {
) : QSFactory {


    init {
    init {
        for (viewModelTileSpec in tileMap.keys) {
        for (viewModelTileSpec in tileMap.keys) {
            // throws an exception when there is no config for a tileSpec of an injected viewModel
            require(qsTileConfigProvider.hasConfig(viewModelTileSpec)) {
            qsTileConfigProvider.getConfig(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? =
    private fun createCustomTileViewModel(spec: TileSpec.CustomTileSpec): QSTileViewModel =
        tileMap[tileSpec]?.let {
        customTileViewModelFactory.create(spec) { config ->
            val tile = it.get()
            customTileComponentBuilder.qsTileConfigModule(QSTileConfigModule(config)).build()
            adapterFactory.create(tile)
        }
        }
}
}
+3 −2
Original line number Original line Diff line number Diff line
@@ -19,17 +19,18 @@ package com.android.systemui.qs.tiles.impl.custom
import android.os.UserHandle
import android.os.UserHandle
import com.android.systemui.qs.tiles.base.interactor.DataUpdateTrigger
import com.android.systemui.qs.tiles.base.interactor.DataUpdateTrigger
import com.android.systemui.qs.tiles.base.interactor.QSTileDataInteractor
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 com.android.systemui.qs.tiles.impl.di.QSTileScope
import javax.inject.Inject
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.Flow


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


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


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


import com.android.systemui.qs.tiles.base.interactor.QSTileDataToStateMapper
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.impl.di.QSTileScope
import com.android.systemui.qs.tiles.viewmodel.QSTileConfig
import com.android.systemui.qs.tiles.viewmodel.QSTileConfig
import com.android.systemui.qs.tiles.viewmodel.QSTileState
import com.android.systemui.qs.tiles.viewmodel.QSTileState
import javax.inject.Inject
import javax.inject.Inject


@QSTileScope
@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")
        TODO("Not yet implemented")
    }
    }
}
}
+3 −2
Original line number Original line 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.QSTileInput
import com.android.systemui.qs.tiles.base.interactor.QSTileUserActionInteractor
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 com.android.systemui.qs.tiles.impl.di.QSTileScope
import javax.inject.Inject
import javax.inject.Inject


@QSTileScope
@QSTileScope
class CustomTileUserActionInteractor @Inject constructor() :
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")
        TODO("Not yet implemented")
    }
    }
}
}
Loading