Drop additional input events to TaskPositioner when drag has ended.
Fixes issue where we do additional drag ended processing like moving
a task to a docked stack even though we have already done that from
the previous drag end.
Change-Id: Iab10f183a9eb0ec63d8303d1e991a9de65a86c34
diff --git a/services/core/java/com/android/server/wm/TaskPositioner.java b/services/core/java/com/android/server/wm/TaskPositioner.java
index a94be83..9557d121 100644
--- a/services/core/java/com/android/server/wm/TaskPositioner.java
+++ b/services/core/java/com/android/server/wm/TaskPositioner.java
@@ -96,6 +96,7 @@
private float mStartDragY;
@CtrlType
private int mCtrlType = CTRL_NONE;
+ private boolean mDragEnded = false;
InputChannel mServerChannel;
InputChannel mClientChannel;
@@ -117,7 +118,14 @@
boolean handled = false;
try {
- boolean endDrag = false;
+ if (mDragEnded) {
+ // The drag has ended but the clean-up message has not been processed by
+ // window manager. Drop events that occur after this until window manager
+ // has a chance to clean-up the input handle.
+ handled = true;
+ return;
+ }
+
final float newX = motionEvent.getRawX();
final float newY = motionEvent.getRawY();
@@ -133,7 +141,7 @@
Slog.w(TAG, "ACTION_MOVE @ {" + newX + ", " + newY + "}");
}
synchronized (mService.mWindowMap) {
- endDrag = notifyMoveLocked(newX, newY);
+ mDragEnded = notifyMoveLocked(newX, newY);
}
try {
mService.mActivityManager.resizeTask(
@@ -145,18 +153,18 @@
if (DEBUG_TASK_POSITIONING) {
Slog.w(TAG, "ACTION_UP @ {" + newX + ", " + newY + "}");
}
- endDrag = true;
+ mDragEnded = true;
} break;
case MotionEvent.ACTION_CANCEL: {
if (DEBUG_TASK_POSITIONING) {
Slog.w(TAG, "ACTION_CANCEL @ {" + newX + ", " + newY + "}");
}
- endDrag = true;
+ mDragEnded = true;
} break;
}
- if (endDrag) {
+ if (mDragEnded) {
synchronized (mService.mWindowMap) {
endDragLocked();
}
@@ -262,6 +270,8 @@
mSideMargin = mService.dipToPixel(SIDE_MARGIN_DIP, mDisplayMetrics);
mMinVisibleWidth = mService.dipToPixel(MINIMUM_VISIBLE_WIDTH_IN_DP, mDisplayMetrics);
mMinVisibleHeight = mService.dipToPixel(MINIMUM_VISIBLE_HEIGHT_IN_DP, mDisplayMetrics);
+
+ mDragEnded = false;
}
void unregister() {
@@ -292,6 +302,7 @@
mDimLayer = null;
}
mCurrentDimSide = CTRL_NONE;
+ mDragEnded = true;
// Resume rotations after a drag.
if (WindowManagerService.DEBUG_ORIENTATION) {