• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 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.statusbar.dagger
18 
19 import android.content.Context
20 import com.android.systemui.CameraProtectionLoader
21 import com.android.systemui.CoreStartable
22 import com.android.systemui.SysUICutoutProvider
23 import com.android.systemui.SysUICutoutProviderImpl
24 import com.android.systemui.dagger.SysUISingleton
25 import com.android.systemui.log.LogBuffer
26 import com.android.systemui.log.LogBufferFactory
27 import com.android.systemui.statusbar.chips.sharetoapp.ui.viewmodel.ShareToAppChipViewModel
28 import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
29 import com.android.systemui.statusbar.data.StatusBarDataLayerModule
30 import com.android.systemui.statusbar.data.repository.LightBarControllerStore
31 import com.android.systemui.statusbar.layout.StatusBarContentInsetsProvider
32 import com.android.systemui.statusbar.layout.StatusBarContentInsetsProviderImpl
33 import com.android.systemui.statusbar.layout.ui.viewmodel.StatusBarContentInsetsViewModel
34 import com.android.systemui.statusbar.phone.AutoHideController
35 import com.android.systemui.statusbar.phone.AutoHideControllerImpl
36 import com.android.systemui.statusbar.phone.LightBarController
37 import com.android.systemui.statusbar.phone.LightBarControllerImpl
38 import com.android.systemui.statusbar.phone.StatusBarSignalPolicy
39 import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController
40 import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallLog
41 import com.android.systemui.statusbar.phone.ongoingcall.StatusBarChipsModernization
42 import com.android.systemui.statusbar.phone.ongoingcall.domain.interactor.OngoingCallInteractor
43 import com.android.systemui.statusbar.policy.ConfigurationController
44 import com.android.systemui.statusbar.ui.StatusBarUiLayerModule
45 import com.android.systemui.statusbar.ui.SystemBarUtilsProxyImpl
46 import com.android.systemui.statusbar.window.MultiDisplayStatusBarWindowControllerStore
47 import com.android.systemui.statusbar.window.SingleDisplayStatusBarWindowControllerStore
48 import com.android.systemui.statusbar.window.StatusBarWindowController
49 import com.android.systemui.statusbar.window.StatusBarWindowControllerImpl
50 import com.android.systemui.statusbar.window.StatusBarWindowControllerStore
51 import dagger.Binds
52 import dagger.Lazy
53 import dagger.Module
54 import dagger.Provides
55 import dagger.multibindings.ClassKey
56 import dagger.multibindings.IntoMap
57 
58 /**
59  * A module for **only** classes related to the status bar **UI element**. This module specifically
60  * should **not** include:
61  * - Classes in the `statusbar` package that are unrelated to the status bar UI.
62  * - Status bar classes that are already provided by other modules
63  *   ([com.android.systemui.statusbar.pipeline.dagger.StatusBarPipelineModule],
64  *   [com.android.systemui.statusbar.policy.dagger.StatusBarPolicyModule], etc.).
65  */
66 @Module(
67     includes =
68         [
69             StatusBarDataLayerModule::class,
70             StatusBarUiLayerModule::class,
71             SystemBarUtilsProxyImpl.Module::class,
72         ]
73 )
74 interface StatusBarModule {
75 
76     @Binds
77     @IntoMap
78     @ClassKey(LightBarController::class)
lightBarControllerAsCoreStartablenull79     fun lightBarControllerAsCoreStartable(controller: LightBarController): CoreStartable
80 
81     @Binds
82     @IntoMap
83     @ClassKey(StatusBarSignalPolicy::class)
84     fun bindStatusBarSignalPolicy(impl: StatusBarSignalPolicy): CoreStartable
85 
86     @Binds
87     @SysUISingleton
88     fun statusBarWindowControllerFactory(
89         implFactory: StatusBarWindowControllerImpl.Factory
90     ): StatusBarWindowController.Factory
91 
92     @Binds @SysUISingleton fun autoHideController(impl: AutoHideControllerImpl): AutoHideController
93 
94     @Binds
95     fun lightBarControllerFactory(
96         legacyFactory: LightBarControllerImpl.LegacyFactory
97     ): LightBarController.Factory
98 
99     companion object {
100         @Provides
101         @SysUISingleton
102         @IntoMap
103         @ClassKey(OngoingCallController::class)
104         fun ongoingCallController(controller: OngoingCallController): CoreStartable =
105             if (StatusBarChipsModernization.isEnabled) {
106                 CoreStartable.NOP
107             } else {
108                 controller
109             }
110 
111         @Provides
112         @SysUISingleton
113         @IntoMap
114         @ClassKey(OngoingCallInteractor::class)
115         fun ongoingCallInteractor(interactor: OngoingCallInteractor): CoreStartable =
116             if (StatusBarChipsModernization.isEnabled) {
117                 interactor
118             } else {
119                 CoreStartable.NOP
120             }
121 
122         @Provides
123         @SysUISingleton
124         fun lightBarController(store: LightBarControllerStore): LightBarController {
125             return store.defaultDisplay
126         }
127 
128         @Provides
129         @SysUISingleton
130         fun windowControllerStore(
131             multiDisplayImplLazy: Lazy<MultiDisplayStatusBarWindowControllerStore>,
132             singleDisplayImplLazy: Lazy<SingleDisplayStatusBarWindowControllerStore>,
133         ): StatusBarWindowControllerStore {
134             return if (StatusBarConnectedDisplays.isEnabled) {
135                 multiDisplayImplLazy.get()
136             } else {
137                 singleDisplayImplLazy.get()
138             }
139         }
140 
141         @Provides
142         @SysUISingleton
143         @IntoMap
144         @ClassKey(ShareToAppChipViewModel::class)
145         fun providesShareToAppChipViewModel(
146             shareToAppChipViewModelLazy: Lazy<ShareToAppChipViewModel>
147         ): CoreStartable {
148             return if (com.android.media.projection.flags.Flags.showStopDialogPostCallEnd()) {
149                 shareToAppChipViewModelLazy.get()
150             } else {
151                 CoreStartable.NOP
152             }
153         }
154 
155         @Provides
156         @SysUISingleton
157         @IntoMap
158         @ClassKey(MultiDisplayStatusBarWindowControllerStore::class)
159         fun multiDisplayControllerStoreAsCoreStartable(
160             storeLazy: Lazy<MultiDisplayStatusBarWindowControllerStore>
161         ): CoreStartable {
162             return if (StatusBarConnectedDisplays.isEnabled) {
163                 storeLazy.get()
164             } else {
165                 CoreStartable.NOP
166             }
167         }
168 
169         @Provides
170         @SysUISingleton
171         @OngoingCallLog
172         fun provideOngoingCallLogBuffer(factory: LogBufferFactory): LogBuffer {
173             return factory.create("OngoingCall", 75)
174         }
175 
176         @Provides
177         @SysUISingleton
178         fun sysUiCutoutProvider(
179             factory: SysUICutoutProviderImpl.Factory,
180             context: Context,
181             cameraProtectionLoader: CameraProtectionLoader,
182         ): SysUICutoutProvider {
183             return factory.create(context, cameraProtectionLoader)
184         }
185 
186         @Provides
187         @SysUISingleton
188         fun contentInsetsProvider(
189             factory: StatusBarContentInsetsProviderImpl.Factory,
190             context: Context,
191             configurationController: ConfigurationController,
192             sysUICutoutProvider: SysUICutoutProvider,
193         ): StatusBarContentInsetsProvider {
194             return factory.create(context, configurationController, sysUICutoutProvider)
195         }
196 
197         @Provides
198         @SysUISingleton
199         fun contentInsetsViewModel(
200             insetsProvider: StatusBarContentInsetsProvider
201         ): StatusBarContentInsetsViewModel {
202             return StatusBarContentInsetsViewModel(insetsProvider)
203         }
204     }
205 }
206