1 /* 2 * Copyright (C) 2024 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.window 18 19 import android.content.Context 20 import android.view.WindowManager 21 import com.android.systemui.dagger.SysUISingleton 22 import com.android.systemui.dagger.qualifiers.Background 23 import com.android.systemui.display.data.repository.DisplayRepository 24 import com.android.systemui.display.data.repository.DisplayWindowPropertiesRepository 25 import com.android.systemui.display.data.repository.PerDisplayStore 26 import com.android.systemui.display.data.repository.SingleDisplayStore 27 import com.android.systemui.statusbar.core.StatusBarConnectedDisplays 28 import com.android.systemui.statusbar.data.repository.StatusBarConfigurationControllerStore 29 import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore 30 import com.android.systemui.statusbar.data.repository.StatusBarPerDisplayStoreImpl 31 import javax.inject.Inject 32 import kotlinx.coroutines.CoroutineScope 33 34 /** Store that allows to retrieve per display instances of [StatusBarWindowController]. */ 35 interface StatusBarWindowControllerStore : PerDisplayStore<StatusBarWindowController> 36 37 @SysUISingleton 38 class MultiDisplayStatusBarWindowControllerStore 39 @Inject 40 constructor( 41 @Background backgroundApplicationScope: CoroutineScope, 42 private val controllerFactory: StatusBarWindowController.Factory, 43 private val displayWindowPropertiesRepository: DisplayWindowPropertiesRepository, 44 private val statusBarConfigurationControllerStore: StatusBarConfigurationControllerStore, 45 private val statusBarContentInsetsProviderStore: StatusBarContentInsetsProviderStore, 46 displayRepository: DisplayRepository, 47 ) : 48 StatusBarWindowControllerStore, 49 StatusBarPerDisplayStoreImpl<StatusBarWindowController>( 50 backgroundApplicationScope, 51 displayRepository, 52 ) { 53 54 init { 55 StatusBarConnectedDisplays.unsafeAssertInNewMode() 56 } 57 createInstanceForDisplaynull58 override fun createInstanceForDisplay(displayId: Int): StatusBarWindowController? { 59 val statusBarDisplayContext = 60 displayWindowPropertiesRepository.get( 61 displayId = displayId, 62 windowType = WindowManager.LayoutParams.TYPE_STATUS_BAR, 63 ) ?: return null 64 val statusBarConfigurationController = 65 statusBarConfigurationControllerStore.forDisplay(displayId) ?: return null 66 val contentInsetsProvider = 67 statusBarContentInsetsProviderStore.forDisplay(displayId) ?: return null 68 return controllerFactory.create( 69 statusBarDisplayContext.context, 70 statusBarDisplayContext.windowManager, 71 statusBarConfigurationController, 72 contentInsetsProvider, 73 ) 74 } 75 onDisplayRemovalActionnull76 override suspend fun onDisplayRemovalAction(instance: StatusBarWindowController) { 77 instance.stop() 78 } 79 80 override val instanceClass = StatusBarWindowController::class.java 81 } 82 83 @SysUISingleton 84 class SingleDisplayStatusBarWindowControllerStore 85 @Inject 86 constructor( 87 context: Context, 88 windowManager: WindowManager, 89 factory: StatusBarWindowControllerImpl.Factory, 90 statusBarConfigurationControllerStore: StatusBarConfigurationControllerStore, 91 statusBarContentInsetsProviderStore: StatusBarContentInsetsProviderStore, 92 ) : 93 StatusBarWindowControllerStore, 94 PerDisplayStore<StatusBarWindowController> by SingleDisplayStore( 95 factory.create( 96 context, 97 windowManager, 98 statusBarConfigurationControllerStore.defaultDisplay, 99 statusBarContentInsetsProviderStore.defaultDisplay, 100 ) <lambda>null101 ) { 102 103 init { 104 StatusBarConnectedDisplays.assertInLegacyMode() 105 } 106 } 107