From 73d4b44ce3198b0b4ac477a64d5f12a152dba549 Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Wed, 25 May 2016 14:30:36 -0700 Subject: [PATCH] Update dock stack create mode after rotation if dock side changed On some devices (such as tablets) dock stack could be created on top, but put to right after rotation. Dock create mode needs to be updated in this case, otherwise when a new stack is attached to the display (for example launch into now-cropped fullscreen stack), attachDisplayContent() will use wrong dock mode to derive the bounds. bug: 28942558 Change-Id: I83e66aeac94bd3f96c4b6a0a740acf76234bbe82 --- services/core/java/com/android/server/wm/TaskStack.java | 8 ++++++++ .../java/com/android/server/wm/WindowManagerService.java | 8 ++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index f51fd8aaf7eb5..aaa7a57964adc 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -17,6 +17,7 @@ package com.android.server.wm; import static android.app.ActivityManager.DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT; +import static android.app.ActivityManager.DOCKED_STACK_CREATE_MODE_BOTTOM_OR_RIGHT; import static android.app.ActivityManager.StackId.DOCKED_STACK_ID; import static android.app.ActivityManager.StackId.HOME_STACK_ID; import static android.app.ActivityManager.StackId.PINNED_STACK_ID; @@ -403,6 +404,13 @@ public class TaskStack implements DimLayer.DimLayerUser, snapDockedStackAfterRotation(mTmpRect2); final int newDockSide = getDockSide(mTmpRect2); if (oldDockSide != newDockSide) { + // Update the dock create mode and clear the dock create bounds, these + // might change after a rotation and the original values will be invalid. + mService.setDockedStackCreateStateLocked( + (newDockSide == DOCKED_LEFT || newDockSide == DOCKED_TOP) + ? DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT + : DOCKED_STACK_CREATE_MODE_BOTTOM_OR_RIGHT, + null); mDisplayContent.getDockedDividerController().notifyDockSideChanged(newDockSide); } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index aaed8ca9181d0..96fbdc9ce9184 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -4960,11 +4960,15 @@ public class WindowManagerService extends IWindowManager.Stub public void setDockedStackCreateState(int mode, Rect bounds) { synchronized (mWindowMap) { - mDockedStackCreateMode = mode; - mDockedStackCreateBounds = bounds; + setDockedStackCreateStateLocked(mode, bounds); } } + void setDockedStackCreateStateLocked(int mode, Rect bounds) { + mDockedStackCreateMode = mode; + mDockedStackCreateBounds = bounds; + } + /** * Create a new TaskStack and place it on a DisplayContent. * @param stackId The unique identifier of the new stack.