Merge "Divide split screen tests for IW microbenchmark and flicker" into udc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
7d8d53c8e0
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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
|
||||
|
||||
import android.app.Instrumentation
|
||||
import android.tools.device.flicker.junit.FlickerBuilderProvider
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import com.android.launcher3.tapl.LauncherInstrumentation
|
||||
|
||||
abstract class BaseBenchmarkTest
|
||||
@JvmOverloads
|
||||
constructor(
|
||||
protected open val flicker: FlickerTest,
|
||||
protected val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation(),
|
||||
protected val tapl: LauncherInstrumentation = LauncherInstrumentation()
|
||||
) {
|
||||
/** Specification of the test transition to execute */
|
||||
abstract val transition: FlickerBuilder.() -> Unit
|
||||
|
||||
/**
|
||||
* Entry point for the test runner. It will use this method to initialize and cache flicker
|
||||
* executions
|
||||
*/
|
||||
@FlickerBuilderProvider
|
||||
fun buildFlicker(): FlickerBuilder {
|
||||
return FlickerBuilder(instrumentation).apply {
|
||||
setup { flicker.scenario.setIsTablet(tapl.isTablet) }
|
||||
transition()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -17,24 +17,10 @@
|
||||
package com.android.wm.shell.flicker
|
||||
|
||||
import android.app.Instrumentation
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.traces.component.ComponentNameMatcher
|
||||
import android.tools.device.flicker.junit.FlickerBuilderProvider
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import com.android.launcher3.tapl.LauncherInstrumentation
|
||||
import com.android.server.wm.flicker.entireScreenCovered
|
||||
import com.android.server.wm.flicker.navBarLayerIsVisibleAtStartAndEnd
|
||||
import com.android.server.wm.flicker.navBarLayerPositionAtStartAndEnd
|
||||
import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible
|
||||
import com.android.server.wm.flicker.statusBarLayerIsVisibleAtStartAndEnd
|
||||
import com.android.server.wm.flicker.statusBarLayerPositionAtStartAndEnd
|
||||
import com.android.server.wm.flicker.statusBarWindowIsAlwaysVisible
|
||||
import com.android.server.wm.flicker.taskBarLayerIsVisibleAtStartAndEnd
|
||||
import com.android.server.wm.flicker.taskBarWindowIsAlwaysVisible
|
||||
import org.junit.Assume
|
||||
import org.junit.Test
|
||||
|
||||
/**
|
||||
* Base test class containing common assertions for [ComponentNameMatcher.NAV_BAR],
|
||||
@@ -44,124 +30,7 @@ import org.junit.Test
|
||||
abstract class BaseTest
|
||||
@JvmOverloads
|
||||
constructor(
|
||||
protected val flicker: FlickerTest,
|
||||
protected val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation(),
|
||||
protected val tapl: LauncherInstrumentation = LauncherInstrumentation()
|
||||
) {
|
||||
/** Specification of the test transition to execute */
|
||||
abstract val transition: FlickerBuilder.() -> Unit
|
||||
|
||||
/**
|
||||
* Entry point for the test runner. It will use this method to initialize and cache flicker
|
||||
* executions
|
||||
*/
|
||||
@FlickerBuilderProvider
|
||||
fun buildFlicker(): FlickerBuilder {
|
||||
return FlickerBuilder(instrumentation).apply {
|
||||
setup { flicker.scenario.setIsTablet(tapl.isTablet) }
|
||||
transition()
|
||||
}
|
||||
}
|
||||
|
||||
/** Checks that all parts of the screen are covered during the transition */
|
||||
@Presubmit @Test open fun entireScreenCovered() = flicker.entireScreenCovered()
|
||||
|
||||
/**
|
||||
* Checks that the [ComponentNameMatcher.NAV_BAR] layer is visible during the whole transition
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
open fun navBarLayerIsVisibleAtStartAndEnd() {
|
||||
Assume.assumeFalse(flicker.scenario.isTablet)
|
||||
flicker.navBarLayerIsVisibleAtStartAndEnd()
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks the position of the [ComponentNameMatcher.NAV_BAR] at the start and end of the
|
||||
* transition
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
open fun navBarLayerPositionAtStartAndEnd() {
|
||||
Assume.assumeFalse(flicker.scenario.isTablet)
|
||||
flicker.navBarLayerPositionAtStartAndEnd()
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that the [ComponentNameMatcher.NAV_BAR] window is visible during the whole transition
|
||||
*
|
||||
* Note: Phones only
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
open fun navBarWindowIsAlwaysVisible() {
|
||||
Assume.assumeFalse(flicker.scenario.isTablet)
|
||||
flicker.navBarWindowIsAlwaysVisible()
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that the [ComponentNameMatcher.TASK_BAR] layer is visible during the whole transition
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
open fun taskBarLayerIsVisibleAtStartAndEnd() {
|
||||
Assume.assumeTrue(flicker.scenario.isTablet)
|
||||
flicker.taskBarLayerIsVisibleAtStartAndEnd()
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that the [ComponentNameMatcher.TASK_BAR] window is visible during the whole transition
|
||||
*
|
||||
* Note: Large screen only
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
open fun taskBarWindowIsAlwaysVisible() {
|
||||
Assume.assumeTrue(flicker.scenario.isTablet)
|
||||
flicker.taskBarWindowIsAlwaysVisible()
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that the [ComponentNameMatcher.STATUS_BAR] layer is visible during the whole
|
||||
* transition
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
open fun statusBarLayerIsVisibleAtStartAndEnd() = flicker.statusBarLayerIsVisibleAtStartAndEnd()
|
||||
|
||||
/**
|
||||
* Checks the position of the [ComponentNameMatcher.STATUS_BAR] at the start and end of the
|
||||
* transition
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
open fun statusBarLayerPositionAtStartAndEnd() = flicker.statusBarLayerPositionAtStartAndEnd()
|
||||
|
||||
/**
|
||||
* Checks that the [ComponentNameMatcher.STATUS_BAR] window is visible during the whole
|
||||
* transition
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
open fun statusBarWindowIsAlwaysVisible() = flicker.statusBarWindowIsAlwaysVisible()
|
||||
|
||||
/**
|
||||
* Checks that all layers that are visible on the trace, are visible for at least 2 consecutive
|
||||
* entries.
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
open fun visibleLayersShownMoreThanOneConsecutiveEntry() {
|
||||
flicker.assertLayers { this.visibleLayersShownMoreThanOneConsecutiveEntry() }
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that all windows that are visible on the trace, are visible for at least 2 consecutive
|
||||
* entries.
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
open fun visibleWindowsShownMoreThanOneConsecutiveEntry() {
|
||||
flicker.assertWm { this.visibleWindowsShownMoreThanOneConsecutiveEntry() }
|
||||
}
|
||||
}
|
||||
override val flicker: FlickerTest,
|
||||
instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation(),
|
||||
tapl: LauncherInstrumentation = LauncherInstrumentation()
|
||||
) : BaseBenchmarkTest(flicker, instrumentation, tapl), ICommonAssertions
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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
|
||||
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.traces.component.ComponentNameMatcher
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import com.android.server.wm.flicker.entireScreenCovered
|
||||
import com.android.server.wm.flicker.navBarLayerIsVisibleAtStartAndEnd
|
||||
import com.android.server.wm.flicker.navBarLayerPositionAtStartAndEnd
|
||||
import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible
|
||||
import com.android.server.wm.flicker.statusBarLayerIsVisibleAtStartAndEnd
|
||||
import com.android.server.wm.flicker.statusBarLayerPositionAtStartAndEnd
|
||||
import com.android.server.wm.flicker.statusBarWindowIsAlwaysVisible
|
||||
import com.android.server.wm.flicker.taskBarLayerIsVisibleAtStartAndEnd
|
||||
import com.android.server.wm.flicker.taskBarWindowIsAlwaysVisible
|
||||
import org.junit.Assume
|
||||
import org.junit.Test
|
||||
|
||||
interface ICommonAssertions {
|
||||
val flicker: FlickerTest
|
||||
|
||||
/** Checks that all parts of the screen are covered during the transition */
|
||||
@Presubmit @Test fun entireScreenCovered() = flicker.entireScreenCovered()
|
||||
|
||||
/**
|
||||
* Checks that the [ComponentNameMatcher.NAV_BAR] layer is visible during the whole transition
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
fun navBarLayerIsVisibleAtStartAndEnd() {
|
||||
Assume.assumeFalse(flicker.scenario.isTablet)
|
||||
flicker.navBarLayerIsVisibleAtStartAndEnd()
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks the position of the [ComponentNameMatcher.NAV_BAR] at the start and end of the
|
||||
* transition
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
fun navBarLayerPositionAtStartAndEnd() {
|
||||
Assume.assumeFalse(flicker.scenario.isTablet)
|
||||
flicker.navBarLayerPositionAtStartAndEnd()
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that the [ComponentNameMatcher.NAV_BAR] window is visible during the whole transition
|
||||
*
|
||||
* Note: Phones only
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
fun navBarWindowIsAlwaysVisible() {
|
||||
Assume.assumeFalse(flicker.scenario.isTablet)
|
||||
flicker.navBarWindowIsAlwaysVisible()
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that the [ComponentNameMatcher.TASK_BAR] layer is visible during the whole transition
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
fun taskBarLayerIsVisibleAtStartAndEnd() {
|
||||
Assume.assumeTrue(flicker.scenario.isTablet)
|
||||
flicker.taskBarLayerIsVisibleAtStartAndEnd()
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that the [ComponentNameMatcher.TASK_BAR] window is visible during the whole transition
|
||||
*
|
||||
* Note: Large screen only
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
fun taskBarWindowIsAlwaysVisible() {
|
||||
Assume.assumeTrue(flicker.scenario.isTablet)
|
||||
flicker.taskBarWindowIsAlwaysVisible()
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that the [ComponentNameMatcher.STATUS_BAR] layer is visible during the whole
|
||||
* transition
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
fun statusBarLayerIsVisibleAtStartAndEnd() = flicker.statusBarLayerIsVisibleAtStartAndEnd()
|
||||
|
||||
/**
|
||||
* Checks the position of the [ComponentNameMatcher.STATUS_BAR] at the start and end of the
|
||||
* transition
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
fun statusBarLayerPositionAtStartAndEnd() = flicker.statusBarLayerPositionAtStartAndEnd()
|
||||
|
||||
/**
|
||||
* Checks that the [ComponentNameMatcher.STATUS_BAR] window is visible during the whole
|
||||
* transition
|
||||
*/
|
||||
@Presubmit @Test fun statusBarWindowIsAlwaysVisible() = flicker.statusBarWindowIsAlwaysVisible()
|
||||
|
||||
/**
|
||||
* Checks that all layers that are visible on the trace, are visible for at least 2 consecutive
|
||||
* entries.
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
fun visibleLayersShownMoreThanOneConsecutiveEntry() {
|
||||
flicker.assertLayers { this.visibleLayersShownMoreThanOneConsecutiveEntry() }
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that all windows that are visible on the trace, are visible for at least 2 consecutive
|
||||
* entries.
|
||||
*/
|
||||
@Presubmit
|
||||
@Test
|
||||
fun visibleWindowsShownMoreThanOneConsecutiveEntry() {
|
||||
flicker.assertWm { this.visibleWindowsShownMoreThanOneConsecutiveEntry() }
|
||||
}
|
||||
}
|
||||
@@ -26,6 +26,7 @@ import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.ICommonAssertions
|
||||
import com.android.wm.shell.flicker.SPLIT_SCREEN_DIVIDER_COMPONENT
|
||||
import com.android.wm.shell.flicker.appWindowIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.appWindowIsVisibleAtStart
|
||||
@@ -34,6 +35,7 @@ import com.android.wm.shell.flicker.layerKeepVisible
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsKeepVisible
|
||||
import com.android.wm.shell.flicker.splitScreenDividerIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitScreenDividerIsVisibleAtStart
|
||||
import com.android.wm.shell.flicker.splitscreen.benchmark.CopyContentInSplitBenchmark
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -49,29 +51,19 @@ import org.junit.runners.Parameterized
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
class CopyContentInSplit(flicker: FlickerTest) : SplitScreenBase(flicker) {
|
||||
private val textEditApp = SplitScreenUtils.getIme(instrumentation)
|
||||
private val MagnifierLayer = ComponentNameMatcher("", "magnifier surface bbq wrapper#")
|
||||
private val PopupWindowLayer = ComponentNameMatcher("", "PopupWindow:")
|
||||
|
||||
class CopyContentInSplit(override val flicker: FlickerTest) :
|
||||
CopyContentInSplitBenchmark(flicker), ICommonAssertions {
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
super.transition(this)
|
||||
setup { SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, textEditApp) }
|
||||
transitions {
|
||||
SplitScreenUtils.copyContentInSplit(
|
||||
instrumentation,
|
||||
device,
|
||||
primaryApp,
|
||||
textEditApp
|
||||
)
|
||||
}
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() {
|
||||
override fun cujCompleted() {
|
||||
flicker.appWindowIsVisibleAtStart(primaryApp)
|
||||
flicker.appWindowIsVisibleAtStart(textEditApp)
|
||||
flicker.splitScreenDividerIsVisibleAtStart()
|
||||
@@ -128,8 +120,8 @@ class CopyContentInSplit(flicker: FlickerTest) : SplitScreenBase(flicker) {
|
||||
ComponentNameMatcher.SNAPSHOT,
|
||||
ComponentNameMatcher.IME_SNAPSHOT,
|
||||
EdgeExtensionComponentMatcher(),
|
||||
MagnifierLayer,
|
||||
PopupWindowLayer
|
||||
magnifierLayer,
|
||||
popupWindowLayer
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -17,22 +17,21 @@
|
||||
package com.android.wm.shell.flicker.splitscreen
|
||||
|
||||
import android.platform.test.annotations.FlakyTest
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Postsubmit
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import android.tools.device.helpers.WindowUtils
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.ICommonAssertions
|
||||
import com.android.wm.shell.flicker.appWindowBecomesInvisible
|
||||
import com.android.wm.shell.flicker.appWindowIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.layerBecomesInvisible
|
||||
import com.android.wm.shell.flicker.layerIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsBecomesInvisible
|
||||
import com.android.wm.shell.flicker.splitScreenDismissed
|
||||
import com.android.wm.shell.flicker.splitScreenDividerBecomesInvisible
|
||||
import com.android.wm.shell.flicker.splitscreen.benchmark.DismissSplitScreenByDividerBenchmark
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -48,37 +47,16 @@ import org.junit.runners.Parameterized
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
class DismissSplitScreenByDivider(flicker: FlickerTest) : SplitScreenBase(flicker) {
|
||||
class DismissSplitScreenByDivider(override val flicker: FlickerTest) :
|
||||
DismissSplitScreenByDividerBenchmark(flicker), ICommonAssertions {
|
||||
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
super.transition(this)
|
||||
setup { SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, secondaryApp) }
|
||||
transitions {
|
||||
if (tapl.isTablet) {
|
||||
SplitScreenUtils.dragDividerToDismissSplit(
|
||||
device,
|
||||
wmHelper,
|
||||
dragToRight = false,
|
||||
dragToBottom = true
|
||||
)
|
||||
} else {
|
||||
SplitScreenUtils.dragDividerToDismissSplit(
|
||||
device,
|
||||
wmHelper,
|
||||
dragToRight = true,
|
||||
dragToBottom = true
|
||||
)
|
||||
}
|
||||
wmHelper.StateSyncBuilder().withFullScreenApp(secondaryApp).waitForAndVerify()
|
||||
}
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() = flicker.splitScreenDismissed(primaryApp, secondaryApp, toHome = false)
|
||||
|
||||
@Presubmit
|
||||
@Test
|
||||
fun splitScreenDividerBecomesInvisible() = flicker.splitScreenDividerBecomesInvisible()
|
||||
@@ -176,12 +154,4 @@ class DismissSplitScreenByDivider(flicker: FlickerTest) : SplitScreenBase(flicke
|
||||
@Test
|
||||
override fun visibleWindowsShownMoreThanOneConsecutiveEntry() =
|
||||
super.visibleWindowsShownMoreThanOneConsecutiveEntry()
|
||||
|
||||
companion object {
|
||||
@Parameterized.Parameters(name = "{0}")
|
||||
@JvmStatic
|
||||
fun getParams(): List<FlickerTest> {
|
||||
return FlickerTestFactory.nonRotationTests()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,18 +17,18 @@
|
||||
package com.android.wm.shell.flicker.splitscreen
|
||||
|
||||
import android.platform.test.annotations.FlakyTest
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.ICommonAssertions
|
||||
import com.android.wm.shell.flicker.appWindowBecomesInvisible
|
||||
import com.android.wm.shell.flicker.layerBecomesInvisible
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsBecomesInvisible
|
||||
import com.android.wm.shell.flicker.splitScreenDismissed
|
||||
import com.android.wm.shell.flicker.splitScreenDividerBecomesInvisible
|
||||
import com.android.wm.shell.flicker.splitscreen.benchmark.DismissSplitScreenByGoHomeBenchmark
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -44,21 +44,14 @@ import org.junit.runners.Parameterized
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
class DismissSplitScreenByGoHome(flicker: FlickerTest) : SplitScreenBase(flicker) {
|
||||
|
||||
class DismissSplitScreenByGoHome(override val flicker: FlickerTest) :
|
||||
DismissSplitScreenByGoHomeBenchmark(flicker), ICommonAssertions {
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
super.transition(this)
|
||||
setup { SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, secondaryApp) }
|
||||
transitions {
|
||||
tapl.goHome()
|
||||
wmHelper.StateSyncBuilder().withHomeActivityVisible().waitForAndVerify()
|
||||
}
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() = flicker.splitScreenDismissed(primaryApp, secondaryApp, toHome = true)
|
||||
|
||||
@Presubmit
|
||||
@Test
|
||||
|
||||
@@ -24,6 +24,7 @@ import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.ICommonAssertions
|
||||
import com.android.wm.shell.flicker.SPLIT_SCREEN_DIVIDER_COMPONENT
|
||||
import com.android.wm.shell.flicker.appWindowIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.appWindowIsVisibleAtStart
|
||||
@@ -32,8 +33,7 @@ import com.android.wm.shell.flicker.layerKeepVisible
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsChanges
|
||||
import com.android.wm.shell.flicker.splitScreenDividerIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitScreenDividerIsVisibleAtStart
|
||||
import org.junit.Assume
|
||||
import org.junit.Before
|
||||
import com.android.wm.shell.flicker.splitscreen.benchmark.DragDividerToResizeBenchmark
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -49,24 +49,19 @@ import org.junit.runners.Parameterized
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
class DragDividerToResize(flicker: FlickerTest) : SplitScreenBase(flicker) {
|
||||
|
||||
class DragDividerToResize(override val flicker: FlickerTest) :
|
||||
DragDividerToResizeBenchmark(flicker), ICommonAssertions {
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
super.transition(this)
|
||||
setup { SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, secondaryApp) }
|
||||
transitions { SplitScreenUtils.dragDividerToResizeAndWait(device, wmHelper) }
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@Before
|
||||
fun before() {
|
||||
Assume.assumeTrue(tapl.isTablet || !flicker.scenario.isLandscapeOrSeascapeAtStart)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() {
|
||||
override fun cujCompleted() {
|
||||
flicker.appWindowIsVisibleAtStart(primaryApp)
|
||||
flicker.appWindowIsVisibleAtStart(secondaryApp)
|
||||
flicker.splitScreenDividerIsVisibleAtStart()
|
||||
@@ -74,9 +69,6 @@ class DragDividerToResize(flicker: FlickerTest) : SplitScreenBase(flicker) {
|
||||
flicker.appWindowIsVisibleAtEnd(primaryApp)
|
||||
flicker.appWindowIsVisibleAtEnd(secondaryApp)
|
||||
flicker.splitScreenDividerIsVisibleAtEnd()
|
||||
|
||||
// TODO(b/246490534): Add validation for resized app after withAppTransitionIdle is
|
||||
// robust enough to get the correct end state.
|
||||
}
|
||||
|
||||
@Presubmit
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package com.android.wm.shell.flicker.splitscreen
|
||||
|
||||
import android.platform.test.annotations.FlakyTest
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Postsubmit
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.NavBar
|
||||
@@ -26,6 +25,7 @@ import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.ICommonAssertions
|
||||
import com.android.wm.shell.flicker.SPLIT_SCREEN_DIVIDER_COMPONENT
|
||||
import com.android.wm.shell.flicker.appWindowBecomesVisible
|
||||
import com.android.wm.shell.flicker.appWindowIsVisibleAtEnd
|
||||
@@ -34,9 +34,7 @@ import com.android.wm.shell.flicker.layerIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsBecomesVisibleByDrag
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitScreenDividerBecomesVisible
|
||||
import com.android.wm.shell.flicker.splitScreenEntered
|
||||
import org.junit.Assume
|
||||
import org.junit.Before
|
||||
import com.android.wm.shell.flicker.splitscreen.benchmark.EnterSplitScreenByDragFromAllAppsBenchmark
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -53,40 +51,15 @@ import org.junit.runners.Parameterized
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
class EnterSplitScreenByDragFromAllApps(flicker: FlickerTest) : SplitScreenBase(flicker) {
|
||||
|
||||
@Before
|
||||
fun before() {
|
||||
Assume.assumeTrue(tapl.isTablet)
|
||||
}
|
||||
|
||||
class EnterSplitScreenByDragFromAllApps(override val flicker: FlickerTest) :
|
||||
EnterSplitScreenByDragFromAllAppsBenchmark(flicker), ICommonAssertions {
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
super.transition(this)
|
||||
setup {
|
||||
tapl.goHome()
|
||||
primaryApp.launchViaIntent(wmHelper)
|
||||
}
|
||||
transitions {
|
||||
tapl.launchedAppState.taskbar
|
||||
.openAllApps()
|
||||
.getAppIcon(secondaryApp.appName)
|
||||
.dragToSplitscreen(secondaryApp.`package`, primaryApp.`package`)
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, secondaryApp)
|
||||
}
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() =
|
||||
flicker.splitScreenEntered(
|
||||
primaryApp,
|
||||
secondaryApp,
|
||||
fromOtherApp = false,
|
||||
appExistAtStart = false
|
||||
)
|
||||
|
||||
@FlakyTest(bugId = 245472831)
|
||||
@Test
|
||||
fun splitScreenDividerBecomesVisible() {
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package com.android.wm.shell.flicker.splitscreen
|
||||
|
||||
import android.platform.test.annotations.FlakyTest
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Postsubmit
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.NavBar
|
||||
@@ -26,6 +25,7 @@ import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.ICommonAssertions
|
||||
import com.android.wm.shell.flicker.SPLIT_SCREEN_DIVIDER_COMPONENT
|
||||
import com.android.wm.shell.flicker.appWindowIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.layerBecomesVisible
|
||||
@@ -33,9 +33,7 @@ import com.android.wm.shell.flicker.layerIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsBecomesVisibleByDrag
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitScreenDividerBecomesVisible
|
||||
import com.android.wm.shell.flicker.splitScreenEntered
|
||||
import org.junit.Assume
|
||||
import org.junit.Before
|
||||
import com.android.wm.shell.flicker.splitscreen.benchmark.EnterSplitScreenByDragFromNotificationBenchmark
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -52,39 +50,16 @@ import org.junit.runners.Parameterized
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
class EnterSplitScreenByDragFromNotification(flicker: FlickerTest) : SplitScreenBase(flicker) {
|
||||
|
||||
private val sendNotificationApp = SplitScreenUtils.getSendNotification(instrumentation)
|
||||
|
||||
@Before
|
||||
fun before() {
|
||||
Assume.assumeTrue(tapl.isTablet)
|
||||
}
|
||||
|
||||
class EnterSplitScreenByDragFromNotification(override val flicker: FlickerTest) :
|
||||
EnterSplitScreenByDragFromNotificationBenchmark(flicker), ICommonAssertions {
|
||||
/** {@inheritDoc} */
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
super.transition(this)
|
||||
setup {
|
||||
// Send a notification
|
||||
sendNotificationApp.launchViaIntent(wmHelper)
|
||||
sendNotificationApp.postNotification(wmHelper)
|
||||
tapl.goHome()
|
||||
primaryApp.launchViaIntent(wmHelper)
|
||||
}
|
||||
transitions {
|
||||
SplitScreenUtils.dragFromNotificationToSplit(instrumentation, device, wmHelper)
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, sendNotificationApp)
|
||||
}
|
||||
teardown { sendNotificationApp.exit(wmHelper) }
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() =
|
||||
flicker.splitScreenEntered(primaryApp, sendNotificationApp, fromOtherApp = false)
|
||||
|
||||
@FlakyTest(bugId = 245472831)
|
||||
@Test
|
||||
fun splitScreenDividerBecomesVisible() {
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package com.android.wm.shell.flicker.splitscreen
|
||||
|
||||
import android.platform.test.annotations.FlakyTest
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.NavBar
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
@@ -25,15 +24,14 @@ import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.ICommonAssertions
|
||||
import com.android.wm.shell.flicker.appWindowIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.layerBecomesVisible
|
||||
import com.android.wm.shell.flicker.layerIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsBecomesVisibleByDrag
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitScreenDividerBecomesVisible
|
||||
import com.android.wm.shell.flicker.splitScreenEntered
|
||||
import org.junit.Assume
|
||||
import org.junit.Before
|
||||
import com.android.wm.shell.flicker.splitscreen.benchmark.EnterSplitScreenByDragFromShortcutBenchmark
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -49,42 +47,16 @@ import org.junit.runners.Parameterized
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
class EnterSplitScreenByDragFromShortcut(flicker: FlickerTest) : SplitScreenBase(flicker) {
|
||||
|
||||
@Before
|
||||
fun before() {
|
||||
Assume.assumeTrue(tapl.isTablet)
|
||||
}
|
||||
class EnterSplitScreenByDragFromShortcut(override val flicker: FlickerTest) :
|
||||
EnterSplitScreenByDragFromShortcutBenchmark(flicker), ICommonAssertions {
|
||||
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
super.transition(this)
|
||||
setup {
|
||||
tapl.goHome()
|
||||
SplitScreenUtils.createShortcutOnHotseatIfNotExist(tapl, secondaryApp.appName)
|
||||
primaryApp.launchViaIntent(wmHelper)
|
||||
}
|
||||
transitions {
|
||||
tapl.launchedAppState.taskbar
|
||||
.getAppIcon(secondaryApp.appName)
|
||||
.openDeepShortcutMenu()
|
||||
.getMenuItem("Split Screen Secondary Activity")
|
||||
.dragToSplitscreen(secondaryApp.`package`, primaryApp.`package`)
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, secondaryApp)
|
||||
}
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() =
|
||||
flicker.splitScreenEntered(
|
||||
primaryApp,
|
||||
secondaryApp,
|
||||
fromOtherApp = false,
|
||||
appExistAtStart = false
|
||||
)
|
||||
|
||||
@Presubmit
|
||||
@Test
|
||||
fun splitScreenDividerBecomesVisible() = flicker.splitScreenDividerBecomesVisible()
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package com.android.wm.shell.flicker.splitscreen
|
||||
|
||||
import android.platform.test.annotations.FlakyTest
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Postsubmit
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.NavBar
|
||||
@@ -26,6 +25,7 @@ import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.ICommonAssertions
|
||||
import com.android.wm.shell.flicker.SPLIT_SCREEN_DIVIDER_COMPONENT
|
||||
import com.android.wm.shell.flicker.appWindowBecomesVisible
|
||||
import com.android.wm.shell.flicker.appWindowIsVisibleAtEnd
|
||||
@@ -34,9 +34,7 @@ import com.android.wm.shell.flicker.layerIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsBecomesVisibleByDrag
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitScreenDividerBecomesVisible
|
||||
import com.android.wm.shell.flicker.splitScreenEntered
|
||||
import org.junit.Assume
|
||||
import org.junit.Before
|
||||
import com.android.wm.shell.flicker.splitscreen.benchmark.EnterSplitScreenByDragFromTaskbarBenchmark
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -53,41 +51,16 @@ import org.junit.runners.Parameterized
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
class EnterSplitScreenByDragFromTaskbar(flicker: FlickerTest) : SplitScreenBase(flicker) {
|
||||
|
||||
@Before
|
||||
fun before() {
|
||||
Assume.assumeTrue(tapl.isTablet)
|
||||
}
|
||||
|
||||
class EnterSplitScreenByDragFromTaskbar(override val flicker: FlickerTest) :
|
||||
EnterSplitScreenByDragFromTaskbarBenchmark(flicker), ICommonAssertions {
|
||||
/** {@inheritDoc} */
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
super.transition(this)
|
||||
setup {
|
||||
tapl.goHome()
|
||||
SplitScreenUtils.createShortcutOnHotseatIfNotExist(tapl, secondaryApp.appName)
|
||||
primaryApp.launchViaIntent(wmHelper)
|
||||
}
|
||||
transitions {
|
||||
tapl.launchedAppState.taskbar
|
||||
.getAppIcon(secondaryApp.appName)
|
||||
.dragToSplitscreen(secondaryApp.`package`, primaryApp.`package`)
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, secondaryApp)
|
||||
}
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() =
|
||||
flicker.splitScreenEntered(
|
||||
primaryApp,
|
||||
secondaryApp,
|
||||
fromOtherApp = false,
|
||||
appExistAtStart = false
|
||||
)
|
||||
|
||||
@FlakyTest(bugId = 245472831)
|
||||
@Test
|
||||
fun splitScreenDividerBecomesVisible() {
|
||||
|
||||
@@ -17,20 +17,20 @@
|
||||
package com.android.wm.shell.flicker.splitscreen
|
||||
|
||||
import android.platform.test.annotations.FlakyTest
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.ICommonAssertions
|
||||
import com.android.wm.shell.flicker.appWindowBecomesVisible
|
||||
import com.android.wm.shell.flicker.layerBecomesVisible
|
||||
import com.android.wm.shell.flicker.layerIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsBecomesVisible
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitScreenDividerBecomesVisible
|
||||
import com.android.wm.shell.flicker.splitScreenEntered
|
||||
import com.android.wm.shell.flicker.splitscreen.benchmark.EnterSplitScreenFromOverviewBenchmark
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -46,31 +46,15 @@ import org.junit.runners.Parameterized
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
class EnterSplitScreenFromOverview(flicker: FlickerTest) : SplitScreenBase(flicker) {
|
||||
class EnterSplitScreenFromOverview(override val flicker: FlickerTest) :
|
||||
EnterSplitScreenFromOverviewBenchmark(flicker), ICommonAssertions {
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
super.transition(this)
|
||||
setup {
|
||||
primaryApp.launchViaIntent(wmHelper)
|
||||
secondaryApp.launchViaIntent(wmHelper)
|
||||
tapl.goHome()
|
||||
wmHelper
|
||||
.StateSyncBuilder()
|
||||
.withAppTransitionIdle()
|
||||
.withHomeActivityVisible()
|
||||
.waitForAndVerify()
|
||||
}
|
||||
transitions {
|
||||
SplitScreenUtils.splitFromOverview(tapl, device)
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, secondaryApp)
|
||||
}
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() = flicker.splitScreenEntered(primaryApp, secondaryApp, fromOtherApp = true)
|
||||
|
||||
@Presubmit
|
||||
@Test
|
||||
fun splitScreenDividerBecomesVisible() = flicker.splitScreenDividerBecomesVisible()
|
||||
|
||||
@@ -20,25 +20,33 @@ import android.content.Context
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import com.android.server.wm.flicker.helpers.setRotation
|
||||
import com.android.wm.shell.flicker.BaseTest
|
||||
import com.android.wm.shell.flicker.BaseBenchmarkTest
|
||||
|
||||
abstract class SplitScreenBase(flicker: FlickerTest) : BaseTest(flicker) {
|
||||
abstract class SplitScreenBase(flicker: FlickerTest) : BaseBenchmarkTest(flicker) {
|
||||
protected val context: Context = instrumentation.context
|
||||
protected val primaryApp = SplitScreenUtils.getPrimary(instrumentation)
|
||||
protected val secondaryApp = SplitScreenUtils.getSecondary(instrumentation)
|
||||
|
||||
/** {@inheritDoc} */
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
setup {
|
||||
tapl.setEnableRotation(true)
|
||||
setRotation(flicker.scenario.startRotation)
|
||||
tapl.setExpectedRotation(flicker.scenario.startRotation.value)
|
||||
tapl.workspace.switchToOverview().dismissAllTasks()
|
||||
}
|
||||
teardown {
|
||||
primaryApp.exit(wmHelper)
|
||||
secondaryApp.exit(wmHelper)
|
||||
}
|
||||
protected open val defaultSetup: FlickerBuilder.() -> Unit = {
|
||||
setup {
|
||||
tapl.setEnableRotation(true)
|
||||
setRotation(flicker.scenario.startRotation)
|
||||
tapl.setExpectedRotation(flicker.scenario.startRotation.value)
|
||||
tapl.workspace.switchToOverview().dismissAllTasks()
|
||||
}
|
||||
}
|
||||
|
||||
protected open val defaultTeardown: FlickerBuilder.() -> Unit = {
|
||||
teardown {
|
||||
primaryApp.exit(wmHelper)
|
||||
secondaryApp.exit(wmHelper)
|
||||
}
|
||||
}
|
||||
|
||||
protected open val withoutTracing: FlickerBuilder.() -> Unit = {
|
||||
withoutLayerTracing()
|
||||
withoutWindowManagerTracing()
|
||||
withoutTransitionTracing()
|
||||
withoutTransactionsTracing()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,14 +20,12 @@ import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Postsubmit
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.NavBar
|
||||
import android.tools.common.Rotation
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import android.tools.device.helpers.WindowUtils
|
||||
import android.tools.device.traces.parsers.WindowManagerStateHelper
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.ICommonAssertions
|
||||
import com.android.wm.shell.flicker.SPLIT_SCREEN_DIVIDER_COMPONENT
|
||||
import com.android.wm.shell.flicker.appWindowIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.appWindowIsVisibleAtStart
|
||||
@@ -36,6 +34,7 @@ import com.android.wm.shell.flicker.layerKeepVisible
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitScreenDividerIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitScreenDividerIsVisibleAtStart
|
||||
import com.android.wm.shell.flicker.splitscreen.benchmark.SwitchAppByDoubleTapDividerBenchmark
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -51,98 +50,19 @@ import org.junit.runners.Parameterized
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
class SwitchAppByDoubleTapDivider(flicker: FlickerTest) : SplitScreenBase(flicker) {
|
||||
|
||||
class SwitchAppByDoubleTapDivider(override val flicker: FlickerTest) :
|
||||
SwitchAppByDoubleTapDividerBenchmark(flicker), ICommonAssertions {
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
super.transition(this)
|
||||
setup { SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, secondaryApp) }
|
||||
transitions {
|
||||
SplitScreenUtils.doubleTapDividerToSwitch(device)
|
||||
wmHelper.StateSyncBuilder().withAppTransitionIdle().waitForAndVerify()
|
||||
|
||||
waitForLayersToSwitch(wmHelper)
|
||||
waitForWindowsToSwitch(wmHelper)
|
||||
}
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
private fun waitForWindowsToSwitch(wmHelper: WindowManagerStateHelper) {
|
||||
wmHelper
|
||||
.StateSyncBuilder()
|
||||
.add("appWindowsSwitched") {
|
||||
val primaryAppWindow =
|
||||
it.wmState.visibleWindows.firstOrNull { window ->
|
||||
primaryApp.windowMatchesAnyOf(window)
|
||||
}
|
||||
?: return@add false
|
||||
val secondaryAppWindow =
|
||||
it.wmState.visibleWindows.firstOrNull { window ->
|
||||
secondaryApp.windowMatchesAnyOf(window)
|
||||
}
|
||||
?: return@add false
|
||||
|
||||
if (isLandscape(flicker.scenario.endRotation)) {
|
||||
return@add if (flicker.scenario.isTablet) {
|
||||
secondaryAppWindow.frame.right <= primaryAppWindow.frame.left
|
||||
} else {
|
||||
primaryAppWindow.frame.right <= secondaryAppWindow.frame.left
|
||||
}
|
||||
} else {
|
||||
return@add if (flicker.scenario.isTablet) {
|
||||
primaryAppWindow.frame.bottom <= secondaryAppWindow.frame.top
|
||||
} else {
|
||||
primaryAppWindow.frame.bottom <= secondaryAppWindow.frame.top
|
||||
}
|
||||
}
|
||||
}
|
||||
.waitForAndVerify()
|
||||
}
|
||||
|
||||
private fun waitForLayersToSwitch(wmHelper: WindowManagerStateHelper) {
|
||||
wmHelper
|
||||
.StateSyncBuilder()
|
||||
.add("appLayersSwitched") {
|
||||
val primaryAppLayer =
|
||||
it.layerState.visibleLayers.firstOrNull { window ->
|
||||
primaryApp.layerMatchesAnyOf(window)
|
||||
}
|
||||
?: return@add false
|
||||
val secondaryAppLayer =
|
||||
it.layerState.visibleLayers.firstOrNull { window ->
|
||||
secondaryApp.layerMatchesAnyOf(window)
|
||||
}
|
||||
?: return@add false
|
||||
|
||||
val primaryVisibleRegion = primaryAppLayer.visibleRegion?.bounds ?: return@add false
|
||||
val secondaryVisibleRegion =
|
||||
secondaryAppLayer.visibleRegion?.bounds ?: return@add false
|
||||
|
||||
if (isLandscape(flicker.scenario.endRotation)) {
|
||||
return@add if (flicker.scenario.isTablet) {
|
||||
secondaryVisibleRegion.right <= primaryVisibleRegion.left
|
||||
} else {
|
||||
primaryVisibleRegion.right <= secondaryVisibleRegion.left
|
||||
}
|
||||
} else {
|
||||
return@add if (flicker.scenario.isTablet) {
|
||||
primaryVisibleRegion.bottom <= secondaryVisibleRegion.top
|
||||
} else {
|
||||
primaryVisibleRegion.bottom <= secondaryVisibleRegion.top
|
||||
}
|
||||
}
|
||||
}
|
||||
.waitForAndVerify()
|
||||
}
|
||||
|
||||
private fun isLandscape(rotation: Rotation): Boolean {
|
||||
val displayBounds = WindowUtils.getDisplayBounds(rotation)
|
||||
return displayBounds.width > displayBounds.height
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() {
|
||||
override fun cujCompleted() {
|
||||
flicker.appWindowIsVisibleAtStart(primaryApp)
|
||||
flicker.appWindowIsVisibleAtStart(secondaryApp)
|
||||
flicker.splitScreenDividerIsVisibleAtStart()
|
||||
@@ -150,9 +70,6 @@ class SwitchAppByDoubleTapDivider(flicker: FlickerTest) : SplitScreenBase(flicke
|
||||
flicker.appWindowIsVisibleAtEnd(primaryApp)
|
||||
flicker.appWindowIsVisibleAtEnd(secondaryApp)
|
||||
flicker.splitScreenDividerIsVisibleAtEnd()
|
||||
|
||||
// TODO(b/246490534): Add validation for switched app after withAppTransitionIdle is
|
||||
// robust enough to get the correct end state.
|
||||
}
|
||||
|
||||
@Presubmit
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package com.android.wm.shell.flicker.splitscreen
|
||||
|
||||
import android.platform.test.annotations.FlakyTest
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.NavBar
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
@@ -25,11 +24,12 @@ import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.ICommonAssertions
|
||||
import com.android.wm.shell.flicker.appWindowBecomesVisible
|
||||
import com.android.wm.shell.flicker.layerBecomesVisible
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitScreenDividerBecomesVisible
|
||||
import com.android.wm.shell.flicker.splitScreenEntered
|
||||
import com.android.wm.shell.flicker.splitscreen.benchmark.SwitchBackToSplitFromAnotherAppBenchmark
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -45,29 +45,15 @@ import org.junit.runners.Parameterized
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
class SwitchBackToSplitFromAnotherApp(flicker: FlickerTest) : SplitScreenBase(flicker) {
|
||||
val thirdApp = SplitScreenUtils.getNonResizeable(instrumentation)
|
||||
|
||||
class SwitchBackToSplitFromAnotherApp(override val flicker: FlickerTest) :
|
||||
SwitchBackToSplitFromAnotherAppBenchmark(flicker), ICommonAssertions {
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
super.transition(this)
|
||||
setup {
|
||||
SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, secondaryApp)
|
||||
|
||||
thirdApp.launchViaIntent(wmHelper)
|
||||
wmHelper.StateSyncBuilder().withWindowSurfaceAppeared(thirdApp).waitForAndVerify()
|
||||
}
|
||||
transitions {
|
||||
tapl.launchedAppState.quickSwitchToPreviousApp()
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, secondaryApp)
|
||||
}
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() = flicker.splitScreenEntered(primaryApp, secondaryApp, fromOtherApp = true)
|
||||
|
||||
@Presubmit
|
||||
@Test
|
||||
fun splitScreenDividerBecomesVisible() = flicker.splitScreenDividerBecomesVisible()
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package com.android.wm.shell.flicker.splitscreen
|
||||
|
||||
import android.platform.test.annotations.FlakyTest
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.NavBar
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
@@ -25,11 +24,12 @@ import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.ICommonAssertions
|
||||
import com.android.wm.shell.flicker.appWindowBecomesVisible
|
||||
import com.android.wm.shell.flicker.layerBecomesVisible
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitScreenDividerBecomesVisible
|
||||
import com.android.wm.shell.flicker.splitScreenEntered
|
||||
import com.android.wm.shell.flicker.splitscreen.benchmark.SwitchBackToSplitFromHomeBenchmark
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -45,28 +45,15 @@ import org.junit.runners.Parameterized
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
class SwitchBackToSplitFromHome(flicker: FlickerTest) : SplitScreenBase(flicker) {
|
||||
|
||||
class SwitchBackToSplitFromHome(override val flicker: FlickerTest) :
|
||||
SwitchBackToSplitFromHomeBenchmark(flicker), ICommonAssertions {
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
super.transition(this)
|
||||
setup {
|
||||
SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, secondaryApp)
|
||||
|
||||
tapl.goHome()
|
||||
wmHelper.StateSyncBuilder().withHomeActivityVisible().waitForAndVerify()
|
||||
}
|
||||
transitions {
|
||||
tapl.workspace.quickSwitchToPreviousApp()
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, secondaryApp)
|
||||
}
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() = flicker.splitScreenEntered(primaryApp, secondaryApp, fromOtherApp = true)
|
||||
|
||||
@Presubmit
|
||||
@Test
|
||||
fun splitScreenDividerBecomesVisible() = flicker.splitScreenDividerBecomesVisible()
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package com.android.wm.shell.flicker.splitscreen
|
||||
|
||||
import android.platform.test.annotations.FlakyTest
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.NavBar
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
@@ -25,11 +24,12 @@ import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.ICommonAssertions
|
||||
import com.android.wm.shell.flicker.appWindowBecomesVisible
|
||||
import com.android.wm.shell.flicker.layerBecomesVisible
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitScreenDividerBecomesVisible
|
||||
import com.android.wm.shell.flicker.splitScreenEntered
|
||||
import com.android.wm.shell.flicker.splitscreen.benchmark.SwitchBackToSplitFromRecentBenchmark
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -45,28 +45,15 @@ import org.junit.runners.Parameterized
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
class SwitchBackToSplitFromRecent(flicker: FlickerTest) : SplitScreenBase(flicker) {
|
||||
|
||||
class SwitchBackToSplitFromRecent(override val flicker: FlickerTest) :
|
||||
SwitchBackToSplitFromRecentBenchmark(flicker), ICommonAssertions {
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
super.transition(this)
|
||||
setup {
|
||||
SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, secondaryApp)
|
||||
|
||||
tapl.goHome()
|
||||
wmHelper.StateSyncBuilder().withHomeActivityVisible().waitForAndVerify()
|
||||
}
|
||||
transitions {
|
||||
tapl.workspace.switchToOverview().currentTask.open()
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, secondaryApp)
|
||||
}
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() = flicker.splitScreenEntered(primaryApp, secondaryApp, fromOtherApp = true)
|
||||
|
||||
@Presubmit
|
||||
@Test
|
||||
fun splitScreenDividerBecomesVisible() = flicker.splitScreenDividerBecomesVisible()
|
||||
|
||||
@@ -24,6 +24,7 @@ import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.ICommonAssertions
|
||||
import com.android.wm.shell.flicker.SPLIT_SCREEN_DIVIDER_COMPONENT
|
||||
import com.android.wm.shell.flicker.appWindowBecomesInvisible
|
||||
import com.android.wm.shell.flicker.appWindowBecomesVisible
|
||||
@@ -36,6 +37,7 @@ import com.android.wm.shell.flicker.splitAppLayerBoundsIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitAppLayerBoundsSnapToDivider
|
||||
import com.android.wm.shell.flicker.splitScreenDividerIsVisibleAtEnd
|
||||
import com.android.wm.shell.flicker.splitScreenDividerIsVisibleAtStart
|
||||
import com.android.wm.shell.flicker.splitscreen.benchmark.SwitchBetweenSplitPairsBenchmark
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -51,32 +53,19 @@ import org.junit.runners.Parameterized
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
class SwitchBetweenSplitPairs(flicker: FlickerTest) : SplitScreenBase(flicker) {
|
||||
private val thirdApp = SplitScreenUtils.getIme(instrumentation)
|
||||
private val fourthApp = SplitScreenUtils.getSendNotification(instrumentation)
|
||||
|
||||
class SwitchBetweenSplitPairs(override val flicker: FlickerTest) :
|
||||
SwitchBetweenSplitPairsBenchmark(flicker), ICommonAssertions {
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
super.transition(this)
|
||||
setup {
|
||||
SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, secondaryApp)
|
||||
SplitScreenUtils.enterSplit(wmHelper, tapl, device, thirdApp, fourthApp)
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, thirdApp, fourthApp)
|
||||
}
|
||||
transitions {
|
||||
tapl.launchedAppState.quickSwitchToPreviousApp()
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, secondaryApp)
|
||||
}
|
||||
teardown {
|
||||
thirdApp.exit(wmHelper)
|
||||
fourthApp.exit(wmHelper)
|
||||
}
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() {
|
||||
override fun cujCompleted() {
|
||||
flicker.appWindowIsVisibleAtStart(thirdApp)
|
||||
flicker.appWindowIsVisibleAtStart(fourthApp)
|
||||
flicker.splitScreenDividerIsVisibleAtStart()
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.splitscreen.benchmark
|
||||
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.traces.component.ComponentNameMatcher
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenBase
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenUtils
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.MethodSorters
|
||||
import org.junit.runners.Parameterized
|
||||
|
||||
@RequiresDevice
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
open class CopyContentInSplitBenchmark(override val flicker: FlickerTest) :
|
||||
SplitScreenBase(flicker) {
|
||||
protected val textEditApp = SplitScreenUtils.getIme(instrumentation)
|
||||
protected val magnifierLayer = ComponentNameMatcher("", "magnifier surface bbq wrapper#")
|
||||
protected val popupWindowLayer = ComponentNameMatcher("", "PopupWindow:")
|
||||
protected val thisTransition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
setup { SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, textEditApp) }
|
||||
transitions {
|
||||
SplitScreenUtils.copyContentInSplit(
|
||||
instrumentation,
|
||||
device,
|
||||
primaryApp,
|
||||
textEditApp
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
withoutTracing(this)
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
open fun cujCompleted() {
|
||||
// The validation of copied text is already done in SplitScreenUtils.copyContentInSplit()
|
||||
}
|
||||
|
||||
companion object {
|
||||
@Parameterized.Parameters(name = "{0}")
|
||||
@JvmStatic
|
||||
fun getParams(): List<FlickerTest> {
|
||||
return FlickerTestFactory.nonRotationTests()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.splitscreen.benchmark
|
||||
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.splitScreenDismissed
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenBase
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenUtils
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.MethodSorters
|
||||
import org.junit.runners.Parameterized
|
||||
|
||||
@RequiresDevice
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
open class DismissSplitScreenByDividerBenchmark(flicker: FlickerTest) : SplitScreenBase(flicker) {
|
||||
protected val thisTransition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
setup { SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, secondaryApp) }
|
||||
transitions {
|
||||
if (tapl.isTablet) {
|
||||
SplitScreenUtils.dragDividerToDismissSplit(
|
||||
device,
|
||||
wmHelper,
|
||||
dragToRight = false,
|
||||
dragToBottom = true
|
||||
)
|
||||
} else {
|
||||
SplitScreenUtils.dragDividerToDismissSplit(
|
||||
device,
|
||||
wmHelper,
|
||||
dragToRight = true,
|
||||
dragToBottom = true
|
||||
)
|
||||
}
|
||||
wmHelper.StateSyncBuilder().withFullScreenApp(secondaryApp).waitForAndVerify()
|
||||
}
|
||||
}
|
||||
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
withoutTracing(this)
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() = flicker.splitScreenDismissed(primaryApp, secondaryApp, toHome = false)
|
||||
|
||||
companion object {
|
||||
@Parameterized.Parameters(name = "{0}")
|
||||
@JvmStatic
|
||||
fun getParams(): List<FlickerTest> {
|
||||
return FlickerTestFactory.nonRotationTests()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.splitscreen.benchmark
|
||||
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.splitScreenDismissed
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenBase
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenUtils
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.MethodSorters
|
||||
import org.junit.runners.Parameterized
|
||||
|
||||
@RequiresDevice
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
open class DismissSplitScreenByGoHomeBenchmark(override val flicker: FlickerTest) :
|
||||
SplitScreenBase(flicker) {
|
||||
protected val thisTransition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
setup { SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, secondaryApp) }
|
||||
transitions {
|
||||
tapl.goHome()
|
||||
wmHelper.StateSyncBuilder().withHomeActivityVisible().waitForAndVerify()
|
||||
}
|
||||
}
|
||||
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
withoutTracing(this)
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() = flicker.splitScreenDismissed(primaryApp, secondaryApp, toHome = true)
|
||||
|
||||
companion object {
|
||||
@Parameterized.Parameters(name = "{0}")
|
||||
@JvmStatic
|
||||
fun getParams(): List<FlickerTest> {
|
||||
return FlickerTestFactory.nonRotationTests()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.splitscreen.benchmark
|
||||
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenBase
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenUtils
|
||||
import org.junit.Assume
|
||||
import org.junit.Before
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.MethodSorters
|
||||
import org.junit.runners.Parameterized
|
||||
|
||||
@RequiresDevice
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
open class DragDividerToResizeBenchmark(override val flicker: FlickerTest) :
|
||||
SplitScreenBase(flicker) {
|
||||
protected val thisTransition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
setup { SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, secondaryApp) }
|
||||
transitions { SplitScreenUtils.dragDividerToResizeAndWait(device, wmHelper) }
|
||||
}
|
||||
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
withoutTracing(this)
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@Before
|
||||
fun before() {
|
||||
Assume.assumeTrue(tapl.isTablet || !flicker.scenario.isLandscapeOrSeascapeAtStart)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
open fun cujCompleted() {
|
||||
// TODO(b/246490534): Add validation for resized app after withAppTransitionIdle is
|
||||
// robust enough to get the correct end state.
|
||||
}
|
||||
|
||||
companion object {
|
||||
@Parameterized.Parameters(name = "{0}")
|
||||
@JvmStatic
|
||||
fun getParams(): List<FlickerTest> {
|
||||
return FlickerTestFactory.nonRotationTests()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.splitscreen.benchmark
|
||||
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.NavBar
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.splitScreenEntered
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenBase
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenUtils
|
||||
import org.junit.Assume
|
||||
import org.junit.Before
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.MethodSorters
|
||||
import org.junit.runners.Parameterized
|
||||
|
||||
@RequiresDevice
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
open class EnterSplitScreenByDragFromAllAppsBenchmark(override val flicker: FlickerTest) :
|
||||
SplitScreenBase(flicker) {
|
||||
|
||||
protected val thisTransition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
setup {
|
||||
tapl.goHome()
|
||||
primaryApp.launchViaIntent(wmHelper)
|
||||
}
|
||||
transitions {
|
||||
tapl.launchedAppState.taskbar
|
||||
.openAllApps()
|
||||
.getAppIcon(secondaryApp.appName)
|
||||
.dragToSplitscreen(secondaryApp.`package`, primaryApp.`package`)
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, secondaryApp)
|
||||
}
|
||||
}
|
||||
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
withoutTracing(this)
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@Before
|
||||
fun before() {
|
||||
Assume.assumeTrue(tapl.isTablet)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() =
|
||||
flicker.splitScreenEntered(
|
||||
primaryApp,
|
||||
secondaryApp,
|
||||
fromOtherApp = false,
|
||||
appExistAtStart = false
|
||||
)
|
||||
|
||||
companion object {
|
||||
@Parameterized.Parameters(name = "{0}")
|
||||
@JvmStatic
|
||||
fun getParams(): List<FlickerTest> {
|
||||
return FlickerTestFactory.nonRotationTests(
|
||||
// TODO(b/176061063):The 3 buttons of nav bar do not exist in the hierarchy.
|
||||
supportedNavigationModes = listOf(NavBar.MODE_GESTURAL)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.splitscreen.benchmark
|
||||
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.NavBar
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.splitScreenEntered
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenBase
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenUtils
|
||||
import org.junit.Assume
|
||||
import org.junit.Before
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.MethodSorters
|
||||
import org.junit.runners.Parameterized
|
||||
|
||||
@RequiresDevice
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
open class EnterSplitScreenByDragFromNotificationBenchmark(override val flicker: FlickerTest) :
|
||||
SplitScreenBase(flicker) {
|
||||
protected val sendNotificationApp = SplitScreenUtils.getSendNotification(instrumentation)
|
||||
protected val thisTransition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
setup {
|
||||
// Send a notification
|
||||
sendNotificationApp.launchViaIntent(wmHelper)
|
||||
sendNotificationApp.postNotification(wmHelper)
|
||||
tapl.goHome()
|
||||
primaryApp.launchViaIntent(wmHelper)
|
||||
}
|
||||
transitions {
|
||||
SplitScreenUtils.dragFromNotificationToSplit(instrumentation, device, wmHelper)
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, sendNotificationApp)
|
||||
}
|
||||
teardown { sendNotificationApp.exit(wmHelper) }
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
withoutTracing(this)
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() =
|
||||
flicker.splitScreenEntered(primaryApp, sendNotificationApp, fromOtherApp = false)
|
||||
|
||||
@Before
|
||||
fun before() {
|
||||
Assume.assumeTrue(tapl.isTablet)
|
||||
}
|
||||
|
||||
companion object {
|
||||
@Parameterized.Parameters(name = "{0}")
|
||||
@JvmStatic
|
||||
fun getParams(): List<FlickerTest> {
|
||||
return FlickerTestFactory.nonRotationTests(
|
||||
// TODO(b/176061063):The 3 buttons of nav bar do not exist in the hierarchy.
|
||||
supportedNavigationModes = listOf(NavBar.MODE_GESTURAL)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.splitscreen.benchmark
|
||||
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.NavBar
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.splitScreenEntered
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenBase
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenUtils
|
||||
import org.junit.Assume
|
||||
import org.junit.Before
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.MethodSorters
|
||||
import org.junit.runners.Parameterized
|
||||
|
||||
@RequiresDevice
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
open class EnterSplitScreenByDragFromShortcutBenchmark(flicker: FlickerTest) :
|
||||
SplitScreenBase(flicker) {
|
||||
@Before
|
||||
fun before() {
|
||||
Assume.assumeTrue(tapl.isTablet)
|
||||
}
|
||||
|
||||
protected val thisTransition: FlickerBuilder.() -> Unit = {
|
||||
setup {
|
||||
tapl.goHome()
|
||||
SplitScreenUtils.createShortcutOnHotseatIfNotExist(tapl, secondaryApp.appName)
|
||||
primaryApp.launchViaIntent(wmHelper)
|
||||
}
|
||||
transitions {
|
||||
tapl.launchedAppState.taskbar
|
||||
.getAppIcon(secondaryApp.appName)
|
||||
.openDeepShortcutMenu()
|
||||
.getMenuItem("Split Screen Secondary Activity")
|
||||
.dragToSplitscreen(secondaryApp.`package`, primaryApp.`package`)
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, secondaryApp)
|
||||
}
|
||||
}
|
||||
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
withoutTracing(this)
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() =
|
||||
flicker.splitScreenEntered(
|
||||
primaryApp,
|
||||
secondaryApp,
|
||||
fromOtherApp = false,
|
||||
appExistAtStart = false
|
||||
)
|
||||
|
||||
companion object {
|
||||
@Parameterized.Parameters(name = "{0}")
|
||||
@JvmStatic
|
||||
fun getParams(): List<FlickerTest> {
|
||||
return FlickerTestFactory.nonRotationTests(
|
||||
// TODO(b/176061063):The 3 buttons of nav bar do not exist in the hierarchy.
|
||||
supportedNavigationModes = listOf(NavBar.MODE_GESTURAL)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.splitscreen.benchmark
|
||||
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.NavBar
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.splitScreenEntered
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenBase
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenUtils
|
||||
import org.junit.Assume
|
||||
import org.junit.Before
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.MethodSorters
|
||||
import org.junit.runners.Parameterized
|
||||
|
||||
@RequiresDevice
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
open class EnterSplitScreenByDragFromTaskbarBenchmark(override val flicker: FlickerTest) :
|
||||
SplitScreenBase(flicker) {
|
||||
protected val thisTransition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
setup {
|
||||
tapl.goHome()
|
||||
SplitScreenUtils.createShortcutOnHotseatIfNotExist(tapl, secondaryApp.appName)
|
||||
primaryApp.launchViaIntent(wmHelper)
|
||||
}
|
||||
transitions {
|
||||
tapl.launchedAppState.taskbar
|
||||
.getAppIcon(secondaryApp.appName)
|
||||
.dragToSplitscreen(secondaryApp.`package`, primaryApp.`package`)
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, secondaryApp)
|
||||
}
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
withoutTracing(this)
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() =
|
||||
flicker.splitScreenEntered(
|
||||
primaryApp,
|
||||
secondaryApp,
|
||||
fromOtherApp = false,
|
||||
appExistAtStart = false
|
||||
)
|
||||
|
||||
@Before
|
||||
fun before() {
|
||||
Assume.assumeTrue(tapl.isTablet)
|
||||
}
|
||||
|
||||
companion object {
|
||||
@Parameterized.Parameters(name = "{0}")
|
||||
@JvmStatic
|
||||
fun getParams(): List<FlickerTest> {
|
||||
return FlickerTestFactory.nonRotationTests(
|
||||
supportedNavigationModes = listOf(NavBar.MODE_GESTURAL)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.splitscreen.benchmark
|
||||
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.splitScreenEntered
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenBase
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenUtils
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.MethodSorters
|
||||
import org.junit.runners.Parameterized
|
||||
|
||||
@RequiresDevice
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
open class EnterSplitScreenFromOverviewBenchmark(override val flicker: FlickerTest) :
|
||||
SplitScreenBase(flicker) {
|
||||
protected val thisTransition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
setup {
|
||||
primaryApp.launchViaIntent(wmHelper)
|
||||
secondaryApp.launchViaIntent(wmHelper)
|
||||
tapl.goHome()
|
||||
wmHelper
|
||||
.StateSyncBuilder()
|
||||
.withAppTransitionIdle()
|
||||
.withHomeActivityVisible()
|
||||
.waitForAndVerify()
|
||||
}
|
||||
transitions {
|
||||
SplitScreenUtils.splitFromOverview(tapl, device)
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, secondaryApp)
|
||||
}
|
||||
}
|
||||
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
withoutTracing(this)
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() = flicker.splitScreenEntered(primaryApp, secondaryApp, fromOtherApp = true)
|
||||
|
||||
companion object {
|
||||
@Parameterized.Parameters(name = "{0}")
|
||||
@JvmStatic
|
||||
fun getParams(): List<FlickerTest> {
|
||||
return FlickerTestFactory.nonRotationTests()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.splitscreen.benchmark
|
||||
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.NavBar
|
||||
import android.tools.common.Rotation
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import android.tools.device.helpers.WindowUtils
|
||||
import android.tools.device.traces.parsers.WindowManagerStateHelper
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenBase
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenUtils
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.MethodSorters
|
||||
import org.junit.runners.Parameterized
|
||||
|
||||
@RequiresDevice
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
open class SwitchAppByDoubleTapDividerBenchmark(override val flicker: FlickerTest) :
|
||||
SplitScreenBase(flicker) {
|
||||
protected val thisTransition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
setup { SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, secondaryApp) }
|
||||
transitions {
|
||||
SplitScreenUtils.doubleTapDividerToSwitch(device)
|
||||
wmHelper.StateSyncBuilder().withAppTransitionIdle().waitForAndVerify()
|
||||
|
||||
waitForLayersToSwitch(wmHelper)
|
||||
waitForWindowsToSwitch(wmHelper)
|
||||
}
|
||||
}
|
||||
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
withoutTracing(this)
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
private fun waitForWindowsToSwitch(wmHelper: WindowManagerStateHelper) {
|
||||
wmHelper
|
||||
.StateSyncBuilder()
|
||||
.add("appWindowsSwitched") {
|
||||
val primaryAppWindow =
|
||||
it.wmState.visibleWindows.firstOrNull { window ->
|
||||
primaryApp.windowMatchesAnyOf(window)
|
||||
}
|
||||
?: return@add false
|
||||
val secondaryAppWindow =
|
||||
it.wmState.visibleWindows.firstOrNull { window ->
|
||||
secondaryApp.windowMatchesAnyOf(window)
|
||||
}
|
||||
?: return@add false
|
||||
|
||||
if (isLandscape(flicker.scenario.endRotation)) {
|
||||
return@add if (flicker.scenario.isTablet) {
|
||||
secondaryAppWindow.frame.right <= primaryAppWindow.frame.left
|
||||
} else {
|
||||
primaryAppWindow.frame.right <= secondaryAppWindow.frame.left
|
||||
}
|
||||
} else {
|
||||
return@add if (flicker.scenario.isTablet) {
|
||||
primaryAppWindow.frame.bottom <= secondaryAppWindow.frame.top
|
||||
} else {
|
||||
primaryAppWindow.frame.bottom <= secondaryAppWindow.frame.top
|
||||
}
|
||||
}
|
||||
}
|
||||
.waitForAndVerify()
|
||||
}
|
||||
|
||||
private fun waitForLayersToSwitch(wmHelper: WindowManagerStateHelper) {
|
||||
wmHelper
|
||||
.StateSyncBuilder()
|
||||
.add("appLayersSwitched") {
|
||||
val primaryAppLayer =
|
||||
it.layerState.visibleLayers.firstOrNull { window ->
|
||||
primaryApp.layerMatchesAnyOf(window)
|
||||
}
|
||||
?: return@add false
|
||||
val secondaryAppLayer =
|
||||
it.layerState.visibleLayers.firstOrNull { window ->
|
||||
secondaryApp.layerMatchesAnyOf(window)
|
||||
}
|
||||
?: return@add false
|
||||
|
||||
val primaryVisibleRegion = primaryAppLayer.visibleRegion?.bounds ?: return@add false
|
||||
val secondaryVisibleRegion =
|
||||
secondaryAppLayer.visibleRegion?.bounds ?: return@add false
|
||||
|
||||
if (isLandscape(flicker.scenario.endRotation)) {
|
||||
return@add if (flicker.scenario.isTablet) {
|
||||
secondaryVisibleRegion.right <= primaryVisibleRegion.left
|
||||
} else {
|
||||
primaryVisibleRegion.right <= secondaryVisibleRegion.left
|
||||
}
|
||||
} else {
|
||||
return@add if (flicker.scenario.isTablet) {
|
||||
primaryVisibleRegion.bottom <= secondaryVisibleRegion.top
|
||||
} else {
|
||||
primaryVisibleRegion.bottom <= secondaryVisibleRegion.top
|
||||
}
|
||||
}
|
||||
}
|
||||
.waitForAndVerify()
|
||||
}
|
||||
|
||||
private fun isLandscape(rotation: Rotation): Boolean {
|
||||
val displayBounds = WindowUtils.getDisplayBounds(rotation)
|
||||
return displayBounds.width > displayBounds.height
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
open fun cujCompleted() {
|
||||
// TODO(b/246490534): Add validation for switched app after withAppTransitionIdle is
|
||||
// robust enough to get the correct end state.
|
||||
}
|
||||
|
||||
companion object {
|
||||
@Parameterized.Parameters(name = "{0}")
|
||||
@JvmStatic
|
||||
fun getParams(): List<FlickerTest> {
|
||||
return FlickerTestFactory.nonRotationTests(
|
||||
// TODO(b/176061063):The 3 buttons of nav bar do not exist in the hierarchy.
|
||||
supportedNavigationModes = listOf(NavBar.MODE_GESTURAL)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.splitscreen.benchmark
|
||||
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.NavBar
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.splitScreenEntered
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenBase
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenUtils
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.MethodSorters
|
||||
import org.junit.runners.Parameterized
|
||||
|
||||
@RequiresDevice
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
open class SwitchBackToSplitFromAnotherAppBenchmark(override val flicker: FlickerTest) :
|
||||
SplitScreenBase(flicker) {
|
||||
private val thirdApp = SplitScreenUtils.getNonResizeable(instrumentation)
|
||||
|
||||
protected val thisTransition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
setup {
|
||||
SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, secondaryApp)
|
||||
|
||||
thirdApp.launchViaIntent(wmHelper)
|
||||
wmHelper.StateSyncBuilder().withWindowSurfaceAppeared(thirdApp).waitForAndVerify()
|
||||
}
|
||||
transitions {
|
||||
tapl.launchedAppState.quickSwitchToPreviousApp()
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, secondaryApp)
|
||||
}
|
||||
}
|
||||
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
withoutTracing(this)
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() = flicker.splitScreenEntered(primaryApp, secondaryApp, fromOtherApp = true)
|
||||
|
||||
companion object {
|
||||
@Parameterized.Parameters(name = "{0}")
|
||||
@JvmStatic
|
||||
fun getParams(): List<FlickerTest> {
|
||||
return FlickerTestFactory.nonRotationTests(
|
||||
// TODO(b/176061063):The 3 buttons of nav bar do not exist in the hierarchy.
|
||||
supportedNavigationModes = listOf(NavBar.MODE_GESTURAL)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.splitscreen.benchmark
|
||||
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.NavBar
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.splitScreenEntered
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenBase
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenUtils
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.MethodSorters
|
||||
import org.junit.runners.Parameterized
|
||||
|
||||
@RequiresDevice
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
open class SwitchBackToSplitFromHomeBenchmark(override val flicker: FlickerTest) :
|
||||
SplitScreenBase(flicker) {
|
||||
protected val thisTransition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
setup {
|
||||
SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, secondaryApp)
|
||||
|
||||
tapl.goHome()
|
||||
wmHelper.StateSyncBuilder().withHomeActivityVisible().waitForAndVerify()
|
||||
}
|
||||
transitions {
|
||||
tapl.workspace.quickSwitchToPreviousApp()
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, secondaryApp)
|
||||
}
|
||||
}
|
||||
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
withoutTracing(this)
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() = flicker.splitScreenEntered(primaryApp, secondaryApp, fromOtherApp = true)
|
||||
|
||||
companion object {
|
||||
@Parameterized.Parameters(name = "{0}")
|
||||
@JvmStatic
|
||||
fun getParams(): List<FlickerTest> {
|
||||
return FlickerTestFactory.nonRotationTests(
|
||||
// TODO(b/176061063):The 3 buttons of nav bar do not exist in the hierarchy.
|
||||
supportedNavigationModes = listOf(NavBar.MODE_GESTURAL)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.splitscreen.benchmark
|
||||
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.common.NavBar
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.splitScreenEntered
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenBase
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenUtils
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.MethodSorters
|
||||
import org.junit.runners.Parameterized
|
||||
|
||||
@RequiresDevice
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
open class SwitchBackToSplitFromRecentBenchmark(override val flicker: FlickerTest) :
|
||||
SplitScreenBase(flicker) {
|
||||
protected val thisTransition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
setup {
|
||||
SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, secondaryApp)
|
||||
|
||||
tapl.goHome()
|
||||
wmHelper.StateSyncBuilder().withHomeActivityVisible().waitForAndVerify()
|
||||
}
|
||||
transitions {
|
||||
tapl.workspace.switchToOverview().currentTask.open()
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, secondaryApp)
|
||||
}
|
||||
}
|
||||
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
withoutTracing(this)
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui")
|
||||
@Presubmit
|
||||
@Test
|
||||
fun cujCompleted() = flicker.splitScreenEntered(primaryApp, secondaryApp, fromOtherApp = true)
|
||||
|
||||
companion object {
|
||||
@Parameterized.Parameters(name = "{0}")
|
||||
@JvmStatic
|
||||
fun getParams(): List<FlickerTest> {
|
||||
return FlickerTestFactory.nonRotationTests(
|
||||
// TODO(b/176061063):The 3 buttons of nav bar do not exist in the hierarchy.
|
||||
supportedNavigationModes = listOf(NavBar.MODE_GESTURAL)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.splitscreen.benchmark
|
||||
|
||||
import android.platform.test.annotations.IwTest
|
||||
import android.platform.test.annotations.Presubmit
|
||||
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
|
||||
import android.tools.device.flicker.legacy.FlickerBuilder
|
||||
import android.tools.device.flicker.legacy.FlickerTest
|
||||
import android.tools.device.flicker.legacy.FlickerTestFactory
|
||||
import androidx.test.filters.RequiresDevice
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenBase
|
||||
import com.android.wm.shell.flicker.splitscreen.SplitScreenUtils
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.MethodSorters
|
||||
import org.junit.runners.Parameterized
|
||||
|
||||
@RequiresDevice
|
||||
@RunWith(Parameterized::class)
|
||||
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
open class SwitchBetweenSplitPairsBenchmark(override val flicker: FlickerTest) :
|
||||
SplitScreenBase(flicker) {
|
||||
protected val thirdApp = SplitScreenUtils.getIme(instrumentation)
|
||||
protected val fourthApp = SplitScreenUtils.getSendNotification(instrumentation)
|
||||
|
||||
protected val thisTransition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
setup {
|
||||
SplitScreenUtils.enterSplit(wmHelper, tapl, device, primaryApp, secondaryApp)
|
||||
SplitScreenUtils.enterSplit(wmHelper, tapl, device, thirdApp, fourthApp)
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, thirdApp, fourthApp)
|
||||
}
|
||||
transitions {
|
||||
tapl.launchedAppState.quickSwitchToPreviousApp()
|
||||
SplitScreenUtils.waitForSplitComplete(wmHelper, primaryApp, secondaryApp)
|
||||
}
|
||||
teardown {
|
||||
thirdApp.exit(wmHelper)
|
||||
fourthApp.exit(wmHelper)
|
||||
}
|
||||
}
|
||||
|
||||
override val transition: FlickerBuilder.() -> Unit
|
||||
get() = {
|
||||
defaultSetup(this)
|
||||
defaultTeardown(this)
|
||||
thisTransition(this)
|
||||
}
|
||||
|
||||
@IwTest(focusArea = "sysui") @Presubmit @Test open fun cujCompleted() {}
|
||||
|
||||
companion object {
|
||||
@Parameterized.Parameters(name = "{0}")
|
||||
@JvmStatic
|
||||
fun getParams(): List<FlickerTest> {
|
||||
return FlickerTestFactory.nonRotationTests()
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user