Add FallbackTaskbarUIController
- Refactor TaskbarManager to accept StatefulActivity instead of BaseQuickstepLauncher
- Update the new StatefulActivity in onOverviewTargetChange()
- Cleanup LauncherTaskbarUIController a bit to avoid initializing TaskbarActivityContext, TaskbarDragLayer, and TaskbarViewController in the constructor, and instead get these from mControllers after init()
Test: No change in behavior
Bug: 188790554
Change-Id: Ic4d69d73deb6dada416876eb265db57803c3adfd
diff --git a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
index 216e79b..e8ea671 100644
--- a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
@@ -160,7 +160,7 @@
mTISBindHelper.onDestroy();
if (mTaskbarManager != null) {
- mTaskbarManager.clearLauncher(this);
+ mTaskbarManager.clearActivity(this);
}
if (mLauncherUnfoldAnimationController != null) {
@@ -318,7 +318,7 @@
private void onTISConnected(TISBinder binder) {
mTaskbarManager = binder.getTaskbarManager();
- mTaskbarManager.setLauncher(BaseQuickstepLauncher.this);
+ mTaskbarManager.setActivity(this);
mOverviewCommandHelper = binder.getOverviewCommandHelper();
}
@@ -348,6 +348,10 @@
mTaskbarUIController = taskbarUIController;
}
+ public @Nullable LauncherTaskbarUIController getTaskbarUIController() {
+ return mTaskbarUIController;
+ }
+
public <T extends OverviewActionsView> T getActionsView() {
return (T) mActionsView;
}
@@ -371,10 +375,6 @@
return mDepthController;
}
- public @Nullable LauncherTaskbarUIController getTaskbarUIController() {
- return mTaskbarUIController;
- }
-
public TaskbarStateHandler getTaskbarStateHandler() {
return mTaskbarStateHandler;
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java
new file mode 100644
index 0000000..400fa26
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2021 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.launcher3.taskbar;
+
+import com.android.quickstep.RecentsActivity;
+
+/**
+ * A data source which integrates with the fallback RecentsActivity instance (for 3P launchers).
+ */
+public class FallbackTaskbarUIController extends TaskbarUIController {
+
+ private final RecentsActivity mRecentsActivity;
+
+ public FallbackTaskbarUIController(RecentsActivity recentsActivity) {
+ mRecentsActivity = recentsActivity;
+ }
+}
diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
index 71a93d1..f206252 100644
--- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
@@ -36,7 +36,6 @@
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.LauncherState;
import com.android.launcher3.QuickstepTransitionManager;
-import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.AnimatorListeners;
import com.android.launcher3.anim.PendingAnimation;
@@ -67,10 +66,6 @@
private final BaseQuickstepLauncher mLauncher;
- private final TaskbarActivityContext mContext;
- private final TaskbarDragLayer mTaskbarDragLayer;
- private final TaskbarView mTaskbarView;
-
private final AnimatedFloat mIconAlignmentForResumedState =
new AnimatedFloat(this::onIconAlignmentRatioChanged);
private final AnimatedFloat mIconAlignmentForGestureState =
@@ -157,12 +152,7 @@
}
};
- public LauncherTaskbarUIController(
- BaseQuickstepLauncher launcher, TaskbarActivityContext context) {
- mContext = context;
- mTaskbarDragLayer = context.getDragLayer();
- mTaskbarView = mTaskbarDragLayer.findViewById(R.id.taskbar_view);
-
+ public LauncherTaskbarUIController(BaseQuickstepLauncher launcher) {
mLauncher = launcher;
}
@@ -217,7 +207,8 @@
@Override
protected void updateContentInsets(Rect outContentInsets) {
int contentHeight = mControllers.taskbarStashController.getContentHeight();
- outContentInsets.top = mTaskbarDragLayer.getHeight() - contentHeight;
+ TaskbarDragLayer dragLayer = mControllers.taskbarActivityContext.getDragLayer();
+ outContentInsets.top = dragLayer.getHeight() - contentHeight;
}
/**
@@ -343,15 +334,15 @@
* @return Whether any Taskbar item could handle the given MotionEvent if given the chance.
*/
public boolean isEventOverAnyTaskbarItem(MotionEvent ev) {
- return mTaskbarView.isEventOverAnyItem(ev);
+ return mControllers.taskbarViewController.isEventOverAnyItem(ev);
}
public boolean isDraggingItem() {
- return mContext.getDragController().isDragging();
+ return mControllers.taskbarDragController.isDragging();
}
public View getRootView() {
- return mTaskbarDragLayer;
+ return mControllers.taskbarActivityContext.getDragLayer();
}
private void setIconAlpha(LauncherState state, float progress) {
@@ -418,7 +409,8 @@
@Override
public void onTaskbarIconLaunched(WorkspaceItemInfo item) {
InstanceId instanceId = new InstanceIdSequence().newInstanceId();
- mLauncher.logAppLaunch(mContext.getStatsLogManager(), item, instanceId);
+ mLauncher.logAppLaunch(mControllers.taskbarActivityContext.getStatsLogManager(), item,
+ instanceId);
}
private final class TaskBarRecentsAnimationListener implements RecentsAnimationListener {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index 5bedf87..92cee04 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -39,14 +39,17 @@
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.LauncherAppState;
import com.android.launcher3.config.FeatureFlags;
+import com.android.launcher3.statemanager.StatefulActivity;
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.DisplayController.Info;
import com.android.launcher3.util.SettingsCache;
import com.android.launcher3.util.SimpleBroadcastReceiver;
+import com.android.quickstep.RecentsActivity;
import com.android.quickstep.SysUINavigationMode;
import com.android.quickstep.SysUINavigationMode.Mode;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.TouchInteractionService;
+import com.android.systemui.unfold.UnfoldTransitionProgressProvider;
import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider;
/**
@@ -71,7 +74,7 @@
new ScopedUnfoldTransitionProgressProvider();
private TaskbarActivityContext mTaskbarActivityContext;
- private BaseQuickstepLauncher mLauncher;
+ private StatefulActivity mActivity;
/**
* Cache a copy here so we can initialize state whenever taskbar is recreated, since
* this class does not get re-initialized w/ new taskbars.
@@ -149,25 +152,50 @@
}
/**
- * Sets a launcher to act as taskbar callback
+ * Sets a {@link StatefulActivity} to act as taskbar callback
*/
- public void setLauncher(@NonNull BaseQuickstepLauncher launcher) {
- mLauncher = launcher;
- mUnfoldProgressProvider.setSourceProvider(launcher
- .getUnfoldTransitionProgressProvider());
+ public void setActivity(@NonNull StatefulActivity activity) {
+ mActivity = activity;
+ mUnfoldProgressProvider.setSourceProvider(getUnfoldTransitionProgressProviderForActivity(
+ activity));
if (mTaskbarActivityContext != null) {
mTaskbarActivityContext.setUIController(
- new LauncherTaskbarUIController(launcher, mTaskbarActivityContext));
+ createTaskbarUIControllerForActivity(mActivity));
}
}
/**
- * Clears a previously set Launcher
+ * Returns an {@link UnfoldTransitionProgressProvider} to use while the given StatefulActivity
+ * is active.
*/
- public void clearLauncher(@NonNull BaseQuickstepLauncher launcher) {
- if (mLauncher == launcher) {
- mLauncher = null;
+ private UnfoldTransitionProgressProvider getUnfoldTransitionProgressProviderForActivity(
+ StatefulActivity activity) {
+ if (activity instanceof BaseQuickstepLauncher) {
+ return ((BaseQuickstepLauncher) activity).getUnfoldTransitionProgressProvider();
+ }
+ return null;
+ }
+
+ /**
+ * Creates a {@link TaskbarUIController} to use while the given StatefulActivity is active.
+ */
+ private TaskbarUIController createTaskbarUIControllerForActivity(StatefulActivity activity) {
+ if (activity instanceof BaseQuickstepLauncher) {
+ return new LauncherTaskbarUIController((BaseQuickstepLauncher) activity);
+ }
+ if (activity instanceof RecentsActivity) {
+ return new FallbackTaskbarUIController((RecentsActivity) activity);
+ }
+ return TaskbarUIController.DEFAULT;
+ }
+
+ /**
+ * Clears a previously set {@link StatefulActivity}
+ */
+ public void clearActivity(@NonNull StatefulActivity activity) {
+ if (mActivity == activity) {
+ mActivity = null;
if (mTaskbarActivityContext != null) {
mTaskbarActivityContext.setUIController(TaskbarUIController.DEFAULT);
}
@@ -192,10 +220,11 @@
mTaskbarActivityContext = new TaskbarActivityContext(mContext, dp.copy(mContext),
mNavButtonController, mUnfoldProgressProvider);
+
mTaskbarActivityContext.init(mSharedState);
- if (mLauncher != null) {
+ if (mActivity != null) {
mTaskbarActivityContext.setUIController(
- new LauncherTaskbarUIController(mLauncher, mTaskbarActivityContext));
+ createTaskbarUIControllerForActivity(mActivity));
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
index d14622b..08d2a06 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
@@ -254,6 +254,14 @@
}
/**
+ * Returns whether the given MotionEvent, *in screen coorindates*, is within any Taskbar item's
+ * touch bounds.
+ */
+ public boolean isEventOverAnyItem(MotionEvent ev) {
+ return mTaskbarView.isEventOverAnyItem(ev);
+ }
+
+ /**
* Callbacks for {@link TaskbarView} to interact with its controller.
*/
public class TaskbarViewCallbacks {
diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java
index 03e2395..7dd4a31 100644
--- a/quickstep/src/com/android/quickstep/RecentsActivity.java
+++ b/quickstep/src/com/android/quickstep/RecentsActivity.java
@@ -60,6 +60,7 @@
import com.android.launcher3.statemanager.StateManager.AtomicAnimationFactory;
import com.android.launcher3.statemanager.StateManager.StateHandler;
import com.android.launcher3.statemanager.StatefulActivity;
+import com.android.launcher3.taskbar.TaskbarManager;
import com.android.launcher3.util.ActivityOptionsWrapper;
import com.android.launcher3.util.ActivityTracker;
import com.android.launcher3.util.RunnableList;
@@ -73,6 +74,7 @@
import com.android.quickstep.fallback.RecentsState;
import com.android.quickstep.util.RecentsAtomicAnimationFactory;
import com.android.quickstep.util.SplitSelectStateController;
+import com.android.quickstep.util.TISBindHelper;
import com.android.quickstep.views.OverviewActionsView;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskView;
@@ -101,6 +103,8 @@
private ScrimView mScrimView;
private FallbackRecentsView mFallbackRecentsView;
private OverviewActionsView mActionsView;
+ private TISBindHelper mTISBindHelper;
+ private @Nullable TaskbarManager mTaskbarManager;
private Configuration mOldConfig;
@@ -125,6 +129,13 @@
new SplitSelectStateController(mHandler, SystemUiProxy.INSTANCE.get(this));
mDragLayer.recreateControllers();
mFallbackRecentsView.init(mActionsView, controller);
+
+ mTISBindHelper = new TISBindHelper(this, this::onTISConnected);
+ }
+
+ private void onTISConnected(TouchInteractionService.TISBinder binder) {
+ mTaskbarManager = binder.getTaskbarManager();
+ mTaskbarManager.setActivity(this);
}
@Override
@@ -346,6 +357,11 @@
super.onDestroy();
ACTIVITY_TRACKER.onActivityDestroyed(this);
mActivityLaunchAnimationRunner = null;
+
+ mTISBindHelper.onDestroy();
+ if (mTaskbarManager != null) {
+ mTaskbarManager.clearActivity(this);
+ }
}
@Override
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index ddcf34c..1516b7a 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -459,6 +459,12 @@
} else {
am.unregisterSystemAction(SYSTEM_ACTION_ID_ALL_APPS);
}
+
+ StatefulActivity newOverviewActivity = mOverviewComponentObserver.getActivityInterface()
+ .getCreatedActivity();
+ if (newOverviewActivity != null) {
+ mTaskbarManager.setActivity(newOverviewActivity);
+ }
}
@UiThread