Merge "Fixing wrong text spacing bounds" into sc-v2-dev
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..24a88a4
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java
@@ -0,0 +1,90 @@
+/*
+ * 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 static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_APP;
+import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_STASHED_LAUNCHER_STATE;
+import static com.android.launcher3.taskbar.TaskbarStashController.TASKBAR_STASH_DURATION;
+
+import android.animation.Animator;
+
+import com.android.launcher3.statemanager.StateManager;
+import com.android.quickstep.RecentsActivity;
+import com.android.quickstep.fallback.RecentsState;
+import com.android.quickstep.views.RecentsView;
+
+/**
+ * A data source which integrates with the fallback RecentsActivity instance (for 3P launchers).
+ */
+public class FallbackTaskbarUIController extends TaskbarUIController {
+
+ private final RecentsActivity mRecentsActivity;
+
+ private final StateManager.StateListener<RecentsState> mStateListener =
+ new StateManager.StateListener<RecentsState>() {
+ @Override
+ public void onStateTransitionStart(RecentsState toState) {
+ animateToRecentsState(toState);
+
+ // Handle tapping on live tile.
+ RecentsView recentsView = mRecentsActivity.getOverviewPanel();
+ recentsView.setTaskLaunchListener(toState == RecentsState.DEFAULT
+ ? (() -> animateToRecentsState(RecentsState.BACKGROUND_APP)) : null);
+ }
+ };
+
+ // Initialized in init.
+ TaskbarControllers mControllers;
+
+ public FallbackTaskbarUIController(RecentsActivity recentsActivity) {
+ mRecentsActivity = recentsActivity;
+ }
+
+ @Override
+ protected void init(TaskbarControllers taskbarControllers) {
+ mControllers = taskbarControllers;
+
+ mRecentsActivity.setTaskbarUIController(this);
+ mRecentsActivity.getStateManager().addStateListener(mStateListener);
+ }
+
+ @Override
+ protected void onDestroy() {
+ mRecentsActivity.setTaskbarUIController(null);
+ mRecentsActivity.getStateManager().removeStateListener(mStateListener);
+ }
+
+ /**
+ * Creates an animation to animate the taskbar for the given state (but does not start it).
+ * Currently this animation just force stashes the taskbar in Overview.
+ */
+ public Animator createAnimToRecentsState(RecentsState toState, long duration) {
+ boolean forceStashed = toState.hasOverviewActions();
+ TaskbarStashController controller = mControllers.taskbarStashController;
+ // Set both FLAG_IN_STASHED_LAUNCHER_STATE and FLAG_IN_APP to ensure the state is respected.
+ // For all other states, just use the current stashed-in-app setting (e.g. if long clicked).
+ controller.updateStateForFlag(FLAG_IN_STASHED_LAUNCHER_STATE, forceStashed);
+ controller.updateStateForFlag(FLAG_IN_APP, !forceStashed);
+ return controller.applyStateWithoutStart(duration);
+ }
+
+ private void animateToRecentsState(RecentsState toState) {
+ Animator anim = createAnimToRecentsState(toState, TASKBAR_STASH_DURATION);
+ if (anim != null) {
+ anim.start();
+ }
+ }
+}
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/TaskbarDragLayerController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java
index 10a5b89..05b0a11 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java
@@ -62,8 +62,11 @@
public void init(TaskbarControllers controllers) {
mControllers = controllers;
mTaskbarDragLayer.init(new TaskbarDragLayerCallbacks());
+
+ mBgTaskbar.value = 1;
mKeyguardBgTaskbar.value = 1;
mBgOverride.value = 1;
+ updateBackgroundAlpha();
}
public void onDestroy() {
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/BaseActivityInterface.java b/quickstep/src/com/android/quickstep/BaseActivityInterface.java
index ec9a325..cf06036 100644
--- a/quickstep/src/com/android/quickstep/BaseActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/BaseActivityInterface.java
@@ -52,6 +52,7 @@
import com.android.launcher3.statehandlers.DepthController;
import com.android.launcher3.statemanager.BaseState;
import com.android.launcher3.statemanager.StatefulActivity;
+import com.android.launcher3.taskbar.TaskbarUIController;
import com.android.launcher3.touch.PagedOrientationHandler;
import com.android.launcher3.util.WindowBounds;
import com.android.launcher3.views.ScrimView;
@@ -138,6 +139,9 @@
return null;
}
+ @Nullable
+ public abstract TaskbarUIController getTaskbarController();
+
public final boolean isResumed() {
ACTIVITY_TYPE activity = getCreatedActivity();
return activity != null && activity.hasBeenResumed();
diff --git a/quickstep/src/com/android/quickstep/FallbackActivityInterface.java b/quickstep/src/com/android/quickstep/FallbackActivityInterface.java
index 4df1aad..ffdfa43 100644
--- a/quickstep/src/com/android/quickstep/FallbackActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/FallbackActivityInterface.java
@@ -21,6 +21,8 @@
import static com.android.quickstep.fallback.RecentsState.DEFAULT;
import static com.android.quickstep.fallback.RecentsState.HOME;
+import android.animation.Animator;
+import android.animation.AnimatorSet;
import android.content.Context;
import android.graphics.Rect;
import android.view.MotionEvent;
@@ -29,7 +31,9 @@
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.statemanager.StateManager;
+import com.android.launcher3.taskbar.FallbackTaskbarUIController;
import com.android.launcher3.touch.PagedOrientationHandler;
+import com.android.quickstep.GestureState.GestureEndTarget;
import com.android.quickstep.fallback.RecentsState;
import com.android.quickstep.util.ActivityInitListener;
import com.android.quickstep.util.AnimatorControllerWithResistance;
@@ -102,6 +106,15 @@
return RecentsActivity.ACTIVITY_TRACKER.getCreatedActivity();
}
+ @Override
+ public FallbackTaskbarUIController getTaskbarController() {
+ RecentsActivity activity = getCreatedActivity();
+ if (activity == null) {
+ return null;
+ }
+ return activity.getTaskbarUIController();
+ }
+
@Nullable
@Override
public RecentsView getVisibleRecentsView() {
@@ -182,7 +195,7 @@
}
@Override
- public RecentsState stateFromGestureEndTarget(GestureState.GestureEndTarget endTarget) {
+ public RecentsState stateFromGestureEndTarget(GestureEndTarget endTarget) {
switch (endTarget) {
case RECENTS:
return DEFAULT;
@@ -203,6 +216,28 @@
}
@Override
+ public @Nullable Animator getParallelAnimationToLauncher(GestureEndTarget endTarget,
+ long duration, RecentsAnimationCallbacks callbacks) {
+ FallbackTaskbarUIController uiController = getTaskbarController();
+ Animator superAnimator = super.getParallelAnimationToLauncher(
+ endTarget, duration, callbacks);
+ if (uiController == null) {
+ return superAnimator;
+ }
+ RecentsState toState = stateFromGestureEndTarget(endTarget);
+ Animator taskbarAnimator = uiController.createAnimToRecentsState(toState, duration);
+ if (taskbarAnimator == null) {
+ return superAnimator;
+ }
+ if (superAnimator == null) {
+ return taskbarAnimator;
+ }
+ AnimatorSet animatorSet = new AnimatorSet();
+ animatorSet.playTogether(superAnimator, taskbarAnimator);
+ return animatorSet;
+ }
+
+ @Override
protected int getOverviewScrimColorForState(RecentsActivity activity, RecentsState state) {
return state.getScrimColor(activity);
}
diff --git a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
index b0bd747..aa9435b 100644
--- a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
@@ -187,7 +187,8 @@
}
@Nullable
- private LauncherTaskbarUIController getTaskbarController() {
+ @Override
+ public LauncherTaskbarUIController getTaskbarController() {
BaseQuickstepLauncher launcher = getCreatedActivity();
if (launcher == null) {
return null;
diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java
index 03e2395..ad7e4df 100644
--- a/quickstep/src/com/android/quickstep/RecentsActivity.java
+++ b/quickstep/src/com/android/quickstep/RecentsActivity.java
@@ -60,6 +60,8 @@
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.FallbackTaskbarUIController;
+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 +75,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 +104,9 @@
private ScrimView mScrimView;
private FallbackRecentsView mFallbackRecentsView;
private OverviewActionsView mActionsView;
+ private TISBindHelper mTISBindHelper;
+ private @Nullable TaskbarManager mTaskbarManager;
+ private @Nullable FallbackTaskbarUIController mTaskbarUIController;
private Configuration mOldConfig;
@@ -125,6 +131,21 @@
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);
+ }
+
+ public void setTaskbarUIController(FallbackTaskbarUIController taskbarUIController) {
+ mTaskbarUIController = taskbarUIController;
+ }
+
+ public FallbackTaskbarUIController getTaskbarUIController() {
+ return mTaskbarUIController;
}
@Override
@@ -346,6 +367,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
diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
index 4895b10..710afe0 100644
--- a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
+++ b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
@@ -43,6 +43,7 @@
import org.junit.After;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -288,6 +289,7 @@
@Test
@PortraitLandscape
+ @Ignore("b/203781041")
public void testOverviewForTablet() throws Exception {
if (!mLauncher.isTablet()) {
return;