Merge "Reset docked divider to the middle of the screen if sys-ui dies"
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 5b93979..40ca1c5 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -585,7 +585,8 @@
}
void getStackDockedModeBoundsLocked(Rect outBounds, boolean ignoreVisibility) {
- if (!StackId.isResizeableByDockedStack(mStackId) || mDisplayContent == null) {
+ if ((mStackId != DOCKED_STACK_ID && !StackId.isResizeableByDockedStack(mStackId))
+ || mDisplayContent == null) {
outBounds.set(mBounds);
return;
}
@@ -614,8 +615,7 @@
mDisplayContent.getLogicalDisplayRect(mTmpRect);
dockedStack.getRawBounds(mTmpRect2);
- final boolean dockedOnTopOrLeft = dockedSide == DOCKED_TOP
- || dockedSide == DOCKED_LEFT;
+ final boolean dockedOnTopOrLeft = dockedSide == DOCKED_TOP || dockedSide == DOCKED_LEFT;
getStackDockedModeBounds(mTmpRect, outBounds, mStackId, mTmpRect2,
mDisplayContent.mDividerControllerLocked.getContentWidth(), dockedOnTopOrLeft);
@@ -720,6 +720,19 @@
}
}
+ void resetDockedStackToMiddle() {
+ if (mStackId != DOCKED_STACK_ID) {
+ throw new IllegalStateException("Not a docked stack=" + this);
+ }
+
+ mService.mDockedStackCreateBounds = null;
+
+ final Rect bounds = new Rect();
+ getStackDockedModeBoundsLocked(bounds, true /*ignoreVisibility*/);
+ mService.mH.obtainMessage(RESIZE_STACK, DOCKED_STACK_ID,
+ 1 /*allowResizeInDockedMode*/, bounds).sendToTarget();
+ }
+
void detachDisplay() {
EventLog.writeEvent(EventLogTags.WM_STACK_REMOVED, mStackId);
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 1f7b810..2f916d9 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -57,6 +57,7 @@
import java.util.ArrayList;
import static android.app.ActivityManager.StackId;
+import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT;
@@ -1608,6 +1609,14 @@
win.mAppToken.appDied = true;
}
mService.removeWindowLocked(win);
+ if (win.mAttrs.type == TYPE_DOCK_DIVIDER) {
+ // The owner of the docked divider died :( We reset the docked stack,
+ // just in case they have the divider at an unstable position.
+ final TaskStack stack = mService.mStackIdToStack.get(DOCKED_STACK_ID);
+ if (stack != null) {
+ stack.resetDockedStackToMiddle();
+ }
+ }
} else if (mHasSurface) {
Slog.e(TAG, "!!! LEAK !!! Window removed but surface still valid.");
mService.removeWindowLocked(WindowState.this);