diff options
author | 2018-09-05 00:10:09 +0000 | |
---|---|---|
committer | 2018-09-05 00:10:09 +0000 | |
commit | 1b48de568a59b11c124aa1961a0e6a02f599afdb (patch) | |
tree | bf57c56acfd7c79cc3714fd2fada138afe5958ec | |
parent | efc032f61e13f3a3618a9168b929846418a531ac (diff) | |
parent | fffc0e53c62614c288e9e702d69e517db17dccd7 (diff) |
Merge "Re-introduce event order guaranee in IME client registration"
-rw-r--r-- | services/core/java/com/android/server/InputMethodManagerService.java | 28 | ||||
-rw-r--r-- | services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java | 8 |
2 files changed, 19 insertions, 17 deletions
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java index aa1b3035a752..4d3468e21e75 100644 --- a/services/core/java/com/android/server/InputMethodManagerService.java +++ b/services/core/java/com/android/server/InputMethodManagerService.java @@ -204,8 +204,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub static final int MSG_START_INPUT = 2000; static final int MSG_START_VR_INPUT = 2010; - static final int MSG_ADD_CLIENT = 2980; - static final int MSG_REMOVE_CLIENT = 2990; static final int MSG_UNBIND_CLIENT = 3000; static final int MSG_BIND_CLIENT = 3010; static final int MSG_SET_ACTIVE = 3020; @@ -1302,7 +1300,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub @Override public void onStart() { LocalServices.addService(InputMethodManagerInternal.class, - new LocalServiceImpl(mService.mHandler)); + new LocalServiceImpl(mService)); publishBinderService(Context.INPUT_METHOD_SERVICE, mService); } @@ -3395,15 +3393,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } // --------------------------------------------------------- - case MSG_ADD_CLIENT: - addClient((ClientState) msg.obj); - return true; - - case MSG_REMOVE_CLIENT: - removeClient((IInputMethodClient) msg.obj); - return true; - - // --------------------------------------------------------- case MSG_UNBIND_CLIENT: try { @@ -4396,22 +4385,27 @@ public class InputMethodManagerService extends IInputMethodManager.Stub private static final class LocalServiceImpl extends InputMethodManagerInternal { @NonNull + private final InputMethodManagerService mService; + @NonNull private final Handler mHandler; - LocalServiceImpl(@NonNull final Handler handler) { - mHandler = handler; + LocalServiceImpl(@NonNull InputMethodManagerService service) { + mService = service; + mHandler = service.mHandler; } @Override public void addClient(IInputMethodClient client, IInputContext inputContext, int uid, int pid) { - mHandler.sendMessage(mHandler.obtainMessage(MSG_ADD_CLIENT, - new ClientState(client, inputContext, uid, pid))); + // Work around Bug 113877122: We need to handle this synchronously. Otherwise, some + // IMM binder calls from the client process before we register this client. + mService.addClient(new ClientState(client, inputContext, uid, pid)); } @Override public void removeClient(IInputMethodClient client) { - mHandler.sendMessage(mHandler.obtainMessage(MSG_REMOVE_CLIENT, client)); + // Handle this synchronously to be consistent with addClient(). + mService.removeClient(client); } @Override diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java index b57356f12223..b5a9f7416237 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java @@ -28,6 +28,10 @@ public abstract class InputMethodManagerInternal { /** * Called by the window manager service when a client process is being attached to the window * manager service. + * + * <p>The caller must not have WindowManagerService lock. This method internally acquires + * InputMethodManagerService lock.</p> + * * @param client {@link android.os.Binder} proxy that is associated with the singleton instance * of {@link android.view.inputmethod.InputMethodManager} that runs on the client * process @@ -42,6 +46,10 @@ public abstract class InputMethodManagerInternal { /** * Called by the window manager service when a client process is being attached to the window * manager service. + * + * <p>The caller must not have WindowManagerService lock. This method internally acquires + * InputMethodManagerService lock.</p> + * * @param client {@link android.os.Binder} proxy that is associated with the singleton instance * of {@link android.view.inputmethod.InputMethodManager} that runs on the client * process |