Merge "Make arrow feel more connected to popup" into ub-launcher3-master
diff --git a/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java
index a1ae99e..8684c58 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java
@@ -46,6 +46,7 @@
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
import com.android.quickstep.RecentsModel;
import com.android.quickstep.TouchInteractionService;
+import com.android.quickstep.util.LayoutUtils;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskView;
@@ -97,11 +98,17 @@
}
return false;
}
+ RecentsView recentsView = mLauncher.getOverviewPanel();
if (mLauncher.isInState(ALL_APPS)) {
// In all-apps only listen if the container cannot scroll itself
if (!mLauncher.getAppsView().shouldContainerScroll(ev)) {
return false;
}
+ } else if (mLauncher.isInState(OVERVIEW) && recentsView.getChildCount() > 0) {
+ // Allow swiping up in the gap between the hotseat and overview.
+ if (ev.getY() < recentsView.getChildAt(0).getBottom()) {
+ return false;
+ }
} else {
// For all other states, only listen if the event originated below the hotseat height
DeviceProfile dp = mLauncher.getDeviceProfile();
@@ -197,7 +204,7 @@
// Reset the state manager, when changing the interaction mode
mLauncher.getStateManager().goToState(OVERVIEW, false /* animate */);
mPendingAnimation = recentsView.createTaskLauncherAnimation(taskView, maxAccuracy);
- mPendingAnimation.anim.setInterpolator(Interpolators.ZOOM_IN);
+ mPendingAnimation.anim.setInterpolator(Interpolators.LINEAR);
Runnable onCancelRunnable = () -> {
cancelPendingAnim();
@@ -206,6 +213,7 @@
mCurrentAnimation = AnimatorPlaybackController.wrap(mPendingAnimation.anim, maxAccuracy,
onCancelRunnable);
mLauncher.getStateManager().setCurrentUserControlledAnimation(mCurrentAnimation);
+ totalShift = LayoutUtils.getShelfTrackingDistance(mLauncher.getDeviceProfile());
} else {
mCurrentAnimation = mLauncher.getStateManager()
.createAnimationToNewWorkspace(mToState, builder, maxAccuracy, this::clearState,
diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java
index 322e270..77af211 100644
--- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java
+++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java
@@ -16,7 +16,6 @@
package com.android.quickstep;
import static android.view.View.TRANSLATION_Y;
-
import static com.android.launcher3.LauncherAnimUtils.OVERVIEW_TRANSITION_MS;
import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY;
import static com.android.launcher3.LauncherState.FAST_OVERVIEW;
@@ -38,6 +37,7 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.graphics.PointF;
import android.graphics.Rect;
import android.os.Build;
import android.os.Handler;
@@ -100,8 +100,13 @@
void onTransitionCancelled(T activity, boolean activityVisible);
+ default int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context,
+ @InteractionType int interactionType, TransformedRect outRect) {
+ return getSwipeUpDestinationAndLength(dp, context, interactionType, outRect, null);
+ }
+
int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context,
- @InteractionType int interactionType, TransformedRect outRect);
+ @InteractionType int interactionType, TransformedRect outRect, PointF touchTown);
void onSwipeUpComplete(T activity);
@@ -185,7 +190,7 @@
@Override
public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context,
- @InteractionType int interactionType, TransformedRect outRect) {
+ @InteractionType int interactionType, TransformedRect outRect, PointF touchDown) {
LayoutUtils.calculateLauncherTaskSize(context, dp, outRect.rect);
if (interactionType == INTERACTION_QUICK_SCRUB) {
outRect.scale = FastOverviewState.getOverviewScale(dp, outRect.rect, context);
@@ -195,9 +200,12 @@
int hotseatInset = dp.isSeascape() ? targetInsets.left : targetInsets.right;
return dp.hotseatBarSizePx + hotseatInset;
} else {
- int shelfHeight = dp.hotseatBarSizePx + dp.getInsets().bottom;
- // Track slightly below the top of the shelf (between top and content).
- return shelfHeight - dp.edgeMarginPx * 2;
+ int swipeLength = LayoutUtils.getShelfTrackingDistance(dp);
+ if (touchDown != null) {
+ // We are already partway through based on where we touched the nav bar.
+ swipeLength -= dp.heightPx - touchDown.y;
+ }
+ return swipeLength;
}
}
@@ -456,7 +464,7 @@
@Override
public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context,
- @InteractionType int interactionType, TransformedRect outRect) {
+ @InteractionType int interactionType, TransformedRect outRect, PointF touchDown) {
LayoutUtils.calculateFallbackTaskSize(context, dp, outRect.rect);
if (dp.isVerticalBarLayout()) {
Rect targetInsets = dp.getInsets();
diff --git a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java
index 0e811f7..c3e0568 100644
--- a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java
+++ b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java
@@ -444,7 +444,7 @@
} else {
TraceHelper.partitionSection("RecentsController", "Received");
mInteractionHandler.onRecentsAnimationStart(mController, mTargets,
- mHomeContentInsets, mMinimizedHomeBounds);
+ mHomeContentInsets, mMinimizedHomeBounds, mDownPos);
}
}
}
diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java
index 66655bd..18fbfbb 100644
--- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java
+++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java
@@ -36,6 +36,7 @@
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Point;
+import android.graphics.PointF;
import android.graphics.Rect;
import android.os.Build;
import android.os.Bundle;
@@ -175,6 +176,7 @@
protected boolean mIsGoingToHome;
private DeviceProfile mDp;
private int mTransitionDragLength;
+ private PointF mTouchDown;
// Shift in the range of [0, 1].
// 0 => preview snapShot is completely visible, and hotseat is completely translated down
@@ -340,12 +342,12 @@
}
}
- private void initTransitionEndpoints(DeviceProfile dp) {
+ private void initTransitionEndpoints(DeviceProfile dp, PointF touchDown) {
mDp = dp;
TransformedRect tempRect = new TransformedRect();
- mTransitionDragLength = mActivityControlHelper
- .getSwipeUpDestinationAndLength(dp, mContext, mInteractionType, tempRect);
+ mTransitionDragLength = mActivityControlHelper.getSwipeUpDestinationAndLength(
+ dp, mContext, mInteractionType, tempRect, touchDown);
mClipAnimationHelper.updateTargetRect(tempRect);
}
@@ -569,7 +571,7 @@
* Called by {@link #mLayoutListener} when launcher layout changes
*/
public void buildAnimationController() {
- initTransitionEndpoints(mActivity.getDeviceProfile());
+ initTransitionEndpoints(mActivity.getDeviceProfile(), mTouchDown);
mAnimationFactory.createActivityController(mTransitionDragLength, mInteractionType);
}
@@ -619,7 +621,8 @@
}
public void onRecentsAnimationStart(RecentsAnimationControllerCompat controller,
- RemoteAnimationTargetSet targets, Rect homeContentInsets, Rect minimizedHomeBounds) {
+ RemoteAnimationTargetSet targets, Rect homeContentInsets, Rect minimizedHomeBounds,
+ PointF touchDown) {
DeviceProfile dp = InvariantDeviceProfile.INSTANCE.get(mContext).getDeviceProfile(mContext);
final Rect overviewStackBounds;
RemoteAnimationTargetCompat runningTaskTarget = targets.findTask(mRunningTaskId);
@@ -650,7 +653,8 @@
mClipAnimationHelper.updateSource(overviewStackBounds, runningTaskTarget);
}
mClipAnimationHelper.prepareAnimation(false /* isOpening */);
- initTransitionEndpoints(dp);
+ mTouchDown = touchDown;
+ initTransitionEndpoints(dp, mTouchDown);
mRecentsAnimationWrapper.setController(controller, targets);
setStateOnUiThread(STATE_APP_CONTROLLER_RECEIVED);
diff --git a/quickstep/src/com/android/quickstep/util/LayoutUtils.java b/quickstep/src/com/android/quickstep/util/LayoutUtils.java
index 7715f35..253e56f 100644
--- a/quickstep/src/com/android/quickstep/util/LayoutUtils.java
+++ b/quickstep/src/com/android/quickstep/util/LayoutUtils.java
@@ -111,4 +111,10 @@
outRect.set(Math.round(x), Math.round(y),
Math.round(x + outWidth), Math.round(y + outHeight));
}
+
+ public static int getShelfTrackingDistance(DeviceProfile dp) {
+ int shelfHeight = dp.hotseatBarSizePx + dp.getInsets().bottom;
+ // Track slightly below the top of the shelf (between top and content).
+ return shelfHeight - dp.edgeMarginPx * 2;
+ }
}