diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographer.kt index 6f8e5da70497e..4ebf33739faaa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographer.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographer.kt @@ -21,8 +21,9 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.util.ListenerSet import com.android.systemui.util.concurrency.DelayableExecutor +import dagger.Binds import dagger.Module -import dagger.Provides +import javax.inject.Inject /** * Choreographs evaluation resulting from multiple asynchronous sources. Specifically, it exposes @@ -46,22 +47,21 @@ interface NotifPipelineChoreographer { fun removeOnEvalListener(onEvalListener: Runnable) } +@Module(includes = [PrivateModule::class]) +object NotifPipelineChoreographerModule + @Module -object NotifPipelineChoreographerModule { - @Provides - @JvmStatic - @SysUISingleton - fun provideChoreographer( - choreographer: Choreographer, - @Main mainExecutor: DelayableExecutor - ): NotifPipelineChoreographer = NotifPipelineChoreographerImpl(choreographer, mainExecutor) +private interface PrivateModule { + @Binds + fun bindChoreographer(impl: NotifPipelineChoreographerImpl): NotifPipelineChoreographer } private const val TIMEOUT_MS: Long = 100 -private class NotifPipelineChoreographerImpl( +@SysUISingleton +private class NotifPipelineChoreographerImpl @Inject constructor( private val viewChoreographer: Choreographer, - private val executor: DelayableExecutor + @Main private val executor: DelayableExecutor ) : NotifPipelineChoreographer { private val listeners = ListenerSet() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt index 9c82cb64a0d76..72d091883ce60 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt @@ -30,29 +30,24 @@ import com.android.systemui.statusbar.notification.collection.coordinator.dagger import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Invalidator import com.android.systemui.statusbar.policy.KeyguardStateController +import dagger.Binds import dagger.Module -import dagger.Provides +import javax.inject.Inject + +@Module(includes = [PrivateModule::class]) +interface SensitiveContentCoordinatorModule @Module -object SensitiveContentCoordinatorModule { - @Provides - @JvmStatic - @CoordinatorScope - fun provideCoordinator( - dynamicPrivacyController: DynamicPrivacyController, - lockscreenUserManager: NotificationLockscreenUserManager, - keyguardUpdateMonitor: KeyguardUpdateMonitor, - statusBarStateController: StatusBarStateController, - keyguardStateController: KeyguardStateController - ): SensitiveContentCoordinator = - SensitiveContentCoordinatorImpl(dynamicPrivacyController, lockscreenUserManager, - keyguardUpdateMonitor, statusBarStateController, keyguardStateController) +private interface PrivateModule { + @Binds + fun bindCoordinator(impl: SensitiveContentCoordinatorImpl): SensitiveContentCoordinator } /** Coordinates re-inflation and post-processing of sensitive notification content. */ interface SensitiveContentCoordinator : Coordinator -private class SensitiveContentCoordinatorImpl( +@CoordinatorScope +private class SensitiveContentCoordinatorImpl @Inject constructor( private val dynamicPrivacyController: DynamicPrivacyController, private val lockscreenUserManager: NotificationLockscreenUserManager, private val keyguardUpdateMonitor: KeyguardUpdateMonitor, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographerTest.kt index 3820b98ab632b..3b908b4175f98 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographerTest.kt @@ -20,10 +20,14 @@ import android.testing.AndroidTestingRunner import android.view.Choreographer import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.util.concurrency.DelayableExecutor import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.withArgCaptor +import dagger.BindsInstance +import dagger.Component import org.junit.Assert.assertTrue import org.junit.Test import org.junit.runner.RunWith @@ -41,8 +45,10 @@ class NotifPipelineChoreographerTest : SysuiTestCase() { whenever(it.executeDelayed(any(), anyLong())).thenReturn(timeoueSubscription) } - val pipelineChoreographer: NotifPipelineChoreographer = NotifPipelineChoreographerModule - .provideChoreographer(viewChoreographer, executor) + val pipelineChoreographer: NotifPipelineChoreographer = + DaggerNotifPipelineChoreographerTestComponent.factory() + .create(viewChoreographer, executor) + .choreographer @Test fun scheduleThenEvalFrameCallback() { @@ -97,4 +103,19 @@ class NotifPipelineChoreographerTest : SysuiTestCase() { verify(viewChoreographer).removeFrameCallback(frameCallback) verify(timeoueSubscription).run() } +} + +@SysUISingleton +@Component(modules = [NotifPipelineChoreographerModule::class]) +interface NotifPipelineChoreographerTestComponent { + + val choreographer: NotifPipelineChoreographer + + @Component.Factory + interface Factory { + fun create( + @BindsInstance viewChoreographer: Choreographer, + @BindsInstance @Main executor: DelayableExecutor + ): NotifPipelineChoreographerTestComponent + } } \ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinatorTest.kt index 3f84c161db200..a2d8e3ddba24d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinatorTest.kt @@ -28,13 +28,16 @@ import com.android.systemui.statusbar.notification.DynamicPrivacyController import com.android.systemui.statusbar.notification.collection.ListEntry import com.android.systemui.statusbar.notification.collection.NotifPipeline import com.android.systemui.statusbar.notification.collection.NotificationEntry +import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Invalidator import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable import com.android.systemui.statusbar.policy.KeyguardStateController -import com.android.systemui.util.mockito.withArgCaptor import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.mock +import com.android.systemui.util.mockito.withArgCaptor +import dagger.BindsInstance +import dagger.Component import org.junit.Test import org.mockito.Mockito.never import org.mockito.Mockito.verify @@ -50,9 +53,16 @@ class SensitiveContentCoordinatorTest : SysuiTestCase() { val statusBarStateController: StatusBarStateController = mock() val keyguardStateController: KeyguardStateController = mock() - val coordinator: SensitiveContentCoordinator = SensitiveContentCoordinatorModule - .provideCoordinator(dynamicPrivacyController, lockscreenUserManager, - keyguardUpdateMonitor, statusBarStateController, keyguardStateController) + val coordinator: SensitiveContentCoordinator = + DaggerTestSensitiveContentCoordinatorComponent + .factory() + .create( + dynamicPrivacyController, + lockscreenUserManager, + keyguardUpdateMonitor, + statusBarStateController, + keyguardStateController) + .coordinator @Test fun onDynamicPrivacyChanged_invokeInvalidationListener() { @@ -238,4 +248,21 @@ class SensitiveContentCoordinatorTest : SysuiTestCase() { override fun getRepresentativeEntry(): NotificationEntry = mockEntry } } +} + +@CoordinatorScope +@Component(modules = [SensitiveContentCoordinatorModule::class]) +interface TestSensitiveContentCoordinatorComponent { + val coordinator: SensitiveContentCoordinator + + @Component.Factory + interface Factory { + fun create( + @BindsInstance dynamicPrivacyController: DynamicPrivacyController, + @BindsInstance lockscreenUserManager: NotificationLockscreenUserManager, + @BindsInstance keyguardUpdateMonitor: KeyguardUpdateMonitor, + @BindsInstance statusBarStateController: StatusBarStateController, + @BindsInstance keyguardStateController: KeyguardStateController + ): TestSensitiveContentCoordinatorComponent + } } \ No newline at end of file