Merge "Fix unexpected IME switcher dialog hidden" into tm-dev

This commit is contained in:
TreeHugger Robot
2022-04-28 15:35:29 +00:00
committed by Android (Google) Code Review
4 changed files with 29 additions and 19 deletions

View File

@@ -133,10 +133,13 @@ public abstract class InputMethodManagerInternal {
*
* @param windowToken the window token that is now in control, or {@code null} if no client
* window is in control of the IME.
* @param imeParentChanged {@code true} when the window manager thoughts the IME surface parent
* will end up to change later, or {@code false} otherwise.
*/
public abstract void reportImeControl(@Nullable IBinder windowToken, boolean imeParentChanged);
public abstract void reportImeControl(@Nullable IBinder windowToken);
/**
* Indicates that the IME window has re-parented to the new target when the IME control changed.
*/
public abstract void onImeParentChanged();
/**
* Destroys the IME surface.
@@ -226,8 +229,11 @@ public abstract class InputMethodManagerInternal {
}
@Override
public void reportImeControl(@Nullable IBinder windowToken,
boolean imeParentChanged) {
public void reportImeControl(@Nullable IBinder windowToken) {
}
@Override
public void onImeParentChanged() {
}
@Override

View File

@@ -5700,19 +5700,23 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
}
@Override
public void reportImeControl(@Nullable IBinder windowToken, boolean imeParentChanged) {
public void reportImeControl(@Nullable IBinder windowToken) {
synchronized (ImfLock.class) {
if (mCurFocusedWindow != windowToken) {
// mCurPerceptible was set by the focused window, but it is no longer in
// control, so we reset mCurPerceptible.
mCurPerceptible = true;
}
if (imeParentChanged) {
// Hide the IME method menu earlier when the IME surface parent will change in
// case seeing the dialog dismiss flickering during the next focused window
// starting the input connection.
mMenuController.hideInputMethodMenu();
}
}
}
@Override
public void onImeParentChanged() {
synchronized (ImfLock.class) {
// Hide the IME method menu when the IME surface parent will change in
// case seeing the dialog dismiss flickering during the next focused window
// starting the input connection.
mMenuController.hideInputMethodMenu();
}
}

View File

@@ -4291,18 +4291,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
// Update Ime parent when IME insets leash created or the new IME layering target might
// updated from setImeLayeringTarget, which is the best time that default IME visibility
// has been settled down after IME control target changed.
final boolean imeParentChanged =
prevImeControlTarget != mImeControlTarget || forceUpdateImeParent;
if (imeParentChanged) {
final boolean imeControlChanged = prevImeControlTarget != mImeControlTarget;
if (imeControlChanged || forceUpdateImeParent) {
updateImeParent();
}
final WindowState win = InsetsControlTarget.asWindowOrNull(mImeControlTarget);
final IBinder token = win != null ? win.mClient.asBinder() : null;
// Note: not allowed to call into IMMS with the WM lock held, hence the post.
mWmService.mH.post(() ->
InputMethodManagerInternal.get().reportImeControl(token, imeParentChanged)
);
mWmService.mH.post(() -> InputMethodManagerInternal.get().reportImeControl(token));
}
void updateImeParent() {
@@ -4324,6 +4321,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
// do a force update to make sure there is a layer set for the new parent.
assignRelativeLayerForIme(getSyncTransaction(), true /* forceUpdate */);
scheduleAnimation();
mWmService.mH.post(() -> InputMethodManagerInternal.get().onImeParentChanged());
}
}

View File

@@ -2464,7 +2464,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
dc.setImeLayeringTarget(null);
dc.computeImeTarget(true /* updateImeTarget */);
}
if (dc.getImeInputTarget() == this) {
if (dc.getImeInputTarget() == this
&& (mActivityRecord == null || !mActivityRecord.isRelaunching())) {
dc.updateImeInputAndControlTarget(null);
}