From 87455f28fcbfd828612850ea6ebf59da19c6fd83 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Wed, 23 Oct 2024 04:39:17 +0000 Subject: [PATCH] TaskbarManager now sets TaskbarUIController for RecentsWindowManager - FallbackTaskbarUIController can take in a generic RecentsViewContainer parameter, i.e. RecentsActivity or RecentsWindowManager. - When changing Overview targets to RecentsWindowManager, which is not an Activity, we still update the TaskbarUIController Test: Switch between default Home activities with the flag on and off, ensure Taskbar works as expected in each case (3P vs 1P launcher). Flag: com.android.launcher3.enable_fallback_overview_in_window Fixes: 368030750 Fixes: 365775636 Change-Id: Ife775e8c226f8c73ec9e1f97b4a6f2972f6c905f --- .../taskbar/FallbackTaskbarUIController.java | 28 +++++++----- .../launcher3/taskbar/TaskbarManager.java | 45 +++++++++++++++---- .../uioverrides/QuickstepLauncher.java | 8 +++- .../android/quickstep/RecentsActivity.java | 13 ++++-- .../quickstep/TouchInteractionService.java | 11 +++-- .../fallback/window/RecentsWindowManager.kt | 14 ++++++ .../quickstep/views/RecentsViewContainer.java | 11 ++++- .../FallbackTaskbarUIControllerTest.kt | 2 +- 8 files changed, 99 insertions(+), 33 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java index 929e7936e0..e3bcb0df0d 100644 --- a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java @@ -25,20 +25,24 @@ import androidx.annotation.Nullable; import com.android.launcher3.popup.SystemShortcut; import com.android.launcher3.statemanager.StateManager; -import com.android.quickstep.RecentsActivity; +import com.android.launcher3.statemanager.StatefulContainer; import com.android.quickstep.TopTaskTracker; import com.android.quickstep.fallback.RecentsState; import com.android.quickstep.util.TISBindHelper; import com.android.quickstep.views.RecentsView; +import com.android.quickstep.views.RecentsViewContainer; import java.util.stream.Stream; /** * A data source which integrates with the fallback RecentsActivity instance (for 3P launchers). + * @param The type of the RecentsViewContainer that will handle Recents state changes. */ -public class FallbackTaskbarUIController extends TaskbarUIController { +public class FallbackTaskbarUIController + > + extends TaskbarUIController { - private final RecentsActivity mRecentsActivity; + private final T mRecentsContainer; private final StateManager.StateListener mStateListener = new StateManager.StateListener() { @@ -63,23 +67,23 @@ public class FallbackTaskbarUIController extends TaskbarUIController { } }; - public FallbackTaskbarUIController(RecentsActivity recentsActivity) { - mRecentsActivity = recentsActivity; + public FallbackTaskbarUIController(T recentsContainer) { + mRecentsContainer = recentsContainer; } @Override protected void init(TaskbarControllers taskbarControllers) { super.init(taskbarControllers); - mRecentsActivity.setTaskbarUIController(this); - mRecentsActivity.getStateManager().addStateListener(mStateListener); + mRecentsContainer.setTaskbarUIController(this); + mRecentsContainer.getStateManager().addStateListener(mStateListener); } @Override protected void onDestroy() { super.onDestroy(); getRecentsView().setTaskLaunchListener(null); - mRecentsActivity.setTaskbarUIController(null); - mRecentsActivity.getStateManager().removeStateListener(mStateListener); + mRecentsContainer.setTaskbarUIController(null); + mRecentsContainer.getStateManager().removeStateListener(mStateListener); } /** @@ -109,7 +113,7 @@ public class FallbackTaskbarUIController extends TaskbarUIController { @Override public RecentsView getRecentsView() { - return mRecentsActivity.getOverviewPanel(); + return mRecentsContainer.getOverviewPanel(); } @Override @@ -131,11 +135,11 @@ public class FallbackTaskbarUIController extends TaskbarUIController { @Nullable @Override protected TISBindHelper getTISBindHelper() { - return mRecentsActivity.getTISBindHelper(); + return mRecentsContainer.getTISBindHelper(); } @Override protected String getTaskbarUIControllerName() { - return "FallbackTaskbarUIController"; + return "FallbackTaskbarUIController<" + mRecentsContainer.getClass().getSimpleName() + ">"; } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java index c18cf28996..58a4700685 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java @@ -71,7 +71,9 @@ import com.android.launcher3.util.SimpleBroadcastReceiver; import com.android.quickstep.AllAppsActionManager; import com.android.quickstep.RecentsActivity; import com.android.quickstep.SystemUiProxy; +import com.android.quickstep.fallback.window.RecentsWindowManager; import com.android.quickstep.util.ContextualSearchInvoker; +import com.android.quickstep.views.RecentsViewContainer; import com.android.systemui.shared.statusbar.phone.BarTransitions; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags; @@ -131,6 +133,8 @@ public class TaskbarManager { private TaskbarActivityContext mTaskbarActivityContext; private StatefulActivity mActivity; + private RecentsViewContainer mRecentsViewContainer; + /** * Cache a copy here so we can initialize state whenever taskbar is recreated, since * this class does not get re-initialized w/ new taskbars. @@ -404,9 +408,28 @@ public class TaskbarManager { } mUnfoldProgressProvider.setSourceProvider(unfoldTransitionProgressProvider); + if (activity instanceof RecentsViewContainer recentsViewContainer) { + setRecentsViewContainer(recentsViewContainer); + } + } + + /** + * Sets the current RecentsViewContainer, from which we create a TaskbarUIController. + */ + public void setRecentsViewContainer(@NonNull RecentsViewContainer recentsViewContainer) { + if (mRecentsViewContainer == recentsViewContainer) { + return; + } + if (mRecentsViewContainer == mActivity) { + // When switching to RecentsWindowManager (not an Activity), the old mActivity is not + // destroyed, nor is there a new Activity to replace it. Thus if we don't clear it here, + // it will not get re-set properly if we return to the Activity (e.g. NexusLauncher). + mActivityOnDestroyCallback.run(); + } + mRecentsViewContainer = recentsViewContainer; if (mTaskbarActivityContext != null) { mTaskbarActivityContext.setUIController( - createTaskbarUIControllerForActivity(mActivity)); + createTaskbarUIControllerForRecentsViewContainer(mRecentsViewContainer)); } } @@ -429,12 +452,18 @@ public class TaskbarManager { /** * Creates a {@link TaskbarUIController} to use while the given StatefulActivity is active. */ - private TaskbarUIController createTaskbarUIControllerForActivity(StatefulActivity activity) { - if (activity instanceof QuickstepLauncher) { - return new LauncherTaskbarUIController((QuickstepLauncher) activity); + private TaskbarUIController createTaskbarUIControllerForRecentsViewContainer( + RecentsViewContainer container) { + if (container instanceof QuickstepLauncher quickstepLauncher) { + return new LauncherTaskbarUIController(quickstepLauncher); } - if (activity instanceof RecentsActivity) { - return new FallbackTaskbarUIController((RecentsActivity) activity); + // If a 3P Launcher is default, always use FallbackTaskbarUIController regardless of + // whether the recents container is RecentsActivity or RecentsWindowManager. + if (container instanceof RecentsActivity recentsActivity) { + return new FallbackTaskbarUIController<>(recentsActivity); + } + if (container instanceof RecentsWindowManager recentsWindowManager) { + return new FallbackTaskbarUIController<>(recentsWindowManager); } return TaskbarUIController.DEFAULT; } @@ -484,9 +513,9 @@ public class TaskbarManager { mSharedState.allAppsVisible = mSharedState.allAppsVisible && isLargeScreenTaskbar; mTaskbarActivityContext.init(mSharedState); - if (mActivity != null) { + if (mRecentsViewContainer != null) { mTaskbarActivityContext.setUIController( - createTaskbarUIControllerForActivity(mActivity)); + createTaskbarUIControllerForRecentsViewContainer(mRecentsViewContainer)); } if (enableTaskbarNoRecreate()) { diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index 228dc9101c..fe68ebcd3b 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -139,6 +139,7 @@ import com.android.launcher3.statemanager.StateManager.AtomicAnimationFactory; import com.android.launcher3.statemanager.StateManager.StateHandler; import com.android.launcher3.taskbar.LauncherTaskbarUIController; import com.android.launcher3.taskbar.TaskbarManager; +import com.android.launcher3.taskbar.TaskbarUIController; import com.android.launcher3.testing.TestLogging; import com.android.launcher3.testing.shared.TestProtocol; import com.android.launcher3.uioverrides.QuickstepWidgetHolder.QuickstepHolderFactory; @@ -1089,10 +1090,12 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, ); } - public void setTaskbarUIController(LauncherTaskbarUIController taskbarUIController) { - mTaskbarUIController = taskbarUIController; + @Override + public void setTaskbarUIController(@Nullable TaskbarUIController taskbarUIController) { + mTaskbarUIController = (LauncherTaskbarUIController) taskbarUIController; } + @Override public @Nullable LauncherTaskbarUIController getTaskbarUIController() { return mTaskbarUIController; } @@ -1399,6 +1402,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, } @NonNull + @Override public TISBindHelper getTISBindHelper() { return mTISBindHelper; } diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index b19f651bef..6075294709 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -70,6 +70,7 @@ import com.android.launcher3.statemanager.StateManager.StateHandler; import com.android.launcher3.statemanager.StatefulActivity; import com.android.launcher3.taskbar.FallbackTaskbarUIController; import com.android.launcher3.taskbar.TaskbarManager; +import com.android.launcher3.taskbar.TaskbarUIController; import com.android.launcher3.util.ActivityOptionsWrapper; import com.android.launcher3.util.ContextTracker; import com.android.launcher3.util.RunnableList; @@ -115,7 +116,7 @@ public final class RecentsActivity extends StatefulActivity implem private FallbackRecentsView mFallbackRecentsView; private OverviewActionsView mActionsView; private TISBindHelper mTISBindHelper; - private @Nullable FallbackTaskbarUIController mTaskbarUIController; + private @Nullable FallbackTaskbarUIController mTaskbarUIController; private StateManager mStateManager; @@ -174,11 +175,14 @@ public final class RecentsActivity extends StatefulActivity implem mTISBindHelper.runOnBindToTouchInteractionService(r); } - public void setTaskbarUIController(FallbackTaskbarUIController taskbarUIController) { - mTaskbarUIController = taskbarUIController; + @Override + public void setTaskbarUIController(@Nullable TaskbarUIController taskbarUIController) { + mTaskbarUIController = (FallbackTaskbarUIController) taskbarUIController; } - public FallbackTaskbarUIController getTaskbarUIController() { + @Nullable + @Override + public FallbackTaskbarUIController getTaskbarUIController() { return mTaskbarUIController; } @@ -515,6 +519,7 @@ public final class RecentsActivity extends StatefulActivity implem } @NonNull + @Override public TISBindHelper getTISBindHelper() { return mTISBindHelper; } diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 816258956f..81cfff429b 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -776,10 +776,13 @@ public class TouchInteractionService extends Service { mAllAppsActionManager.setHomeAndOverviewSame(isHomeAndOverviewSame); RecentsViewContainer newOverviewContainer = mOverviewComponentObserver.getContainerInterface().getCreatedContainer(); - if (newOverviewContainer != null - && newOverviewContainer instanceof StatefulActivity activity) { - //TODO(b/368030750) refactor taskbarManager to accept RecentsViewContainer - mTaskbarManager.setActivity(activity); + if (newOverviewContainer != null) { + if (newOverviewContainer instanceof StatefulActivity activity) { + // This will also call setRecentsViewContainer() internally. + mTaskbarManager.setActivity(activity); + } else { + mTaskbarManager.setRecentsViewContainer(newOverviewContainer); + } } mTISBinder.onOverviewTargetChange(); } diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt index 3017df2481..e5f51fe492 100644 --- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt +++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt @@ -39,6 +39,7 @@ import com.android.launcher3.statehandlers.DesktopVisibilityController import com.android.launcher3.statemanager.StateManager import com.android.launcher3.statemanager.StateManager.AtomicAnimationFactory import com.android.launcher3.statemanager.StatefulContainer +import com.android.launcher3.taskbar.TaskbarUIController import com.android.launcher3.util.ContextTracker import com.android.launcher3.util.DisplayController import com.android.launcher3.util.RunnableList @@ -116,6 +117,7 @@ class RecentsWindowManager(context: Context) : private var callbacks: RecentsAnimationCallbacks? = null + private var taskbarUIController: TaskbarUIController? = null private var tisBindHelper: TISBindHelper = TISBindHelper(this) {} // Callback array that corresponds to events defined in @ActivityEvent @@ -285,6 +287,18 @@ class RecentsWindowManager(context: Context) : return tisBindHelper.desktopVisibilityController } + override fun setTaskbarUIController(taskbarUIController: TaskbarUIController?) { + this.taskbarUIController = taskbarUIController + } + + override fun getTaskbarUIController(): TaskbarUIController? { + return taskbarUIController + } + + override fun getTISBindHelper(): TISBindHelper { + return tisBindHelper + } + fun registerInitListener(onInitListener: Predicate) { this.onInitListener = onInitListener } diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java index d8036aa052..b04753b3b8 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java +++ b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java @@ -16,8 +16,6 @@ package com.android.quickstep.views; -import android.app.Activity; -import android.content.ComponentName; import android.content.Context; import android.content.ContextWrapper; import android.content.LocusId; @@ -27,13 +25,16 @@ import android.view.MotionEvent; import android.view.View; import android.view.Window; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.launcher3.BaseActivity; import com.android.launcher3.logger.LauncherAtom; import com.android.launcher3.statehandlers.DesktopVisibilityController; +import com.android.launcher3.taskbar.TaskbarUIController; import com.android.launcher3.views.ActivityContext; import com.android.launcher3.views.ScrimView; +import com.android.quickstep.util.TISBindHelper; /** * Interface to be implemented by the parent view of RecentsView @@ -212,4 +213,10 @@ public interface RecentsViewContainer extends ActivityContext { @Nullable DesktopVisibilityController getDesktopVisibilityController(); + + void setTaskbarUIController(@Nullable TaskbarUIController taskbarUIController); + + @Nullable TaskbarUIController getTaskbarUIController(); + + @NonNull TISBindHelper getTISBindHelper(); } diff --git a/quickstep/tests/src/com/android/launcher3/taskbar/FallbackTaskbarUIControllerTest.kt b/quickstep/tests/src/com/android/launcher3/taskbar/FallbackTaskbarUIControllerTest.kt index 04012c027d..df98606c9f 100644 --- a/quickstep/tests/src/com/android/launcher3/taskbar/FallbackTaskbarUIControllerTest.kt +++ b/quickstep/tests/src/com/android/launcher3/taskbar/FallbackTaskbarUIControllerTest.kt @@ -33,7 +33,7 @@ import org.mockito.kotlin.whenever @RunWith(AndroidJUnit4::class) class FallbackTaskbarUIControllerTest : TaskbarBaseTestCase() { - lateinit var fallbackTaskbarUIController: FallbackTaskbarUIController + lateinit var fallbackTaskbarUIController: FallbackTaskbarUIController lateinit var stateListener: StateManager.StateListener private val recentsActivity: RecentsActivity = mock()