From 2a88fc31cf16b419fdd23c9841ffdbfe7af9d966 Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Mon, 11 Jan 2016 17:14:24 -0800 Subject: [PATCH] Apply scroll to windows added to a non-resizeble task that's docked bug: 26447921 Change-Id: I933e277137fb127a9e961035cf48cba2bef52042 --- .../java/com/android/server/wm/DisplayContent.java | 2 +- services/core/java/com/android/server/wm/Task.java | 4 ++++ .../core/java/com/android/server/wm/TaskStack.java | 2 +- .../com/android/server/wm/WindowManagerService.java | 4 ++++ .../java/com/android/server/wm/WindowState.java | 13 +++++++++++-- 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 51787b0668592..a9025bda2fbcb 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 47a4936b144fd..6bb3e20727e88 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 fc6ad70513b13..fb778ec94f7f1 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 aa5cc7fc8f0e9..71cd660433315 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 b7fd60f1c201f..058fa67a5e4a8 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) {