• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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