Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6b2d8fa1 authored by Charles Chen's avatar Charles Chen
Browse files

Add flicker tests for non-match parent exit PIP animation

Note that that tests are disabled for PIP2 since we haven't supported
it.

Bug: 356277166
Bug: 380397174
Test: atest BottomHalfExitPipToAppViaIntentTest BottomHalfExitPipToAppViaExpandButtonTest
Flag: com.android.window.flags.better_support_non_match_parent_activity
Change-Id: Ie3d59e3cd6def0a9785b174a5f687ff8e6a8d2a8
parent 677cb7dc
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -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
////////////////////////////////////////////////////////////////////////////////
+93 −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.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.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.
 */
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
+78 −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.RequiresDevice
import android.platform.test.annotations.RequiresFlagsDisabled
import android.platform.test.annotations.RequiresFlagsEnabled
import android.tools.flicker.junit.FlickerParametersRunnerFactory
import android.tools.flicker.legacy.FlickerBuilder
import android.tools.flicker.legacy.LegacyFlickerTest
import com.android.window.flags.Flags
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
 * ```
 */
// 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)
@RequiresDevice
@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
+76 −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.RequiresDevice
import android.platform.test.annotations.RequiresFlagsDisabled
import android.platform.test.annotations.RequiresFlagsEnabled
import android.tools.flicker.junit.FlickerParametersRunnerFactory
import android.tools.flicker.legacy.FlickerBuilder
import android.tools.flicker.legacy.LegacyFlickerTest
import com.android.window.flags.Flags
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
 * ```
 */
// 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)
@RequiresDevice
@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
+41 −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.server.wm.flicker.helpers

import android.app.Instrumentation
import android.content.Intent
import android.tools.traces.parsers.toFlickerComponent
import com.android.server.wm.flicker.testapp.ActivityOptions

class BottomHalfPipAppHelper(
    instrumentation: Instrumentation,
    private val useLaunchingActivity: Boolean = false,
) : PipAppHelper(
    instrumentation,
    appName = ActivityOptions.BottomHalfPip.LABEL,
    componentNameMatcher = ActivityOptions.BottomHalfPip.COMPONENT
        .toFlickerComponent()
) {
    override val openAppIntent: Intent
        get() = super.openAppIntent.apply {
            component = if (useLaunchingActivity) {
                ActivityOptions.BottomHalfPip.LAUNCHING_APP_COMPONENT
            } else {
                ActivityOptions.BottomHalfPip.COMPONENT
            }
        }
}
 No newline at end of file
Loading