From 924c181fcd84c3fabcc8c82a8e74cbcea341b2ff Mon Sep 17 00:00:00 2001 From: Schneider Victor-Tulias Date: Wed, 19 Mar 2025 13:55:27 -0400 Subject: [PATCH 1/2] Fix missing TAPL test state checks Flag: com.android.launcher3.enable_launcher_overview_in_window Bug: 377678992 Test: pre/postsubmit Change-Id: I2315e0af7b0567368ddc194a2d5ec7b3e563175f --- .../fallback/window/RecentsWindowManager.kt | 5 +- .../window/RecentsWindowSwipeHandler.java | 17 +++- .../quickstep/AbsSwipeUpHandlerTestCase.java | 16 ++- .../FallbackSwipeHandlerTestCase.java | 6 ++ .../LauncherSwipeHandlerV2TestCase.java | 6 ++ .../RecentsWindowSwipeHandlerTestCase.java | 15 ++- .../quickstep/AbstractQuickStepTest.java | 16 +-- .../android/quickstep/TaplTestsQuickstep.java | 98 ++++++++----------- 8 files changed, 108 insertions(+), 71 deletions(-) diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt index fe387fdc64..a674bf4e23 100644 --- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt +++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt @@ -37,6 +37,7 @@ import com.android.launcher3.AbstractFloatingView import com.android.launcher3.BaseActivity import com.android.launcher3.LauncherAnimationRunner import com.android.launcher3.LauncherAnimationRunner.RemoteAnimationFactory +import com.android.launcher3.LauncherState import com.android.launcher3.R import com.android.launcher3.compat.AccessibilityManagerCompat import com.android.launcher3.statemanager.StateManager @@ -66,7 +67,7 @@ import com.android.quickstep.fallback.RecentsState import com.android.quickstep.fallback.RecentsState.BACKGROUND_APP import com.android.quickstep.fallback.RecentsState.BG_LAUNCHER import com.android.quickstep.fallback.RecentsState.DEFAULT -import com.android.quickstep.fallback.RecentsState.HOME +import com.android.quickstep.fallback.toLauncherState import com.android.quickstep.fallback.toLauncherStateOrdinal import com.android.quickstep.util.RecentsAtomicAnimationFactory import com.android.quickstep.util.RecentsWindowProtoLogProxy @@ -361,7 +362,7 @@ class RecentsWindowManager(context: Context, wallpaperColorHints: Int) : override fun onStateSetEnd(state: RecentsState) { super.onStateSetEnd(state) RecentsWindowProtoLogProxy.logOnStateSetEnd(state.toString()) - if (state == HOME || state == BG_LAUNCHER) { + if (state.toLauncherState() == LauncherState.NORMAL) { cleanupRecentsWindow() } AccessibilityManagerCompat.sendStateEventToTest(baseContext, state.toLauncherStateOrdinal()) diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java index a0d790680a..1649bd0205 100644 --- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java @@ -27,6 +27,7 @@ import static com.android.launcher3.GestureNavContract.EXTRA_ON_FINISH_CALLBACK; import static com.android.launcher3.GestureNavContract.EXTRA_REMOTE_CALLBACK; import static com.android.launcher3.anim.AnimatorListeners.forEndCallback; +import android.animation.Animator; import android.app.ActivityManager.RunningTaskInfo; import android.content.Context; import android.content.Intent; @@ -58,6 +59,7 @@ import androidx.annotation.UiThread; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimatedFloat; +import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.anim.SpringAnimationBuilder; @@ -273,8 +275,10 @@ public class RecentsWindowSwipeHandler extends AbsSwipeUpHandler mStateManager; @Mock protected CONTAINER_INTERFACE mActivityInterface; @Mock protected ContextInitListener mContextInitListener; @@ -142,6 +145,7 @@ public abstract class AbsSwipeUpHandlerTestCase< @Mock protected GestureState mGestureState; @Mock protected MSDLPlayerWrapper mMSDLPlayerWrapper; @Mock protected RecentsAnimationDeviceState mDeviceState; + @Mock protected StateManager.AtomicAnimationFactory mAtomicAnimationFactory; @Before public void setUpAnimationTargets() { @@ -193,7 +197,7 @@ public abstract class AbsSwipeUpHandlerTestCase< @Before public void setUpRecentsContainer() { mTaskAnimationManager = new TaskAnimationManager(mContext, DEFAULT_DISPLAY); - RecentsViewContainer recentsContainer = getRecentsContainer(); + RECENTS_CONTAINER recentsContainer = getRecentsContainer(); RECENTS_VIEW recentsView = getRecentsView(); when(recentsContainer.getDeviceProfile()).thenReturn(new DeviceProfile()); @@ -201,6 +205,7 @@ public abstract class AbsSwipeUpHandlerTestCase< when(recentsContainer.getDragLayer()).thenReturn(mDragLayer); when(recentsContainer.getRootView()).thenReturn(mRootView); when(recentsContainer.getSystemUiController()).thenReturn(mSystemUiController); + when(recentsContainer.createAtomicAnimationFactory()).thenReturn(mAtomicAnimationFactory); when(mActivityInterface.createActivityInitListener(any())) .thenReturn(mContextInitListener); doReturn(recentsContainer).when(mActivityInterface).getCreatedContainer(); @@ -208,6 +213,10 @@ public abstract class AbsSwipeUpHandlerTestCase< answer.getArgument(0).run(); return this; }).when(recentsContainer).runOnBindToTouchInteractionService(any()); + + mStateManager = spy(new StateManager<>(recentsContainer, getBaseState())); + + doReturn(mStateManager).when(recentsContainer).getStateManager(); } @Test @@ -393,8 +402,11 @@ public abstract class AbsSwipeUpHandlerTestCase< long touchTimeMs, boolean continuingLastGesture); @NonNull - protected abstract RecentsViewContainer getRecentsContainer(); + protected abstract RECENTS_CONTAINER getRecentsContainer(); @NonNull protected abstract RECENTS_VIEW getRecentsView(); + + @NonNull + protected abstract STATE_TYPE getBaseState(); } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/FallbackSwipeHandlerTestCase.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/FallbackSwipeHandlerTestCase.java index ef82ee5105..d07b4678b3 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/FallbackSwipeHandlerTestCase.java +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/FallbackSwipeHandlerTestCase.java @@ -64,4 +64,10 @@ public class FallbackSwipeHandlerTestCase extends AbsSwipeUpHandlerTestCase< protected FallbackRecentsView getRecentsView() { return mRecentsView; } + + @NonNull + @Override + protected RecentsState getBaseState() { + return RecentsState.BG_LAUNCHER; + } } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2TestCase.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2TestCase.java index 0d0bec5122..612095e0fd 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2TestCase.java +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2TestCase.java @@ -95,4 +95,10 @@ public class LauncherSwipeHandlerV2TestCase extends AbsSwipeUpHandlerTestCase< protected RecentsView getRecentsView() { return mRecentsView; } + + @NonNull + @Override + protected LauncherState getBaseState() { + return LauncherState.NORMAL; + } } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsWindowSwipeHandlerTestCase.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsWindowSwipeHandlerTestCase.java index e2b1a55f97..071f12efd2 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsWindowSwipeHandlerTestCase.java +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsWindowSwipeHandlerTestCase.java @@ -16,6 +16,9 @@ package com.android.quickstep; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.when; + import androidx.annotation.NonNull; import androidx.test.filters.SmallTest; @@ -28,7 +31,6 @@ import com.android.quickstep.fallback.RecentsState; import com.android.quickstep.fallback.window.RecentsDisplayModel; import com.android.quickstep.fallback.window.RecentsWindowManager; import com.android.quickstep.fallback.window.RecentsWindowSwipeHandler; -import com.android.quickstep.views.RecentsViewContainer; import dagger.BindsInstance; import dagger.Component; @@ -52,6 +54,9 @@ public class RecentsWindowSwipeHandlerTestCase extends AbsSwipeUpHandlerTestCase @Before public void setRecentsDisplayModel() { + when(mRecentsDisplayModel.getRecentsWindowManager(anyInt())) + .thenReturn(mRecentsWindowManager); + mContext.initDaggerComponent(DaggerRecentsWindowSwipeHandlerTestCase_TestComponent.builder() .bindRecentsDisplayModel(mRecentsDisplayModel)); } @@ -73,7 +78,7 @@ public class RecentsWindowSwipeHandlerTestCase extends AbsSwipeUpHandlerTestCase @NonNull @Override - protected RecentsViewContainer getRecentsContainer() { + protected RecentsWindowManager getRecentsContainer() { return mRecentsWindowManager; } @@ -83,6 +88,12 @@ public class RecentsWindowSwipeHandlerTestCase extends AbsSwipeUpHandlerTestCase return mRecentsView; } + @NonNull + @Override + protected RecentsState getBaseState() { + return RecentsState.BG_LAUNCHER; + } + @LauncherAppSingleton @Component(modules = {AllModulesForTest.class}) interface TestComponent extends LauncherAppComponent { diff --git a/quickstep/tests/src/com/android/quickstep/AbstractQuickStepTest.java b/quickstep/tests/src/com/android/quickstep/AbstractQuickStepTest.java index c215ff2227..b059ec4034 100644 --- a/quickstep/tests/src/com/android/quickstep/AbstractQuickStepTest.java +++ b/quickstep/tests/src/com/android/quickstep/AbstractQuickStepTest.java @@ -16,6 +16,8 @@ package com.android.quickstep; +import static com.android.quickstep.fallback.RecentsStateUtilsKt.toLauncherState; + import static org.junit.Assert.assertTrue; import android.os.SystemProperties; @@ -23,20 +25,19 @@ import android.os.SystemProperties; import androidx.test.uiautomator.By; import androidx.test.uiautomator.Until; +import com.android.launcher3.LauncherState; import com.android.launcher3.tapl.LaunchedAppState; import com.android.launcher3.tapl.TestHelpers; import com.android.launcher3.ui.AbstractLauncherUiTest; import com.android.launcher3.uioverrides.QuickstepLauncher; import com.android.launcher3.util.TestUtil; import com.android.launcher3.util.Wait; -import com.android.quickstep.fallback.RecentsState; import com.android.quickstep.fallback.window.RecentsWindowManager; import com.android.quickstep.views.RecentsView; import org.junit.rules.RuleChain; import org.junit.rules.TestRule; -import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; @@ -64,9 +65,10 @@ public abstract class AbstractQuickStepTest extends AbstractLauncherUiTest state) { + protected void waitForRecentsWindowState(String message, Supplier state) { waitForRecentsWindowCondition(message, recentsWindow -> - recentsWindow.getStateManager().getCurrentStableState() == state.get()); + state.get() == toLauncherState( + recentsWindow.getStateManager().getCurrentStableState())); } // Cannot be used in TaplTests after injecting any gesture using Tapl because this can hide @@ -94,10 +96,10 @@ public abstract class AbstractQuickStepTest extends AbstractLauncherUiTest getFromRecentsWindow(condition), mLauncher, timeout); } - protected boolean isInRecentsWindowState(Supplier state) { + protected boolean isInRecentsWindowState(Supplier state) { if (!TestHelpers.isInLauncherProcess()) return true; - return getFromRecentsWindow( - recentsWindow -> recentsWindow.getStateManager().getState() == state.get()); + return getFromRecentsWindow(recentsWindow -> + state.get() == toLauncherState(recentsWindow.getStateManager().getState())); } protected void assertTestActivityIsRunning(int activityNumber, String message) { diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java index fc60bec151..9abfbf7eef 100644 --- a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java +++ b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java @@ -57,7 +57,6 @@ import com.android.launcher3.util.rule.ScreenRecordRule; import com.android.launcher3.util.rule.TestStabilityRule; import com.android.quickstep.NavigationModeSwitchRule.NavigationModeSwitch; import com.android.quickstep.TaskbarModeSwitchRule.TaskbarModeSwitch; -import com.android.quickstep.fallback.RecentsState; import com.android.quickstep.views.RecentsView; import org.junit.After; @@ -80,20 +79,6 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { private static final String READ_DEVICE_CONFIG_PERMISSION = "android.permission.READ_DEVICE_CONFIG"; - private enum ExpectedState { - - HOME(LauncherState.NORMAL, RecentsState.HOME), - OVERVIEW(LauncherState.OVERVIEW, RecentsState.DEFAULT); - - private final LauncherState mLauncherState; - private final RecentsState mRecentsState; - - ExpectedState(LauncherState launcherState, RecentsState recentsState) { - this.mLauncherState = launcherState; - this.mRecentsState = recentsState; - } - } - @Before public void setUp() throws Exception { super.setUp(); @@ -131,7 +116,7 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { // mLauncher.pressHome() also tests an important case of pressing home while in background. Overview overview = mLauncher.goHome().switchToOverview(); assertIsInState( - "Launcher internal state didn't switch to Overview", ExpectedState.OVERVIEW); + "Launcher internal state didn't switch to Overview", LauncherState.OVERVIEW); runOnRecentsView(recentsView -> assertTrue("Don't have at least 3 tasks", recentsView.getTaskViewCount() >= 3)); @@ -140,14 +125,14 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { 0, recentsView.getCurrentPage())); overview.flingForward(); - assertIsInState("Launcher internal state is not Overview", ExpectedState.OVERVIEW); + assertIsInState("Launcher internal state is not Overview", LauncherState.OVERVIEW); final Integer currentTaskAfterFlingForward = getFromRecentsView(RecentsView::getCurrentPage); runOnRecentsView(recentsView -> assertTrue("Current task in Overview is still 0", currentTaskAfterFlingForward > 0)); overview.flingBackward(); - assertIsInState("Launcher internal state is not Overview", ExpectedState.OVERVIEW); + assertIsInState("Launcher internal state is not Overview", LauncherState.OVERVIEW); runOnRecentsView(recentsView -> assertTrue("Flinging back in Overview did nothing", recentsView.getCurrentPage() < currentTaskAfterFlingForward)); @@ -163,7 +148,7 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { // Test dismissing a task. overview = mLauncher.goHome().switchToOverview(); assertIsInState("Launcher internal state didn't switch to Overview", - ExpectedState.OVERVIEW); + LauncherState.OVERVIEW); final Integer numTasks = getFromRecentsView(RecentsView::getTaskViewCount); task = overview.getCurrentTask(); assertNotNull("overview.getCurrentTask() returned null (2)", task); @@ -174,7 +159,7 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { // Test dismissing all tasks. mLauncher.goHome().switchToOverview().dismissAllTasks(); - assertIsInState("Launcher internal state is not Home", ExpectedState.HOME); + assertIsInState("Launcher internal state is not Home", LauncherState.NORMAL); runOnRecentsView(recentsView -> assertEquals("Still have tasks after dismissing all", 0, recentsView.getTaskViewCount())); } @@ -198,10 +183,10 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { public void testDismissOverviewWithEscKey() throws Exception { startTestAppsWithCheck(); final Overview overview = mLauncher.goHome().switchToOverview(); - assertIsInState("Launcher internal state is not Overview", ExpectedState.OVERVIEW); + assertIsInState("Launcher internal state is not Overview", LauncherState.OVERVIEW); overview.dismissByEscKey(); - assertIsInState("Launcher internal state is not Home", ExpectedState.HOME); + assertIsInState("Launcher internal state is not Home", LauncherState.NORMAL); } @Test @@ -217,14 +202,15 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { selectModeButtons = overview.getOverviewActions().clickSelect(); } - assertTrue("Launcher internal state is not Overview Modal Task", - isInState(() -> LauncherState.OVERVIEW_MODAL_TASK)); + assertIsInState( + "Launcher internal state is not Overview Modal Task", + LauncherState.OVERVIEW_MODAL_TASK); selectModeButtons.dismissByEscKey(); - assertIsInState("Launcher internal state is not Overview", ExpectedState.OVERVIEW); + assertIsInState("Launcher internal state is not Overview", LauncherState.OVERVIEW); overview.dismissByEscKey(); - assertIsInState("Launcher internal state is not Home", ExpectedState.HOME); + assertIsInState("Launcher internal state is not Home", LauncherState.NORMAL); } @Test @@ -232,11 +218,11 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { startTestAppsWithCheck(); startAppFast(CALCULATOR_APP_PACKAGE); // Ensure Calculator is last opened app. Workspace home = mLauncher.goHome(); - assertIsInState("Launcher state is not Home", ExpectedState.HOME); + assertIsInState("Launcher state is not Home", LauncherState.NORMAL); Overview overview = home.openOverviewFromActionPlusTabKeyboardShortcut(); - assertIsInState("Launcher state is not Overview", ExpectedState.OVERVIEW); + assertIsInState("Launcher state is not Overview", LauncherState.OVERVIEW); overview.launchFocusedTaskByEnterKey(CALCULATOR_APP_PACKAGE); // Assert app is focused. } @@ -245,11 +231,11 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { startTestAppsWithCheck(); startAppFast(CALCULATOR_APP_PACKAGE); // Ensure Calculator is last opened app. Workspace home = mLauncher.goHome(); - assertIsInState("Launcher state is not Home", ExpectedState.HOME); + assertIsInState("Launcher state is not Home", LauncherState.NORMAL); Overview overview = home.openOverviewFromRecentsKeyboardShortcut(); - assertIsInState("Launcher state is not Overview", ExpectedState.OVERVIEW); + assertIsInState("Launcher state is not Overview", LauncherState.OVERVIEW); overview.launchFocusedTaskByEnterKey(CALCULATOR_APP_PACKAGE); // Assert app is focused. } @@ -261,7 +247,7 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { assertNotNull("Workspace.switchToOverview() returned null", mLauncher.goHome().switchToOverview()); assertIsInState( - "Launcher internal state didn't switch to Overview", ExpectedState.OVERVIEW); + "Launcher internal state didn't switch to Overview", LauncherState.OVERVIEW); } @Test @@ -287,7 +273,7 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { assertNotNull("Background.switchToOverview() returned null", launchedAppState.switchToOverview()); assertIsInState( - "Launcher internal state didn't switch to Overview", ExpectedState.OVERVIEW); + "Launcher internal state didn't switch to Overview", LauncherState.OVERVIEW); } @Test @@ -380,11 +366,11 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { // Debug if we need to goHome to prevent wrong previous state b/315525621 mLauncher.goHome(); mLauncher.getWorkspace().switchToAllApps().pressBackToWorkspace(); - waitForState("Launcher internal state didn't switch to Home", ExpectedState.HOME); + waitForState("Launcher internal state didn't switch to Home", LauncherState.NORMAL); startAppFast(CALCULATOR_APP_PACKAGE); mLauncher.getLaunchedAppState().pressBackToWorkspace(); - waitForState("Launcher internal state didn't switch to Home", ExpectedState.HOME); + waitForState("Launcher internal state didn't switch to Home", LauncherState.NORMAL); } @Test @@ -404,7 +390,7 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { // Test scroll the first task off screen overview.scrollCurrentTaskOffScreen(); - assertIsInState("Launcher internal state is not Overview", ExpectedState.OVERVIEW); + assertIsInState("Launcher internal state is not Overview", LauncherState.OVERVIEW); runOnRecentsView(recentsView -> assertTrue("Current task in Overview is still 0", recentsView.getCurrentPage() > 0)); @@ -420,7 +406,7 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { overview = mLauncher.goHome().switchToOverview(); overview.scrollCurrentTaskOffScreen(); assertIsInState( - "Launcher internal state is not Overview", ExpectedState.OVERVIEW); + "Launcher internal state is not Overview", LauncherState.OVERVIEW); runOnRecentsView(recentsView -> assertTrue("Current task in Overview is still 0", recentsView.getCurrentPage() > 0)); @@ -436,10 +422,10 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { // Test dismissing more tasks. assertIsInState( - "Launcher internal state didn't remain in Overview", ExpectedState.OVERVIEW); + "Launcher internal state didn't remain in Overview", LauncherState.OVERVIEW); overview.getCurrentTask().dismiss(); assertIsInState( - "Launcher internal state didn't remain in Overview", ExpectedState.OVERVIEW); + "Launcher internal state didn't remain in Overview", LauncherState.OVERVIEW); overview.getCurrentTask().dismiss(); runOnRecentsView(recentsView -> assertTrue( "Grid did not rebalance after multiple dismissals", @@ -448,7 +434,7 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { // Test dismissing all tasks. mLauncher.goHome().switchToOverview().dismissAllTasks(); - assertIsInState("Launcher internal state is not Home", ExpectedState.HOME); + assertIsInState("Launcher internal state is not Home", LauncherState.NORMAL); runOnRecentsView(recentsView -> assertEquals("Still have tasks after dismissing all", 0, recentsView.getTaskViewCount())); } @@ -459,18 +445,18 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { startTestAppsWithCheck(); Overview overview = mLauncher.goHome().switchToOverview(); - assertIsInState("Launcher internal state should be Overview", ExpectedState.OVERVIEW); + assertIsInState("Launcher internal state should be Overview", LauncherState.OVERVIEW); runOnRecentsView(recentsView -> assertTrue("Should have at least 3 tasks", recentsView.getTaskViewCount() >= 3)); // It should not dismiss overview when tapping between tasks overview.touchBetweenTasks(); overview = mLauncher.getOverview(); - assertIsInState("Launcher internal state should be Overview", ExpectedState.OVERVIEW); + assertIsInState("Launcher internal state should be Overview", LauncherState.OVERVIEW); // Dismiss when tapping to the right of the focused task overview.touchOutsideFirstTask(); - assertIsInState("Launcher internal state should be Home", ExpectedState.HOME); + assertIsInState("Launcher internal state should be Home", LauncherState.NORMAL); } @Test @@ -482,28 +468,28 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { startTestAppsWithCheck(); Overview overview = mLauncher.goHome().switchToOverview(); - assertIsInState("Launcher internal state should be Overview", ExpectedState.OVERVIEW); + assertIsInState("Launcher internal state should be Overview", LauncherState.OVERVIEW); runOnRecentsView(recentsView -> assertTrue("Should have at least 3 tasks", recentsView.getTaskViewCount() >= 3)); if (mLauncher.isTransientTaskbar()) { // On transient taskbar, it should dismiss when tapping outside taskbar bounds. overview.touchTaskbarBottomCorner(/* tapRight= */ false); - assertIsInState("Launcher internal state should be Normal", ExpectedState.HOME); + assertIsInState("Launcher internal state should be Normal", LauncherState.NORMAL); overview = mLauncher.getWorkspace().switchToOverview(); // On transient taskbar, it should dismiss when tapping outside taskbar bounds. overview.touchTaskbarBottomCorner(/* tapRight= */ true); - assertIsInState("Launcher internal state should be Normal", ExpectedState.HOME); + assertIsInState("Launcher internal state should be Normal", LauncherState.NORMAL); } else { // On persistent taskbar, it should not dismiss when tapping the taskbar overview.touchTaskbarBottomCorner(/* tapRight= */ false); - assertIsInState("Launcher internal state should be Overview", ExpectedState.OVERVIEW); + assertIsInState("Launcher internal state should be Overview", LauncherState.OVERVIEW); // On persistent taskbar, it should not dismiss when tapping the taskbar overview.touchTaskbarBottomCorner(/* tapRight= */ true); - assertIsInState("Launcher internal state should be Overview", ExpectedState.OVERVIEW); + assertIsInState("Launcher internal state should be Overview", LauncherState.OVERVIEW); } } @@ -549,7 +535,7 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { startTestAppsWithCheck(); Overview overview = mLauncher.goHome().switchToOverview(); assertIsInState("Launcher internal state didn't switch to Overview", - ExpectedState.OVERVIEW); + LauncherState.OVERVIEW); final Integer numTasks = getFromRecentsView(RecentsView::getTaskViewCount); OverviewTask task = overview.getCurrentTask(); assertNotNull("overview.getCurrentTask() returned null (2)", task); @@ -571,7 +557,7 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { Overview overview = mLauncher.goHome().switchToOverview(); assertIsInState("Launcher internal state didn't switch to Overview", - ExpectedState.OVERVIEW); + LauncherState.OVERVIEW); final Integer numTasks = getFromRecentsView(RecentsView::getTaskViewCount); Optional bottomTask = overview.getCurrentTasksForTablet().stream().max( Comparator.comparingInt(OverviewTask::getTaskCenterY)); @@ -598,7 +584,7 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { recentsView.getBottomRowTaskCountForTablet())); Overview overview = mLauncher.goHome().switchToOverview(); assertIsInState("Launcher internal state didn't switch to Overview", - ExpectedState.OVERVIEW); + LauncherState.OVERVIEW); overview.flingForwardUntilClearAllVisible(); assertTrue("Clear All not visible.", overview.isClearAllVisible()); @@ -644,18 +630,18 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { } private void assertIsInState( - @NonNull String failureMessage, @NonNull ExpectedState expectedState) { + @NonNull String failureMessage, @NonNull LauncherState expectedState) { assertTrue(failureMessage, enableLauncherOverviewInWindow() - ? isInRecentsWindowState(() -> expectedState.mRecentsState) - : isInState(() -> expectedState.mLauncherState)); + ? isInRecentsWindowState(() -> expectedState) + : isInState(() -> expectedState)); } private void waitForState( - @NonNull String failureMessage, @NonNull ExpectedState expectedState) { + @NonNull String failureMessage, @NonNull LauncherState expectedState) { if (enableLauncherOverviewInWindow()) { - waitForRecentsWindowState(failureMessage, () -> expectedState.mRecentsState); + waitForRecentsWindowState(failureMessage, () -> expectedState); } else { - waitForState(failureMessage, () -> expectedState.mLauncherState); + waitForState(failureMessage, () -> expectedState); } } From cdf20df7f695cc126877f7e66c85889ff6d593c8 Mon Sep 17 00:00:00 2001 From: Schneider Victor-Tulias Date: Wed, 26 Mar 2025 15:57:09 -0400 Subject: [PATCH 2/2] Fix broken uses of TISBinder.refreshOverviewTarget TaskbarManager.setActivity doesn't get called again when TISBinder.refreshOverviewTarget is called because TIS isn't re-connecting to launcher. TISBinder.refreshOverviewTarget just forcefully updated the overview target, but TIS was still connected. So, QuickstepLauncher.onTISConnected wouldn't run again to call TaskbarMAnager.setActivity(this). Calling it manually to fix failing TaplTestsNexus tests with recents in window flags enabled Flag: com.android.launcher3.enable_launcher_overview_in_window Flag: com.android.launcher3.enable_fallback_overview_in_window Flag: com.android.launcher3.enable_overview_on_connected_displays Bug: 377678992 Test: TaplTestsNexus.testDismissWithKeyboardShortcut and TaplTestsNexus.testSearchWithKeyboardShortcut Change-Id: Ib386c3b8cfc5a9167f7f219dba0cccec344446b6 --- .../quickstep/QuickstepTestInformationHandler.java | 2 +- .../android/quickstep/TouchInteractionService.java | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java b/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java index b6046810ba..d80c05b99e 100644 --- a/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java +++ b/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java @@ -174,7 +174,7 @@ public class QuickstepTestInformationHandler extends TestInformationHandler { return response; case TestProtocol.REQUEST_REFRESH_OVERVIEW_TARGET: - runOnTISBinder(TouchInteractionService.TISBinder::refreshOverviewTarget); + runOnTISBinder(TouchInteractionService.TISBinder::refreshOverviewTargetForTest); return response; case TestProtocol.REQUEST_RECREATE_TASKBAR: diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index b059b330ed..226eeed4a7 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -73,6 +73,7 @@ import com.android.app.displaylib.PerDisplayRepository; import com.android.launcher3.ConstantItem; import com.android.launcher3.EncryptionType; import com.android.launcher3.Flags; +import com.android.launcher3.Launcher; import com.android.launcher3.LauncherPrefs; import com.android.launcher3.anim.AnimatedFloat; import com.android.launcher3.desktop.DesktopAppLaunchTransitionManager; @@ -96,6 +97,7 @@ import com.android.launcher3.util.TraceHelper; import com.android.quickstep.OverviewCommandHelper.CommandType; import com.android.quickstep.OverviewComponentObserver.OverviewChangeListener; import com.android.quickstep.fallback.window.RecentsDisplayModel; +import com.android.quickstep.fallback.window.RecentsWindowFlags; import com.android.quickstep.fallback.window.RecentsWindowSwipeHandler; import com.android.quickstep.inputconsumers.BubbleBarInputConsumer; import com.android.quickstep.inputconsumers.OneHandedModeInputConsumer; @@ -537,10 +539,17 @@ public class TouchInteractionService extends Service { } /** Refreshes the current overview target. */ - public void refreshOverviewTarget() { + @VisibleForTesting + public void refreshOverviewTargetForTest() { executeForTouchInteractionService(tis -> { tis.mAllAppsActionManager.onDestroy(); tis.onOverviewTargetChanged(tis.mOverviewComponentObserver.isHomeAndOverviewSame()); + if (RecentsWindowFlags.getEnableOverviewInWindow()) { + Launcher launcher = Launcher.ACTIVITY_TRACKER.getCreatedContext(); + if (launcher != null) { + tis.mTaskbarManager.setActivity(launcher); + } + } }); } }