Make SysUICutoutProvider a @PerDisplaySingleton

Test: atest SystemUITests
Test: Build and run SystemUI
Fixes: 431942810
Flag: EXEMPT dagger change that can't be flagged
Change-Id: Ifc2ec8fa2dfd75f111dd3a9f27dcaeb234c3b3a0
diff --git a/packages/SystemUI/src/com/android/systemui/SysUICutoutProvider.kt b/packages/SystemUI/src/com/android/systemui/SysUICutoutProvider.kt
index b4cb103..5313672 100644
--- a/packages/SystemUI/src/com/android/systemui/SysUICutoutProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/SysUICutoutProvider.kt
@@ -21,10 +21,9 @@
 import android.util.RotationUtils
 import android.view.Display
 import android.view.DisplayCutout
+import com.android.systemui.display.dagger.SystemUIDisplaySubcomponent.PerDisplaySingleton
 import com.android.systemui.display.naturalBounds
-import dagger.assisted.Assisted
-import dagger.assisted.AssistedFactory
-import dagger.assisted.AssistedInject
+import javax.inject.Inject
 
 interface SysUICutoutProvider {
 
@@ -37,11 +36,12 @@
     fun cutoutInfoForCurrentDisplayAndRotation(): SysUICutoutInformation?
 }
 
+@PerDisplaySingleton
 class SysUICutoutProviderImpl
-@AssistedInject
+@Inject
 constructor(
-    @Assisted private val context: Context,
-    @Assisted private val cameraProtectionLoader: CameraProtectionLoader,
+    private val context: Context,
+    private val cameraProtectionLoader: CameraProtectionLoader,
 ) : SysUICutoutProvider {
 
     private val cameraProtectionList by lazy {
@@ -81,12 +81,4 @@
         )
         return rotatedBoundsOut
     }
