summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTony Wickham <twickham@google.com>2016-09-12 18:09:33 -0700
committerTony Wickham <twickham@google.com>2016-09-20 16:48:42 -0700
commitdbf08b4aee0bd9c296552485a34f15f997a56f3f (patch)
treeb8d749dbcd7f6f8f5a29012536e73e80c1bc383e
parent41253866876bc3cbb7d52cd0f28063cea7aca59d (diff)
downloadandroid_packages_apps_Trebuchet-dbf08b4aee0bd9c296552485a34f15f997a56f3f.tar.gz
android_packages_apps_Trebuchet-dbf08b4aee0bd9c296552485a34f15f997a56f3f.tar.bz2
android_packages_apps_Trebuchet-dbf08b4aee0bd9c296552485a34f15f997a56f3f.zip
Stop jumping to workspace from hotseat on quick drop.
Regression occurred in ag/1315317. In that change, Launcher#enterSpringLoadedDragMode() was moved from the end of startDrag() to the end of onDragStart(). This changed the sequence of events from: beginDragShared() --> DragController#startDrag() --> onDragStart --> dropTarget.onDragOver() --> Launcher#enterSpringLoadedDragMode() to: beginDragShared() --> DragController#startDrag() --> onDragStart --> Launcher#enterSpringLoadedDragMode() --> onDragOver() Basically, the key difference is that onDragOver() is called after enterSpringLoadedDragMode(). This matters, because onDragOver() returns early if Workspace#transitionStateShouldAllowDrop() returns false, which it does during the spring loaded transition. This meant that onDragOver() didn't update the layout to be Hotseat, and thus the current workspace page was used as default, since that is what was set in onDragEnter(). To fix it, I've copied the logic in onDragOver() that checks to see if the drag is over the hotseat first to a new method that onDragEnter() now calls as well. Bug: 31245181 Change-Id: Ie758921b25fc96516a09c32bdc9706da941522df
-rw-r--r--src/com/android/launcher3/Workspace.java83
1 files changed, 42 insertions, 41 deletions
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index c499beeb3..0e25b1ef9 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -25,7 +25,6 @@ import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.annotation.SuppressLint;
-import android.annotation.TargetApi;
import android.app.WallpaperManager;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetProviderInfo;
@@ -39,7 +38,6 @@ import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
-import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.Parcelable;
@@ -2800,9 +2798,7 @@ public class Workspace extends PagedView
mAddToExistingFolderOnDrop = false;
mDropToLayout = null;
- CellLayout layout = getCurrentDropLayout();
- setCurrentDropLayout(layout);
- setCurrentDragOverlappingLayout(layout);
+ setDropLayoutForDragObject(d);
if (!workspaceInModalState() && FeatureFlags.LAUNCHER3_LEGACY_WORKSPACE_DND) {
mLauncher.getDragLayer().showPageHints();
@@ -3061,7 +3057,6 @@ public class Workspace extends PagedView
// Skip drag over events while we are dragging over side pages
if (mInScrollArea || !transitionStateShouldAllowDrop()) return;
- CellLayout layout = null;
ItemInfo item = d.dragInfo;
if (item == null) {
if (ProviderConfig.IS_DOGFOOD_BUILD) {
@@ -3075,43 +3070,15 @@ public class Workspace extends PagedView
mDragViewVisualCenter = d.getVisualCenter(mDragViewVisualCenter);
final View child = (mDragInfo == null) ? null : mDragInfo.cell;
- // Identify whether we have dragged over a side page
- if (workspaceInModalState()) {
- if (mLauncher.getHotseat() != null && !isDragWidget(d)) {
- if (isPointInSelfOverHotseat(d.x, d.y)) {
- layout = mLauncher.getHotseat().getLayout();
- }
- }
- if (layout == null) {
- layout = findMatchingPageForDragOver(d.dragView, d.x, d.y, false);
- }
- if (layout != mDragTargetLayout) {
- setCurrentDropLayout(layout);
- setCurrentDragOverlappingLayout(layout);
-
- boolean isInSpringLoadedMode = (mState == State.SPRING_LOADED);
- if (isInSpringLoadedMode) {
- if (mLauncher.isHotseatLayout(layout)) {
- mSpringLoadedDragController.cancel();
- } else {
- mSpringLoadedDragController.setAlarm(mDragTargetLayout);
- }
- }
- }
- } else {
- // Test to see if we are over the hotseat otherwise just use the current page
- if (mLauncher.getHotseat() != null && !isDragWidget(d)) {
- if (isPointInSelfOverHotseat(d.x, d.y)) {
- layout = mLauncher.getHotseat().getLayout();
+ if (setDropLayoutForDragObject(d)) {
+ boolean isInSpringLoadedMode = (mState == State.SPRING_LOADED);
+ if (isInSpringLoadedMode) {
+ if (mLauncher.isHotseatLayout(mDragTargetLayout)) {
+ mSpringLoadedDragController.cancel();
+ } else {
+ mSpringLoadedDragController.setAlarm(mDragTargetLayout);
}
}
- if (layout == null) {
- layout = getCurrentDropLayout();
- }
- if (layout != mDragTargetLayout) {
- setCurrentDropLayout(layout);
- setCurrentDragOverlappingLayout(layout);
- }
}
// Handle the drag over
@@ -3176,6 +3143,40 @@ public class Workspace extends PagedView
}
}
+ /**
+ * Updates {@link #mDragTargetLayout} and {@link #mDragOverlappingLayout}
+ * based on the DragObject's position.
+ *
+ * The layout will be:
+ * - The Hotseat if the drag object is over it
+ * - A side page if we are in spring-loaded mode and the drag object is over it
+ * - The current page otherwise
+ *
+ * @return whether the layout is different from the current {@link #mDragTargetLayout}.
+ */
+ private boolean setDropLayoutForDragObject(DragObject d) {
+ CellLayout layout = null;
+ // Test to see if we are over the hotseat first
+ if (mLauncher.getHotseat() != null && !isDragWidget(d)) {
+ if (isPointInSelfOverHotseat(d.x, d.y)) {
+ layout = mLauncher.getHotseat().getLayout();
+ }
+ }
+ if (layout == null) {
+ // Identify whether we have dragged over a side page,
+ // otherwise just use the current page
+ layout = workspaceInModalState() ?
+ findMatchingPageForDragOver(d.dragView, d.x, d.y, false)
+ : getCurrentDropLayout();
+ }
+ if (layout != mDragTargetLayout) {
+ setCurrentDropLayout(layout);
+ setCurrentDragOverlappingLayout(layout);
+ return true;
+ }
+ return false;
+ }
+
private void manageFolderFeedback(CellLayout targetLayout,
int[] targetCell, float distance, DragObject dragObject) {
if (distance > mMaxDistanceForFolderCreation) return;