From 1b5ea72b3cd946ae27e92743339f1fcb117a0520 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Wed, 20 Apr 2016 13:23:28 -0700 Subject: [PATCH] Force pinned windows to always be scaleable. Otherwise we have a race when switching it off at the end of the animation when we don't move to fullscreen. Ensure SCALE_TO_WINDOW is always enabled for windows while they are in the pinned stack. Bug: 27793381 Change-Id: Ia92465fd0d854f799caa8ed31edb4621af9fdecd --- core/java/android/app/ActivityManager.java | 8 +++++ .../java/com/android/server/wm/TaskStack.java | 34 ++++++++++--------- .../server/wm/WindowStateAnimator.java | 6 ++++ 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 2f7c550979296..f4e5ddf106a36 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -696,6 +696,14 @@ public class ActivityManager { public static boolean activitiesCanRequestVisibleBehind(int stackId) { return stackId == FULLSCREEN_WORKSPACE_STACK_ID; } + + /** + * Returns true if this stack may be scaled without resizing, + * and windows within may need to be configured as such. + */ + public static boolean windowsAreScaleable(int stackId) { + return stackId == PINNED_STACK_ID; + } } /** diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index a289855586c46..96847e82e98e0 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -556,6 +556,15 @@ public class TaskStack implements DimLayer.DimLayerUser, if (toTop) { mDisplayContent.moveStack(this, true); } + + if (StackId.windowsAreScaleable(mStackId)) { + // We force windows out of SCALING_MODE_FREEZE + // so that we can continue to animate them + // while a resize is pending. + forceWindowsScaleable(task, true); + } else { + forceWindowsScaleable(task, false); + } EventLog.writeEvent(EventLogTags.WM_TASK_MOVED, task.mTaskId, toTop ? 1 : 0, position); } @@ -1280,20 +1289,18 @@ public class TaskStack implements DimLayer.DimLayerUser, return true; } - void forceWindowsScaleable(boolean force) { + void forceWindowsScaleable(Task task, boolean force) { SurfaceControl.openTransaction(); try { - for (int taskNdx = mTasks.size() - 1; taskNdx >= 0; --taskNdx) { - final ArrayList activities = mTasks.get(taskNdx).mAppTokens; - for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { - final ArrayList windows = activities.get(activityNdx).allAppWindows; - for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) { - final WindowStateAnimator winAnimator = windows.get(winNdx).mWinAnimator; - if (winAnimator == null || !winAnimator.hasSurface()) { - continue; - } - winAnimator.mSurfaceController.forceScaleableInTransaction(force); + final ArrayList activities = task.mAppTokens; + for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { + final ArrayList windows = activities.get(activityNdx).allAppWindows; + for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) { + final WindowStateAnimator winAnimator = windows.get(winNdx).mWinAnimator; + if (winAnimator == null || !winAnimator.hasSurface()) { + continue; } + winAnimator.mSurfaceController.forceScaleableInTransaction(force); } } } finally { @@ -1304,10 +1311,6 @@ public class TaskStack implements DimLayer.DimLayerUser, @Override // AnimatesBounds public void onAnimationStart() { synchronized (mService.mWindowMap) { - // We force windows out of SCALING_MODE_FREEZE - // so that we can continue to animate them - // while a resize is pending. - forceWindowsScaleable(true); mFreezeMovementAnimations = true; mBoundsAnimating = true; } @@ -1318,7 +1321,6 @@ public class TaskStack implements DimLayer.DimLayerUser, synchronized (mService.mWindowMap) { mFreezeMovementAnimations = false; mBoundsAnimating = false; - forceWindowsScaleable(false); mService.requestTraversal(); } if (mStackId == PINNED_STACK_ID) { diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 8c29c9b194ad6..f6330c128a9eb 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -17,6 +17,7 @@ package com.android.server.wm; import static android.app.ActivityManager.StackId; +import static android.app.ActivityManager.StackId.PINNED_STACK_ID; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; import static android.view.WindowManager.LayoutParams.FLAG_SCALED; @@ -1683,6 +1684,11 @@ class WindowStateAnimator { * @return Returns true if the surface was successfully shown. */ private boolean showSurfaceRobustlyLocked() { + final Task task = mWin.getTask(); + if (task != null && StackId.windowsAreScaleable(task.mStack.mStackId)) { + mSurfaceController.forceScaleableInTransaction(true); + } + boolean shown = mSurfaceController.showRobustlyInTransaction(); if (!shown) return false;