From 07544cd85f40193dcc5c7f6acbf6d315af30c3f5 Mon Sep 17 00:00:00 2001 From: Garfield Tan Date: Wed, 12 Sep 2018 16:16:54 -0700 Subject: [PATCH] Fix 2 input issues regarding drag-move/drag-resize. 1) Only add InputWindowHandle to target display. 2) Synchronize when releasing input related sources. Also organized imports. Bug: 113363194 Test: Drag-move stopped crashing. Change-Id: I6352d19e195c9173092493a7fd0da140073fd8b9 --- .../java/com/android/server/wm/InputMonitor.java | 12 ++++++------ .../java/com/android/server/wm/TaskPositioner.java | 14 +++++++++----- .../server/wm/TaskPositioningController.java | 7 ++----- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java index 33097986b2e17..ef3a770390efd 100644 --- a/services/core/java/com/android/server/wm/InputMonitor.java +++ b/services/core/java/com/android/server/wm/InputMonitor.java @@ -268,11 +268,11 @@ final class InputMonitor { } final InputWindowHandle dragWindowHandle = mService.mDragDropController.getInputWindowHandleLocked(); - if (dragWindowHandle != null) { - addInputWindowHandle(dragWindowHandle); - } else { + if (dragWindowHandle == null) { Slog.w(TAG_WM, "Drag is in progress but there is no " + "drag window handle."); + } else if (dragWindowHandle.displayId == mDisplayId) { + addInputWindowHandle(dragWindowHandle); } } @@ -283,11 +283,11 @@ final class InputMonitor { } final InputWindowHandle dragWindowHandle = mService.mTaskPositioningController.getDragWindowHandleLocked(); - if (dragWindowHandle != null) { - addInputWindowHandle(dragWindowHandle); - } else { + if (dragWindowHandle == null) { Slog.e(TAG_WM, "Repositioning is in progress but there is no drag window handle."); + } else if (dragWindowHandle.displayId == mDisplayId) { + addInputWindowHandle(dragWindowHandle); } } diff --git a/services/core/java/com/android/server/wm/TaskPositioner.java b/services/core/java/com/android/server/wm/TaskPositioner.java index 8effc6bbdd594..d2696c0479af8 100644 --- a/services/core/java/com/android/server/wm/TaskPositioner.java +++ b/services/core/java/com/android/server/wm/TaskPositioner.java @@ -19,17 +19,17 @@ package com.android.server.wm; import static android.app.ActivityTaskManager.RESIZE_MODE_USER; import static android.app.ActivityTaskManager.RESIZE_MODE_USER_FORCED; import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; + +import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_FREEFORM; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_POSITIONING; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.dipToPixel; -import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_FREEFORM; import static com.android.server.wm.WindowState.MINIMUM_VISIBLE_HEIGHT_IN_DP; import static com.android.server.wm.WindowState.MINIMUM_VISIBLE_WIDTH_IN_DP; import android.annotation.IntDef; -import android.app.IActivityManager; import android.app.IActivityTaskManager; import android.graphics.Point; import android.graphics.Rect; @@ -51,7 +51,6 @@ import android.view.WindowManager; import com.android.internal.annotations.VisibleForTesting; import com.android.server.input.InputApplicationHandle; import com.android.server.input.InputWindowHandle; -import com.android.server.wm.WindowManagerService.H; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -209,7 +208,6 @@ class TaskPositioner { // Post back to WM to handle clean-ups. We still need the input // event handler for the last finishInputEvent()! mService.mTaskPositioningController.finishTaskPositioning(); - mTask.getDisplayContent().getInputMonitor().updateInputWindowsLw(true /*force*/); } handled = true; } catch (Exception e) { @@ -237,7 +235,7 @@ class TaskPositioner { } /** - * @param display The Display that the window being dragged is on. + * @param displayContent The Display that the window being dragged is on. */ void register(DisplayContent displayContent) { final Display display = displayContent.getDisplay(); @@ -303,6 +301,9 @@ class TaskPositioner { } mDisplayContent.pauseRotationLocked(); + // Notify InputMonitor to take mDragWindowHandle. + mDisplayContent.getInputMonitor().updateInputWindowsLw(true /*force*/); + mSideMargin = dipToPixel(SIDE_MARGIN_DIP, mDisplayMetrics); mMinVisibleWidth = dipToPixel(MINIMUM_VISIBLE_WIDTH_IN_DP, mDisplayMetrics); mMinVisibleHeight = dipToPixel(MINIMUM_VISIBLE_HEIGHT_IN_DP, mDisplayMetrics); @@ -334,6 +335,9 @@ class TaskPositioner { mDragApplicationHandle = null; mDragEnded = true; + // Notify InputMonitor to remove mDragWindowHandle. + mDisplayContent.getInputMonitor().updateInputWindowsLw(true /*force*/); + // Resume rotations after a drag. if (DEBUG_ORIENTATION) { Slog.d(TAG, "Resuming rotation after re-position"); diff --git a/services/core/java/com/android/server/wm/TaskPositioningController.java b/services/core/java/com/android/server/wm/TaskPositioningController.java index 9cdc6b75c3b6c..33416f66f85b3 100644 --- a/services/core/java/com/android/server/wm/TaskPositioningController.java +++ b/services/core/java/com/android/server/wm/TaskPositioningController.java @@ -20,14 +20,13 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_POSITION import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.annotation.Nullable; -import android.app.IActivityManager; import android.app.IActivityTaskManager; -import android.os.RemoteException; import android.os.Handler; import android.os.Looper; +import android.os.RemoteException; import android.util.Slog; -import android.view.Display; import android.view.IWindow; + import com.android.internal.annotations.GuardedBy; import com.android.server.input.InputManagerService; import com.android.server.input.InputWindowHandle; @@ -124,10 +123,8 @@ class TaskPositioningController { return false; } - Display display = displayContent.getDisplay(); mTaskPositioner = TaskPositioner.create(mService); mTaskPositioner.register(displayContent); - displayContent.getInputMonitor().updateInputWindowsLw(true /*force*/); // We need to grab the touch focus so that the touch events during the // resizing/scrolling are not sent to the app. 'win' is the main window