Merge "Reset docked divider to the middle of the screen if sys-ui dies"

This commit is contained in:
Wale Ogunwale
2016-02-05 03:17:05 +00:00
committed by Android (Google) Code Review
2 changed files with 25 additions and 3 deletions

View File

@@ -585,7 +585,8 @@ public class TaskStack implements DimLayer.DimLayerUser,
}
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 @@ public class TaskStack implements DimLayer.DimLayerUser,
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 @@ public class TaskStack implements DimLayer.DimLayerUser,
}
}
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);

View File

@@ -57,6 +57,7 @@ import java.io.PrintWriter;
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 @@ final class WindowState implements WindowManagerPolicy.WindowState {
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);