From 4baf2915d8b968fd36972146881c49384cfa5411 Mon Sep 17 00:00:00 2001 From: Yohei Yukawa Date: Fri, 30 Apr 2021 12:29:39 -0700 Subject: Make IInputMethodManager#reportActivityViewAsync() truly async It turns out that IInputMethodManager#reportActivityView() [1], which was added a few years ago to support CursorAnchorInfo API on edit fields hosted on an ActivityView [1], is now also used by task organizer [2]. This means that we would continue living with this @hide API for a while even after ActivityView gets completely removed at Bug 179161778. Then, converting this IPC into truly asynchronous would probably make sense. There should be no behavior change unless the target IME client is running on an embedded display environment. [1]: Id0411a80456182111bb5b681c6d1230b58e7ec2e b4f328a2f30d425ecb3950064c3e2e26af8b7a35 [2]: Id422bb2547197c617f914ed7cf5085e02a1c3fb5 a1f869d10e2a0ed1dbaff29eb67b4d0adc694242 Fix: 186874025 Test: atest CtsWindowManagerDeviceTestCases:ActivityViewTest Change-Id: I0463e8e9daaa8ab6d3eadb395843ca5e6bc1bb5e --- .../java/android/view/inputmethod/InputMethodManager.java | 5 +---- .../com/android/internal/view/IInputMethodManager.aidl | 4 ++-- .../server/inputmethod/InputMethodManagerService.java | 15 +++++++++++---- .../inputmethod/MultiClientInputMethodManagerService.java | 5 ++--- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 6694b7eb9ac2..42985501d818 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -3106,10 +3106,7 @@ public final class InputMethodManager { matrixValues = new float[9]; matrix.getValues(matrixValues); } - final Completable.Void value = Completable.createVoid(); - mService.reportActivityView( - mClient, childDisplayId, matrixValues, ResultCallbacks.of(value)); - Completable.getResult(value); + mService.reportActivityViewAsync(mClient, childDisplayId, matrixValues); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl index 3b8f4405426e..e9efca37e707 100644 --- a/core/java/com/android/internal/view/IInputMethodManager.aidl +++ b/core/java/com/android/internal/view/IInputMethodManager.aidl @@ -88,8 +88,8 @@ interface IInputMethodManager { // TODO(Bug 113914148): Consider removing this. oneway void getInputMethodWindowVisibleHeight(IIntResultCallback resultCallback); - oneway void reportActivityView(in IInputMethodClient parentClient, int childDisplayId, - in float[] matrixValues, in IVoidResultCallback resultCallback); + oneway void reportActivityViewAsync(in IInputMethodClient parentClient, int childDisplayId, + in float[] matrixValues); oneway void reportPerceptibleAsync(in IBinder windowToken, boolean perceptible); /** Remove the IME surface. Requires INTERNAL_SYSTEM_WINDOW permission. */ diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 418b9695b436..518c4287deab 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -4046,9 +4046,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } @Override - public void reportActivityView(IInputMethodClient parentClient, int childDisplayId, - float[] matrixValues, IVoidResultCallback resultCallback) { - CallbackUtils.onResult(resultCallback, () -> { + public void reportActivityViewAsync(IInputMethodClient parentClient, int childDisplayId, + float[] matrixValues) { + try { final DisplayInfo displayInfo = mDisplayManagerInternal.getDisplayInfo(childDisplayId); if (displayInfo == null) { throw new IllegalArgumentException( @@ -4127,7 +4127,14 @@ public class InputMethodManagerService extends IInputMethodManager.Stub displayId = info.mParentClient.selfReportedDisplayId; } } - }); + } catch (Throwable t) { + if (parentClient != null) { + try { + parentClient.throwExceptionFromSystem(t.toString()); + } catch (RemoteException e) { + } + } + } } @Override diff --git a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java index 69f293d056cb..bbf4b718414d 100644 --- a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java @@ -1864,10 +1864,9 @@ public final class MultiClientInputMethodManagerService { @BinderThread @Override - public void reportActivityView(IInputMethodClient parentClient, int childDisplayId, - float[] matrixValues, IVoidResultCallback resultCallback) { + public void reportActivityViewAsync(IInputMethodClient parentClient, int childDisplayId, + float[] matrixValues) { reportNotSupported(); - CallbackUtils.onResult(resultCallback, () -> { }); } @BinderThread -- cgit v1.2.3-59-g8ed1b