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
This commit is contained in:
Tony Wickham
2024-10-23 04:39:17 +00:00
parent e6b473a284
commit 87455f28fc
8 changed files with 99 additions and 33 deletions
@@ -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 <T> The type of the RecentsViewContainer that will handle Recents state changes.
*/
public class FallbackTaskbarUIController extends TaskbarUIController {
public class FallbackTaskbarUIController
<T extends RecentsViewContainer & StatefulContainer<RecentsState>>
extends TaskbarUIController {
private final RecentsActivity mRecentsActivity;
private final T mRecentsContainer;
private final StateManager.StateListener<RecentsState> mStateListener =
new StateManager.StateListener<RecentsState>() {
@@ -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() + ">";
}
}
@@ -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()) {
@@ -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;
}
@@ -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<RecentsState> implem
private FallbackRecentsView mFallbackRecentsView;
private OverviewActionsView<?> mActionsView;
private TISBindHelper mTISBindHelper;
private @Nullable FallbackTaskbarUIController mTaskbarUIController;
private @Nullable FallbackTaskbarUIController<RecentsActivity> mTaskbarUIController;
private StateManager<RecentsState, RecentsActivity> mStateManager;
@@ -174,11 +175,14 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> implem
mTISBindHelper.runOnBindToTouchInteractionService(r);
}
public void setTaskbarUIController(FallbackTaskbarUIController taskbarUIController) {
mTaskbarUIController = taskbarUIController;
@Override
public void setTaskbarUIController(@Nullable TaskbarUIController taskbarUIController) {
mTaskbarUIController = (FallbackTaskbarUIController<RecentsActivity>) taskbarUIController;
}
public FallbackTaskbarUIController getTaskbarUIController() {
@Nullable
@Override
public FallbackTaskbarUIController<RecentsActivity> getTaskbarUIController() {
return mTaskbarUIController;
}
@@ -515,6 +519,7 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> implem
}
@NonNull
@Override
public TISBindHelper getTISBindHelper() {
return mTISBindHelper;
}
@@ -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();
}
@@ -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<Boolean>) {
this.onInitListener = onInitListener
}
@@ -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();
}
@@ -33,7 +33,7 @@ import org.mockito.kotlin.whenever
@RunWith(AndroidJUnit4::class)
class FallbackTaskbarUIControllerTest : TaskbarBaseTestCase() {
lateinit var fallbackTaskbarUIController: FallbackTaskbarUIController
lateinit var fallbackTaskbarUIController: FallbackTaskbarUIController<RecentsActivity>
lateinit var stateListener: StateManager.StateListener<RecentsState>
private val recentsActivity: RecentsActivity = mock()