From 8791e7de11b8a359fa5860ddc5cc466d559b7c15 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Mon, 18 Oct 2021 16:02:21 -0700 Subject: [PATCH] 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 --- .../launcher3/BaseQuickstepLauncher.java | 12 ++-- .../taskbar/FallbackTaskbarUIController.java | 30 ++++++++++ .../taskbar/LauncherTaskbarUIController.java | 24 +++----- .../launcher3/taskbar/TaskbarManager.java | 55 ++++++++++++++----- .../taskbar/TaskbarViewController.java | 8 +++ .../android/quickstep/RecentsActivity.java | 16 ++++++ .../quickstep/TouchInteractionService.java | 6 ++ 7 files changed, 116 insertions(+), 35 deletions(-) create mode 100644 quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java diff --git a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java index 216e79bf42..e8ea671ba2 100644 --- a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java @@ -160,7 +160,7 @@ public abstract class BaseQuickstepLauncher extends Launcher mTISBindHelper.onDestroy(); if (mTaskbarManager != null) { - mTaskbarManager.clearLauncher(this); + mTaskbarManager.clearActivity(this); } if (mLauncherUnfoldAnimationController != null) { @@ -318,7 +318,7 @@ public abstract class BaseQuickstepLauncher extends Launcher private void onTISConnected(TISBinder binder) { mTaskbarManager = binder.getTaskbarManager(); - mTaskbarManager.setLauncher(BaseQuickstepLauncher.this); + mTaskbarManager.setActivity(this); mOverviewCommandHelper = binder.getOverviewCommandHelper(); } @@ -348,6 +348,10 @@ public abstract class BaseQuickstepLauncher extends Launcher mTaskbarUIController = taskbarUIController; } + public @Nullable LauncherTaskbarUIController getTaskbarUIController() { + return mTaskbarUIController; + } + public T getActionsView() { return (T) mActionsView; } @@ -371,10 +375,6 @@ public abstract class BaseQuickstepLauncher extends Launcher 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 0000000000..400fa2628f --- /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 71a93d1f99..f206252b10 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.BaseQuickstepLauncher; 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 @@ public class LauncherTaskbarUIController extends TaskbarUIController { 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 class LauncherTaskbarUIController extends TaskbarUIController { } }; - 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 @@ public class LauncherTaskbarUIController extends TaskbarUIController { @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 @@ public class LauncherTaskbarUIController extends TaskbarUIController { * @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 @@ public class LauncherTaskbarUIController extends TaskbarUIController { @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 5bedf87d64..92cee04f37 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.BaseQuickstepLauncher; 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 @@ public class TaskbarManager implements DisplayController.DisplayInfoChangeListen 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 @@ public class TaskbarManager implements DisplayController.DisplayInfoChangeListen } /** - * 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 @@ public class TaskbarManager implements DisplayController.DisplayInfoChangeListen 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 d14622b2b3..08d2a06ee3 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java @@ -253,6 +253,14 @@ public class TaskbarViewController { mTaskbarNavButtonTranslationY.updateValue(-deviceProfile.getTaskbarOffsetY()); } + /** + * 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. */ diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index 03e2395029..7dd4a313b2 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; 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.RecentsDragLayer; 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 @@ public final class RecentsActivity extends StatefulActivity { private ScrimView mScrimView; private FallbackRecentsView mFallbackRecentsView; private OverviewActionsView mActionsView; + private TISBindHelper mTISBindHelper; + private @Nullable TaskbarManager mTaskbarManager; private Configuration mOldConfig; @@ -125,6 +129,13 @@ public final class RecentsActivity extends StatefulActivity { 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 @@ public final class RecentsActivity extends StatefulActivity { 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 ddcf34cb6a..1516b7a0da 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -459,6 +459,12 @@ public class TouchInteractionService extends Service } else { am.unregisterSystemAction(SYSTEM_ACTION_ID_ALL_APPS); } + + StatefulActivity newOverviewActivity = mOverviewComponentObserver.getActivityInterface() + .getCreatedActivity(); + if (newOverviewActivity != null) { + mTaskbarManager.setActivity(newOverviewActivity); + } } @UiThread