Loading libs/WindowManager/Shell/tests/flicker/pip/Android.bp +21 −0 Original line number Diff line number Diff line Loading @@ -266,5 +266,26 @@ test_module_config { test_suites: ["device-tests"], } test_module_config { name: "WMShellFlickerTestsPip-nonMatchParent", base: "WMShellFlickerTestsPip", include_filters: ["com.android.wm.shell.flicker.pip.nonmatchparent.*"], test_suites: ["device-tests"], } test_module_config { name: "WMShellFlickerTestsPip-BottomHalfExitPipToAppViaExpandButtonTest", base: "WMShellFlickerTestsPip", include_filters: ["com.android.wm.shell.flicker.pip.nonmatchparent.BottomHalfExitPipToAppViaExpandButtonTest"], test_suites: ["device-tests"], } test_module_config { name: "WMShellFlickerTestsPip-BottomHalfExitPipToAppViaIntentTest", base: "WMShellFlickerTestsPip", include_filters: ["com.android.wm.shell.flicker.pip.nonmatchparent.BottomHalfExitPipToAppViaIntentTest"], test_suites: ["device-tests"], } // End breakdowns for WMShellFlickerTestsPip module //////////////////////////////////////////////////////////////////////////////// libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/common/PipTransition.kt +5 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,6 @@ abstract class PipTransition(flicker: LegacyFlickerTest) : BaseTest(flicker) { @Rule val checkFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule() protected val pipApp = PipAppHelper(instrumentation) protected val displayBounds = WindowUtils.getDisplayBounds(flicker.scenario.startRotation) protected val broadcastActionTrigger = BroadcastActionTrigger(instrumentation) Loading @@ -63,6 +62,11 @@ abstract class PipTransition(flicker: LegacyFlickerTest) : BaseTest(flicker) { } } /** * Defines the test app to run PIP flicker test. */ protected open val pipApp = PipAppHelper(instrumentation) /** Defines the transition used to run the test */ protected open val thisTransition: FlickerBuilder.() -> Unit = {} Loading libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/nonmatchparent/BottomHalfExitPipToAppTransition.kt 0 → 100644 +99 −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.wm.shell.flicker.pip.nonmatchparent import android.platform.test.annotations.Presubmit import android.platform.test.annotations.RequiresFlagsDisabled import android.platform.test.annotations.RequiresFlagsEnabled import android.tools.flicker.legacy.LegacyFlickerTest import android.tools.traces.component.ComponentNameMatcher import com.android.server.wm.flicker.helpers.BottomHalfPipAppHelper import com.android.server.wm.flicker.helpers.PipAppHelper import com.android.window.flags.Flags import com.android.wm.shell.flicker.pip.common.ExitPipToAppTransition import org.junit.Test /** * Base test class to verify PIP exit animation with an activity layout to the bottom half of * the container. */ // TODO(b/380796448): re-enable tests after the support of non-match parent PIP animation for PIP2. @RequiresFlagsDisabled(com.android.wm.shell.Flags.FLAG_ENABLE_PIP2) @RequiresFlagsEnabled(Flags.FLAG_BETTER_SUPPORT_NON_MATCH_PARENT_ACTIVITY) abstract class BottomHalfExitPipToAppTransition(flicker: LegacyFlickerTest) : ExitPipToAppTransition(flicker) { override val pipApp: PipAppHelper = BottomHalfPipAppHelper(instrumentation) @Presubmit @Test override fun showBothAppLayersThenHidePip() { // Disabled since the BottomHalfPipActivity just covers half of the simple activity. } @Presubmit @Test override fun showBothAppWindowsThenHidePip() { // Disabled since the BottomHalfPipActivity just covers half of the simple activity. } @Presubmit @Test override fun pipAppCoversFullScreenAtEnd() { // Disabled since the BottomHalfPipActivity just covers half of the simple activity. } /** * Checks that the [testApp] and [pipApp] are always visible since the [pipApp] only covers * half of screen. */ @Presubmit @Test fun showBothAppLayersDuringPipTransition() { flicker.assertLayers { isVisible(testApp) .isVisible(pipApp.or(ComponentNameMatcher.TRANSITION_SNAPSHOT)) } } /** * Checks that the [testApp] and [pipApp] are always visible since the [pipApp] only covers * half of screen. */ @Presubmit @Test fun showBothAppWindowsDuringPipTransition() { flicker.assertWm { isAppWindowVisible(testApp) .isAppWindowOnTop(pipApp) .isAppWindowVisible(pipApp) } } /** * Verify that the [testApp] and [pipApp] covers the entire screen at the end of PIP exit * animation since the [pipApp] will use a bottom half layout. */ @Presubmit @Test fun testPlusPipAppCoversWindowFrameAtEnd() { flicker.assertLayersEnd { val pipRegion = visibleRegion(pipApp).region visibleRegion(testApp).plus(pipRegion).coversExactly(displayBounds) } } } No newline at end of file libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/nonmatchparent/BottomHalfExitPipToAppViaExpandButtonTest.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.wm.shell.flicker.pip.nonmatchparent import android.tools.flicker.junit.FlickerParametersRunnerFactory import android.tools.flicker.legacy.FlickerBuilder import android.tools.flicker.legacy.LegacyFlickerTest import org.junit.FixMethodOrder import org.junit.runner.RunWith import org.junit.runners.MethodSorters import org.junit.runners.Parameterized /** * Test expanding a pip window back to bottom half layout via the expand button * * To run this test: `atest WMShellFlickerTestsPip:BottomHalfExitPipToAppViaExpandButtonTest` * * Actions: * ``` * Launch an app in pip mode [bottomHalfPipApp], * Launch another full screen mode [testApp] * Expand [bottomHalfPipApp] app to bottom half layout by clicking on the pip window and * then on the expand button * ``` * * Notes: * ``` * 1. Some default assertions (e.g., nav bar, status bar and screen covered) * are inherited [PipTransition] * 2. Part of the test setup occurs automatically via * [android.tools.flicker.legacy.runner.TransitionRunner], * including configuring navigation mode, initial orientation and ensuring no * apps are running before setup * ``` */ @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) class BottomHalfExitPipToAppViaExpandButtonTest(flicker: LegacyFlickerTest) : BottomHalfExitPipToAppTransition(flicker) { override val thisTransition: FlickerBuilder.() -> Unit = { setup { // launch an app behind the pip one testApp.launchViaIntent(wmHelper) } transitions { // This will bring PipApp to fullscreen pipApp.expandPipWindowToApp(wmHelper) // Wait until the transition idle and test and pip app still shows. wmHelper.StateSyncBuilder().withLayerVisible(testApp).withLayerVisible(pipApp) .withAppTransitionIdle().waitForAndVerify() } } } No newline at end of file libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/nonmatchparent/BottomHalfExitPipToAppViaIntentTest.kt 0 → 100644 +68 −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.wm.shell.flicker.pip.nonmatchparent import android.tools.flicker.junit.FlickerParametersRunnerFactory import android.tools.flicker.legacy.FlickerBuilder import android.tools.flicker.legacy.LegacyFlickerTest import org.junit.FixMethodOrder import org.junit.runner.RunWith import org.junit.runners.MethodSorters import org.junit.runners.Parameterized /** * Test expanding a pip window back to bottom half layout via an intent * * To run this test: `atest WMShellFlickerTestsPip:BottomHalfExitPipToAppViaIntentTest` * * Actions: * ``` * Launch an app in pip mode [bottomHalfPipApp], * Launch another full screen mode [testApp] * Expand [bottomHalfPipApp] app to bottom half layout via an intent * ``` * * Notes: * ``` * 1. Some default assertions (e.g., nav bar, status bar and screen covered) * are inherited from [PipTransition] * 2. Part of the test setup occurs automatically via * [android.tools.flicker.legacy.runner.TransitionRunner], * including configuring navigation mode, initial orientation and ensuring no * apps are running before setup * ``` */ @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) class BottomHalfExitPipToAppViaIntentTest(flicker: LegacyFlickerTest) : BottomHalfExitPipToAppTransition(flicker) { override val thisTransition: FlickerBuilder.() -> Unit = { setup { // launch an app behind the pip one testApp.launchViaIntent(wmHelper) } transitions { // This will bring PipApp to fullscreen pipApp.exitPipToFullScreenViaIntent(wmHelper) // Wait until the transition idle and test and pip app still shows. wmHelper.StateSyncBuilder().withLayerVisible(testApp).withLayerVisible(pipApp) .withAppTransitionIdle().waitForAndVerify() } } } No newline at end of file Loading
libs/WindowManager/Shell/tests/flicker/pip/Android.bp +21 −0 Original line number Diff line number Diff line Loading @@ -266,5 +266,26 @@ test_module_config { test_suites: ["device-tests"], } test_module_config { name: "WMShellFlickerTestsPip-nonMatchParent", base: "WMShellFlickerTestsPip", include_filters: ["com.android.wm.shell.flicker.pip.nonmatchparent.*"], test_suites: ["device-tests"], } test_module_config { name: "WMShellFlickerTestsPip-BottomHalfExitPipToAppViaExpandButtonTest", base: "WMShellFlickerTestsPip", include_filters: ["com.android.wm.shell.flicker.pip.nonmatchparent.BottomHalfExitPipToAppViaExpandButtonTest"], test_suites: ["device-tests"], } test_module_config { name: "WMShellFlickerTestsPip-BottomHalfExitPipToAppViaIntentTest", base: "WMShellFlickerTestsPip", include_filters: ["com.android.wm.shell.flicker.pip.nonmatchparent.BottomHalfExitPipToAppViaIntentTest"], test_suites: ["device-tests"], } // End breakdowns for WMShellFlickerTestsPip module ////////////////////////////////////////////////////////////////////////////////
libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/common/PipTransition.kt +5 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,6 @@ abstract class PipTransition(flicker: LegacyFlickerTest) : BaseTest(flicker) { @Rule val checkFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule() protected val pipApp = PipAppHelper(instrumentation) protected val displayBounds = WindowUtils.getDisplayBounds(flicker.scenario.startRotation) protected val broadcastActionTrigger = BroadcastActionTrigger(instrumentation) Loading @@ -63,6 +62,11 @@ abstract class PipTransition(flicker: LegacyFlickerTest) : BaseTest(flicker) { } } /** * Defines the test app to run PIP flicker test. */ protected open val pipApp = PipAppHelper(instrumentation) /** Defines the transition used to run the test */ protected open val thisTransition: FlickerBuilder.() -> Unit = {} Loading
libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/nonmatchparent/BottomHalfExitPipToAppTransition.kt 0 → 100644 +99 −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.wm.shell.flicker.pip.nonmatchparent import android.platform.test.annotations.Presubmit import android.platform.test.annotations.RequiresFlagsDisabled import android.platform.test.annotations.RequiresFlagsEnabled import android.tools.flicker.legacy.LegacyFlickerTest import android.tools.traces.component.ComponentNameMatcher import com.android.server.wm.flicker.helpers.BottomHalfPipAppHelper import com.android.server.wm.flicker.helpers.PipAppHelper import com.android.window.flags.Flags import com.android.wm.shell.flicker.pip.common.ExitPipToAppTransition import org.junit.Test /** * Base test class to verify PIP exit animation with an activity layout to the bottom half of * the container. */ // TODO(b/380796448): re-enable tests after the support of non-match parent PIP animation for PIP2. @RequiresFlagsDisabled(com.android.wm.shell.Flags.FLAG_ENABLE_PIP2) @RequiresFlagsEnabled(Flags.FLAG_BETTER_SUPPORT_NON_MATCH_PARENT_ACTIVITY) abstract class BottomHalfExitPipToAppTransition(flicker: LegacyFlickerTest) : ExitPipToAppTransition(flicker) { override val pipApp: PipAppHelper = BottomHalfPipAppHelper(instrumentation) @Presubmit @Test override fun showBothAppLayersThenHidePip() { // Disabled since the BottomHalfPipActivity just covers half of the simple activity. } @Presubmit @Test override fun showBothAppWindowsThenHidePip() { // Disabled since the BottomHalfPipActivity just covers half of the simple activity. } @Presubmit @Test override fun pipAppCoversFullScreenAtEnd() { // Disabled since the BottomHalfPipActivity just covers half of the simple activity. } /** * Checks that the [testApp] and [pipApp] are always visible since the [pipApp] only covers * half of screen. */ @Presubmit @Test fun showBothAppLayersDuringPipTransition() { flicker.assertLayers { isVisible(testApp) .isVisible(pipApp.or(ComponentNameMatcher.TRANSITION_SNAPSHOT)) } } /** * Checks that the [testApp] and [pipApp] are always visible since the [pipApp] only covers * half of screen. */ @Presubmit @Test fun showBothAppWindowsDuringPipTransition() { flicker.assertWm { isAppWindowVisible(testApp) .isAppWindowOnTop(pipApp) .isAppWindowVisible(pipApp) } } /** * Verify that the [testApp] and [pipApp] covers the entire screen at the end of PIP exit * animation since the [pipApp] will use a bottom half layout. */ @Presubmit @Test fun testPlusPipAppCoversWindowFrameAtEnd() { flicker.assertLayersEnd { val pipRegion = visibleRegion(pipApp).region visibleRegion(testApp).plus(pipRegion).coversExactly(displayBounds) } } } No newline at end of file
libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/nonmatchparent/BottomHalfExitPipToAppViaExpandButtonTest.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.wm.shell.flicker.pip.nonmatchparent import android.tools.flicker.junit.FlickerParametersRunnerFactory import android.tools.flicker.legacy.FlickerBuilder import android.tools.flicker.legacy.LegacyFlickerTest import org.junit.FixMethodOrder import org.junit.runner.RunWith import org.junit.runners.MethodSorters import org.junit.runners.Parameterized /** * Test expanding a pip window back to bottom half layout via the expand button * * To run this test: `atest WMShellFlickerTestsPip:BottomHalfExitPipToAppViaExpandButtonTest` * * Actions: * ``` * Launch an app in pip mode [bottomHalfPipApp], * Launch another full screen mode [testApp] * Expand [bottomHalfPipApp] app to bottom half layout by clicking on the pip window and * then on the expand button * ``` * * Notes: * ``` * 1. Some default assertions (e.g., nav bar, status bar and screen covered) * are inherited [PipTransition] * 2. Part of the test setup occurs automatically via * [android.tools.flicker.legacy.runner.TransitionRunner], * including configuring navigation mode, initial orientation and ensuring no * apps are running before setup * ``` */ @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) class BottomHalfExitPipToAppViaExpandButtonTest(flicker: LegacyFlickerTest) : BottomHalfExitPipToAppTransition(flicker) { override val thisTransition: FlickerBuilder.() -> Unit = { setup { // launch an app behind the pip one testApp.launchViaIntent(wmHelper) } transitions { // This will bring PipApp to fullscreen pipApp.expandPipWindowToApp(wmHelper) // Wait until the transition idle and test and pip app still shows. wmHelper.StateSyncBuilder().withLayerVisible(testApp).withLayerVisible(pipApp) .withAppTransitionIdle().waitForAndVerify() } } } No newline at end of file
libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/nonmatchparent/BottomHalfExitPipToAppViaIntentTest.kt 0 → 100644 +68 −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.wm.shell.flicker.pip.nonmatchparent import android.tools.flicker.junit.FlickerParametersRunnerFactory import android.tools.flicker.legacy.FlickerBuilder import android.tools.flicker.legacy.LegacyFlickerTest import org.junit.FixMethodOrder import org.junit.runner.RunWith import org.junit.runners.MethodSorters import org.junit.runners.Parameterized /** * Test expanding a pip window back to bottom half layout via an intent * * To run this test: `atest WMShellFlickerTestsPip:BottomHalfExitPipToAppViaIntentTest` * * Actions: * ``` * Launch an app in pip mode [bottomHalfPipApp], * Launch another full screen mode [testApp] * Expand [bottomHalfPipApp] app to bottom half layout via an intent * ``` * * Notes: * ``` * 1. Some default assertions (e.g., nav bar, status bar and screen covered) * are inherited from [PipTransition] * 2. Part of the test setup occurs automatically via * [android.tools.flicker.legacy.runner.TransitionRunner], * including configuring navigation mode, initial orientation and ensuring no * apps are running before setup * ``` */ @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) class BottomHalfExitPipToAppViaIntentTest(flicker: LegacyFlickerTest) : BottomHalfExitPipToAppTransition(flicker) { override val thisTransition: FlickerBuilder.() -> Unit = { setup { // launch an app behind the pip one testApp.launchViaIntent(wmHelper) } transitions { // This will bring PipApp to fullscreen pipApp.exitPipToFullScreenViaIntent(wmHelper) // Wait until the transition idle and test and pip app still shows. wmHelper.StateSyncBuilder().withLayerVisible(testApp).withLayerVisible(pipApp) .withAppTransitionIdle().waitForAndVerify() } } } No newline at end of file