diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 514d9099e9f70..91df4f5def5ce 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -126,6 +126,7 @@ import java.util.Map; import java.util.Objects; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; /** @@ -3638,6 +3639,32 @@ public final class InputMethodManager { return IInputMethodManagerGlobalInvoker.getInputMethodWindowVisibleHeight(mClient); } + /** + * {@code true} means that + * {@link RemoteInputConnectionImpl#requestCursorUpdatesInternal(int, int, int)} returns + * {@code false} when the IME client and the IME run in different displays. + */ + final AtomicBoolean mRequestCursorUpdateDisplayIdCheck = new AtomicBoolean(true); + + /** + * Controls the display ID mismatch validation in + * {@link RemoteInputConnectionImpl#requestCursorUpdatesInternal(int, int, int)}. + * + *
{@link #updateCursorAnchorInfo(View, CursorAnchorInfo)} is not guaranteed to work + * correctly when the IME client and the IME run in different displays. This is why + * {@link RemoteInputConnectionImpl#requestCursorUpdatesInternal(int, int, int)} returns + * {@code false} by default when the display ID does not match. This method allows special apps + * to override this behavior when they are sure that it should work.
+ * + *By default the validation is enabled.
+ * + * @param enabled {@code false} to disable the display ID validation. + * @hide + */ + public void setRequestCursorUpdateDisplayIdCheck(boolean enabled) { + mRequestCursorUpdateDisplayIdCheck.set(enabled); + } + /** * An internal API for {@link android.hardware.display.VirtualDisplay} to report where its * embedded virtual display is placed. diff --git a/core/java/android/view/inputmethod/RemoteInputConnectionImpl.java b/core/java/android/view/inputmethod/RemoteInputConnectionImpl.java index ead79245609a3..a9277658aaa7c 100644 --- a/core/java/android/view/inputmethod/RemoteInputConnectionImpl.java +++ b/core/java/android/view/inputmethod/RemoteInputConnectionImpl.java @@ -1071,7 +1071,8 @@ final class RemoteInputConnectionImpl extends IRemoteInputConnection.Stub { Log.w(TAG, "requestCursorAnchorInfo on inactive InputConnection"); return false; } - if (mParentInputMethodManager.getDisplayId() != imeDisplayId + if (mParentInputMethodManager.mRequestCursorUpdateDisplayIdCheck.get() + && mParentInputMethodManager.getDisplayId() != imeDisplayId && !mParentInputMethodManager.hasVirtualDisplayToScreenMatrix()) { // requestCursorUpdates() is not currently supported across displays. return false;