Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/StatusBarInitializerTest.kt +6 −0 Original line number Diff line number Diff line Loading @@ -26,11 +26,14 @@ import androidx.test.filters.SmallTest import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.fragments.FragmentHostManager import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.statusbar.data.repository.fakeStatusBarModePerDisplayRepository import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment import com.android.systemui.statusbar.phone.fragment.dagger.HomeStatusBarComponent import com.android.systemui.statusbar.pipeline.shared.ui.composable.StatusBarRootFactory import com.android.systemui.statusbar.window.StatusBarWindowController import com.android.systemui.statusbar.window.StatusBarWindowControllerStore import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlin.test.Test import org.junit.Assert.assertThrows Loading @@ -45,12 +48,14 @@ import org.mockito.kotlin.whenever @SmallTest @RunWith(AndroidJUnit4::class) class StatusBarInitializerTest : SysuiTestCase() { private val kosmos = testKosmos().useUnconfinedTestDispatcher() private val windowController = mock(StatusBarWindowController::class.java) private val windowControllerStore = mock(StatusBarWindowControllerStore::class.java) private val transaction = mock(FragmentTransaction::class.java) private val fragmentManager = mock(FragmentManager::class.java) private val fragmentHostManager = mock(FragmentHostManager::class.java) private val backgroundView = mock(ViewGroup::class.java) private val statusBarModePerDisplayRepository = kosmos.fakeStatusBarModePerDisplayRepository @Before fun setup() { Loading @@ -72,6 +77,7 @@ class StatusBarInitializerTest : SysuiTestCase() { statusBarRootFactory = mock(StatusBarRootFactory::class.java), componentFactory = mock(HomeStatusBarComponent.Factory::class.java), creationListeners = setOf(), statusBarModePerDisplayRepository = statusBarModePerDisplayRepository, ) @Test Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayStatusBarModeRepositoryStoreTest.kt 0 → 100644 +70 −0 Original line number Diff line number Diff line /* * 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.statusbar.data.repository import android.platform.test.annotations.EnableFlags import android.view.Display.DEFAULT_DISPLAY import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.display.data.repository.displayRepository import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.statusbar.core.StatusBarConnectedDisplays import com.android.systemui.testKosmos import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.kotlin.verify @SmallTest @RunWith(AndroidJUnit4::class) @EnableFlags(StatusBarConnectedDisplays.FLAG_NAME) class MultiDisplayStatusBarModeRepositoryStoreTest : SysuiTestCase() { private val kosmos = testKosmos().useUnconfinedTestDispatcher() private val testScope = kosmos.testScope private val fakeDisplayRepository = kosmos.displayRepository private val underTest by lazy { kosmos.multiDisplayStatusBarModeRepositoryStore } @Before fun start() { underTest.start() } @Before fun addDisplays() = runBlocking { fakeDisplayRepository.addDisplay(DEFAULT_DISPLAY) } @Test fun forDisplay_startsInstance() = testScope.runTest { val instance = underTest.forDisplay(DEFAULT_DISPLAY) verify(instance).start() } @Test fun displayRemoved_stopsInstance() = testScope.runTest { val instance = underTest.forDisplay(DEFAULT_DISPLAY) fakeDisplayRepository.removeDisplay(DEFAULT_DISPLAY) verify(instance).stop() } } packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt +15 −5 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import com.android.systemui.fragments.FragmentHostManager import com.android.systemui.res.R import com.android.systemui.statusbar.core.StatusBarInitializer.OnStatusBarViewInitializedListener import com.android.systemui.statusbar.core.StatusBarInitializer.OnStatusBarViewUpdatedListener import com.android.systemui.statusbar.data.repository.StatusBarModePerDisplayRepository import com.android.systemui.statusbar.phone.PhoneStatusBarTransitions import com.android.systemui.statusbar.phone.PhoneStatusBarView import com.android.systemui.statusbar.phone.PhoneStatusBarViewController Loading Loading @@ -71,7 +72,10 @@ interface StatusBarInitializer : CoreStartable { } interface Factory { fun create(statusBarWindowController: StatusBarWindowController): StatusBarInitializer fun create( statusBarWindowController: StatusBarWindowController, statusBarModePerDisplayRepository: StatusBarModePerDisplayRepository, ): StatusBarInitializer } } Loading @@ -79,6 +83,7 @@ class StatusBarInitializerImpl @AssistedInject constructor( @Assisted private val statusBarWindowController: StatusBarWindowController, @Assisted private val statusBarModePerDisplayRepository: StatusBarModePerDisplayRepository, private val collapsedStatusBarFragmentProvider: Provider<CollapsedStatusBarFragment>, private val statusBarRootFactory: StatusBarRootFactory, private val componentFactory: HomeStatusBarComponent.Factory, Loading Loading @@ -127,7 +132,7 @@ constructor( val phoneStatusBarView = cv.findViewById<PhoneStatusBarView>(R.id.status_bar) component = componentFactory.create(phoneStatusBarView).also { component -> // CollapsedStatusBarFragment used to be responsible initializting // CollapsedStatusBarFragment used to be responsible initializing component.init() statusBarViewUpdatedListener?.onStatusBarViewUpdated( Loading @@ -135,11 +140,15 @@ constructor( component.phoneStatusBarTransitions, ) if (StatusBarConnectedDisplays.isEnabled) { statusBarModePerDisplayRepository.onStatusBarViewInitialized(component) } else { creationListeners.forEach { listener -> listener.onStatusBarViewInitialized(component) } } } } // Add the new compose view to the hierarchy because we don't use fragment transactions // anymore Loading Loading @@ -184,7 +193,8 @@ constructor( @AssistedFactory interface Factory : StatusBarInitializer.Factory { override fun create( statusBarWindowController: StatusBarWindowController statusBarWindowController: StatusBarWindowController, statusBarModePerDisplayRepository: StatusBarModePerDisplayRepository, ): StatusBarInitializerImpl } } packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializerStore.kt +4 −1 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import com.android.systemui.display.data.repository.DisplayRepository import com.android.systemui.display.data.repository.PerDisplayStore import com.android.systemui.display.data.repository.PerDisplayStoreImpl import com.android.systemui.display.data.repository.SingleDisplayStore import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryStore import com.android.systemui.statusbar.window.StatusBarWindowControllerStore import javax.inject.Inject import kotlinx.coroutines.CoroutineScope Loading @@ -37,6 +38,7 @@ constructor( displayRepository: DisplayRepository, private val factory: StatusBarInitializer.Factory, private val statusBarWindowControllerStore: StatusBarWindowControllerStore, private val statusBarModeRepositoryStore: StatusBarModeRepositoryStore, ) : StatusBarInitializerStore, PerDisplayStoreImpl<StatusBarInitializer>(backgroundApplicationScope, displayRepository) { Loading @@ -47,7 +49,8 @@ constructor( override fun createInstanceForDisplay(displayId: Int): StatusBarInitializer { return factory.create( statusBarWindowController = statusBarWindowControllerStore.forDisplay(displayId) statusBarWindowController = statusBarWindowControllerStore.forDisplay(displayId), statusBarModePerDisplayRepository = statusBarModeRepositoryStore.forDisplay(displayId), ) } Loading packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModePerDisplayRepository.kt +14 −4 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ import android.view.WindowInsetsController.APPEARANCE_SEMI_TRANSPARENT_STATUS_BA import android.view.WindowInsetsController.Appearance import com.android.internal.statusbar.LetterboxDetails import com.android.internal.view.AppearanceRegion import com.android.systemui.Dumpable import com.android.systemui.CoreStartable import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.core.StatusBarInitializer.OnStatusBarViewInitializedListener Loading Loading @@ -59,7 +59,7 @@ import kotlinx.coroutines.flow.stateIn * Note: These status bar modes are status bar *window* states that are sent to us from * WindowManager, not determined internally. */ interface StatusBarModePerDisplayRepository { interface StatusBarModePerDisplayRepository : OnStatusBarViewInitializedListener, CoreStartable { /** * True if the status bar window is showing transiently and will disappear soon, and false * otherwise. ("Otherwise" in this case means the status bar is persistently hidden OR Loading Loading @@ -104,6 +104,12 @@ interface StatusBarModePerDisplayRepository { * determined internally instead. */ fun clearTransient() /** * Called when the [StatusBarModePerDisplayRepository] should stop doing any work and clean up * if needed. */ fun stop() } class StatusBarModePerDisplayRepositoryImpl Loading @@ -114,7 +120,7 @@ constructor( private val commandQueue: CommandQueue, private val letterboxAppearanceCalculator: LetterboxAppearanceCalculator, ongoingCallRepository: OngoingCallRepository, ) : StatusBarModePerDisplayRepository, OnStatusBarViewInitializedListener, Dumpable { ) : StatusBarModePerDisplayRepository { private val commandQueueCallback = object : CommandQueue.Callbacks { Loading Loading @@ -163,10 +169,14 @@ constructor( } } fun start() { override fun start() { commandQueue.addCallback(commandQueueCallback) } override fun stop() { commandQueue.removeCallback(commandQueueCallback) } private val _isTransientShown = MutableStateFlow(false) override val isTransientShown: StateFlow<Boolean> = _isTransientShown.asStateFlow() Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/StatusBarInitializerTest.kt +6 −0 Original line number Diff line number Diff line Loading @@ -26,11 +26,14 @@ import androidx.test.filters.SmallTest import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.fragments.FragmentHostManager import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.statusbar.data.repository.fakeStatusBarModePerDisplayRepository import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment import com.android.systemui.statusbar.phone.fragment.dagger.HomeStatusBarComponent import com.android.systemui.statusbar.pipeline.shared.ui.composable.StatusBarRootFactory import com.android.systemui.statusbar.window.StatusBarWindowController import com.android.systemui.statusbar.window.StatusBarWindowControllerStore import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlin.test.Test import org.junit.Assert.assertThrows Loading @@ -45,12 +48,14 @@ import org.mockito.kotlin.whenever @SmallTest @RunWith(AndroidJUnit4::class) class StatusBarInitializerTest : SysuiTestCase() { private val kosmos = testKosmos().useUnconfinedTestDispatcher() private val windowController = mock(StatusBarWindowController::class.java) private val windowControllerStore = mock(StatusBarWindowControllerStore::class.java) private val transaction = mock(FragmentTransaction::class.java) private val fragmentManager = mock(FragmentManager::class.java) private val fragmentHostManager = mock(FragmentHostManager::class.java) private val backgroundView = mock(ViewGroup::class.java) private val statusBarModePerDisplayRepository = kosmos.fakeStatusBarModePerDisplayRepository @Before fun setup() { Loading @@ -72,6 +77,7 @@ class StatusBarInitializerTest : SysuiTestCase() { statusBarRootFactory = mock(StatusBarRootFactory::class.java), componentFactory = mock(HomeStatusBarComponent.Factory::class.java), creationListeners = setOf(), statusBarModePerDisplayRepository = statusBarModePerDisplayRepository, ) @Test Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayStatusBarModeRepositoryStoreTest.kt 0 → 100644 +70 −0 Original line number Diff line number Diff line /* * 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.statusbar.data.repository import android.platform.test.annotations.EnableFlags import android.view.Display.DEFAULT_DISPLAY import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.display.data.repository.displayRepository import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.statusbar.core.StatusBarConnectedDisplays import com.android.systemui.testKosmos import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.kotlin.verify @SmallTest @RunWith(AndroidJUnit4::class) @EnableFlags(StatusBarConnectedDisplays.FLAG_NAME) class MultiDisplayStatusBarModeRepositoryStoreTest : SysuiTestCase() { private val kosmos = testKosmos().useUnconfinedTestDispatcher() private val testScope = kosmos.testScope private val fakeDisplayRepository = kosmos.displayRepository private val underTest by lazy { kosmos.multiDisplayStatusBarModeRepositoryStore } @Before fun start() { underTest.start() } @Before fun addDisplays() = runBlocking { fakeDisplayRepository.addDisplay(DEFAULT_DISPLAY) } @Test fun forDisplay_startsInstance() = testScope.runTest { val instance = underTest.forDisplay(DEFAULT_DISPLAY) verify(instance).start() } @Test fun displayRemoved_stopsInstance() = testScope.runTest { val instance = underTest.forDisplay(DEFAULT_DISPLAY) fakeDisplayRepository.removeDisplay(DEFAULT_DISPLAY) verify(instance).stop() } }
packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt +15 −5 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import com.android.systemui.fragments.FragmentHostManager import com.android.systemui.res.R import com.android.systemui.statusbar.core.StatusBarInitializer.OnStatusBarViewInitializedListener import com.android.systemui.statusbar.core.StatusBarInitializer.OnStatusBarViewUpdatedListener import com.android.systemui.statusbar.data.repository.StatusBarModePerDisplayRepository import com.android.systemui.statusbar.phone.PhoneStatusBarTransitions import com.android.systemui.statusbar.phone.PhoneStatusBarView import com.android.systemui.statusbar.phone.PhoneStatusBarViewController Loading Loading @@ -71,7 +72,10 @@ interface StatusBarInitializer : CoreStartable { } interface Factory { fun create(statusBarWindowController: StatusBarWindowController): StatusBarInitializer fun create( statusBarWindowController: StatusBarWindowController, statusBarModePerDisplayRepository: StatusBarModePerDisplayRepository, ): StatusBarInitializer } } Loading @@ -79,6 +83,7 @@ class StatusBarInitializerImpl @AssistedInject constructor( @Assisted private val statusBarWindowController: StatusBarWindowController, @Assisted private val statusBarModePerDisplayRepository: StatusBarModePerDisplayRepository, private val collapsedStatusBarFragmentProvider: Provider<CollapsedStatusBarFragment>, private val statusBarRootFactory: StatusBarRootFactory, private val componentFactory: HomeStatusBarComponent.Factory, Loading Loading @@ -127,7 +132,7 @@ constructor( val phoneStatusBarView = cv.findViewById<PhoneStatusBarView>(R.id.status_bar) component = componentFactory.create(phoneStatusBarView).also { component -> // CollapsedStatusBarFragment used to be responsible initializting // CollapsedStatusBarFragment used to be responsible initializing component.init() statusBarViewUpdatedListener?.onStatusBarViewUpdated( Loading @@ -135,11 +140,15 @@ constructor( component.phoneStatusBarTransitions, ) if (StatusBarConnectedDisplays.isEnabled) { statusBarModePerDisplayRepository.onStatusBarViewInitialized(component) } else { creationListeners.forEach { listener -> listener.onStatusBarViewInitialized(component) } } } } // Add the new compose view to the hierarchy because we don't use fragment transactions // anymore Loading Loading @@ -184,7 +193,8 @@ constructor( @AssistedFactory interface Factory : StatusBarInitializer.Factory { override fun create( statusBarWindowController: StatusBarWindowController statusBarWindowController: StatusBarWindowController, statusBarModePerDisplayRepository: StatusBarModePerDisplayRepository, ): StatusBarInitializerImpl } }
packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializerStore.kt +4 −1 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import com.android.systemui.display.data.repository.DisplayRepository import com.android.systemui.display.data.repository.PerDisplayStore import com.android.systemui.display.data.repository.PerDisplayStoreImpl import com.android.systemui.display.data.repository.SingleDisplayStore import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryStore import com.android.systemui.statusbar.window.StatusBarWindowControllerStore import javax.inject.Inject import kotlinx.coroutines.CoroutineScope Loading @@ -37,6 +38,7 @@ constructor( displayRepository: DisplayRepository, private val factory: StatusBarInitializer.Factory, private val statusBarWindowControllerStore: StatusBarWindowControllerStore, private val statusBarModeRepositoryStore: StatusBarModeRepositoryStore, ) : StatusBarInitializerStore, PerDisplayStoreImpl<StatusBarInitializer>(backgroundApplicationScope, displayRepository) { Loading @@ -47,7 +49,8 @@ constructor( override fun createInstanceForDisplay(displayId: Int): StatusBarInitializer { return factory.create( statusBarWindowController = statusBarWindowControllerStore.forDisplay(displayId) statusBarWindowController = statusBarWindowControllerStore.forDisplay(displayId), statusBarModePerDisplayRepository = statusBarModeRepositoryStore.forDisplay(displayId), ) } Loading
packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarModePerDisplayRepository.kt +14 −4 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ import android.view.WindowInsetsController.APPEARANCE_SEMI_TRANSPARENT_STATUS_BA import android.view.WindowInsetsController.Appearance import com.android.internal.statusbar.LetterboxDetails import com.android.internal.view.AppearanceRegion import com.android.systemui.Dumpable import com.android.systemui.CoreStartable import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.core.StatusBarInitializer.OnStatusBarViewInitializedListener Loading Loading @@ -59,7 +59,7 @@ import kotlinx.coroutines.flow.stateIn * Note: These status bar modes are status bar *window* states that are sent to us from * WindowManager, not determined internally. */ interface StatusBarModePerDisplayRepository { interface StatusBarModePerDisplayRepository : OnStatusBarViewInitializedListener, CoreStartable { /** * True if the status bar window is showing transiently and will disappear soon, and false * otherwise. ("Otherwise" in this case means the status bar is persistently hidden OR Loading Loading @@ -104,6 +104,12 @@ interface StatusBarModePerDisplayRepository { * determined internally instead. */ fun clearTransient() /** * Called when the [StatusBarModePerDisplayRepository] should stop doing any work and clean up * if needed. */ fun stop() } class StatusBarModePerDisplayRepositoryImpl Loading @@ -114,7 +120,7 @@ constructor( private val commandQueue: CommandQueue, private val letterboxAppearanceCalculator: LetterboxAppearanceCalculator, ongoingCallRepository: OngoingCallRepository, ) : StatusBarModePerDisplayRepository, OnStatusBarViewInitializedListener, Dumpable { ) : StatusBarModePerDisplayRepository { private val commandQueueCallback = object : CommandQueue.Callbacks { Loading Loading @@ -163,10 +169,14 @@ constructor( } } fun start() { override fun start() { commandQueue.addCallback(commandQueueCallback) } override fun stop() { commandQueue.removeCallback(commandQueueCallback) } private val _isTransientShown = MutableStateFlow(false) override val isTransientShown: StateFlow<Boolean> = _isTransientShown.asStateFlow() Loading