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.display 18 19 import android.hardware.display.DisplayManager 20 import android.os.Handler 21 import com.android.app.displaylib.DisplayLibBackground 22 import com.android.app.displaylib.DisplayLibComponent 23 import com.android.app.displaylib.PerDisplayRepository 24 import com.android.app.displaylib.createDisplayLibComponent 25 import com.android.systemui.CoreStartable 26 import com.android.systemui.dagger.SysUISingleton 27 import com.android.systemui.dagger.qualifiers.Background 28 import com.android.systemui.display.data.repository.DeviceStateRepository 29 import com.android.systemui.display.data.repository.DeviceStateRepositoryImpl 30 import com.android.systemui.display.data.repository.DisplayRepository 31 import com.android.systemui.display.data.repository.DisplayRepositoryImpl 32 import com.android.systemui.display.data.repository.DisplayWindowPropertiesRepository 33 import com.android.systemui.display.data.repository.DisplayWindowPropertiesRepositoryImpl 34 import com.android.systemui.display.data.repository.DisplaysWithDecorationsRepository 35 import com.android.systemui.display.data.repository.DisplaysWithDecorationsRepositoryImpl 36 import com.android.systemui.display.data.repository.FocusedDisplayRepository 37 import com.android.systemui.display.data.repository.FocusedDisplayRepositoryImpl 38 import com.android.systemui.display.data.repository.PerDisplayRepoDumpHelper 39 import com.android.systemui.display.domain.interactor.ConnectedDisplayInteractor 40 import com.android.systemui.display.domain.interactor.ConnectedDisplayInteractorImpl 41 import com.android.systemui.display.domain.interactor.DisplayWindowPropertiesInteractorModule 42 import com.android.systemui.display.domain.interactor.RearDisplayStateInteractor 43 import com.android.systemui.display.domain.interactor.RearDisplayStateInteractorImpl 44 import com.android.systemui.statusbar.core.StatusBarConnectedDisplays 45 import dagger.Binds 46 import dagger.Lazy 47 import dagger.Module 48 import dagger.Provides 49 import dagger.multibindings.ClassKey 50 import dagger.multibindings.IntoMap 51 import kotlinx.coroutines.CoroutineDispatcher 52 import kotlinx.coroutines.CoroutineScope 53 54 /** Module binding display related classes. */ 55 @Module(includes = [DisplayWindowPropertiesInteractorModule::class, DisplayLibModule::class]) 56 interface DisplayModule { 57 @Binds bindConnectedDisplayInteractornull58 fun bindConnectedDisplayInteractor( 59 provider: ConnectedDisplayInteractorImpl 60 ): ConnectedDisplayInteractor 61 62 @Binds 63 fun bindRearDisplayStateInteractor( 64 provider: RearDisplayStateInteractorImpl 65 ): RearDisplayStateInteractor 66 67 @Binds fun bindsDisplayRepository(displayRepository: DisplayRepositoryImpl): DisplayRepository 68 69 @Binds 70 fun bindsDeviceStateRepository( 71 deviceStateRepository: DeviceStateRepositoryImpl 72 ): DeviceStateRepository 73 74 @Binds 75 fun bindsFocusedDisplayRepository( 76 focusedDisplayRepository: FocusedDisplayRepositoryImpl 77 ): FocusedDisplayRepository 78 79 @Binds 80 fun displayWindowPropertiesRepository( 81 impl: DisplayWindowPropertiesRepositoryImpl 82 ): DisplayWindowPropertiesRepository 83 84 @Binds 85 fun displaysWithDecorationsRepository( 86 impl: DisplaysWithDecorationsRepositoryImpl 87 ): DisplaysWithDecorationsRepository 88 89 @Binds 90 fun dumpRegistrationLambda(helper: PerDisplayRepoDumpHelper): PerDisplayRepository.InitCallback 91 92 @Binds 93 @DisplayLibBackground 94 fun bindDisplayLibBackground(@Background bgScope: CoroutineScope): CoroutineScope 95 96 companion object { 97 @Provides 98 @SysUISingleton 99 @IntoMap 100 @ClassKey(DisplayWindowPropertiesRepository::class) 101 fun displayWindowPropertiesRepoAsCoreStartable( 102 repoLazy: Lazy<DisplayWindowPropertiesRepositoryImpl> 103 ): CoreStartable { 104 return if (StatusBarConnectedDisplays.isEnabled) { 105 return repoLazy.get() 106 } else { 107 CoreStartable.NOP 108 } 109 } 110 } 111 } 112 113 /** Module to bind the DisplayRepository from displaylib to the systemui dagger graph. */ 114 @Module 115 object DisplayLibModule { 116 @Provides 117 @SysUISingleton displayLibComponentnull118 fun displayLibComponent( 119 displayManager: DisplayManager, 120 @Background backgroundHandler: Handler, 121 @Background bgApplicationScope: CoroutineScope, 122 @Background backgroundCoroutineDispatcher: CoroutineDispatcher, 123 ): DisplayLibComponent { 124 return createDisplayLibComponent( 125 displayManager, 126 backgroundHandler, 127 bgApplicationScope, 128 backgroundCoroutineDispatcher, 129 ) 130 } 131 132 @Provides 133 @SysUISingleton providesDisplayRepositoryFromLibnull134 fun providesDisplayRepositoryFromLib( 135 displayLibComponent: DisplayLibComponent 136 ): com.android.app.displaylib.DisplayRepository { 137 return displayLibComponent.displayRepository 138 } 139 } 140