Loading libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipMenuTests.kt +61 −20 Original line number Diff line number Diff line Loading @@ -16,9 +16,10 @@ package com.android.wm.shell.flicker.pip.tv import android.os.SystemClock import androidx.test.filters.RequiresDevice import org.junit.Assert.assertNotNull import androidx.test.uiautomator.UiObject2 import com.android.wm.shell.flicker.SYSTEM_UI_PACKAGE_NAME import com.android.wm.shell.flicker.wait import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test Loading @@ -34,21 +35,27 @@ import org.junit.runners.Parameterized class TvPipMenuTests(rotationName: String, rotation: Int) : TvPipTestBase(rotationName, rotation) { private val systemUiResources = packageManager.getResourcesForApplication(SYSTEM_UI_PACKAGE_NAME) private val playButtonDescription = systemUiResources.run { getString(getIdentifier("pip_play", "string", SYSTEM_UI_PACKAGE_NAME)) } private val pauseButtonDescription = systemUiResources.run { getString(getIdentifier("pip_pause", "string", SYSTEM_UI_PACKAGE_NAME)) } @Before override fun setUp() { super.setUp() // Launch the app and go to PiP testApp.launchViaIntent() testApp.clickEnterPipButton() } @Test fun pipMenu_open() { // Pressing the Window key should bring up Pip menu uiDevice.pressWindowKey() val pipMenu = uiDevice.waitForTvPipMenu() ?: fail("Pip notification should have been dismissed") val pipMenu = enterPip_openMenu_assertShown() // Make sure it's fullscreen assertTrue("Pip menu should be shown fullscreen", pipMenu.isFullscreen(uiDevice)) testApp.closePipWindow() Loading @@ -56,22 +63,29 @@ class TvPipMenuTests(rotationName: String, rotation: Int) @Test fun pipMenu_backButton() { // Pressing the Window key should bring up Pip menu uiDevice.pressWindowKey() assertNotNull("Pip notification should have been dismissed", uiDevice.waitForTvPipMenu()) enterPip_openMenu_assertShown() // Pressing the Back key should close the Pip menu uiDevice.pressBack() assertTrue("Pip notification should have closed", uiDevice.waitForTvPipMenuToClose()) assertTrue("Pip menu should have closed", uiDevice.waitForTvPipMenuToClose()) testApp.closePipWindow() } @Test fun pipMenu_homeButton() { enterPip_openMenu_assertShown() // Pressing the Home key should close the Pip menu uiDevice.pressHome() assertTrue("Pip menu should have closed", uiDevice.waitForTvPipMenuToClose()) testApp.closePipWindow() } @Test fun pipMenu_closeButton() { // Pressing the Window key should bring up Pip menu uiDevice.pressWindowKey() assertNotNull("Pip notification should have been dismissed", uiDevice.waitForTvPipMenu()) enterPip_openMenu_assertShown() // PiP menu should contain the Close button val closeButton = uiDevice.findTvPipMenuCloseButton() Loading @@ -84,26 +98,53 @@ class TvPipMenuTests(rotationName: String, rotation: Int) @Test fun pipMenu_fullscreenButton() { // Pressing the Window key should bring up Pip menu uiDevice.pressWindowKey() assertNotNull("Pip notification should have been dismissed", uiDevice.waitForTvPipMenu()) enterPip_openMenu_assertShown() // PiP menu should contain the Fullscreen button val fullscreenButton = uiDevice.findTvPipMenuFullscreenButton() ?: fail("\"Full screen\" button should be shown in Pip menu") // Clicking on the fullscreen button should return app to the fullscreen mode. // Click, wait for 3 seconds, check the app is fullscreen // Click, wait for the app to go fullscreen fullscreenButton.click() SystemClock.sleep(3_000L) assertTrue("\"Full screen\" button should open the app fullscreen", testApp.ui?.isFullscreen(uiDevice) ?: false) wait { testApp.ui?.isFullscreen(uiDevice) ?: false }) // Close the app uiDevice.pressBack() testApp.waitUntilClosed() } @Test fun pipMenu_mediaPlayPauseButtons() { // Start media session before entering PiP testApp.clickStartMediaSessionButton() enterPip_openMenu_assertShown() // PiP menu should contain the Pause button val pauseButton = uiDevice.findTvPipMenuElementWithDescription(pauseButtonDescription) ?: fail("\"Pause\" button should be shown in Pip menu if there is an active " + "playing media session.") // When we pause media, the button should change from Pause to Play pauseButton.click() // PiP menu should contain the Play button now uiDevice.waitForTvPipMenuElementWithDescription(playButtonDescription) ?: fail("\"Play\" button should be shown in Pip menu if there is an active " + "paused media session.") testApp.closePipWindow() } private fun enterPip_openMenu_assertShown(): UiObject2 { testApp.clickEnterPipButton() // Pressing the Window key should bring up Pip menu uiDevice.pressWindowKey() return uiDevice.waitForTvPipMenu() ?: fail("Pip menu should have been shown") } companion object { @Parameterized.Parameters(name = "{0}") @JvmStatic Loading libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvUtils.kt +13 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,19 @@ fun UiDevice.findTvPipMenuCloseButton(): UiObject2? = findObject( fun UiDevice.findTvPipMenuFullscreenButton(): UiObject2? = findObject( By.res(SYSTEM_UI_PACKAGE_NAME, TV_PIP_MENU_FULLSCREEN_BUTTON_ID)) fun UiDevice.findTvPipMenuElementWithDescription(desc: String): UiObject2? { val buttonSelector = By.desc(desc) val menuWithButtonSelector = By.copy(tvPipMenuSelector).hasDescendant(buttonSelector) return findObject(menuWithButtonSelector)?.findObject(buttonSelector) } fun UiDevice.waitForTvPipMenuElementWithDescription(desc: String): UiObject2? { val buttonSelector = By.desc(desc) val menuWithButtonSelector = By.copy(tvPipMenuSelector).hasDescendant(buttonSelector) return wait(Until.findObject(menuWithButtonSelector), WAIT_TIME_MS) ?.findObject(buttonSelector) } fun UiObject2.isFullscreen(uiDevice: UiDevice): Boolean = visibleBounds.run { height() == uiDevice.displayHeight && width() == uiDevice.displayWidth } No newline at end of file libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/src/com/android/wm/shell/flicker/testapp/PipActivity.java +3 −2 Original line number Diff line number Diff line Loading @@ -17,7 +17,8 @@ package com.android.wm.shell.flicker.testapp; import static android.media.MediaMetadata.METADATA_KEY_TITLE; import static android.media.session.PlaybackState.ACTION_PLAY_PAUSE; import static android.media.session.PlaybackState.ACTION_PAUSE; import static android.media.session.PlaybackState.ACTION_PLAY; import static android.media.session.PlaybackState.ACTION_STOP; import static android.media.session.PlaybackState.STATE_PAUSED; import static android.media.session.PlaybackState.STATE_PLAYING; Loading Loading @@ -48,7 +49,7 @@ public class PipActivity extends Activity { private MediaSession mMediaSession; private final PlaybackState.Builder mPlaybackStateBuilder = new PlaybackState.Builder() .setActions(ACTION_PLAY_PAUSE | ACTION_STOP) .setActions(ACTION_PLAY | ACTION_PAUSE | ACTION_STOP) .setState(STATE_STOPPED, 0, 1f); private PlaybackState mPlaybackState = mPlaybackStateBuilder.build(); private final MediaMetadata.Builder mMediaMetadataBuilder = new MediaMetadata.Builder(); Loading Loading
libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipMenuTests.kt +61 −20 Original line number Diff line number Diff line Loading @@ -16,9 +16,10 @@ package com.android.wm.shell.flicker.pip.tv import android.os.SystemClock import androidx.test.filters.RequiresDevice import org.junit.Assert.assertNotNull import androidx.test.uiautomator.UiObject2 import com.android.wm.shell.flicker.SYSTEM_UI_PACKAGE_NAME import com.android.wm.shell.flicker.wait import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test Loading @@ -34,21 +35,27 @@ import org.junit.runners.Parameterized class TvPipMenuTests(rotationName: String, rotation: Int) : TvPipTestBase(rotationName, rotation) { private val systemUiResources = packageManager.getResourcesForApplication(SYSTEM_UI_PACKAGE_NAME) private val playButtonDescription = systemUiResources.run { getString(getIdentifier("pip_play", "string", SYSTEM_UI_PACKAGE_NAME)) } private val pauseButtonDescription = systemUiResources.run { getString(getIdentifier("pip_pause", "string", SYSTEM_UI_PACKAGE_NAME)) } @Before override fun setUp() { super.setUp() // Launch the app and go to PiP testApp.launchViaIntent() testApp.clickEnterPipButton() } @Test fun pipMenu_open() { // Pressing the Window key should bring up Pip menu uiDevice.pressWindowKey() val pipMenu = uiDevice.waitForTvPipMenu() ?: fail("Pip notification should have been dismissed") val pipMenu = enterPip_openMenu_assertShown() // Make sure it's fullscreen assertTrue("Pip menu should be shown fullscreen", pipMenu.isFullscreen(uiDevice)) testApp.closePipWindow() Loading @@ -56,22 +63,29 @@ class TvPipMenuTests(rotationName: String, rotation: Int) @Test fun pipMenu_backButton() { // Pressing the Window key should bring up Pip menu uiDevice.pressWindowKey() assertNotNull("Pip notification should have been dismissed", uiDevice.waitForTvPipMenu()) enterPip_openMenu_assertShown() // Pressing the Back key should close the Pip menu uiDevice.pressBack() assertTrue("Pip notification should have closed", uiDevice.waitForTvPipMenuToClose()) assertTrue("Pip menu should have closed", uiDevice.waitForTvPipMenuToClose()) testApp.closePipWindow() } @Test fun pipMenu_homeButton() { enterPip_openMenu_assertShown() // Pressing the Home key should close the Pip menu uiDevice.pressHome() assertTrue("Pip menu should have closed", uiDevice.waitForTvPipMenuToClose()) testApp.closePipWindow() } @Test fun pipMenu_closeButton() { // Pressing the Window key should bring up Pip menu uiDevice.pressWindowKey() assertNotNull("Pip notification should have been dismissed", uiDevice.waitForTvPipMenu()) enterPip_openMenu_assertShown() // PiP menu should contain the Close button val closeButton = uiDevice.findTvPipMenuCloseButton() Loading @@ -84,26 +98,53 @@ class TvPipMenuTests(rotationName: String, rotation: Int) @Test fun pipMenu_fullscreenButton() { // Pressing the Window key should bring up Pip menu uiDevice.pressWindowKey() assertNotNull("Pip notification should have been dismissed", uiDevice.waitForTvPipMenu()) enterPip_openMenu_assertShown() // PiP menu should contain the Fullscreen button val fullscreenButton = uiDevice.findTvPipMenuFullscreenButton() ?: fail("\"Full screen\" button should be shown in Pip menu") // Clicking on the fullscreen button should return app to the fullscreen mode. // Click, wait for 3 seconds, check the app is fullscreen // Click, wait for the app to go fullscreen fullscreenButton.click() SystemClock.sleep(3_000L) assertTrue("\"Full screen\" button should open the app fullscreen", testApp.ui?.isFullscreen(uiDevice) ?: false) wait { testApp.ui?.isFullscreen(uiDevice) ?: false }) // Close the app uiDevice.pressBack() testApp.waitUntilClosed() } @Test fun pipMenu_mediaPlayPauseButtons() { // Start media session before entering PiP testApp.clickStartMediaSessionButton() enterPip_openMenu_assertShown() // PiP menu should contain the Pause button val pauseButton = uiDevice.findTvPipMenuElementWithDescription(pauseButtonDescription) ?: fail("\"Pause\" button should be shown in Pip menu if there is an active " + "playing media session.") // When we pause media, the button should change from Pause to Play pauseButton.click() // PiP menu should contain the Play button now uiDevice.waitForTvPipMenuElementWithDescription(playButtonDescription) ?: fail("\"Play\" button should be shown in Pip menu if there is an active " + "paused media session.") testApp.closePipWindow() } private fun enterPip_openMenu_assertShown(): UiObject2 { testApp.clickEnterPipButton() // Pressing the Window key should bring up Pip menu uiDevice.pressWindowKey() return uiDevice.waitForTvPipMenu() ?: fail("Pip menu should have been shown") } companion object { @Parameterized.Parameters(name = "{0}") @JvmStatic Loading
libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvUtils.kt +13 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,19 @@ fun UiDevice.findTvPipMenuCloseButton(): UiObject2? = findObject( fun UiDevice.findTvPipMenuFullscreenButton(): UiObject2? = findObject( By.res(SYSTEM_UI_PACKAGE_NAME, TV_PIP_MENU_FULLSCREEN_BUTTON_ID)) fun UiDevice.findTvPipMenuElementWithDescription(desc: String): UiObject2? { val buttonSelector = By.desc(desc) val menuWithButtonSelector = By.copy(tvPipMenuSelector).hasDescendant(buttonSelector) return findObject(menuWithButtonSelector)?.findObject(buttonSelector) } fun UiDevice.waitForTvPipMenuElementWithDescription(desc: String): UiObject2? { val buttonSelector = By.desc(desc) val menuWithButtonSelector = By.copy(tvPipMenuSelector).hasDescendant(buttonSelector) return wait(Until.findObject(menuWithButtonSelector), WAIT_TIME_MS) ?.findObject(buttonSelector) } fun UiObject2.isFullscreen(uiDevice: UiDevice): Boolean = visibleBounds.run { height() == uiDevice.displayHeight && width() == uiDevice.displayWidth } No newline at end of file
libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/src/com/android/wm/shell/flicker/testapp/PipActivity.java +3 −2 Original line number Diff line number Diff line Loading @@ -17,7 +17,8 @@ package com.android.wm.shell.flicker.testapp; import static android.media.MediaMetadata.METADATA_KEY_TITLE; import static android.media.session.PlaybackState.ACTION_PLAY_PAUSE; import static android.media.session.PlaybackState.ACTION_PAUSE; import static android.media.session.PlaybackState.ACTION_PLAY; import static android.media.session.PlaybackState.ACTION_STOP; import static android.media.session.PlaybackState.STATE_PAUSED; import static android.media.session.PlaybackState.STATE_PLAYING; Loading Loading @@ -48,7 +49,7 @@ public class PipActivity extends Activity { private MediaSession mMediaSession; private final PlaybackState.Builder mPlaybackStateBuilder = new PlaybackState.Builder() .setActions(ACTION_PLAY_PAUSE | ACTION_STOP) .setActions(ACTION_PLAY | ACTION_PAUSE | ACTION_STOP) .setState(STATE_STOPPED, 0, 1f); private PlaybackState mPlaybackState = mPlaybackStateBuilder.build(); private final MediaMetadata.Builder mMediaMetadataBuilder = new MediaMetadata.Builder(); Loading