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.controller.ControlsBindingController
24 import com.android.systemui.controls.controller.ControlsBindingControllerImpl
25 import com.android.systemui.controls.controller.ControlsController
26 import com.android.systemui.controls.controller.ControlsControllerImpl
27 import com.android.systemui.controls.controller.ControlsFavoritePersistenceWrapper
28 import com.android.systemui.controls.management.ControlsEditingActivity
29 import com.android.systemui.controls.management.ControlsFavoritingActivity
30 import com.android.systemui.controls.management.ControlsListingController
31 import com.android.systemui.controls.management.ControlsListingControllerImpl
32 import com.android.systemui.controls.management.ControlsProviderSelectorActivity
33 import com.android.systemui.controls.management.ControlsRequestDialog
34 import com.android.systemui.controls.ui.ControlActionCoordinator
35 import com.android.systemui.controls.ui.ControlActionCoordinatorImpl
36 import com.android.systemui.controls.ui.ControlsActivity
37 import com.android.systemui.controls.ui.ControlsUiController
38 import com.android.systemui.controls.ui.ControlsUiControllerImpl
39 import com.android.systemui.dagger.SysUISingleton
40 import dagger.Binds
41 import dagger.BindsOptionalOf
42 import dagger.Module
43 import dagger.Provides
44 import dagger.multibindings.ClassKey
45 import dagger.multibindings.IntoMap
46 
47 /**
48  * Module for injecting classes in `com.android.systemui.controls`-
49  *
50  * Classes provided by this module should only be injected directly into other classes in this
51  * module. For injecting outside of this module (for example, [GlobalActionsDialog], inject
52  * [ControlsComponent] and obtain the corresponding optionals from it.
53  */
54 @Module
55 abstract class ControlsModule {
56 
57     @Module
58     companion object {
59         @JvmStatic
60         @Provides
61         @SysUISingleton
62         @ControlsFeatureEnabled
63         fun providesControlsFeatureEnabled(pm: PackageManager): Boolean {
64             return pm.hasSystemFeature(PackageManager.FEATURE_CONTROLS)
65         }
66     }
67 
68     @Binds
69     abstract fun provideControlsListingController(
70         controller: ControlsListingControllerImpl
71     ): ControlsListingController
72 
73     @Binds
74     abstract fun provideControlsController(controller: ControlsControllerImpl): ControlsController
75 
76     @Binds
77     abstract fun provideControlsBindingController(
78         controller: ControlsBindingControllerImpl
79     ): ControlsBindingController
80 
81     @Binds
82     abstract fun provideUiController(controller: ControlsUiControllerImpl): ControlsUiController
83 
84     @Binds
85     abstract fun provideMetricsLogger(logger: ControlsMetricsLoggerImpl): ControlsMetricsLogger
86 
87     @Binds
88     abstract fun provideControlActionCoordinator(
89         coordinator: ControlActionCoordinatorImpl
90     ): ControlActionCoordinator
91 
92     @BindsOptionalOf
93     abstract fun optionalPersistenceWrapper(): ControlsFavoritePersistenceWrapper
94 
95     @Binds
96     @IntoMap
97     @ClassKey(ControlsProviderSelectorActivity::class)
98     abstract fun provideControlsProviderActivity(
99         activity: ControlsProviderSelectorActivity
100     ): Activity
101 
102     @Binds
103     @IntoMap
104     @ClassKey(ControlsFavoritingActivity::class)
105     abstract fun provideControlsFavoritingActivity(
106         activity: ControlsFavoritingActivity
107     ): Activity
108 
109     @Binds
110     @IntoMap
111     @ClassKey(ControlsEditingActivity::class)
112     abstract fun provideControlsEditingActivity(
113         activity: ControlsEditingActivity
114     ): Activity
115 
116     @Binds
117     @IntoMap
118     @ClassKey(ControlsRequestDialog::class)
119     abstract fun provideControlsRequestDialog(
120         activity: ControlsRequestDialog
121     ): Activity
122 
123     @Binds
124     @IntoMap
125     @ClassKey(ControlsActivity::class)
126     abstract fun provideControlsActivity(activity: ControlsActivity): Activity
127 }
128