Merge "Create TAPL test suite for splitscreen" into tm-qpr-dev am: ad9bdcfd2d

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/21221178

Change-Id: I14e25affb3d204cd2fcf0f693fd53ce502e576f3
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Jeremy Sim
2023-03-04 06:46:09 +00:00
committed by Automerger Merge Worker
6 changed files with 169 additions and 4 deletions

View File

@@ -147,6 +147,8 @@ import com.android.launcher3.logging.StatsLogManager;
import com.android.launcher3.statehandlers.DepthController;
import com.android.launcher3.statemanager.BaseState;
import com.android.launcher3.statemanager.StatefulActivity;
import com.android.launcher3.testing.TestLogging;
import com.android.launcher3.testing.shared.TestProtocol;
import com.android.launcher3.touch.OverScroll;
import com.android.launcher3.touch.PagedOrientationHandler;
import com.android.launcher3.util.DynamicResource;
@@ -4491,6 +4493,7 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
* Attempts to initiate split with an existing taskView, if one exists
*/
public void initiateSplitSelect(SplitSelectSource splitSelectSource) {
TestLogging.recordEvent(TestProtocol.SEQUENCE_MAIN, "enterSplitSelect");
mSplitSelectSource = splitSelectSource;
mSplitHiddenTaskView = getTaskViewByTaskId(splitSelectSource.alreadyRunningTaskId);
mSplitHiddenTaskViewIndex = indexOfChild(mSplitHiddenTaskView);

View File

@@ -0,0 +1,78 @@
/*
* 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.quickstep;
import android.content.Intent;
import com.android.launcher3.ui.TaplTestsLauncher3;
import com.android.launcher3.util.rule.TestStabilityRule;
import com.android.quickstep.TaskbarModeSwitchRule.TaskbarModeSwitch;
import org.junit.After;
import org.junit.Assume;
import org.junit.Before;
import org.junit.Test;
public class TaplTestsSplitscreen extends AbstractQuickStepTest {
private static final String CALCULATOR_APP_NAME = "Calculator";
private static final String CALCULATOR_APP_PACKAGE =
resolveSystemApp(Intent.CATEGORY_APP_CALCULATOR);
@Override
@Before
public void setUp() throws Exception {
super.setUp();
TaplTestsLauncher3.initialize(this);
mLauncher.getWorkspace()
.deleteAppIcon(mLauncher.getWorkspace().getHotseatAppIcon(0))
.switchToAllApps()
.getAppIcon(CALCULATOR_APP_NAME)
.dragToHotseat(0);
startAppFast(CALCULATOR_APP_PACKAGE);
mLauncher.enableBlockTimeout(true);
mLauncher.showTaskbarIfHidden();
}
@After
public void tearDown() {
mLauncher.enableBlockTimeout(false);
}
@Test
// TODO (b/270201357): When this test is proven stable, remove this TestStabilityRule and
// introduce into presubmit as well.
@TestStabilityRule.Stability(
flavors = TestStabilityRule.LOCAL | TestStabilityRule.PLATFORM_POSTSUBMIT)
@PortraitLandscape
@TaskbarModeSwitch
public void testSplitAppFromHomeWithItself() throws Exception {
Assume.assumeTrue(mLauncher.isTablet());
mLauncher.goHome()
.switchToAllApps()
.getAppIcon(CALCULATOR_APP_NAME)
.openMenu()
.getSplitScreenMenuItem()
.click();
mLauncher.getLaunchedAppState()
.getTaskbar()
.getAppIcon(CALCULATOR_APP_NAME)
.launchIntoSplitScreen();
}
}

View File

@@ -54,5 +54,14 @@ public abstract class AppIconMenu {
return createMenuItem(menuItem);
}
/**
* Returns a menu item that matches the text "Split screen". Fails if it doesn't exist.
*/
public SplitScreenMenuItem getSplitScreenMenuItem() {
final UiObject2 menuItem = mLauncher.waitForObjectInContainer(mDeepShortcutsContainer,
AppIcon.getAppIconSelector("Split screen", mLauncher));
return new SplitScreenMenuItem(mLauncher, menuItem);
}
protected abstract AppIconMenuItem createMenuItem(UiObject2 menuItem);
}

View File

@@ -76,6 +76,27 @@ public abstract class Launchable {
}
}
/**
* Clicks a launcher object to initiate splitscreen, where the selected app will be one of two
* apps running on the screen. Should be called when Launcher is in a "split staging" state
* and is waiting for the user's selection of a second app. Expects a SPLIT_START_EVENT to be
* fired when the click is executed.
*/
public LaunchedAppState launchIntoSplitScreen() {
try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer(
"want to launch split tasks from " + launchableType())) {
LauncherInstrumentation.log("Launchable.launch before click "
+ mObject.getVisibleCenter() + " in " + mLauncher.getVisibleBounds(mObject));
mLauncher.clickLauncherObject(mObject);
try (LauncherInstrumentation.Closable c2 = mLauncher.addContextLayer("clicked")) {
mLauncher.expectEvent(TestProtocol.SEQUENCE_MAIN, OverviewTask.SPLIT_START_EVENT);
return new LaunchedAppState(mLauncher);
}
}
}
protected LaunchedAppState assertAppLaunched(BySelector selector) {
mLauncher.assertTrue(
"App didn't start: (" + selector + ")",

View File

@@ -37,10 +37,9 @@ import java.util.stream.Collectors;
public final class OverviewTask {
private static final String SYSTEMUI_PACKAGE = "com.android.systemui";
static final Pattern TASK_START_EVENT =
Pattern.compile("startActivityFromRecentsAsync");
static final Pattern SPLIT_START_EVENT =
Pattern.compile("launchSplitTasks");
static final Pattern TASK_START_EVENT = Pattern.compile("startActivityFromRecentsAsync");
static final Pattern SPLIT_SELECT_EVENT = Pattern.compile("enterSplitSelect");
static final Pattern SPLIT_START_EVENT = Pattern.compile("launchSplitTasks");
private final LauncherInstrumentation mLauncher;
private final UiObject2 mTask;
private final BaseOverview mOverview;

View File

@@ -0,0 +1,55 @@
/*
* 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.launcher3.tapl;
import androidx.test.uiautomator.UiObject2;
import com.android.launcher3.testing.shared.TestProtocol;
/**
* A class representing the "Split screen" menu item in the app long-press menu. Used for TAPL
* testing in a similar way as other menu items {@link AppIconMenuItem}, but unlike AppIconMenuItem,
* the split screen command does not trigger an app launch. Instead, it causes Launcher to shift to
* a different state (OverviewSplitSelect).
*/
public final class SplitScreenMenuItem {
private final LauncherInstrumentation mLauncher;
private final UiObject2 mObject;
SplitScreenMenuItem(LauncherInstrumentation launcher, UiObject2 object) {
mLauncher = launcher;
mObject = object;
}
/**
* Executes a click command on this menu item. Expects a SPLIT_SELECT_EVENT to be fired.
*/
public void click() {
try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer(
"want to enter split select from app long-press menu")) {
LauncherInstrumentation.log("clicking on split screen menu item "
+ mObject.getVisibleCenter() + " in " + mLauncher.getVisibleBounds(mObject));
mLauncher.clickLauncherObject(mObject);
try (LauncherInstrumentation.Closable c2 = mLauncher.addContextLayer("clicked")) {
mLauncher.expectEvent(TestProtocol.SEQUENCE_MAIN, OverviewTask.SPLIT_SELECT_EVENT);
mLauncher.waitForLauncherObject("split_placeholder");
}
}
}
}