From 60c667803119d63afd284dbcdf0141fd0b11b7f1 Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Tue, 7 Jul 2020 12:48:06 -0700 Subject: [PATCH] Use inputtarget to check for insets controller Was using just the window target, but we need to actually use the inputmethodinputtarget since that has an activity that can actually be checked for split-screen mode. Additionally, we need to force-update the Wm configuration because we skip doing so when divider is "hidden" by keyguard. Bug: 159457357 Test: open split with pip running. Open keyboard in secondary, lock screen, then unlock. Change-Id: Idbc0c3b90c18a55cc664c6958546994cbb8549ee --- .../com/android/systemui/stackdivider/Divider.java | 8 +++++--- .../stackdivider/DividerImeController.java | 14 +++++++++++++- .../android/systemui/wm/DisplayImeController.java | 7 ++++--- .../java/com/android/server/wm/DisplayContent.java | 5 +++-- .../com/android/server/wm/DisplayContentTests.java | 1 + .../src/com/android/server/wm/SizeCompatTests.java | 2 ++ 6 files changed, 28 insertions(+), 9 deletions(-) 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 8ba5b9951c543..e2d613e452ef8 100644 --- a/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java +++ b/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java @@ -271,10 +271,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. @@ -283,6 +281,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 e8a4234f44a75..7aa306e17dd4b 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