Merge "Let system control IME for ineligible display" into rvc-dev
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user