Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/MultiDisplayStatusBarStarterTest.kt +8 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mockito.kotlin.mock import org.mockito.kotlin.never import org.mockito.kotlin.verify Loading @@ -53,6 +54,8 @@ class MultiDisplayStatusBarStarterTest : SysuiTestCase() { private val fakeInitializerStore = kosmos.fakeStatusBarInitializerStore private val fakePrivacyDotStore = kosmos.fakePrivacyDotWindowControllerStore private val fakeLightBarStore = kosmos.fakeLightBarControllerStore private val fakeStatusBarIconRefreshPerDisplayRepository = kosmos.statusBarIconRefreshPerDisplayRepository // Lazy, so that @EnableFlags is set before initializer is instantiated. private val underTest by lazy { kosmos.multiDisplayStatusBarStarter } Loading Loading @@ -89,12 +92,17 @@ class MultiDisplayStatusBarStarterTest : SysuiTestCase() { @Test fun start_triggerAddDisplaySystemDecoration_startsOrchestratorForDisplay() = testScope.runTest { fakeStatusBarIconRefreshPerDisplayRepository.add(DISPLAY_2, mock()) underTest.start() runCurrent() assertThat(fakeStatusBarIconRefreshPerDisplayRepository[DISPLAY_2]).isNotNull() fakeDisplayRepository.triggerAddDisplaySystemDecorationEvent( displayId = DEFAULT_DISPLAY ) fakeDisplayRepository.addDisplay(DISPLAY_2) runCurrent() fakeDisplayRepository.triggerAddDisplaySystemDecorationEvent(displayId = DISPLAY_2) runCurrent() Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/StatusBarOrchestratorTest.kt +23 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,8 @@ import com.android.systemui.statusbar.data.model.StatusBarMode.LIGHTS_OUT_TRANSP import com.android.systemui.statusbar.data.model.StatusBarMode.OPAQUE import com.android.systemui.statusbar.data.model.StatusBarMode.TRANSPARENT import com.android.systemui.statusbar.data.repository.fakeStatusBarModePerDisplayRepository import com.android.systemui.statusbar.phone.ui.statusBarIconController import com.android.systemui.statusbar.policy.fakeConfigurationController import com.android.systemui.statusbar.window.data.repository.fakeStatusBarWindowStatePerDisplayRepository import com.android.systemui.statusbar.window.fakeStatusBarWindowController import com.android.systemui.statusbar.window.shared.model.StatusBarWindowState Loading @@ -48,6 +50,7 @@ import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.runTest import org.junit.Test import org.junit.runner.RunWith import org.mockito.kotlin.any import org.mockito.kotlin.never import org.mockito.kotlin.times import org.mockito.kotlin.verify Loading @@ -72,6 +75,7 @@ class StatusBarOrchestratorTest : SysuiTestCase() { private val fakeStatusBarWindowController = kosmos.fakeStatusBarWindowController private val fakeStatusBarInitializer = kosmos.fakeStatusBarInitializer private val dumpManager = kosmos.dumpManager private val statusBarIconRefreshInteractor = kosmos.statusBarIconRefreshInteractor private val orchestrator = kosmos.statusBarOrchestrator Loading Loading @@ -302,6 +306,25 @@ class StatusBarOrchestratorTest : SysuiTestCase() { verify(dumpManager).unregisterDumpable("StatusBarOrchestrator") } @Test fun start_densityChange_IconRefresh() { orchestrator.start() kosmos.fakeConfigurationController.notifyDensityOrFontScaleChanged() verify(kosmos.statusBarIconController).refreshIconGroups(any()) } @Test fun stop_densityChange_noIconRefresh() { orchestrator.start() orchestrator.stop() kosmos.fakeConfigurationController.notifyDensityOrFontScaleChanged() verify(kosmos.statusBarIconController, never()).refreshIconGroups(any()) } private fun putDeviceToSleep() { fakePowerRepository.updateWakefulness( rawState = WakefulnessState.ASLEEP, Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/domain/interactor/StatusBarIconRefreshInteractorTest.kt 0 → 100644 +60 −0 Original line number Diff line number Diff line /* * Copyright (C) 2025 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.statusbar.domain.interactor import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.statusbar.core.statusBarIconRefreshInteractor import com.android.systemui.statusbar.phone.ui.statusBarIconController import com.android.systemui.statusbar.policy.fakeConfigurationController import com.android.systemui.testKosmos import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito.verify import org.mockito.kotlin.any import org.mockito.kotlin.never @SmallTest @RunWith(AndroidJUnit4::class) class StatusBarIconRefreshInteractorTest : SysuiTestCase() { private val kosmos = testKosmos() private val fakeConfigurationController = kosmos.fakeConfigurationController private val mockIconController = kosmos.statusBarIconController private val underTest = kosmos.statusBarIconRefreshInteractor @Test fun start_propagatesConfigChanges() { underTest.start() fakeConfigurationController.notifyDensityOrFontScaleChanged() verify(mockIconController).refreshIconGroups(any()) } @Test fun stop_doesNotPropagatesConfigChanges() { underTest.start() underTest.stop() fakeConfigurationController.notifyDensityOrFontScaleChanged() verify(mockIconController, never()).refreshIconGroups(any()) } } packages/SystemUI/src/com/android/systemui/display/dagger/PerDisplayCommonModule.kt +2 −0 Original line number Diff line number Diff line Loading @@ -83,5 +83,7 @@ interface PerDisplayCommonModule { backgroundDispatcher + newTracingContext("DisplayScope(id=$displayId)") ) } @Provides @DisplayAware fun provideDisplayId(@DisplayId displayId: Int): Int = displayId } } packages/SystemUI/src/com/android/systemui/display/dagger/SystemUIDisplaySubcomponent.kt +6 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.systemui.display.dagger import com.android.systemui.display.dagger.SystemUIDisplaySubcomponent.PerDisplaySingleton import com.android.systemui.display.data.repository.DisplayStateRepository import com.android.systemui.display.domain.interactor.DisplayStateInteractor import com.android.systemui.statusbar.dagger.StatusBarPerDisplayModule import com.android.systemui.statusbar.domain.interactor.StatusBarIconRefreshInteractor import dagger.BindsInstance import dagger.Subcomponent import javax.inject.Qualifier Loading @@ -35,7 +37,7 @@ import kotlinx.coroutines.CoroutineScope * thread is not feasible as it would cause jank. */ @PerDisplaySingleton @Subcomponent(modules = [PerDisplayCommonModule::class]) @Subcomponent(modules = [PerDisplayCommonModule::class, StatusBarPerDisplayModule::class]) interface SystemUIDisplaySubcomponent { @get:DisplayAware val displayCoroutineScope: CoroutineScope Loading @@ -44,6 +46,8 @@ interface SystemUIDisplaySubcomponent { @get:DisplayAware val displayStateInteractor: DisplayStateInteractor @get:DisplayAware val statusBarIconRefreshInteractor: StatusBarIconRefreshInteractor @Subcomponent.Factory interface Factory { fun create(@BindsInstance @DisplayId displayId: Int): SystemUIDisplaySubcomponent Loading @@ -63,6 +67,7 @@ interface SystemUIDisplaySubcomponent { /** * Annotates the displaylib implementation of a class. * * TODO(b/408503553): Remove this annotation once the flag is cleaned up. */ @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class DisplayLib Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/MultiDisplayStatusBarStarterTest.kt +8 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mockito.kotlin.mock import org.mockito.kotlin.never import org.mockito.kotlin.verify Loading @@ -53,6 +54,8 @@ class MultiDisplayStatusBarStarterTest : SysuiTestCase() { private val fakeInitializerStore = kosmos.fakeStatusBarInitializerStore private val fakePrivacyDotStore = kosmos.fakePrivacyDotWindowControllerStore private val fakeLightBarStore = kosmos.fakeLightBarControllerStore private val fakeStatusBarIconRefreshPerDisplayRepository = kosmos.statusBarIconRefreshPerDisplayRepository // Lazy, so that @EnableFlags is set before initializer is instantiated. private val underTest by lazy { kosmos.multiDisplayStatusBarStarter } Loading Loading @@ -89,12 +92,17 @@ class MultiDisplayStatusBarStarterTest : SysuiTestCase() { @Test fun start_triggerAddDisplaySystemDecoration_startsOrchestratorForDisplay() = testScope.runTest { fakeStatusBarIconRefreshPerDisplayRepository.add(DISPLAY_2, mock()) underTest.start() runCurrent() assertThat(fakeStatusBarIconRefreshPerDisplayRepository[DISPLAY_2]).isNotNull() fakeDisplayRepository.triggerAddDisplaySystemDecorationEvent( displayId = DEFAULT_DISPLAY ) fakeDisplayRepository.addDisplay(DISPLAY_2) runCurrent() fakeDisplayRepository.triggerAddDisplaySystemDecorationEvent(displayId = DISPLAY_2) runCurrent() Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/StatusBarOrchestratorTest.kt +23 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,8 @@ import com.android.systemui.statusbar.data.model.StatusBarMode.LIGHTS_OUT_TRANSP import com.android.systemui.statusbar.data.model.StatusBarMode.OPAQUE import com.android.systemui.statusbar.data.model.StatusBarMode.TRANSPARENT import com.android.systemui.statusbar.data.repository.fakeStatusBarModePerDisplayRepository import com.android.systemui.statusbar.phone.ui.statusBarIconController import com.android.systemui.statusbar.policy.fakeConfigurationController import com.android.systemui.statusbar.window.data.repository.fakeStatusBarWindowStatePerDisplayRepository import com.android.systemui.statusbar.window.fakeStatusBarWindowController import com.android.systemui.statusbar.window.shared.model.StatusBarWindowState Loading @@ -48,6 +50,7 @@ import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.runTest import org.junit.Test import org.junit.runner.RunWith import org.mockito.kotlin.any import org.mockito.kotlin.never import org.mockito.kotlin.times import org.mockito.kotlin.verify Loading @@ -72,6 +75,7 @@ class StatusBarOrchestratorTest : SysuiTestCase() { private val fakeStatusBarWindowController = kosmos.fakeStatusBarWindowController private val fakeStatusBarInitializer = kosmos.fakeStatusBarInitializer private val dumpManager = kosmos.dumpManager private val statusBarIconRefreshInteractor = kosmos.statusBarIconRefreshInteractor private val orchestrator = kosmos.statusBarOrchestrator Loading Loading @@ -302,6 +306,25 @@ class StatusBarOrchestratorTest : SysuiTestCase() { verify(dumpManager).unregisterDumpable("StatusBarOrchestrator") } @Test fun start_densityChange_IconRefresh() { orchestrator.start() kosmos.fakeConfigurationController.notifyDensityOrFontScaleChanged() verify(kosmos.statusBarIconController).refreshIconGroups(any()) } @Test fun stop_densityChange_noIconRefresh() { orchestrator.start() orchestrator.stop() kosmos.fakeConfigurationController.notifyDensityOrFontScaleChanged() verify(kosmos.statusBarIconController, never()).refreshIconGroups(any()) } private fun putDeviceToSleep() { fakePowerRepository.updateWakefulness( rawState = WakefulnessState.ASLEEP, Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/domain/interactor/StatusBarIconRefreshInteractorTest.kt 0 → 100644 +60 −0 Original line number Diff line number Diff line /* * Copyright (C) 2025 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.statusbar.domain.interactor import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.statusbar.core.statusBarIconRefreshInteractor import com.android.systemui.statusbar.phone.ui.statusBarIconController import com.android.systemui.statusbar.policy.fakeConfigurationController import com.android.systemui.testKosmos import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito.verify import org.mockito.kotlin.any import org.mockito.kotlin.never @SmallTest @RunWith(AndroidJUnit4::class) class StatusBarIconRefreshInteractorTest : SysuiTestCase() { private val kosmos = testKosmos() private val fakeConfigurationController = kosmos.fakeConfigurationController private val mockIconController = kosmos.statusBarIconController private val underTest = kosmos.statusBarIconRefreshInteractor @Test fun start_propagatesConfigChanges() { underTest.start() fakeConfigurationController.notifyDensityOrFontScaleChanged() verify(mockIconController).refreshIconGroups(any()) } @Test fun stop_doesNotPropagatesConfigChanges() { underTest.start() underTest.stop() fakeConfigurationController.notifyDensityOrFontScaleChanged() verify(mockIconController, never()).refreshIconGroups(any()) } }
packages/SystemUI/src/com/android/systemui/display/dagger/PerDisplayCommonModule.kt +2 −0 Original line number Diff line number Diff line Loading @@ -83,5 +83,7 @@ interface PerDisplayCommonModule { backgroundDispatcher + newTracingContext("DisplayScope(id=$displayId)") ) } @Provides @DisplayAware fun provideDisplayId(@DisplayId displayId: Int): Int = displayId } }
packages/SystemUI/src/com/android/systemui/display/dagger/SystemUIDisplaySubcomponent.kt +6 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.systemui.display.dagger import com.android.systemui.display.dagger.SystemUIDisplaySubcomponent.PerDisplaySingleton import com.android.systemui.display.data.repository.DisplayStateRepository import com.android.systemui.display.domain.interactor.DisplayStateInteractor import com.android.systemui.statusbar.dagger.StatusBarPerDisplayModule import com.android.systemui.statusbar.domain.interactor.StatusBarIconRefreshInteractor import dagger.BindsInstance import dagger.Subcomponent import javax.inject.Qualifier Loading @@ -35,7 +37,7 @@ import kotlinx.coroutines.CoroutineScope * thread is not feasible as it would cause jank. */ @PerDisplaySingleton @Subcomponent(modules = [PerDisplayCommonModule::class]) @Subcomponent(modules = [PerDisplayCommonModule::class, StatusBarPerDisplayModule::class]) interface SystemUIDisplaySubcomponent { @get:DisplayAware val displayCoroutineScope: CoroutineScope Loading @@ -44,6 +46,8 @@ interface SystemUIDisplaySubcomponent { @get:DisplayAware val displayStateInteractor: DisplayStateInteractor @get:DisplayAware val statusBarIconRefreshInteractor: StatusBarIconRefreshInteractor @Subcomponent.Factory interface Factory { fun create(@BindsInstance @DisplayId displayId: Int): SystemUIDisplaySubcomponent Loading @@ -63,6 +67,7 @@ interface SystemUIDisplaySubcomponent { /** * Annotates the displaylib implementation of a class. * * TODO(b/408503553): Remove this annotation once the flag is cleaned up. */ @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class DisplayLib Loading