Merge "Let system control IME for ineligible display" into rvc-dev

This commit is contained in:
Taran Singh
2020-07-13 22:39:20 +00:00
committed by Android (Google) Code Review
3 changed files with 25 additions and 14 deletions

View File

@@ -3538,9 +3538,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
InsetsControlTarget getImeFallback() { InsetsControlTarget getImeFallback() {
// host is in non-default display that doesn't support system decor, default to // host is in non-default display that doesn't support system decor, default to
// default display's StatusBar to control IME (when available), else let system control it. // default display's StatusBar to control IME (when available), else let system control it.
WindowState statusBar = final DisplayContent defaultDc = mWmService.getDefaultDisplayContentLocked();
mWmService.getDefaultDisplayContentLocked().getDisplayPolicy().getStatusBar(); WindowState statusBar = defaultDc.getDisplayPolicy().getStatusBar();
return statusBar != null ? statusBar : mRemoteInsetsControlTarget; return statusBar != null ? statusBar : defaultDc.mRemoteInsetsControlTarget;
} }
boolean canShowIme() { boolean canShowIme() {
@@ -3600,7 +3600,10 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
*/ */
@VisibleForTesting @VisibleForTesting
InsetsControlTarget computeImeControlTarget() { InsetsControlTarget computeImeControlTarget() {
if (!isImeControlledByApp() && mRemoteInsetsControlTarget != null) { if (!isImeControlledByApp() && mRemoteInsetsControlTarget != null
|| (mInputMethodInputTarget != null
&& getImeHostOrFallback(mInputMethodInputTarget.getWindow())
== mRemoteInsetsControlTarget)) {
return mRemoteInsetsControlTarget; return mRemoteInsetsControlTarget;
} else { } else {
// Now, a special case -- if the last target's window is in the process of exiting, but // Now, a special case -- if the last target's window is in the process of exiting, but

View File

@@ -32,7 +32,7 @@ import java.io.PrintWriter;
*/ */
class ImeInsetsSourceProvider extends InsetsSourceProvider { class ImeInsetsSourceProvider extends InsetsSourceProvider {
private WindowState mImeTargetFromIme; private InsetsControlTarget mImeTargetFromIme;
private Runnable mShowImeRunner; private Runnable mShowImeRunner;
private boolean mIsImeLayoutDrawn; private boolean mIsImeLayoutDrawn;
@@ -47,10 +47,12 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider {
* *
* @param imeTarget imeTarget on which IME request is coming from. * @param imeTarget imeTarget on which IME request is coming from.
*/ */
void scheduleShowImePostLayout(WindowState imeTarget) { void scheduleShowImePostLayout(InsetsControlTarget imeTarget) {
boolean targetChanged = mImeTargetFromIme != imeTarget boolean targetChanged = mImeTargetFromIme != imeTarget
&& mImeTargetFromIme != null && imeTarget != null && mShowImeRunner != null && mImeTargetFromIme != null && imeTarget != null && mShowImeRunner != null
&& mImeTargetFromIme.mActivityRecord == imeTarget.mActivityRecord; && imeTarget.getWindow() != null && mImeTargetFromIme.getWindow() != null
&& mImeTargetFromIme.getWindow().mActivityRecord
== imeTarget.getWindow().mActivityRecord;
mImeTargetFromIme = imeTarget; mImeTargetFromIme = imeTarget;
if (targetChanged) { if (targetChanged) {
// target changed, check if new target can show IME. // target changed, check if new target can show IME.
@@ -62,7 +64,8 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider {
return; return;
} }
ProtoLog.d(WM_DEBUG_IME, "Schedule IME show for %s", mImeTargetFromIme.getName()); ProtoLog.d(WM_DEBUG_IME, "Schedule IME show for %s", mImeTargetFromIme.getWindow() == null
? mImeTargetFromIme : mImeTargetFromIme.getWindow().getName());
mShowImeRunner = () -> { mShowImeRunner = () -> {
ProtoLog.d(WM_DEBUG_IME, "Run showImeRunner"); ProtoLog.d(WM_DEBUG_IME, "Run showImeRunner");
// Target should still be the same. // Target should still be the same.
@@ -127,13 +130,17 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider {
return false; return false;
} }
ProtoLog.d(WM_DEBUG_IME, "dcTarget: %s mImeTargetFromIme: %s", ProtoLog.d(WM_DEBUG_IME, "dcTarget: %s mImeTargetFromIme: %s",
dcTarget.getName(), mImeTargetFromIme.getName()); dcTarget.getName(), mImeTargetFromIme.getWindow() == null
? mImeTargetFromIme : mImeTargetFromIme.getWindow().getName());
return (!dcTarget.isClosing() && mImeTargetFromIme == dcTarget) return (!dcTarget.isClosing() && mImeTargetFromIme == dcTarget)
|| (mImeTargetFromIme != null && dcTarget.getParentWindow() == mImeTargetFromIme || (mImeTargetFromIme != null && mImeTargetFromIme.getWindow() != null
&& dcTarget.mSubLayer > mImeTargetFromIme.mSubLayer) && dcTarget.getParentWindow() == mImeTargetFromIme
&& dcTarget.mSubLayer > mImeTargetFromIme.getWindow().mSubLayer)
|| mImeTargetFromIme == mDisplayContent.getImeFallback() || mImeTargetFromIme == mDisplayContent.getImeFallback()
|| (!mImeTargetFromIme.isClosing() && controlTarget == mImeTargetFromIme); || controlTarget == mImeTargetFromIme
&& (mImeTargetFromIme.getWindow() == null
|| !mImeTargetFromIme.getWindow().isClosing());
} }
@Override @Override

View File

@@ -7606,13 +7606,14 @@ public class WindowManagerService extends IWindowManager.Stub
if (imeTarget == null) { if (imeTarget == null) {
return; return;
} }
imeTarget = imeTarget.getImeControlTarget().getWindow(); final InsetsControlTarget controlTarget = imeTarget.getImeControlTarget();
imeTarget = controlTarget.getWindow();
// If InsetsControlTarget doesn't have a window, its using remoteControlTarget which // If InsetsControlTarget doesn't have a window, its using remoteControlTarget which
// is controlled by default display // is controlled by default display
final DisplayContent dc = imeTarget != null final DisplayContent dc = imeTarget != null
? imeTarget.getDisplayContent() : getDefaultDisplayContentLocked(); ? imeTarget.getDisplayContent() : getDefaultDisplayContentLocked();
dc.getInsetsStateController().getImeSourceProvider() dc.getInsetsStateController().getImeSourceProvider()
.scheduleShowImePostLayout(imeTarget); .scheduleShowImePostLayout(controlTarget);
} }
} }