Loading quickstep/src/com/android/quickstep/views/RecentsView.java +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -4497,6 +4499,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); Loading quickstep/tests/src/com/android/quickstep/TaplTestsSplitscreen.java 0 → 100644 +82 −0 Original line number Diff line number Diff line /* * 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); if (mLauncher.isTablet()) { mLauncher.enableBlockTimeout(true); mLauncher.showTaskbarIfHidden(); } } @After public void tearDown() { if (mLauncher.isTablet()) { 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(); } } tests/tapl/com/android/launcher3/tapl/AppIconMenu.java +9 −0 Original line number Diff line number Diff line Loading @@ -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); } tests/tapl/com/android/launcher3/tapl/Launchable.java +21 −0 Original line number Diff line number Diff line Loading @@ -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 + ")", Loading tests/tapl/com/android/launcher3/tapl/OverviewTask.java +3 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading
quickstep/src/com/android/quickstep/views/RecentsView.java +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -4497,6 +4499,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); Loading
quickstep/tests/src/com/android/quickstep/TaplTestsSplitscreen.java 0 → 100644 +82 −0 Original line number Diff line number Diff line /* * 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); if (mLauncher.isTablet()) { mLauncher.enableBlockTimeout(true); mLauncher.showTaskbarIfHidden(); } } @After public void tearDown() { if (mLauncher.isTablet()) { 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(); } }
tests/tapl/com/android/launcher3/tapl/AppIconMenu.java +9 −0 Original line number Diff line number Diff line Loading @@ -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); }
tests/tapl/com/android/launcher3/tapl/Launchable.java +21 −0 Original line number Diff line number Diff line Loading @@ -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 + ")", Loading
tests/tapl/com/android/launcher3/tapl/OverviewTask.java +3 −4 Original line number Diff line number Diff line Loading @@ -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; Loading