1 /*
2  * Copyright (C) 2019 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.controls.dagger
18 
19 import android.app.Activity
20 import android.content.pm.PackageManager
21 import com.android.systemui.controls.ControlsMetricsLogger
22 import com.android.systemui.controls.ControlsMetricsLoggerImpl
23 import com.android.systemui.controls.settings.ControlsSettingsRepository
24 import com.android.systemui.controls.settings.ControlsSettingsRepositoryImpl
25 import com.android.systemui.controls.controller.ControlsBindingController
26 import com.android.systemui.controls.controller.ControlsBindingControllerImpl
27 import com.android.systemui.controls.controller.ControlsController
28 import com.android.systemui.controls.controller.ControlsControllerImpl
29 import com.android.systemui.controls.controller.ControlsFavoritePersistenceWrapper
30 import com.android.systemui.controls.controller.ControlsTileResourceConfiguration
31 import com.android.systemui.controls.management.ControlsEditingActivity
32 import com.android.systemui.controls.management.ControlsFavoritingActivity
33 import com.android.systemui.controls.management.ControlsListingController
34 import com.android.systemui.controls.management.ControlsListingControllerImpl
35 import com.android.systemui.controls.management.ControlsProviderSelectorActivity
36 import com.android.systemui.controls.management.ControlsRequestDialog
37 import com.android.systemui.controls.panels.AuthorizedPanelsRepository
38 import com.android.systemui.controls.panels.AuthorizedPanelsRepositoryImpl
39 import com.android.systemui.controls.panels.SelectedComponentRepository
40 import com.android.systemui.controls.panels.SelectedComponentRepositoryImpl
41 import com.android.systemui.controls.settings.ControlsSettingsDialogManager
42 import com.android.systemui.controls.settings.ControlsSettingsDialogManagerImpl
43 import com.android.systemui.controls.ui.ControlActionCoordinator
44 import com.android.systemui.controls.ui.ControlActionCoordinatorImpl
45 import com.android.systemui.controls.ui.ControlsActivity
46 import com.android.systemui.controls.ui.ControlsUiController
47 import com.android.systemui.controls.ui.ControlsUiControllerImpl
48 import com.android.systemui.dagger.SysUISingleton
49 import com.android.systemui.qs.tileimpl.QSTileImpl
50 import com.android.systemui.qs.tiles.DeviceControlsTile
51 import dagger.Binds
52 import dagger.BindsOptionalOf
53 import dagger.Module
54 import dagger.Provides
55 import dagger.multibindings.ClassKey
56 import dagger.multibindings.IntoMap
57 import dagger.multibindings.StringKey
58 
59 /**
60  * Module for injecting classes in `com.android.systemui.controls`-
61  *
62  * Classes provided by this module should only be injected directly into other classes in this
63  * module. For injecting outside of this module (for example, [GlobalActionsDialog], inject
64  * [ControlsComponent] and obtain the corresponding optionals from it.
65  */
66 @Module
67 abstract class ControlsModule {
68 
69     @Module
70     companion object {
71         @JvmStatic
72         @Provides
73         @SysUISingleton
74         @ControlsFeatureEnabled
75         fun providesControlsFeatureEnabled(pm: PackageManager): Boolean {
76             return pm.hasSystemFeature(PackageManager.FEATURE_CONTROLS)
77         }
78     }
79 
80     @Binds
81     abstract fun provideControlsListingController(
82         controller: ControlsListingControllerImpl
83     ): ControlsListingController
84 
85     @Binds
86     abstract fun provideControlsController(controller: ControlsControllerImpl): ControlsController
87 
88     @Binds
89     abstract fun provideControlsBindingController(
90         controller: ControlsBindingControllerImpl
91     ): ControlsBindingController
92 
93     @Binds
94     abstract fun provideUiController(controller: ControlsUiControllerImpl): ControlsUiController
95 
96     @Binds
97     abstract fun provideSettingsManager(
98             manager: ControlsSettingsRepositoryImpl
99     ): ControlsSettingsRepository
100 
101     @Binds
102     abstract fun provideDialogManager(
103             manager: ControlsSettingsDialogManagerImpl
104     ): ControlsSettingsDialogManager
105 
106     @Binds
107     abstract fun provideMetricsLogger(logger: ControlsMetricsLoggerImpl): ControlsMetricsLogger
108 
109     @Binds
110     abstract fun provideControlActionCoordinator(
111         coordinator: ControlActionCoordinatorImpl
112     ): ControlActionCoordinator
113 
114     @Binds
115     abstract fun provideAuthorizedPanelsRepository(
116         repository: AuthorizedPanelsRepositoryImpl
117     ): AuthorizedPanelsRepository
118 
119     @Binds
120     abstract fun providePreferredPanelRepository(
121         repository: SelectedComponentRepositoryImpl
122     ): SelectedComponentRepository
123 
124     @BindsOptionalOf
125     abstract fun optionalPersistenceWrapper(): ControlsFavoritePersistenceWrapper
126 
127     @BindsOptionalOf
128     abstract fun provideControlsTileResourceConfiguration(): ControlsTileResourceConfiguration
129 
130     @Binds
131     @IntoMap
132     @ClassKey(ControlsProviderSelectorActivity::class)
133     abstract fun provideControlsProviderActivity(
134         activity: ControlsProviderSelectorActivity
135     ): Activity
136 
137     @Binds
138     @IntoMap
139     @ClassKey(ControlsFavoritingActivity::class)
140     abstract fun provideControlsFavoritingActivity(
141         activity: ControlsFavoritingActivity
142     ): Activity
143 
144     @Binds
145     @IntoMap
146     @ClassKey(ControlsEditingActivity::class)
147     abstract fun provideControlsEditingActivity(
148         activity: ControlsEditingActivity
149     ): Activity
150 
151     @Binds
152     @IntoMap
153     @ClassKey(ControlsRequestDialog::class)
154     abstract fun provideControlsRequestDialog(
155         activity: ControlsRequestDialog
156     ): Activity
157 
158     @Binds
159     @IntoMap
160     @ClassKey(ControlsActivity::class)
161     abstract fun provideControlsActivity(activity: ControlsActivity): Activity
162 
163     @Binds
164     @IntoMap
165     @StringKey(DeviceControlsTile.TILE_SPEC)
166     abstract fun bindDeviceControlsTile(controlsTile: DeviceControlsTile): QSTileImpl<*>
167 }
168