diff options
author | 2017-02-13 18:52:39 +0000 | |
---|---|---|
committer | 2017-02-13 18:52:42 +0000 | |
commit | dfabcb1ca015fe76f395e19997048bf8eca6eafb (patch) | |
tree | e9aad4011abdc4f17669a6a0450c2e0c2b37d4c9 | |
parent | 33a119c94fbef9a185b82204fc58292e08c3d33d (diff) | |
parent | ee9e277033d959211ba733a480355d41a2f32705 (diff) |
Merge "Handle focused tasks on multiple displays"
4 files changed, 43 insertions, 22 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index a06fa1b8dcfe..80df26b4ed42 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -2031,6 +2031,8 @@ final class ActivityManagerShellCommand extends ShellCommand { return runTaskDragTaskTest(pw); } else if (op.equals("size-task-test")) { return runTaskSizeTaskTest(pw); + } else if (op.equals("focus")) { + return runTaskFocus(pw); } else { getErrPrintWriter().println("Error: unknown command '" + op + "'"); return -1; @@ -2322,6 +2324,13 @@ final class ActivityManagerShellCommand extends ShellCommand { return 0; } + int runTaskFocus(PrintWriter pw) throws RemoteException { + final int taskId = Integer.parseInt(getNextArgRequired()); + pw.println("Setting focus to task " + taskId); + mInterface.setFocusedTask(taskId); + return 0; + } + int runWrite(PrintWriter pw) { mInternal.enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER, "registerUidObserver()"); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index c45136ca2472..2c315445577d 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1072,19 +1072,25 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } void setTouchExcludeRegion(Task focusedTask) { - mTouchExcludeRegion.set(mBaseDisplayRect); - final int delta = dipToPixel(RESIZE_HANDLE_WIDTH_IN_DP, mDisplayMetrics); - mTmpRect2.setEmpty(); - for (int stackNdx = mTaskStackContainers.size() - 1; stackNdx >= 0; --stackNdx) { - final TaskStack stack = mTaskStackContainers.get(stackNdx); - stack.setTouchExcludeRegion( - focusedTask, delta, mTouchExcludeRegion, mContentRect, mTmpRect2); - } - // If we removed the focused task above, add it back and only leave its - // outside touch area in the exclusion. TapDectector is not interested in - // any touch inside the focused task itself. - if (!mTmpRect2.isEmpty()) { - mTouchExcludeRegion.op(mTmpRect2, Region.Op.UNION); + // The provided task is the task on this display with focus, so if WindowManagerService's + // focused app is not on this display, focusedTask will be null. + if (focusedTask == null) { + mTouchExcludeRegion.setEmpty(); + } else { + mTouchExcludeRegion.set(mBaseDisplayRect); + final int delta = dipToPixel(RESIZE_HANDLE_WIDTH_IN_DP, mDisplayMetrics); + mTmpRect2.setEmpty(); + for (int stackNdx = mTaskStackContainers.size() - 1; stackNdx >= 0; --stackNdx) { + final TaskStack stack = mTaskStackContainers.get(stackNdx); + stack.setTouchExcludeRegion( + focusedTask, delta, mTouchExcludeRegion, mContentRect, mTmpRect2); + } + // If we removed the focused task above, add it back and only leave its + // outside touch area in the exclusion. TapDectector is not interested in + // any touch inside the focused task itself. + if (!mTmpRect2.isEmpty()) { + mTouchExcludeRegion.op(mTmpRect2, Region.Op.UNION); + } } final WindowState inputMethod = mService.mInputMethodWindow; if (inputMethod != null && inputMethod.isVisibleLw()) { diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 80e6655545aa..126e0800cf07 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -784,7 +784,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { if (updateInputWindowsNeeded) { mService.mInputMonitor.updateInputWindowsLw(false /*force*/); } - mService.setFocusTaskRegionLocked(); + mService.setFocusTaskRegionLocked(null); // Check to see if we are now in a state where the screen should // be enabled, because the window obscured flags have changed. diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 1c864e8cf2e7..eae08b35290e 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2586,13 +2586,18 @@ public class WindowManagerService extends IWindowManager.Stub } } - void setFocusTaskRegionLocked() { + void setFocusTaskRegionLocked(AppWindowToken previousFocus) { final Task focusedTask = mFocusedApp != null ? mFocusedApp.mTask : null; - if (focusedTask != null) { - final DisplayContent displayContent = focusedTask.getDisplayContent(); - if (displayContent != null) { - displayContent.setTouchExcludeRegion(focusedTask); - } + final Task previousTask = previousFocus != null ? previousFocus.mTask : null; + final DisplayContent focusedDisplayContent = + focusedTask != null ? focusedTask.getDisplayContent() : null; + final DisplayContent previousDisplayContent = + previousTask != null ? previousTask.getDisplayContent() : null; + if (previousDisplayContent != null && previousDisplayContent != focusedDisplayContent) { + previousDisplayContent.setTouchExcludeRegion(null); + } + if (focusedDisplayContent != null) { + focusedDisplayContent.setTouchExcludeRegion(focusedTask); } } @@ -2618,9 +2623,10 @@ public class WindowManagerService extends IWindowManager.Stub final boolean changed = mFocusedApp != newFocus; if (changed) { + AppWindowToken prev = mFocusedApp; mFocusedApp = newFocus; mInputMonitor.setFocusedAppLw(newFocus); - setFocusTaskRegionLocked(); + setFocusTaskRegionLocked(prev); } if (moveFocusNow && changed) { @@ -7456,7 +7462,7 @@ public class WindowManagerService extends IWindowManager.Stub synchronized (mWindowMap) { getDefaultDisplayContentLocked().getDockedDividerController() .setTouchRegion(touchRegion); - setFocusTaskRegionLocked(); + setFocusTaskRegionLocked(null); } } |