diff --git a/core/java/android/inputmethodservice/RemoteInputConnection.java b/core/java/android/inputmethodservice/RemoteInputConnection.java index 1065d041713f0..589dd7255a62d 100644 --- a/core/java/android/inputmethodservice/RemoteInputConnection.java +++ b/core/java/android/inputmethodservice/RemoteInputConnection.java @@ -393,7 +393,15 @@ final class RemoteInputConnection implements InputConnection { // This method is not implemented. return false; } - final CompletableFuture value = mInvoker.requestCursorUpdates(cursorUpdateMode); + + final InputMethodServiceInternal ims = mImsInternal.getAndWarnIfNull(); + if (ims == null) { + return false; + } + + final int displayId = ims.getContext().getDisplayId(); + final CompletableFuture value = + mInvoker.requestCursorUpdates(cursorUpdateMode, displayId); return CompletableFutureUtil.getResultOrFalse(value, TAG, "requestCursorUpdates()", mCancellationGroup, MAX_WAIT_TIME_MILLIS); } diff --git a/core/java/com/android/internal/inputmethod/IInputContextInvoker.java b/core/java/com/android/internal/inputmethod/IInputContextInvoker.java index 0cbdc132e66fb..2fde98177fa7c 100644 --- a/core/java/com/android/internal/inputmethod/IInputContextInvoker.java +++ b/core/java/com/android/internal/inputmethod/IInputContextInvoker.java @@ -477,15 +477,16 @@ public final class IInputContextInvoker { * Invokes {@link IInputContext#requestCursorUpdates(int, IIntResultCallback)}. * * @param cursorUpdateMode {@code cursorUpdateMode} parameter to be passed. + * @param imeDisplayId the display ID that is associated with the IME. * @return {@link AndroidFuture} that can be used to retrieve the invocation * result. {@link RemoteException} will be treated as an error. */ @AnyThread @NonNull - public AndroidFuture requestCursorUpdates(int cursorUpdateMode) { + public AndroidFuture requestCursorUpdates(int cursorUpdateMode, int imeDisplayId) { final AndroidFuture future = new AndroidFuture<>(); try { - mIInputContext.requestCursorUpdates(cursorUpdateMode, future); + mIInputContext.requestCursorUpdates(cursorUpdateMode, imeDisplayId, future); } catch (RemoteException e) { future.completeExceptionally(e); } diff --git a/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java b/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java index 662bd288df950..c2e56365c9b69 100644 --- a/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java +++ b/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java @@ -567,13 +567,18 @@ public final class RemoteInputConnectionImpl extends IInputContext.Stub { } @Override - public void requestCursorUpdates(int cursorUpdateMode, AndroidFuture future /* T=Boolean */) { + public void requestCursorUpdates(int cursorUpdateMode, int imeDisplayId, + AndroidFuture future /* T=Boolean */) { dispatchWithTracing("requestCursorUpdates", future, () -> { final InputConnection ic = getInputConnection(); if (ic == null || !isActive()) { Log.w(TAG, "requestCursorAnchorInfo on inactive InputConnection"); return false; } + if (mParentInputMethodManager.getDisplayId() != imeDisplayId) { + // requestCursorUpdates() is not currently supported across displays. + return false; + } return ic.requestCursorUpdates(cursorUpdateMode); }); } diff --git a/core/java/com/android/internal/view/IInputContext.aidl b/core/java/com/android/internal/view/IInputContext.aidl index 12a98c17b3f01..2e6f9e537b002 100644 --- a/core/java/com/android/internal/view/IInputContext.aidl +++ b/core/java/com/android/internal/view/IInputContext.aidl @@ -75,7 +75,8 @@ import com.android.internal.infra.AndroidFuture; void getSelectedText(int flags, in AndroidFuture future /* T=CharSequence */); - void requestCursorUpdates(int cursorUpdateMode, in AndroidFuture future /* T=Boolean */); + void requestCursorUpdates(int cursorUpdateMode, int imeDisplayId, + in AndroidFuture future /* T=Boolean */); void commitContent(in InputContentInfo inputContentInfo, int flags, in Bundle opts, in AndroidFuture future /* T=Boolean */); diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 2813236fd91d0..28261e826efd9 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -2384,12 +2384,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub if (mCurSeq <= 0) mCurSeq = 1; mCurClient = cs; mCurInputContext = inputContext; - if (cs.selfReportedDisplayId != displayIdToShowIme) { - // CursorAnchorInfo API does not work as-is for cross-display scenario. Pretend that - // InputConnection#requestCursorUpdates() is not implemented in the application so that - // IMEs will always receive false from this API. - missingMethods |= MissingMethodFlags.REQUEST_CURSOR_UPDATES; - } mCurInputContextMissingMethods = missingMethods; mCurAttribute = attribute;