From ceec31b17c7abf423e9ab9301ae323b6bc232310 Mon Sep 17 00:00:00 2001 From: kholoud mohamed Date: Thu, 3 Feb 2022 15:44:25 +0000 Subject: [PATCH 1/5] Expose action that allows landing on the work tab Bug: 217385869 Bug: 203531272 Test: manual Change-Id: I68a6add9f603105e0a2ee01ebdc3059e18c9a050 --- AndroidManifest.xml | 1 + src/com/android/launcher3/Launcher.java | 9 +++++++++ .../launcher3/allapps/BaseAllAppsContainerView.java | 10 ++++++++++ 3 files changed, 20 insertions(+) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 398489044e..b459b2dc3b 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -58,6 +58,7 @@ android:enabled="true"> + diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 59c40ccbe3..45a83aa604 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -124,6 +124,7 @@ import com.android.launcher3.accessibility.LauncherAccessibilityDelegate; import com.android.launcher3.allapps.ActivityAllAppsContainerView; import com.android.launcher3.allapps.AllAppsStore; import com.android.launcher3.allapps.AllAppsTransitionController; +import com.android.launcher3.allapps.BaseAllAppsContainerView; import com.android.launcher3.allapps.DiscoveryBounce; import com.android.launcher3.anim.AnimatorListeners; import com.android.launcher3.anim.PropertyListBuilder; @@ -1567,6 +1568,7 @@ public class Launcher extends StatefulActivity implements Launche boolean isActionMain = Intent.ACTION_MAIN.equals(intent.getAction()); boolean internalStateHandled = ACTIVITY_TRACKER.handleNewIntent(this); hideKeyboard(); + if (isActionMain) { if (!internalStateHandled) { // In all these cases, only animate if we're already on home @@ -1595,6 +1597,8 @@ public class Launcher extends StatefulActivity implements Launche handleGestureContract(intent); } else if (Intent.ACTION_ALL_APPS.equals(intent.getAction())) { showAllAppsFromIntent(alreadyOnHome); + } else if (Intent.ACTION_SHOW_WORK_APPS.equals(intent.getAction())) { + showAllAppsWorkTabFromIntent(alreadyOnHome); } TraceHelper.INSTANCE.endSection(traceToken); @@ -1605,6 +1609,11 @@ public class Launcher extends StatefulActivity implements Launche getStateManager().goToState(ALL_APPS, alreadyOnHome); } + private void showAllAppsWorkTabFromIntent(boolean alreadyOnHome) { + showAllAppsFromIntent(alreadyOnHome); + mAppsView.switchToTab(BaseAllAppsContainerView.AdapterHolder.WORK); + } + /** * Handles gesture nav contract */ diff --git a/src/com/android/launcher3/allapps/BaseAllAppsContainerView.java b/src/com/android/launcher3/allapps/BaseAllAppsContainerView.java index b257407161..8d03305fcd 100644 --- a/src/com/android/launcher3/allapps/BaseAllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/BaseAllAppsContainerView.java @@ -331,6 +331,16 @@ public abstract class BaseAllAppsContainerView Date: Mon, 7 Feb 2022 11:09:24 -0800 Subject: [PATCH 2/5] Prediction icons in Taskbar were updating when dragging icon in the same place When dragging an icon in the Taskbar and dropping it in the same spot it triggers new predictions when it shouldn't. Basically, it was thinking that the icon was moved outside of the taskbar which should trigger new predictions. To fix it, it simply required to change the order of the events, sending the UNPIN event before the PIN event. Bug: 202922907 Test: Have at least two prediction icons in the Taskbar, drag an app icon in the Taskbar, and drop it in the same place the prediction icon shouldn't change Change-Id: I6079ff6eb69d7b1cb3c22bebc84511c0abd61cec --- .../src/com/android/launcher3/model/AppEventProducer.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/quickstep/src/com/android/launcher3/model/AppEventProducer.java b/quickstep/src/com/android/launcher3/model/AppEventProducer.java index 7c29c5b4c6..4404ffb0e5 100644 --- a/quickstep/src/com/android/launcher3/model/AppEventProducer.java +++ b/quickstep/src/com/android/launcher3/model/AppEventProducer.java @@ -137,12 +137,12 @@ public class AppEventProducer implements StatsLogConsumer { if (mLastDragItem == null) { return; } - if (isTrackedForHotseatPrediction(atomInfo)) { - sendEvent(atomInfo, ACTION_PIN, CONTAINER_HOTSEAT_PREDICTION); - } if (isTrackedForHotseatPrediction(mLastDragItem)) { sendEvent(mLastDragItem, ACTION_UNPIN, CONTAINER_HOTSEAT_PREDICTION); } + if (isTrackedForHotseatPrediction(atomInfo)) { + sendEvent(atomInfo, ACTION_PIN, CONTAINER_HOTSEAT_PREDICTION); + } if (isTrackedForWidgetPrediction(atomInfo)) { sendEvent(atomInfo, ACTION_PIN, CONTAINER_WIDGETS_PREDICTION); } From daa3150b9cb26ec2cc928f81f5f56eac2660d8c6 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Mon, 7 Feb 2022 14:06:35 -0800 Subject: [PATCH 3/5] Move All Apps button to the left in RTL. Bug: 205803230 Test: verify LTR force RTL using developer option verify All Apps button is in the left verify All Apps button moves left before fading out Change-Id: I2a5be9b37f471bfaa1a92f6819e04274e4dfb7a1 --- quickstep/src/com/android/launcher3/taskbar/TaskbarView.java | 4 +++- .../com/android/launcher3/taskbar/TaskbarViewController.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java index fddd1ed6fb..40c67ffc04 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java @@ -32,6 +32,7 @@ import androidx.annotation.Nullable; import com.android.launcher3.BubbleTextView; import com.android.launcher3.Insettable; import com.android.launcher3.R; +import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.model.data.FolderInfo; @@ -214,7 +215,8 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar } if (mAllAppsButton != null) { - addView(mAllAppsButton); + int index = Utilities.isRtl(getResources()) ? 0 : getChildCount(); + addView(mAllAppsButton, index); } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java index 778040dbc1..30bdce1a36 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java @@ -235,7 +235,9 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar if (FeatureFlags.ENABLE_ALL_APPS_IN_TASKBAR.get() && i == count - 1) { // Note that there is no All Apps button in the hotseat, this position is only used // as its convenient for animation purposes. - positionInHotseat = mActivity.getDeviceProfile().inv.numShownHotseatIcons; + positionInHotseat = Utilities.isRtl(child.getResources()) + ? -1 + : mActivity.getDeviceProfile().inv.numShownHotseatIcons; setter.setViewAlpha(child, 0, LINEAR); } else if (child.getTag() instanceof ItemInfo) { From b1c3f88185b3ccf2744ec8d31bc4f04df2f7c726 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Tue, 8 Feb 2022 00:32:03 +0000 Subject: [PATCH 4/5] Fix NPE when mRecentsView is null The NPE was in an unused variable, so also address the TODO to use it as log rank. Test: wwdebug, wwlogcat, quickswitch and check rank field Fixes: 218216440 Change-Id: I173ae607e9f73e58880c0fb1b6e8f2352469816f --- quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index e218db1043..2cb7100378 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -1198,10 +1198,10 @@ public abstract class AbsSwipeUpHandler, // We probably never received an animation controller, skip logging. return; } - int pageIndex = endTarget == LAST_TASK + int pageIndex = endTarget == LAST_TASK || mRecentsView == null ? LOG_NO_OP_PAGE_INDEX : mRecentsView.getNextPage(); - // TODO: set correct container using the pageIndex + logger.withRank(pageIndex); logger.log(event); } From d9378317910fefa8c62cc7a5b1b187c9a38af5df Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Sat, 5 Feb 2022 07:06:41 +0000 Subject: [PATCH 5/5] Add basic return animation when drag is canceled Bug: 179390870 Test: Drag, but don't drop to split an app from the taskbar and check that Launcher animates the surface back into place Change-Id: I726855ff5bdffd1fc58d2839b3cc44b3fdb131e9 --- .../taskbar/TaskbarDragController.java | 121 +++++++++++++++++- .../launcher3/taskbar/TaskbarView.java | 16 ++- .../taskbar/TaskbarViewController.java | 8 +- 3 files changed, 137 insertions(+), 8 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java index e152915038..435eae47ee 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java @@ -15,6 +15,11 @@ */ package com.android.launcher3.taskbar; +import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_ALL_APPS; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; import android.content.ClipData; import android.content.ClipDescription; import android.content.Intent; @@ -27,7 +32,9 @@ import android.graphics.drawable.Drawable; import android.os.UserHandle; import android.view.DragEvent; import android.view.MotionEvent; +import android.view.SurfaceControl; import android.view.View; +import android.view.ViewRootImpl; import androidx.annotation.Nullable; @@ -39,20 +46,25 @@ import com.android.launcher3.DragSource; import com.android.launcher3.DropTarget; import com.android.launcher3.LauncherSettings; import com.android.launcher3.R; +import com.android.launcher3.Utilities; import com.android.launcher3.accessibility.DragViewStateAnnouncer; +import com.android.launcher3.anim.Interpolators; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragDriver; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.dragndrop.DragView; import com.android.launcher3.dragndrop.DraggableView; +import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.DragPreviewProvider; import com.android.launcher3.logging.StatsLogManager; +import com.android.launcher3.model.data.FolderInfo; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.popup.PopupContainerWithArrow; import com.android.launcher3.shortcuts.DeepShortcutView; import com.android.launcher3.shortcuts.ShortcutDragPreviewProvider; +import com.android.launcher3.util.LauncherBindableItemsContainer; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.system.ClipDescriptionCompat; import com.android.systemui.shared.system.LauncherAppsCompat; @@ -66,6 +78,8 @@ import java.util.Arrays; public class TaskbarDragController extends DragController implements TaskbarControllers.LoggableTaskbarController { + private static boolean DEBUG_DRAG_SHADOW_SURFACE = false; + private final int mDragIconSize; private final int[] mTempXY = new int[2]; @@ -78,6 +92,9 @@ public class TaskbarDragController extends DragController { switch (dragEvent.getAction()) { @@ -356,7 +377,12 @@ public class TaskbarDragController extends DragController= 0) { + // Since folders close when the drag starts, target the folder icon instead + LauncherBindableItemsContainer.ItemOperator op = (info, v) -> { + if (info instanceof FolderInfo && v instanceof FolderIcon) { + FolderInfo fi = (FolderInfo) info; + for (WorkspaceItemInfo si : fi.contents) { + if (si.id == item.id) { + // Found the parent + return true; + } + } + } + return false; + }; + target = taskbarViewController.mapOverItems(op); + } + } + + // Finish any pending return animation before starting a new drag + if (mReturnAnimator != null) { + mReturnAnimator.end(); + } + + float fromX = dragEvent.getX() - dragEvent.getOffsetX(); + float fromY = dragEvent.getY() - dragEvent.getOffsetY(); + int[] toPosition = target.getLocationOnScreen(); + float toScale = (float) target.getWidth() / mDragIconSize; + float toAlpha = (target == btv) ? 1f : 0f; + final ViewRootImpl viewRoot = target.getViewRootImpl(); + SurfaceControl.Transaction tx = new SurfaceControl.Transaction(); + mReturnAnimator = ValueAnimator.ofFloat(0f, 1f); + mReturnAnimator.setDuration(300); + mReturnAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN); + mReturnAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + float t = animation.getAnimatedFraction(); + float accelT = Interpolators.ACCEL_2.getInterpolation(t); + float scale = 1f - t * (1f - toScale); + float alpha = 1f - accelT * (1f - toAlpha); + tx.setPosition(dragSurface, Utilities.mapRange(t, fromX, toPosition[0]), + Utilities.mapRange(t, fromY, toPosition[1])); + tx.setScale(dragSurface, scale, scale); + tx.setAlpha(dragSurface, alpha); + tx.apply(); + } + }); + mReturnAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationCancel(Animator animation) { + cleanUpSurface(); + } + + @Override + public void onAnimationEnd(Animator animation) { + cleanUpSurface(); + } + + private void cleanUpSurface() { + maybeOnDragEnd(); + // Synchronize removing the drag surface with the next draw after calling + // maybeOnDragEnd() + viewRoot.consumeNextDraw((transaction) -> { + transaction.remove(dragSurface); + transaction.apply(); + tx.close(); + }); + viewRoot.getView().invalidate(); + mReturnAnimator = null; + } + }); + mReturnAnimator.start(); + } + @Override protected float getX(MotionEvent ev) { // We will resize to fill the screen while dragging, so use screen coordinates. This ensures diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java index fddd1ed6fb..cfdacacfe7 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java @@ -316,6 +316,13 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar return icons; } + /** + * Returns the all apps button in the taskbar. + */ + public View getAllAppsButtonView() { + return mAllAppsButton; + } + // FolderIconParent implemented methods. @Override @@ -357,13 +364,18 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar return getVisibility() == VISIBLE; } - protected void mapOverItems(LauncherBindableItemsContainer.ItemOperator op) { + /** + * Maps {@code op} over all the child views, returning the view that {@code op} evaluates + * {@code true} for, or {@code null} if none satisfy {@code op}. + */ + protected View mapOverItems(LauncherBindableItemsContainer.ItemOperator op) { // map over all the shortcuts on the taskbar for (int i = 0; i < getChildCount(); i++) { View item = getChildAt(i); if (op.evaluate((ItemInfo) item.getTag(), item)) { - return; + return item; } } + return null; } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java index 778040dbc1..730f7a85a8 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java @@ -164,6 +164,10 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar return mTaskbarView.getIconViews(); } + public View getAllAppsButtonView() { + return mTaskbarView.getAllAppsButtonView(); + } + public AnimatedFloat getTaskbarIconScaleForStash() { return mTaskbarIconScaleForStash; } @@ -268,8 +272,8 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar mTaskbarNavButtonTranslationY.updateValue(-deviceProfile.getTaskbarOffsetY()); } - public void mapOverItems(LauncherBindableItemsContainer.ItemOperator op) { - mTaskbarView.mapOverItems(op); + public View mapOverItems(LauncherBindableItemsContainer.ItemOperator op) { + return mTaskbarView.mapOverItems(op); } /**