From d3ec507160eec964f687d3b03b0f126b3394e95f Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Thu, 28 Apr 2016 15:57:47 -0700 Subject: [PATCH] Fix minimized dock stack for translucent activity over home task Previously, we only looked at whether home task is going away or getting visible. This doesn't work anymore, as we also need to un-minimize docked stack if another task is visible with translucency over the home task. Change-Id: I993f58a25d99d2ef9f562f7d1587c2dec0d05142 Fixes: 28434466 Fixes: 27906038 --- .../com/android/server/wm/AppTransition.java | 2 +- .../wm/DockedStackDividerController.java | 56 +++++++------------ .../java/com/android/server/wm/TaskStack.java | 14 +++++ .../server/wm/WindowManagerService.java | 2 +- 4 files changed, 37 insertions(+), 37 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index 094b217aafa03..4553f8e07cdac 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -372,7 +372,7 @@ public class AppTransition implements Dump { topOpeningAppAnimator != null ? topOpeningAppAnimator.animation : null, topClosingAppAnimator != null ? topClosingAppAnimator.animation : null); mService.getDefaultDisplayContentLocked().getDockedDividerController() - .notifyAppTransitionStarting(openingApps, closingApps); + .notifyAppTransitionStarting(); // Prolong the start for the transition when docking a task from recents, unless recents // ended it already then we don't need to wait. diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index c640b2a2a56ea..45262d33ffb30 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -17,6 +17,7 @@ package com.android.server.wm; import static android.app.ActivityManager.StackId.DOCKED_STACK_ID; +import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID; import static android.app.ActivityManager.StackId.INVALID_STACK_ID; import static android.view.WindowManager.DOCKED_BOTTOM; import static android.view.WindowManager.DOCKED_LEFT; @@ -24,7 +25,6 @@ import static android.view.WindowManager.DOCKED_RIGHT; import static android.view.WindowManager.DOCKED_TOP; import static com.android.server.wm.AppTransition.DEFAULT_APP_TRANSITION_DURATION; import static com.android.server.wm.AppTransition.TOUCH_RESPONSE_INTERPOLATOR; -import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.H.NOTIFY_DOCKED_STACK_MINIMIZED_CHANGED; @@ -33,7 +33,6 @@ import android.content.Context; import android.graphics.Rect; import android.os.RemoteCallbackList; import android.os.RemoteException; -import android.util.ArraySet; import android.util.Slog; import android.view.DisplayInfo; import android.view.IDockedStackListener; @@ -369,44 +368,31 @@ public class DockedStackDividerController implements DimLayerUser { * Notifies the docked stack divider controller of a visibility change that happens without * an animation. */ - void notifyAppVisibilityChanged(AppWindowToken wtoken, boolean visible) { - final Task task = wtoken.mTask; - if (!task.isHomeTask() || !task.isVisibleForUser()) { - return; - } - - // 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.getTopAppToken() == null || task.getTopAppToken() != wtoken) { - return; - } - - // If the stack is completely offscreen, this might just be an intermediate state when - // docking a task/launching recents at the same time, but home doesn't actually get - // visible after the state settles in. - if (isWithinDisplay(task) - && mDisplayContent.getDockedStackVisibleForUserLocked() != null) { - setMinimizedDockedStack(visible, false /* animate */); - } + void notifyAppVisibilityChanged() { + checkMinimizeChanged(false /* animate */); } - void notifyAppTransitionStarting(ArraySet openingApps, - ArraySet closingApps) { - if (containsHomeTaskWithinDisplay(openingApps)) { - setMinimizedDockedStack(true /* minimized */, true /* animate */); - } else if (containsHomeTaskWithinDisplay(closingApps)) { - setMinimizedDockedStack(false /* minimized */, true /* animate */); - } + void notifyAppTransitionStarting() { + checkMinimizeChanged(true /* animate */); } - private boolean containsHomeTaskWithinDisplay(ArraySet apps) { - for (int i = apps.size() - 1; i >= 0; i--) { - final Task task = apps.valueAt(i).mTask; - if (task != null && task.isHomeTask()) { - return isWithinDisplay(task); - } + private void checkMinimizeChanged(boolean animate) { + final TaskStack homeStack = mDisplayContent.getHomeStack(); + if (homeStack == null) { + return; } - return false; + final Task homeTask = homeStack.findHomeTask(); + if (homeTask == null || !isWithinDisplay(homeTask)) { + return; + } + final TaskStack fullscreenStack + = mService.mStackIdToStack.get(FULLSCREEN_WORKSPACE_STACK_ID); + final ArrayList homeStackTasks = homeStack.getTasks(); + final Task topHomeStackTask = homeStackTasks.get(homeStackTasks.size() - 1); + final boolean homeVisible = homeTask.getTopVisibleAppToken() != null; + final boolean homeBehind = (fullscreenStack != null && fullscreenStack.isVisibleLocked()) + || (homeStackTasks.size() > 1 && topHomeStackTask != homeTask); + setMinimizedDockedStack(homeVisible && !homeBehind, animate); } private boolean isWithinDisplay(Task task) { diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 4224c57a95ed3..6c80d1ab3cfec 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -18,6 +18,7 @@ package com.android.server.wm; import static android.app.ActivityManager.DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT; 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; import static android.content.res.Configuration.DENSITY_DPI_UNDEFINED; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; @@ -155,6 +156,19 @@ public class TaskStack implements DimLayer.DimLayerUser, return mTasks; } + Task findHomeTask() { + if (mStackId != HOME_STACK_ID) { + return null; + } + + for (int i = mTasks.size() - 1; i >= 0; i--) { + if (mTasks.get(i).isHomeTask()) { + return mTasks.get(i); + } + } + return null; + } + /** * Set the bounds of the stack and its containing tasks. * @param stackBounds New stack bounds. Passing in null sets the bounds to fullscreen. diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 57f551cff098f..76c8b56e0829a 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -4348,7 +4348,7 @@ public class WindowManagerService extends IWindowManager.Stub // 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); + .notifyAppVisibilityChanged(); } }