diff options
author | 2016-01-11 17:14:24 -0800 | |
---|---|---|
committer | 2016-01-11 17:15:40 -0800 | |
commit | 2a88fc31cf16b419fdd23c9841ffdbfe7af9d966 (patch) | |
tree | 1f1cac7184a79ef329be21ad901efa6a0cc2c4fa | |
parent | a16a704af08f30f11a5d184038cf59d5ebffe78a (diff) |
Apply scroll to windows added to a non-resizeble task that's docked
bug: 26447921
Change-Id: I933e277137fb127a9e961035cf48cba2bef52042
5 files changed, 21 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 51787b066859..a9025bda2fbc 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -393,7 +393,7 @@ class DisplayContent { } mTouchExcludeRegion.op(mTmpRect, Region.Op.DIFFERENCE); } - if (task.isDockedInEffect() && !task.isResizeable()) { + if (task.isTwoFingerScrollMode()) { stack.getBounds(mTmpRect); mNonResizeableRegion.op(mTmpRect, Region.Op.UNION); break; diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 47a4936b144f..6bb3e20727e8 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -571,6 +571,10 @@ class Task implements DimLayer.DimLayerUser { return inDockedWorkspace() || isResizeableByDockedStack(); } + boolean isTwoFingerScrollMode() { + return isDockedInEffect() && !isResizeable(); + } + WindowState getTopVisibleAppMainWindow() { final AppWindowToken token = getTopVisibleAppToken(); return token != null ? token.findMainWindow() : null; diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index fc6ad70513b1..fb778ec94f7f 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -126,7 +126,7 @@ public class TaskStack implements DimLayer.DimLayerUser { Configuration config = configs.get(task.mTaskId); if (config != null) { Rect bounds = taskBounds.get(task.mTaskId); - if (!task.isResizeable() && task.isDockedInEffect()) { + if (task.isTwoFingerScrollMode()) { // This is a non-resizeable task that's docked (or side-by-side to the docked // stack). It might have been scrolled previously, and after the stack resizing, // it might no longer fully cover the stack area. diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index aa5cc7fc8f0e..71cd66043331 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -1990,6 +1990,10 @@ public class WindowManagerService extends IWindowManager.Stub } } + // If the window is being added to a task that's docked but non-resizeable, + // we need to update this new window's scroll position when it's added. + win.applyScrollIfNeeded(); + if (type == TYPE_DOCK_DIVIDER) { getDefaultDisplayContentLocked().getDockedDividerController().setWindow(win); } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index b7fd60f1c201..058fa67a5e4a 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1458,15 +1458,24 @@ final class WindowState implements WindowManagerPolicy.WindowState { } boolean inDockedWorkspace() { - Task task = getTask(); + final Task task = getTask(); return task != null && task.inDockedWorkspace(); } boolean isDockedInEffect() { - Task task = getTask(); + final Task task = getTask(); return task != null && task.isDockedInEffect(); } + void applyScrollIfNeeded() { + final Task task = getTask(); + if (task != null && task.isTwoFingerScrollMode()) { + task.getDimBounds(mTmpRect); + mXOffset = mTmpRect.left; + mYOffset = mTmpRect.top; + } + } + int getTouchableRegion(Region region, int flags) { final boolean modal = (flags & (FLAG_NOT_TOUCH_MODAL | FLAG_NOT_FOCUSABLE)) == 0; if (modal && mAppToken != null) { |