summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/inputmethod/InputMethodManager.java4
-rw-r--r--core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java20
2 files changed, 20 insertions, 4 deletions
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index dfcc6f6568b8..72981b1296f2 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -1131,9 +1131,7 @@ public final class InputMethodManager {
|| mServedInputConnection == null) {
return;
}
- final boolean isMonitoring = (mRequestUpdateCursorAnchorInfoMonitorMode
- & InputConnection.CURSOR_UPDATE_MONITOR) != 0;
- if (!isMonitoring) {
+ if (!mServedInputConnection.isCursorAnchorInfoMonitoring()) {
return;
}
// Since the host VirtualDisplay is moved, we need to issue
diff --git a/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java b/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java
index cb18ccc9788a..09394c1ebf41 100644
--- a/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java
+++ b/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java
@@ -176,6 +176,8 @@ public final class RemoteInputConnectionImpl extends IRemoteInputConnection.Stub
private final AtomicInteger mCurrentSessionId = new AtomicInteger(0);
private final AtomicBoolean mHasPendingInvalidation = new AtomicBoolean();
+ private final AtomicBoolean mIsCursorAnchorInfoMonitoring = new AtomicBoolean(false);
+
public RemoteInputConnectionImpl(@NonNull Looper looper,
@NonNull InputConnection inputConnection,
@NonNull InputMethodManager inputMethodManager, @Nullable View servedView) {
@@ -223,6 +225,16 @@ public final class RemoteInputConnectionImpl extends IRemoteInputConnection.Stub
}
/**
+ * @return {@code true} if there is any active request for
+ * {@link android.view.inputmethod.CursorAnchorInfo} with
+ * {@link InputConnection#CURSOR_UPDATE_MONITOR} flag.
+ */
+ @AnyThread
+ public boolean isCursorAnchorInfoMonitoring() {
+ return mIsCursorAnchorInfoMonitoring.get();
+ }
+
+ /**
* Schedule a task to execute
* {@link InputMethodManager#doInvalidateInput(RemoteInputConnectionImpl, TextSnapshot, int)}
* on the associated Handler if not yet scheduled.
@@ -998,11 +1010,17 @@ public final class RemoteInputConnectionImpl extends IRemoteInputConnection.Stub
// requestCursorUpdates() is not currently supported across displays.
return false;
}
+ final boolean hasMonitoring =
+ (cursorUpdateMode & InputConnection.CURSOR_UPDATE_MONITOR) != 0;
+ boolean result = false;
try {
- return ic.requestCursorUpdates(cursorUpdateMode, cursorUpdateFilter);
+ result = ic.requestCursorUpdates(cursorUpdateMode, cursorUpdateFilter);
+ return result;
} catch (AbstractMethodError ignored) {
// TODO(b/199934664): See if we can remove this by providing a default impl.
return false;
+ } finally {
+ mIsCursorAnchorInfoMonitoring.set(result && hasMonitoring);
}
}