1 /* 2 * Copyright (C) 2022 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 @file:OptIn(InternalNoteTaskApi::class) 18 19 package com.android.systemui.notetask 20 21 import android.app.Activity 22 import android.app.Service 23 import android.app.role.RoleManager 24 import com.android.systemui.flags.FeatureFlags 25 import com.android.systemui.flags.Flags 26 import com.android.systemui.notetask.NoteTaskBubblesController.NoteTaskBubblesService 27 import com.android.systemui.notetask.quickaffordance.NoteTaskQuickAffordanceModule 28 import com.android.systemui.notetask.shortcut.CreateNoteTaskShortcutActivity 29 import com.android.systemui.notetask.shortcut.LaunchNoteTaskActivity 30 import com.android.systemui.qs.QsEventLogger 31 import com.android.systemui.qs.pipeline.shared.TileSpec 32 import com.android.systemui.qs.shared.model.TileCategory 33 import com.android.systemui.qs.tileimpl.QSTileImpl 34 import com.android.systemui.qs.tiles.NotesTile 35 import com.android.systemui.qs.tiles.base.domain.interactor.QSTileAvailabilityInteractor 36 import com.android.systemui.qs.tiles.base.shared.model.QSTileConfig 37 import com.android.systemui.qs.tiles.base.shared.model.QSTileUIConfig 38 import com.android.systemui.qs.tiles.base.ui.viewmodel.QSTileViewModel 39 import com.android.systemui.qs.tiles.base.ui.viewmodel.QSTileViewModelFactory 40 import com.android.systemui.qs.tiles.base.ui.viewmodel.StubQSTileViewModel 41 import com.android.systemui.qs.tiles.impl.notes.domain.interactor.NotesTileDataInteractor 42 import com.android.systemui.qs.tiles.impl.notes.domain.interactor.NotesTileUserActionInteractor 43 import com.android.systemui.qs.tiles.impl.notes.domain.model.NotesTileModel 44 import com.android.systemui.qs.tiles.impl.notes.ui.mapper.NotesTileMapper 45 import com.android.systemui.res.R 46 import dagger.Binds 47 import dagger.Module 48 import dagger.Provides 49 import dagger.multibindings.ClassKey 50 import dagger.multibindings.IntoMap 51 import dagger.multibindings.StringKey 52 53 /** Compose all dependencies required by Note Task feature. */ 54 @Module(includes = [NoteTaskQuickAffordanceModule::class]) 55 interface NoteTaskModule { 56 57 @[Binds IntoMap ClassKey(NoteTaskControllerUpdateService::class)] bindNoteTaskControllerUpdateServicenull58 fun bindNoteTaskControllerUpdateService(service: NoteTaskControllerUpdateService): Service 59 60 @[Binds IntoMap ClassKey(NoteTaskBubblesService::class)] 61 fun bindNoteTaskBubblesService(service: NoteTaskBubblesService): Service 62 63 @[Binds IntoMap ClassKey(LaunchNoteTaskActivity::class)] 64 fun bindNoteTaskLauncherActivity(activity: LaunchNoteTaskActivity): Activity 65 66 @[Binds IntoMap ClassKey(LaunchNotesRoleSettingsTrampolineActivity::class)] 67 fun bindLaunchNotesRoleSettingsTrampolineActivity( 68 activity: LaunchNotesRoleSettingsTrampolineActivity 69 ): Activity 70 71 @[Binds IntoMap ClassKey(CreateNoteTaskShortcutActivity::class)] 72 fun bindNoteTaskShortcutActivity(activity: CreateNoteTaskShortcutActivity): Activity 73 74 @Binds 75 @IntoMap 76 @StringKey(NOTES_TILE_SPEC) 77 fun provideNotesAvailabilityInteractor( 78 impl: NotesTileDataInteractor 79 ): QSTileAvailabilityInteractor 80 81 @Binds 82 @IntoMap 83 @StringKey(NotesTile.TILE_SPEC) 84 fun bindNotesTile(notesTile: NotesTile): QSTileImpl<*> 85 86 companion object { 87 88 const val NOTES_TILE_SPEC = "notes" 89 90 @[Provides NoteTaskEnabledKey] 91 fun provideIsNoteTaskEnabled( 92 featureFlags: FeatureFlags, 93 roleManager: RoleManager, 94 ): Boolean { 95 val isRoleAvailable = roleManager.isRoleAvailable(RoleManager.ROLE_NOTES) 96 val isFeatureEnabled = featureFlags.isEnabled(Flags.NOTE_TASKS) 97 return isRoleAvailable && isFeatureEnabled 98 } 99 100 /** Inject NotesTile into tileViewModelMap in QSModule */ 101 @Provides 102 @IntoMap 103 @StringKey(NOTES_TILE_SPEC) 104 fun provideNotesTileViewModel( 105 factory: QSTileViewModelFactory.Static<NotesTileModel>, 106 mapper: NotesTileMapper, 107 stateInteractor: NotesTileDataInteractor, 108 userActionInteractor: NotesTileUserActionInteractor, 109 ): QSTileViewModel = 110 if (com.android.systemui.Flags.qsNewTilesFuture()) 111 factory.create( 112 TileSpec.create(NOTES_TILE_SPEC), 113 userActionInteractor, 114 stateInteractor, 115 mapper, 116 ) 117 else StubQSTileViewModel 118 119 @Provides 120 @IntoMap 121 @StringKey(NOTES_TILE_SPEC) 122 fun provideNotesTileConfig(uiEventLogger: QsEventLogger): QSTileConfig = 123 QSTileConfig( 124 tileSpec = TileSpec.create(NOTES_TILE_SPEC), 125 uiConfig = 126 QSTileUIConfig.Resource( 127 iconRes = R.drawable.ic_qs_notes, 128 labelRes = R.string.quick_settings_notes_label, 129 ), 130 instanceId = uiEventLogger.getNewInstanceId(), 131 category = TileCategory.UTILITIES, 132 ) 133 } 134 } 135