diff options
3 files changed, 93 insertions, 14 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt index 779e79ed80c9..0f8f1a216f3f 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt @@ -20,9 +20,9 @@ import android.app.smartspace.SmartspaceTarget import android.appwidget.AppWidgetProviderInfo import android.content.pm.UserInfo import android.os.UserHandle +import android.platform.test.flag.junit.FlagsParameterization import android.provider.Settings import android.widget.RemoteViews -import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.Flags.FLAG_COMMUNAL_HUB import com.android.systemui.SysuiTestCase @@ -41,6 +41,7 @@ import com.android.systemui.communal.ui.viewmodel.CommunalViewModel.Companion.PO import com.android.systemui.coroutines.collectLastValue import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor import com.android.systemui.flags.Flags.COMMUNAL_SERVICE_ENABLED +import com.android.systemui.flags.andSceneContainer import com.android.systemui.flags.fakeFeatureFlagsClassic import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository @@ -50,8 +51,9 @@ import com.android.systemui.log.logcatLogBuffer import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager import com.android.systemui.media.controls.ui.view.MediaHost import com.android.systemui.settings.fakeUserTracker -import com.android.systemui.shade.data.repository.fakeShadeRepository +import com.android.systemui.shade.ShadeTestUtil import com.android.systemui.shade.domain.interactor.shadeInteractor +import com.android.systemui.shade.shadeTestUtil import com.android.systemui.smartspace.data.repository.FakeSmartspaceRepository import com.android.systemui.smartspace.data.repository.fakeSmartspaceRepository import com.android.systemui.testKosmos @@ -70,11 +72,13 @@ import org.mockito.Mock import org.mockito.Mockito import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations +import platform.test.runner.parameterized.ParameterizedAndroidJunit4 +import platform.test.runner.parameterized.Parameters @OptIn(ExperimentalCoroutinesApi::class) @SmallTest -@RunWith(AndroidJUnit4::class) -class CommunalViewModelTest : SysuiTestCase() { +@RunWith(ParameterizedAndroidJunit4::class) +class CommunalViewModelTest(flags: FlagsParameterization?) : SysuiTestCase() { @Mock private lateinit var mediaHost: MediaHost @Mock private lateinit var user: UserInfo @Mock private lateinit var providerInfo: AppWidgetProviderInfo @@ -88,9 +92,14 @@ class CommunalViewModelTest : SysuiTestCase() { private lateinit var smartspaceRepository: FakeSmartspaceRepository private lateinit var mediaRepository: FakeCommunalMediaRepository private lateinit var userRepository: FakeUserRepository + private lateinit var shadeTestUtil: ShadeTestUtil private lateinit var underTest: CommunalViewModel + init { + mSetFlagsRule.setFlagsParameterization(flags!!) + } + @Before fun setUp() { MockitoAnnotations.initMocks(this) @@ -101,6 +110,7 @@ class CommunalViewModelTest : SysuiTestCase() { smartspaceRepository = kosmos.fakeSmartspaceRepository mediaRepository = kosmos.fakeCommunalMediaRepository userRepository = kosmos.fakeUserRepository + shadeTestUtil = kosmos.shadeTestUtil kosmos.fakeFeatureFlagsClassic.set(COMMUNAL_SERVICE_ENABLED, true) mSetFlagsRule.enableFlags(FLAG_COMMUNAL_HUB) @@ -274,7 +284,7 @@ class CommunalViewModelTest : SysuiTestCase() { testScope.runTest { // On keyguard without any shade expansion. kosmos.fakeKeyguardRepository.setStatusBarState(StatusBarState.KEYGUARD) - kosmos.fakeShadeRepository.setLockscreenShadeExpansion(0f) + shadeTestUtil.setLockscreenShadeExpansion(0f) runCurrent() assertThat(underTest.canChangeScene()).isTrue() } @@ -284,7 +294,7 @@ class CommunalViewModelTest : SysuiTestCase() { testScope.runTest { // On keyguard with shade fully expanded. kosmos.fakeKeyguardRepository.setStatusBarState(StatusBarState.KEYGUARD) - kosmos.fakeShadeRepository.setLockscreenShadeExpansion(1f) + shadeTestUtil.setLockscreenShadeExpansion(1f) runCurrent() assertThat(underTest.canChangeScene()).isFalse() } @@ -297,5 +307,11 @@ class CommunalViewModelTest : SysuiTestCase() { private companion object { val MAIN_USER_INFO = UserInfo(0, "primary", UserInfo.FLAG_MAIN) + + @JvmStatic + @Parameters(name = "{0}") + fun getParams(): List<FlagsParameterization> { + return FlagsParameterization.allCombinationsOf().andSceneContainer() + } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt index 7b5c1d3fe139..19b137c01ce4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt @@ -18,7 +18,7 @@ package com.android.systemui.shade import android.graphics.Rect import android.os.PowerManager -import android.testing.AndroidTestingRunner +import android.platform.test.flag.junit.FlagsParameterization import android.testing.TestableLooper import android.testing.ViewUtils import android.view.MotionEvent @@ -41,6 +41,7 @@ import com.android.systemui.communal.shared.model.CommunalScenes import com.android.systemui.communal.ui.viewmodel.CommunalViewModel import com.android.systemui.communal.util.CommunalColors import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.flags.andSceneContainer import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor @@ -49,8 +50,10 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.testDispatcher import com.android.systemui.kosmos.testScope import com.android.systemui.res.R +import com.android.systemui.scene.domain.interactor.sceneInteractor +import com.android.systemui.scene.shared.flag.SceneContainerFlag +import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.scene.shared.model.sceneDataSourceDelegator -import com.android.systemui.shade.data.repository.fakeShadeRepository import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.statusbar.phone.SystemUIDialogFactory import com.android.systemui.testKosmos @@ -69,12 +72,14 @@ import org.mockito.Mock import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations +import platform.test.runner.parameterized.ParameterizedAndroidJunit4 +import platform.test.runner.parameterized.Parameters @ExperimentalCoroutinesApi -@RunWith(AndroidTestingRunner::class) +@RunWith(ParameterizedAndroidJunit4::class) @TestableLooper.RunWithLooper(setAsMainLooper = true) @SmallTest -class GlanceableHubContainerControllerTest : SysuiTestCase() { +class GlanceableHubContainerControllerTest(flags: FlagsParameterization?) : SysuiTestCase() { private val kosmos: Kosmos = testKosmos().apply { // UnconfinedTestDispatcher makes testing simpler due to CommunalInteractor flows using @@ -96,6 +101,10 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() { private lateinit var communalRepository: FakeCommunalRepository private lateinit var underTest: GlanceableHubContainerController + init { + mSetFlagsRule.setFlagsParameterization(flags!!) + } + @Before fun setUp() { MockitoAnnotations.initMocks(this) @@ -251,7 +260,7 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() { goToScene(CommunalScenes.Communal) // Shade shows up. - fakeShadeRepository.setQsExpansion(1.0f) + shadeTestUtil.setQsExpansion(1.0f) testableLooper.processAllMessages() // Touch events are not intercepted. @@ -405,7 +414,7 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() { goToScene(CommunalScenes.Communal) // Shade shows up. - fakeShadeRepository.setQsExpansion(1.0f) + shadeTestUtil.setQsExpansion(1.0f) testableLooper.processAllMessages() assertThat(underTest.lifecycle.currentState).isEqualTo(Lifecycle.State.STARTED) @@ -458,6 +467,13 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() { } private fun goToScene(scene: SceneKey) { + if (SceneContainerFlag.isEnabled) { + if (scene == CommunalScenes.Communal) { + kosmos.sceneInteractor.changeScene(Scenes.Communal, "test") + } else { + kosmos.sceneInteractor.changeScene(Scenes.Lockscreen, "test") + } + } communalRepository.changeScene(scene) testableLooper.processAllMessages() } @@ -486,5 +502,11 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() { MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, CONTAINER_WIDTH.toFloat(), 0f, 0) private val MOVE_EVENT = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_MOVE, 0f, 0f, 0) private val UP_EVENT = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0f, 0f, 0) + + @JvmStatic + @Parameters(name = "{0}") + fun getParams(): List<FlagsParameterization> { + return FlagsParameterization.allCombinationsOf().andSceneContainer() + } } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeTestUtil.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeTestUtil.kt index 4b85a42b3b9b..d17dd6c518a4 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeTestUtil.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeTestUtil.kt @@ -31,6 +31,16 @@ import org.junit.Assert /** Sets up shade state for tests for either value of the scene container flag. */ class ShadeTestUtil constructor(val delegate: ShadeTestUtilDelegate) { + /** Sets shade expansion to a value between 0-1. */ + fun setShadeExpansion(shadeExpansion: Float) { + setShadeAndQsExpansion(shadeExpansion, 0f) + } + + /** Sets QS expansion to a value between 0-1. */ + fun setQsExpansion(qsExpansion: Float) { + setShadeAndQsExpansion(0f, qsExpansion) + } + /** Sets both shade and QS expansion. One value must be zero or values must add up to 1f. */ fun setShadeAndQsExpansion(shadeExpansion: Float, qsExpansion: Float) { Assert.assertTrue( @@ -40,15 +50,24 @@ class ShadeTestUtil constructor(val delegate: ShadeTestUtilDelegate) { delegate.assertFlagValid() delegate.setShadeAndQsExpansionInternal(shadeExpansion, qsExpansion) } + + /** Sets the shade expansion on the lockscreen to the given amount from 0-1. */ + fun setLockscreenShadeExpansion(lockscreenShadeExpansion: Float) { + delegate.assertFlagValid() + delegate.setLockscreenShadeExpansion(lockscreenShadeExpansion) + } } /** Sets up shade state for tests for a specific value of the scene container flag. */ interface ShadeTestUtilDelegate { + /** Asserts that the scene container flag matches this implementation. */ + fun assertFlagValid() + /** Sets both shade and QS expansion. One value must be zero or values must add up to 1f. */ fun setShadeAndQsExpansionInternal(shadeExpansion: Float, qsExpansion: Float) - /** Asserts that the scene container flag matches this implementation. */ - fun assertFlagValid() + /** Sets the shade expansion on the lockscreen to the given amount from 0-1. */ + fun setLockscreenShadeExpansion(lockscreenShadeExpansion: Float) } /** Sets up shade state for tests when the scene container flag is disabled. */ @@ -60,6 +79,10 @@ class ShadeTestUtilLegacyImpl(val testScope: TestScope, val shadeRepository: Fak testScope.runCurrent() } + override fun setLockscreenShadeExpansion(lockscreenShadeExpansion: Float) { + shadeRepository.setLockscreenShadeExpansion(lockscreenShadeExpansion) + } + override fun assertFlagValid() { Assert.assertFalse(SceneContainerFlag.isEnabled) } @@ -78,6 +101,24 @@ class ShadeTestUtilSceneImpl(val testScope: TestScope, val sceneInteractor: Scen } } + override fun setLockscreenShadeExpansion(lockscreenShadeExpansion: Float) { + if (lockscreenShadeExpansion == 0f) { + setIdleScene(Scenes.Lockscreen) + } else if (lockscreenShadeExpansion == 1f) { + setIdleScene(Scenes.Shade) + } else { + setTransitionProgress(Scenes.Lockscreen, Scenes.Shade, lockscreenShadeExpansion) + } + } + + private fun setIdleScene(scene: SceneKey) { + sceneInteractor.changeScene(scene, "test") + val transitionState = + MutableStateFlow<ObservableTransitionState>(ObservableTransitionState.Idle(scene)) + sceneInteractor.setTransitionState(transitionState) + testScope.runCurrent() + } + private fun setTransitionProgress(from: SceneKey, to: SceneKey, progress: Float) { sceneInteractor.changeScene(from, "test") val transitionState = |