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:
@@ -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();
|
||||
}
|
||||
|
||||
+1
-1
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user