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() {
// 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.
WindowState statusBar =
mWmService.getDefaultDisplayContentLocked().getDisplayPolicy().getStatusBar();
return statusBar != null ? statusBar : mRemoteInsetsControlTarget;
final DisplayContent defaultDc = mWmService.getDefaultDisplayContentLocked();
WindowState statusBar = defaultDc.getDisplayPolicy().getStatusBar();
return statusBar != null ? statusBar : defaultDc.mRemoteInsetsControlTarget;
}
boolean canShowIme() {
@@ -3600,7 +3600,10 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
*/
@VisibleForTesting
InsetsControlTarget computeImeControlTarget() {
if (!isImeControlledByApp() && mRemoteInsetsControlTarget != null) {
if (!isImeControlledByApp() && mRemoteInsetsControlTarget != null
|| (mInputMethodInputTarget != null
&& getImeHostOrFallback(mInputMethodInputTarget.getWindow())
== mRemoteInsetsControlTarget)) {
return mRemoteInsetsControlTarget;
} else {
// 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 {
private WindowState mImeTargetFromIme;
private InsetsControlTarget mImeTargetFromIme;
private Runnable mShowImeRunner;
private boolean mIsImeLayoutDrawn;
@@ -47,10 +47,12 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider {
*
* @param imeTarget imeTarget on which IME request is coming from.
*/
void scheduleShowImePostLayout(WindowState imeTarget) {
void scheduleShowImePostLayout(InsetsControlTarget imeTarget) {
boolean targetChanged = mImeTargetFromIme != imeTarget
&& mImeTargetFromIme != null && imeTarget != null && mShowImeRunner != null
&& mImeTargetFromIme.mActivityRecord == imeTarget.mActivityRecord;
&& imeTarget.getWindow() != null && mImeTargetFromIme.getWindow() != null
&& mImeTargetFromIme.getWindow().mActivityRecord
== imeTarget.getWindow().mActivityRecord;
mImeTargetFromIme = imeTarget;
if (targetChanged) {
// target changed, check if new target can show IME.
@@ -62,7 +64,8 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider {
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 = () -> {
ProtoLog.d(WM_DEBUG_IME, "Run showImeRunner");
// Target should still be the same.
@@ -127,13 +130,17 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider {
return false;
}
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)
|| (mImeTargetFromIme != null && dcTarget.getParentWindow() == mImeTargetFromIme
&& dcTarget.mSubLayer > mImeTargetFromIme.mSubLayer)
|| (mImeTargetFromIme != null && mImeTargetFromIme.getWindow() != null
&& dcTarget.getParentWindow() == mImeTargetFromIme
&& dcTarget.mSubLayer > mImeTargetFromIme.getWindow().mSubLayer)
|| mImeTargetFromIme == mDisplayContent.getImeFallback()
|| (!mImeTargetFromIme.isClosing() && controlTarget == mImeTargetFromIme);
|| controlTarget == mImeTargetFromIme
&& (mImeTargetFromIme.getWindow() == null
|| !mImeTargetFromIme.getWindow().isClosing());
}
@Override

View File

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