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