-
-    @AssistedFactory
-    interface Factory {
-        fun create(
-            context: Context,
-            cameraProtectionLoader: CameraProtectionLoader,
-        ): SysUICutoutProviderImpl
-    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/display/dagger/PerDisplayCommonModule.kt b/packages/SystemUI/src/com/android/systemui/display/dagger/PerDisplayCommonModule.kt
index edb4f1e..9c264b2 100644
--- a/packages/SystemUI/src/com/android/systemui/display/dagger/PerDisplayCommonModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/display/dagger/PerDisplayCommonModule.kt
@@ -19,6 +19,10 @@
 import android.content.Context
 import android.view.Display
 import com.android.app.displaylib.DisplayRepository
+import com.android.systemui.CameraProtectionLoader
+import com.android.systemui.CameraProtectionLoaderImpl
+import com.android.systemui.SysUICutoutProvider
+import com.android.systemui.SysUICutoutProviderImpl
 import com.android.systemui.coroutines.newTracingContext
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.dagger.qualifiers.Background
@@ -69,10 +73,22 @@
     @DisplayAware
     fun sysUiDarkIconDispatcher(impl: DarkIconDispatcherImpl): SysuiDarkIconDispatcher
 
+    @Binds @DisplayAware fun sysUICutoutProvider(impl: SysUICutoutProviderImpl): SysUICutoutProvider
+
     companion object {
 
         @Provides
         @PerDisplaySingleton
+        @DisplayAware
+        fun cameraProtectionLoader(
+            factory: CameraProtectionLoaderImpl.Factory,
+            @DisplayAware context: Context,
+        ): CameraProtectionLoader {
+            return factory.create(context)
+        }
+
+        @Provides
+        @PerDisplaySingleton
         fun provideDisplay(
             @DisplayId displayId: Int,
             displayRepository: DisplayRepository,
diff --git a/packages/SystemUI/src/com/android/systemui/display/dagger/SystemUIDisplaySubcomponent.kt b/packages/SystemUI/src/com/android/systemui/display/dagger/SystemUIDisplaySubcomponent.kt
index 79e3e93..500e189 100644
--- a/packages/SystemUI/src/com/android/systemui/display/dagger/SystemUIDisplaySubcomponent.kt
+++ b/packages/SystemUI/src/com/android/systemui/display/dagger/SystemUIDisplaySubcomponent.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.display.dagger
 
+import com.android.systemui.SysUICutoutProvider
 import com.android.systemui.common.ui.ConfigurationState
 import com.android.systemui.display.dagger.SystemUIDisplaySubcomponent.PerDisplaySingleton
 import com.android.systemui.display.data.repository.DisplayStateRepository
@@ -67,6 +68,8 @@
 
     @get:DisplayAware val configurationState: ConfigurationState
 
+    @get:DisplayAware val sysUICutoutProvider: SysUICutoutProvider
+
     @Subcomponent.Factory
     interface Factory {
         fun create(@BindsInstance @DisplayId displayId: Int): SystemUIDisplaySubcomponent
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt
index ddf0691..ba7da57 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt
@@ -19,12 +19,11 @@
 import android.content.Context
 import android.view.Display
 import android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR
-import com.android.systemui.CameraProtectionLoader
+import com.android.app.displaylib.PerDisplayRepository
 import com.android.systemui.CoreStartable
-import com.android.systemui.SysUICutoutProvider
-import com.android.systemui.SysUICutoutProviderImpl
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.display.dagger.SystemUIDisplaySubcomponent
 import com.android.systemui.display.data.repository.DisplayWindowPropertiesRepositoryImpl
 import com.android.systemui.log.LogBuffer
 import com.android.systemui.log.LogBufferFactory
@@ -181,23 +180,18 @@
 
         @Provides
         @SysUISingleton
-        fun sysUiCutoutProvider(
-            factory: SysUICutoutProviderImpl.Factory,
-            context: Context,
-            cameraProtectionLoader: CameraProtectionLoader,
-        ): SysUICutoutProvider {
-            return factory.create(context, cameraProtectionLoader)
-        }
-
-        @Provides
-        @SysUISingleton
         fun contentInsetsProvider(
             factory: StatusBarContentInsetsProviderImpl.Factory,
             context: Context,
             configurationController: ConfigurationController,
-            sysUICutoutProvider: SysUICutoutProvider,
+            displaySubcomponentRepo: PerDisplayRepository<SystemUIDisplaySubcomponent>,
         ): StatusBarContentInsetsProvider {
-            return factory.create(context, configurationController, sysUICutoutProvider)
+            val displaySubcomponent = displaySubcomponentRepo[Display.DEFAULT_DISPLAY]!!
+            return factory.create(
+                context,
+                configurationController,
+                displaySubcomponent.sysUICutoutProvider,
+            )
         }
 
         @Provides
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStore.kt
index 3cd4b5c..807c269 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStore.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStore.kt
@@ -17,11 +17,11 @@
 package com.android.systemui.statusbar.data.repository
 
 import android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR
-import com.android.systemui.CameraProtectionLoaderImpl
+import com.android.app.displaylib.PerDisplayRepository
 import com.android.systemui.CoreStartable
-import com.android.systemui.SysUICutoutProviderImpl
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.display.dagger.SystemUIDisplaySubcomponent
 import com.android.systemui.display.data.repository.DisplayRepository
 import com.android.systemui.display.data.repository.DisplayWindowPropertiesRepository
 import com.android.systemui.display.data.repository.PerDisplayStore
@@ -49,8 +49,7 @@
     private val factory: StatusBarContentInsetsProviderImpl.Factory,
     private val displayWindowPropertiesRepository: DisplayWindowPropertiesRepository,
     private val statusBarConfigurationControllerStore: StatusBarConfigurationControllerStore,
-    private val sysUICutoutProviderFactory: SysUICutoutProviderImpl.Factory,
-    private val cameraProtectionLoaderFactory: CameraProtectionLoaderImpl.Factory,
+    private val displaySubcomponentRepo: PerDisplayRepository<SystemUIDisplaySubcomponent>,
 ) :
     StatusBarContentInsetsProviderStore,
     StatusBarPerDisplayStoreImpl<StatusBarContentInsetsProvider>(
@@ -64,13 +63,9 @@
         val context = displayWindowProperties.context
         val configurationController =
             statusBarConfigurationControllerStore.forDisplay(displayId) ?: return null
-        val cameraProtectionLoader = cameraProtectionLoaderFactory.create(context)
+        val displaySubcomponent = displaySubcomponentRepo[displayId] ?: return null
         return factory
-            .create(
-                context,
-                configurationController,
-                sysUICutoutProviderFactory.create(context, cameraProtectionLoader),
-            )
+            .create(context, configurationController, displaySubcomponent.sysUICutoutProvider)
             .also { it.start() }
     }
 
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/FakeSysUICutoutProviderFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/FakeSysUICutoutProviderFactory.kt
deleted file mode 100644
index 4eb3780..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/FakeSysUICutoutProviderFactory.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui
-
-import android.content.Context
-import org.mockito.kotlin.mock
-
-class FakeSysUICutoutProviderFactory : SysUICutoutProviderImpl.Factory {
-
-    override fun create(
-        context: Context,
-        cameraProtectionLoader: CameraProtectionLoader,
-    ): SysUICutoutProviderImpl {
-        return mock<SysUICutoutProviderImpl>()
-    }
-}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/SysUICutoutProviderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/SysUICutoutProviderKosmos.kt
deleted file mode 100644
index 412ed72..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/SysUICutoutProviderKosmos.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui
-
-import com.android.systemui.kosmos.Kosmos
-
-val Kosmos.fakeSysUICutoutProviderFactory by Kosmos.Fixture { FakeSysUICutoutProviderFactory() }
-
-var Kosmos.sysUICutoutProviderFactory: SysUICutoutProviderImpl.Factory by
-    Kosmos.Fixture { fakeSysUICutoutProviderFactory }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/DisplayRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/DisplayRepositoryKosmos.kt
index 5cf3c00..b7d801e 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/DisplayRepositoryKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/DisplayRepositoryKosmos.kt
@@ -22,6 +22,7 @@
 import android.view.Display
 import android.view.mockIWindowManager
 import com.android.app.displaylib.fakes.FakePerDisplayRepository
+import com.android.systemui.SysUICutoutProvider
 import com.android.systemui.common.ui.ConfigurationState
 import com.android.systemui.common.ui.configurationState
 import com.android.systemui.display.dagger.SystemUIDisplaySubcomponent
@@ -104,6 +105,9 @@
         override val configurationState: ConfigurationState
             get() = configurationState
 
+        override val sysUICutoutProvider: SysUICutoutProvider
+            get() = mock<SysUICutoutProvider>()
+
         override val homeStatusBarComponentFactory: HomeStatusBarComponent.Factory
             get() = mock<HomeStatusBarComponent.Factory>()
 
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStoreKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStoreKosmos.kt
index af7a463..5e22a65 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStoreKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStoreKosmos.kt
@@ -16,13 +16,12 @@
 
 package com.android.systemui.statusbar.data.repository
 
-import com.android.systemui.cameraProtectionLoaderFactory
 import com.android.systemui.display.data.repository.displayRepository
+import com.android.systemui.display.data.repository.displaySubcomponentPerDisplayRepository
 import com.android.systemui.display.data.repository.displayWindowPropertiesRepository
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.applicationCoroutineScope
 import com.android.systemui.statusbar.layout.statusBarContentInsetsProviderFactory
-import com.android.systemui.sysUICutoutProviderFactory
 
 val Kosmos.fakeStatusBarContentInsetsProviderStore by
     Kosmos.Fixture { FakeStatusBarContentInsetsProviderStore() }
@@ -35,8 +34,7 @@
             statusBarContentInsetsProviderFactory,
             displayWindowPropertiesRepository,
             statusBarConfigurationControllerStore,
-            sysUICutoutProviderFactory,
-            cameraProtectionLoaderFactory,
+            displaySubcomponentPerDisplayRepository,
         )
     }