diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java index 8a3819925f30f..370f9a7624027 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java @@ -193,10 +193,11 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, @Override public void onKeyguardShowingChanged() { - if (!isDividerVisible() || mView == null) { + if (!isSplitActive() || mView == null) { return; } mView.setHidden(mKeyguardStateController.isShowing()); + mImePositionProcessor.updateAdjustForIme(); } @Override @@ -285,8 +286,9 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, * while this only cares if some things are (eg. while entering/exiting as well). */ private boolean isSplitActive() { - return mSplits.mPrimary.topActivityType != ACTIVITY_TYPE_UNDEFINED - || mSplits.mSecondary.topActivityType != ACTIVITY_TYPE_UNDEFINED; + return mSplits.mPrimary != null && mSplits.mSecondary != null + && (mSplits.mPrimary.topActivityType != ACTIVITY_TYPE_UNDEFINED + || mSplits.mSecondary.topActivityType != ACTIVITY_TYPE_UNDEFINED); } private void addDivider(Configuration configuration) { diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerImeController.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerImeController.java index 47c8c0ad8a4e7..9db389eba3d85 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerImeController.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerImeController.java @@ -91,6 +91,7 @@ class DividerImeController implements DisplayImeController.ImePositionProcessor private boolean mPaused = true; private boolean mPausedTargetAdjusted = false; + private boolean mAdjustedWhileHidden = false; DividerImeController(SplitScreenTaskOrganizer splits, TransactionPool pool, Handler handler) { mSplits = splits; @@ -170,11 +171,17 @@ class DividerImeController implements DisplayImeController.ImePositionProcessor // If split is hidden, we don't want to trigger any relayouts that would cause the // divider to show again. updateImeAdjustState(); + } else { + mAdjustedWhileHidden = true; } } private void updateImeAdjustState() { - if (mAdjusted != mTargetAdjusted) { + updateImeAdjustState(false /* force */); + } + + private void updateImeAdjustState(boolean force) { + if (mAdjusted != mTargetAdjusted || force) { // Reposition the server's secondary split position so that it evaluates // insets properly. WindowContainerTransaction wct = new WindowContainerTransaction(); @@ -231,6 +238,11 @@ class DividerImeController implements DisplayImeController.ImePositionProcessor mSplits.mDivider.setAdjustedForIme(mTargetShown && !mPaused); } + public void updateAdjustForIme() { + updateImeAdjustState(mAdjustedWhileHidden); + mAdjustedWhileHidden = false; + } + @Override public void onImePositionChanged(int displayId, int imeTop, SurfaceControl.Transaction t) { diff --git a/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java b/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java index c0089e53f8b63..1ce98eb152c82 100644 --- a/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java +++ b/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java @@ -273,10 +273,8 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged if (imeSource == null || mImeSourceControl == null) { return; } - // Set frame, but only if the new frame isn't empty -- this maintains continuity final Rect newFrame = imeSource.getFrame(); - mImeFrame.set(newFrame); - final boolean isFloating = newFrame.height() == 0; + final boolean isFloating = newFrame.height() == 0 && show; if (isFloating) { // This is likely a "floating" or "expanded" IME, so to get animations, just // pretend the ime has some size just below the screen. @@ -285,6 +283,9 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged mSystemWindows.mDisplayController.getDisplayLayout(mDisplayId).density() * FLOATING_IME_BOTTOM_INSET); mImeFrame.bottom -= floatingInset; + } else if (newFrame.height() != 0) { + // Don't set a new frame if it's empty and hiding -- this maintains continuity + mImeFrame.set(newFrame); } if (DEBUG) { Slog.d(TAG, "Run startAnim show:" + show + " was:" diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index b94fb0471af41..de6501aa9718d 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3506,12 +3506,13 @@ class DisplayContent extends WindowContainer