diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 6fc3aed2f12e6..7edc6b761d335 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -694,6 +694,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 ad33b4c32d7ae..037f31679b6a5 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -554,6 +554,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); } @@ -1279,20 +1288,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 { @@ -1303,10 +1310,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; } @@ -1317,7 +1320,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 f603995984289..1493bc73a17f8 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; @@ -1695,6 +1696,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;