Merge "Fix minimized dock stack for translucent activity over home task" into nyc-dev
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 094b217..4553f8e 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 @@
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 c640b2a..45262d3 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_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.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 @@
* 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<AppWindowToken> openingApps,
- ArraySet<AppWindowToken> 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<AppWindowToken> 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<Task> 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 4224c57..6c80d1a 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 @@
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 @@
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 57f551c..76c8b56 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 @@
// 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();
}
}