From af558e1419aba5b89b9ee8c2fdafa508e6de8d84 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Wed, 27 Apr 2016 22:56:56 -0700 Subject: [PATCH] Fix issues with docked stack not un-minimizing - Add minimize state to dump - If the docked app goes through a configuration change while the docked stack is minimizing, the window list becomes temporarily empty, and thus Task.isVisibleForCurrentUserLocked == false. Since we already check at the beginning of the animation, we need to finish the minimize animation on the docked stack no matter what happens. - Adjust the condition when to notify divider controller about app visibility. It turns out that under some conditions an animation is set, but the app is not an element of mClosingApps nor mOpeningApps, so we missed the visibility change of the home task - Use getTopAppToken instead of getTopVisibleAppToken. When the token is about to hide, it's already hiddenRequested, so we skipped changing the minimize adjustment. Change-Id: Ib9e2e3f6a5da7b7854b49857299a236e47baa6fc Fixes: 28184044 --- .../server/wm/DockedStackDividerController.java | 4 ++-- services/core/java/com/android/server/wm/Task.java | 4 ++++ .../core/java/com/android/server/wm/TaskStack.java | 8 ++++++++ .../android/server/wm/WindowManagerService.java | 14 ++++++++++---- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index 8174c139cf640..c640b2a2a56ea 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -377,7 +377,7 @@ public class DockedStackDividerController implements DimLayerUser { // If the app that having visibility change is not the top visible one in the task, // it does not affect whether the docked stack is minimized, ignore it. - if (task.getTopVisibleAppToken() == null || task.getTopVisibleAppToken() != wtoken) { + if (task.getTopAppToken() == null || task.getTopAppToken() != wtoken) { return; } @@ -598,7 +598,7 @@ public class DockedStackDividerController implements DimLayerUser { } private boolean animateForMinimizedDockedStack(long now) { - final TaskStack stack = mDisplayContent.getDockedStackVisibleForUserLocked(); + final TaskStack stack = mService.mStackIdToStack.get(DOCKED_STACK_ID); if (!mAnimationStarted) { mAnimationStarted = true; mAnimationStartTime = now; diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 6925fa597c4b8..8d41dab431f7e 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -719,6 +719,10 @@ class Task implements DimLayer.DimLayerUser { return null; } + AppWindowToken getTopAppToken() { + return mAppTokens.size() > 0 ? mAppTokens.get(mAppTokens.size() - 1) : null; + } + @Override public boolean isFullscreen() { if (useCurrentBounds()) { diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 7c1d2d715a5b4..4224c57a95ed3 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -1098,6 +1098,14 @@ public class TaskStack implements DimLayer.DimLayerUser, pw.println(prefix + "mDeferDetach=" + mDeferDetach); pw.println(prefix + "mFullscreen=" + mFullscreen); pw.println(prefix + "mBounds=" + mBounds.toShortString()); + if (mMinimizeAmount != 0f) { + pw.println(prefix + "mMinimizeAmout=" + mMinimizeAmount); + } + if (mAdjustedForIme) { + pw.println(prefix + "mAdjustedForIme=true"); + pw.println(prefix + "mAdjustImeAmount=" + mAdjustImeAmount); + pw.println(prefix + "mAdjustDividerAmount=" + mAdjustDividerAmount); + } if (!mAdjustedBounds.isEmpty()) { pw.println(prefix + "mAdjustedBounds=" + mAdjustedBounds.toShortString()); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 534c661d0618e..e4be5a8d56eb5 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -4333,15 +4333,21 @@ public class WindowManagerService extends IWindowManager.Stub } } - if (visibilityChanged && !delayed) { - if (visible) { + if (visibilityChanged) { + if (visible && !delayed) { // The token was made immediately visible, there will be no entrance animation. // We need to inform the client the enter animation was finished. wtoken.mEnteringAnimation = true; mActivityManagerAppTransitionNotifier.onAppTransitionFinishedLocked(wtoken.token); } - getDefaultDisplayContentLocked().getDockedDividerController() - .notifyAppVisibilityChanged(wtoken, visible); + + if (!mClosingApps.contains(wtoken) && !mOpeningApps.contains(wtoken)) { + // The token is not closing nor opening, so even if there is an animation set, that + // doesn't mean that it goes through the normal app transition cycle so we have + // to inform the docked controller about visibility change. + getDefaultDisplayContentLocked().getDockedDividerController() + .notifyAppVisibilityChanged(wtoken, visible); + } } return delayed;