Loading packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt +8 −4 Original line number Diff line number Diff line Loading @@ -522,14 +522,18 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { } @Test fun factoryResetProtectionActive_isNotVisible() = fun deviceProvisioningAndFactoryResetProtection() = testScope.runTest { val isVisible by collectLastValue(sceneContainerViewModel.isVisible) assertThat(isVisible).isTrue() kosmos.fakeDeviceProvisioningRepository.setFactoryResetProtectionActive(isActive = true) kosmos.fakeDeviceProvisioningRepository.setDeviceProvisioned(false) kosmos.fakeDeviceProvisioningRepository.setFactoryResetProtectionActive(true) assertThat(isVisible).isFalse() kosmos.fakeDeviceProvisioningRepository.setFactoryResetProtectionActive(false) assertThat(isVisible).isFalse() kosmos.fakeDeviceProvisioningRepository.setDeviceProvisioned(true) assertThat(isVisible).isTrue() } /** Loading packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt +31 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.scene.shared.model.SceneModel import com.android.systemui.statusbar.NotificationShadeWindowController import com.android.systemui.statusbar.pipeline.mobile.data.repository.fakeMobileConnectionsRepository import com.android.systemui.statusbar.policy.data.repository.fakeDeviceProvisioningRepository import com.android.systemui.statusbar.policy.domain.interactor.deviceProvisioningInteractor import com.android.systemui.testKosmos import com.android.systemui.util.mockito.mock Loading Loading @@ -163,6 +164,30 @@ class SceneContainerStartableTest : SysuiTestCase() { assertThat(isVisible).isFalse() } @Test fun hydrateVisibility_basedOnDeviceProvisioningAndFactoryResetProtection() = testScope.runTest { val isVisible by collectLastValue(sceneInteractor.isVisible) prepareState( isDeviceUnlocked = true, initialSceneKey = SceneKey.Lockscreen, isDeviceProvisioned = false, isFrpActive = true, ) underTest.start() assertThat(isVisible).isFalse() kosmos.fakeDeviceProvisioningRepository.setFactoryResetProtectionActive(false) assertThat(isVisible).isFalse() kosmos.fakeDeviceProvisioningRepository.setDeviceProvisioned(true) assertThat(isVisible).isTrue() kosmos.fakeDeviceProvisioningRepository.setFactoryResetProtectionActive(true) assertThat(isVisible).isFalse() } @Test fun startsInLockscreenScene() = testScope.runTest { Loading Loading @@ -745,6 +770,8 @@ class SceneContainerStartableTest : SysuiTestCase() { authenticationMethod: AuthenticationMethodModel? = null, isLockscreenEnabled: Boolean = true, startsAwake: Boolean = true, isDeviceProvisioned: Boolean = true, isFrpActive: Boolean = false, ): MutableStateFlow<ObservableTransitionState> { if (authenticationMethod?.isSecure == true) { assert(isLockscreenEnabled) { Loading Loading @@ -781,6 +808,10 @@ class SceneContainerStartableTest : SysuiTestCase() { } else { powerInteractor.setAsleepForTest() } kosmos.fakeDeviceProvisioningRepository.setDeviceProvisioned(isDeviceProvisioned) kosmos.fakeDeviceProvisioningRepository.setFactoryResetProtectionActive(isFrpActive) runCurrent() return transitionStateFlow Loading packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt +12 −5 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChangedBy import kotlinx.coroutines.flow.emptyFlow Loading Loading @@ -115,11 +116,15 @@ constructor( private fun hydrateVisibility() { applicationScope.launch { // TODO(b/296114544): Combine with some global hun state to make it visible! deviceProvisioningInteractor.isFactoryResetProtectionActive .flatMapLatest { isFrpActive -> if (isFrpActive) { flowOf(false to "Factory Reset Protection is active") } else { combine( deviceProvisioningInteractor.isDeviceProvisioned, deviceProvisioningInteractor.isFactoryResetProtectionActive, ) { isDeviceProvisioned, isFrpActive -> isDeviceProvisioned && !isFrpActive } .distinctUntilChanged() .flatMapLatest { isAllowedToBeVisible -> if (isAllowedToBeVisible) { sceneInteractor.transitionState .mapNotNull { state -> when (state) { Loading @@ -140,6 +145,8 @@ constructor( } } .distinctUntilChanged() } else { flowOf(false to "Device not provisioned or Factory Reset Protection active") } } .collect { (isVisible, loggingReason) -> Loading packages/SystemUI/src/com/android/systemui/shade/ShadeControllerSceneImpl.kt +9 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.view.MotionEvent import com.android.systemui.assist.AssistManager import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor import com.android.systemui.log.LogBuffer import com.android.systemui.log.dagger.ShadeTouchLog Loading @@ -34,11 +35,13 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import dagger.Lazy import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.withContext /** * Implementation of ShadeController backed by scenes instead of NPVC. Loading @@ -50,6 +53,7 @@ import kotlinx.coroutines.launch class ShadeControllerSceneImpl @Inject constructor( @Main private val mainDispatcher: CoroutineDispatcher, @Background private val scope: CoroutineScope, private val shadeInteractor: ShadeInteractor, private val sceneInteractor: SceneInteractor, Loading Loading @@ -193,7 +197,11 @@ constructor( } override fun setVisibilityListener(listener: ShadeVisibilityListener) { scope.launch { sceneInteractor.isVisible.collect { listener.expandedVisibleChanged(it) } } scope.launch { sceneInteractor.isVisible.collect { isVisible -> withContext(mainDispatcher) { listener.expandedVisibleChanged(isVisible) } } } } @ExperimentalCoroutinesApi Loading packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeControllerKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import com.android.systemui.concurrency.fakeExecutor import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.kosmos.testDispatcher import com.android.systemui.log.LogBuffer import com.android.systemui.plugins.statusbar.statusBarStateController import com.android.systemui.scene.domain.interactor.sceneInteractor Loading @@ -44,6 +45,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.shadeControllerSceneImpl by Kosmos.Fixture { ShadeControllerSceneImpl( mainDispatcher = testDispatcher, scope = applicationCoroutineScope, shadeInteractor = shadeInteractor, sceneInteractor = sceneInteractor, Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt +8 −4 Original line number Diff line number Diff line Loading @@ -522,14 +522,18 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { } @Test fun factoryResetProtectionActive_isNotVisible() = fun deviceProvisioningAndFactoryResetProtection() = testScope.runTest { val isVisible by collectLastValue(sceneContainerViewModel.isVisible) assertThat(isVisible).isTrue() kosmos.fakeDeviceProvisioningRepository.setFactoryResetProtectionActive(isActive = true) kosmos.fakeDeviceProvisioningRepository.setDeviceProvisioned(false) kosmos.fakeDeviceProvisioningRepository.setFactoryResetProtectionActive(true) assertThat(isVisible).isFalse() kosmos.fakeDeviceProvisioningRepository.setFactoryResetProtectionActive(false) assertThat(isVisible).isFalse() kosmos.fakeDeviceProvisioningRepository.setDeviceProvisioned(true) assertThat(isVisible).isTrue() } /** Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt +31 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.scene.shared.model.SceneModel import com.android.systemui.statusbar.NotificationShadeWindowController import com.android.systemui.statusbar.pipeline.mobile.data.repository.fakeMobileConnectionsRepository import com.android.systemui.statusbar.policy.data.repository.fakeDeviceProvisioningRepository import com.android.systemui.statusbar.policy.domain.interactor.deviceProvisioningInteractor import com.android.systemui.testKosmos import com.android.systemui.util.mockito.mock Loading Loading @@ -163,6 +164,30 @@ class SceneContainerStartableTest : SysuiTestCase() { assertThat(isVisible).isFalse() } @Test fun hydrateVisibility_basedOnDeviceProvisioningAndFactoryResetProtection() = testScope.runTest { val isVisible by collectLastValue(sceneInteractor.isVisible) prepareState( isDeviceUnlocked = true, initialSceneKey = SceneKey.Lockscreen, isDeviceProvisioned = false, isFrpActive = true, ) underTest.start() assertThat(isVisible).isFalse() kosmos.fakeDeviceProvisioningRepository.setFactoryResetProtectionActive(false) assertThat(isVisible).isFalse() kosmos.fakeDeviceProvisioningRepository.setDeviceProvisioned(true) assertThat(isVisible).isTrue() kosmos.fakeDeviceProvisioningRepository.setFactoryResetProtectionActive(true) assertThat(isVisible).isFalse() } @Test fun startsInLockscreenScene() = testScope.runTest { Loading Loading @@ -745,6 +770,8 @@ class SceneContainerStartableTest : SysuiTestCase() { authenticationMethod: AuthenticationMethodModel? = null, isLockscreenEnabled: Boolean = true, startsAwake: Boolean = true, isDeviceProvisioned: Boolean = true, isFrpActive: Boolean = false, ): MutableStateFlow<ObservableTransitionState> { if (authenticationMethod?.isSecure == true) { assert(isLockscreenEnabled) { Loading Loading @@ -781,6 +808,10 @@ class SceneContainerStartableTest : SysuiTestCase() { } else { powerInteractor.setAsleepForTest() } kosmos.fakeDeviceProvisioningRepository.setDeviceProvisioned(isDeviceProvisioned) kosmos.fakeDeviceProvisioningRepository.setFactoryResetProtectionActive(isFrpActive) runCurrent() return transitionStateFlow Loading
packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt +12 −5 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChangedBy import kotlinx.coroutines.flow.emptyFlow Loading Loading @@ -115,11 +116,15 @@ constructor( private fun hydrateVisibility() { applicationScope.launch { // TODO(b/296114544): Combine with some global hun state to make it visible! deviceProvisioningInteractor.isFactoryResetProtectionActive .flatMapLatest { isFrpActive -> if (isFrpActive) { flowOf(false to "Factory Reset Protection is active") } else { combine( deviceProvisioningInteractor.isDeviceProvisioned, deviceProvisioningInteractor.isFactoryResetProtectionActive, ) { isDeviceProvisioned, isFrpActive -> isDeviceProvisioned && !isFrpActive } .distinctUntilChanged() .flatMapLatest { isAllowedToBeVisible -> if (isAllowedToBeVisible) { sceneInteractor.transitionState .mapNotNull { state -> when (state) { Loading @@ -140,6 +145,8 @@ constructor( } } .distinctUntilChanged() } else { flowOf(false to "Device not provisioned or Factory Reset Protection active") } } .collect { (isVisible, loggingReason) -> Loading
packages/SystemUI/src/com/android/systemui/shade/ShadeControllerSceneImpl.kt +9 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.view.MotionEvent import com.android.systemui.assist.AssistManager import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor import com.android.systemui.log.LogBuffer import com.android.systemui.log.dagger.ShadeTouchLog Loading @@ -34,11 +35,13 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import dagger.Lazy import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.withContext /** * Implementation of ShadeController backed by scenes instead of NPVC. Loading @@ -50,6 +53,7 @@ import kotlinx.coroutines.launch class ShadeControllerSceneImpl @Inject constructor( @Main private val mainDispatcher: CoroutineDispatcher, @Background private val scope: CoroutineScope, private val shadeInteractor: ShadeInteractor, private val sceneInteractor: SceneInteractor, Loading Loading @@ -193,7 +197,11 @@ constructor( } override fun setVisibilityListener(listener: ShadeVisibilityListener) { scope.launch { sceneInteractor.isVisible.collect { listener.expandedVisibleChanged(it) } } scope.launch { sceneInteractor.isVisible.collect { isVisible -> withContext(mainDispatcher) { listener.expandedVisibleChanged(isVisible) } } } } @ExperimentalCoroutinesApi Loading
packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeControllerKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import com.android.systemui.concurrency.fakeExecutor import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.kosmos.testDispatcher import com.android.systemui.log.LogBuffer import com.android.systemui.plugins.statusbar.statusBarStateController import com.android.systemui.scene.domain.interactor.sceneInteractor Loading @@ -44,6 +45,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.shadeControllerSceneImpl by Kosmos.Fixture { ShadeControllerSceneImpl( mainDispatcher = testDispatcher, scope = applicationCoroutineScope, shadeInteractor = shadeInteractor, sceneInteractor = sceneInteractor, Loading