1 /* 2 * Copyright (C) 2025 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.systemui.qs.tiles.base.ui.model 18 19 import com.android.systemui.dagger.SysUISingleton 20 import com.android.systemui.plugins.qs.QSFactory 21 import com.android.systemui.plugins.qs.QSTile 22 import com.android.systemui.qs.pipeline.shared.QSPipelineFlagsRepository 23 import com.android.systemui.qs.pipeline.shared.TileSpec 24 import com.android.systemui.qs.tiles.base.shared.model.QSTileConfigProvider 25 import com.android.systemui.qs.tiles.base.ui.viewmodel.QSTileViewModel 26 import com.android.systemui.qs.tiles.base.ui.viewmodel.QSTileViewModelAdapter 27 import com.android.systemui.qs.tiles.base.ui.viewmodel.QSTileViewModelFactory 28 import com.android.systemui.qs.tiles.base.ui.viewmodel.StubQSTileViewModel 29 import javax.inject.Inject 30 import javax.inject.Provider 31 32 // TODO(b/http://b/299909989): Rename the factory after rollout 33 @SysUISingleton 34 class NewQSTileFactory 35 @Inject 36 constructor( 37 qsTileConfigProvider: QSTileConfigProvider, 38 private val adapterFactory: QSTileViewModelAdapter.Factory, 39 private val tileMap: 40 Map<String, @JvmSuppressWildcards Provider<@JvmSuppressWildcards QSTileViewModel>>, 41 private val customTileViewModelFactory: QSTileViewModelFactory.Component, 42 ) : QSFactory { 43 44 init { 45 QSPipelineFlagsRepository.assertNewTiles() 46 for (viewModelTileSpec in tileMap.keys) { <lambda>null47 require(qsTileConfigProvider.hasConfig(viewModelTileSpec)) { 48 "No config for $viewModelTileSpec" 49 } 50 } 51 } 52 createTilenull53 override fun createTile(tileSpec: String): QSTile? { 54 val viewModel: QSTileViewModel = 55 when (val spec = TileSpec.create(tileSpec)) { 56 is TileSpec.CustomTileSpec -> createCustomTileViewModel(spec) 57 // when using the stub, we default to old tile rather than adding the stub 58 is TileSpec.PlatformTileSpec -> 59 tileMap[tileSpec]?.get()?.takeIf { it !is StubQSTileViewModel } 60 is TileSpec.Invalid -> null 61 } ?: return null 62 return adapterFactory.create(viewModel) 63 } 64 createCustomTileViewModelnull65 private fun createCustomTileViewModel(spec: TileSpec.CustomTileSpec): QSTileViewModel = 66 customTileViewModelFactory.create(spec) 67 } 68