From f226a79fee58d55ae2dbdc5049479146e421ce93 Mon Sep 17 00:00:00 2001 From: Wilson Wu Date: Thu, 28 Jan 2021 17:01:25 +0800 Subject: [PATCH] Make IInputMethodManager to oneway (11/N) Comply following methods to IVoidResultCallback to emulate current behavior and apply them to one-way. -. startProtoDump -. startImeTrace -. stopImeTrace Bug: 163453493 Test: atest CtsInputMethodTestCases Test: 1) Enable the Winscope Trace tile 2) Do some actions like open keyboard 3) Disable the Winscope Trace tile 4) Grad a bugreport and verify trace on go/Winscope Change-Id: I3eafbc28ed3acf3ba859885bf201cb06b3149b94 --- .../android/util/imetracing/ImeTracing.java | 6 +- .../internal/view/IInputMethodManager.aidl | 7 +- .../InputMethodManagerService.java | 142 +++++++++--------- .../MultiClientInputMethodManagerService.java | 10 +- 4 files changed, 91 insertions(+), 74 deletions(-) diff --git a/core/java/android/util/imetracing/ImeTracing.java b/core/java/android/util/imetracing/ImeTracing.java index 723f1dd15e238..49ff237403b27 100644 --- a/core/java/android/util/imetracing/ImeTracing.java +++ b/core/java/android/util/imetracing/ImeTracing.java @@ -28,6 +28,8 @@ import android.util.Log; import android.util.proto.ProtoOutputStream; import android.view.inputmethod.InputMethodManager; +import com.android.internal.inputmethod.Completable; +import com.android.internal.inputmethod.ResultCallbacks; import com.android.internal.view.IInputMethodManager; import java.io.PrintWriter; @@ -91,7 +93,9 @@ public abstract class ImeTracing { * @param where */ public void sendToService(byte[] protoDump, int source, String where) throws RemoteException { - mService.startProtoDump(protoDump, source, where); + final Completable.Void value = Completable.createVoid(); + mService.startProtoDump(protoDump, source, where, ResultCallbacks.of(value)); + Completable.getResult(value); } /** diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl index 892c5a53527b7..50bbfc5ccb085 100644 --- a/core/java/com/android/internal/view/IInputMethodManager.aidl +++ b/core/java/com/android/internal/view/IInputMethodManager.aidl @@ -91,11 +91,12 @@ interface IInputMethodManager { /** Remove the IME surface. Requires passing the currently focused window. */ oneway void removeImeSurfaceFromWindow(in IBinder windowToken, in IVoidResultCallback resultCallback); - void startProtoDump(in byte[] protoDump, int source, String where); + oneway void startProtoDump(in byte[] protoDump, int source, String where, + in IVoidResultCallback resultCallback); oneway void isImeTraceEnabled(in IBooleanResultCallback resultCallback); // Starts an ime trace. - void startImeTrace(); + oneway void startImeTrace(in IVoidResultCallback resultCallback); // Stops an ime trace. - void stopImeTrace(); + oneway void stopImeTrace(in IVoidResultCallback resultCallback); } diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 6308ace260110..e5b53501d6e3a 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -4131,48 +4131,52 @@ public class InputMethodManagerService extends IInputMethodManager.Stub @BinderThread @Override @GuardedBy("mMethodMap") - public void startProtoDump(byte[] protoDump, int source, String where) { - if (protoDump == null && source != IME_TRACING_FROM_IMMS) { - // Dump not triggered from IMMS, but no proto information provided. - return; - } - ImeTracing tracingInstance = ImeTracing.getInstance(); - if (!tracingInstance.isAvailable() || !tracingInstance.isEnabled()) { - return; - } - - ProtoOutputStream proto = new ProtoOutputStream(); - switch (source) { - case ImeTracing.IME_TRACING_FROM_CLIENT: - final long client_token = proto.start(InputMethodClientsTraceFileProto.ENTRY); - proto.write(InputMethodClientsTraceProto.ELAPSED_REALTIME_NANOS, - SystemClock.elapsedRealtimeNanos()); - proto.write(InputMethodClientsTraceProto.WHERE, where); - proto.write(InputMethodClientsTraceProto.CLIENT, protoDump); - proto.end(client_token); - break; - case ImeTracing.IME_TRACING_FROM_IMS: - final long service_token = proto.start(InputMethodServiceTraceFileProto.ENTRY); - proto.write(InputMethodServiceTraceProto.ELAPSED_REALTIME_NANOS, - SystemClock.elapsedRealtimeNanos()); - proto.write(InputMethodServiceTraceProto.WHERE, where); - proto.write(InputMethodServiceTraceProto.INPUT_METHOD_SERVICE, protoDump); - proto.end(service_token); - break; - case IME_TRACING_FROM_IMMS: - final long managerservice_token = - proto.start(InputMethodManagerServiceTraceFileProto.ENTRY); - proto.write(InputMethodManagerServiceTraceProto.ELAPSED_REALTIME_NANOS, - SystemClock.elapsedRealtimeNanos()); - proto.write(InputMethodManagerServiceTraceProto.WHERE, where); - dumpDebug(proto, InputMethodManagerServiceTraceProto.INPUT_METHOD_MANAGER_SERVICE); - proto.end(managerservice_token); - break; - default: - // Dump triggered by a source not recognised. + public void startProtoDump(byte[] protoDump, int source, String where, + IVoidResultCallback resultCallback) { + CallbackUtils.onResult(resultCallback, () -> { + if (protoDump == null && source != IME_TRACING_FROM_IMMS) { + // Dump not triggered from IMMS, but no proto information provided. return; - } - tracingInstance.addToBuffer(proto, source); + } + ImeTracing tracingInstance = ImeTracing.getInstance(); + if (!tracingInstance.isAvailable() || !tracingInstance.isEnabled()) { + return; + } + + ProtoOutputStream proto = new ProtoOutputStream(); + switch (source) { + case ImeTracing.IME_TRACING_FROM_CLIENT: + final long client_token = proto.start(InputMethodClientsTraceFileProto.ENTRY); + proto.write(InputMethodClientsTraceProto.ELAPSED_REALTIME_NANOS, + SystemClock.elapsedRealtimeNanos()); + proto.write(InputMethodClientsTraceProto.WHERE, where); + proto.write(InputMethodClientsTraceProto.CLIENT, protoDump); + proto.end(client_token); + break; + case ImeTracing.IME_TRACING_FROM_IMS: + final long service_token = proto.start(InputMethodServiceTraceFileProto.ENTRY); + proto.write(InputMethodServiceTraceProto.ELAPSED_REALTIME_NANOS, + SystemClock.elapsedRealtimeNanos()); + proto.write(InputMethodServiceTraceProto.WHERE, where); + proto.write(InputMethodServiceTraceProto.INPUT_METHOD_SERVICE, protoDump); + proto.end(service_token); + break; + case IME_TRACING_FROM_IMMS: + final long managerservice_token = + proto.start(InputMethodManagerServiceTraceFileProto.ENTRY); + proto.write(InputMethodManagerServiceTraceProto.ELAPSED_REALTIME_NANOS, + SystemClock.elapsedRealtimeNanos()); + proto.write(InputMethodManagerServiceTraceProto.WHERE, where); + dumpDebug(proto, + InputMethodManagerServiceTraceProto.INPUT_METHOD_MANAGER_SERVICE); + proto.end(managerservice_token); + break; + default: + // Dump triggered by a source not recognised. + return; + } + tracingInstance.addToBuffer(proto, source); + }); } @BinderThread @@ -4183,40 +4187,44 @@ public class InputMethodManagerService extends IInputMethodManager.Stub @BinderThread @Override - public void startImeTrace() { - ImeTracing.getInstance().startTrace(null /* printwriter */); - ArrayMap clients; - synchronized (mMethodMap) { - clients = new ArrayMap<>(mClients); - } - for (ClientState state : clients.values()) { - if (state != null) { - try { - state.client.setImeTraceEnabled(true /* enabled */); - } catch (RemoteException e) { - Slog.e(TAG, "Error while trying to enable ime trace on client window", e); + public void startImeTrace(IVoidResultCallback resultCallback) { + CallbackUtils.onResult(resultCallback, () -> { + ImeTracing.getInstance().startTrace(null /* printwriter */); + ArrayMap clients; + synchronized (mMethodMap) { + clients = new ArrayMap<>(mClients); + } + for (ClientState state : clients.values()) { + if (state != null) { + try { + state.client.setImeTraceEnabled(true /* enabled */); + } catch (RemoteException e) { + Slog.e(TAG, "Error while trying to enable ime trace on client window", e); + } } } - } + }); } @BinderThread @Override - public void stopImeTrace() { - ImeTracing.getInstance().stopTrace(null /* printwriter */); - ArrayMap clients; - synchronized (mMethodMap) { - clients = new ArrayMap<>(mClients); - } - for (ClientState state : clients.values()) { - if (state != null) { - try { - state.client.setImeTraceEnabled(false /* enabled */); - } catch (RemoteException e) { - Slog.e(TAG, "Error while trying to disable ime trace on client window", e); + public void stopImeTrace(IVoidResultCallback resultCallback) { + CallbackUtils.onResult(resultCallback, () -> { + ImeTracing.getInstance().stopTrace(null /* printwriter */); + ArrayMap clients; + synchronized (mMethodMap) { + clients = new ArrayMap<>(mClients); + } + for (ClientState state : clients.values()) { + if (state != null) { + try { + state.client.setImeTraceEnabled(false /* enabled */); + } catch (RemoteException e) { + Slog.e(TAG, "Error while trying to disable ime trace on client window", e); + } } } - } + }); } @GuardedBy("mMethodMap") diff --git a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java index 7f9c76634422d..6fec9063ba94f 100644 --- a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java @@ -1868,7 +1868,9 @@ public final class MultiClientInputMethodManagerService { @BinderThread @Override - public void startProtoDump(byte[] clientProtoDump, int source, String where) { + public void startProtoDump(byte[] clientProtoDump, int source, String where, + IVoidResultCallback resultCallback) { + CallbackUtils.onResult(resultCallback, () -> { }); } @BinderThread @@ -1879,12 +1881,14 @@ public final class MultiClientInputMethodManagerService { @BinderThread @Override - public void startImeTrace() { + public void startImeTrace(IVoidResultCallback resultCallback) { + CallbackUtils.onResult(resultCallback, () -> { }); } @BinderThread @Override - public void stopImeTrace() { + public void stopImeTrace(IVoidResultCallback resultCallback) { + CallbackUtils.onResult(resultCallback, () -> { }); } } }