From 41f89c3bccd0613a29a46b132891ba16032990d9 Mon Sep 17 00:00:00 2001 From: Yohei Yukawa Date: Wed, 19 Sep 2018 14:30:04 -0700 Subject: [PATCH] Remove the dependency on IInputMethodClient from IME focus check This is a preparation to remove the dependency on IInputMethodClient from WindowManagerService. What inputMethodClientHasFocus(IInputMethodClient) is currently doing is basically equivalent to comparing PID (and UID), because InputMethodManager is a per-process instance and comparing two IInputMethodClient Binder proxies is no more or less than comparing PID (and UID pair). We can just change its method signature to achieve the same behavior by taking a PID/UID pair instead of taking IInputMethodClient. Note that we can later add display ID to this method to support multi-display scenario. This CL also renames inputMethodClientHasFocus() to isInputMethodClientFocus() for better consistency with other methods. There should be no observable behavior difference in this CL anyway. Bug: 115993358 Test: atest CtsInputMethodTestCases CtsInputMethodServiceHostTestCases Change-Id: I444077b1e4af4033f67ab72c181fac85b601e08a --- .../android/internal/view/InputBindResult.java | 3 +-- .../inputmethod/InputMethodManagerService.java | 14 +++++++++++--- .../com/android/server/wm/DisplayContent.java | 15 +++++---------- .../android/server/wm/WindowManagerInternal.java | 10 +++++++--- .../android/server/wm/WindowManagerService.java | 8 ++++---- 5 files changed, 28 insertions(+), 22 deletions(-) diff --git a/core/java/com/android/internal/view/InputBindResult.java b/core/java/com/android/internal/view/InputBindResult.java index 7548c2257c066..101fd41f29252 100644 --- a/core/java/com/android/internal/view/InputBindResult.java +++ b/core/java/com/android/internal/view/InputBindResult.java @@ -139,8 +139,7 @@ public final class InputBindResult implements Parcelable { * The client should try to restart input when its {@link android.view.Window} is focused * again.

* - * @see com.android.server.wm.WindowManagerInternal#inputMethodClientHasFocus( - * IInputMethodClient) + * @see com.android.server.wm.WindowManagerInternal#isInputMethodClientFocus(int, int) */ int ERROR_NOT_IME_TARGET_WINDOW = 11; /** diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index b2287acc635a5..a043201100bde 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -2536,7 +2536,11 @@ public class InputMethodManagerService extends IInputMethodManager.Stub // We need to check if this is the current client with // focus in the window manager, to allow this call to // be made before input is started in it. - if (!mWindowManagerInternal.inputMethodClientHasFocus(client)) { + final ClientState cs = mClients.get(client.asBinder()); + if (cs == null) { + throw new IllegalArgumentException("unknown client " + client.asBinder()); + } + if (!mWindowManagerInternal.isInputMethodClientFocus(cs.uid, cs.pid)) { Slog.w(TAG, "Ignoring showSoftInput of uid " + uid + ": " + client); return false; } @@ -2616,7 +2620,11 @@ public class InputMethodManagerService extends IInputMethodManager.Stub // We need to check if this is the current client with // focus in the window manager, to allow this call to // be made before input is started in it. - if (!mWindowManagerInternal.inputMethodClientHasFocus(client)) { + final ClientState cs = mClients.get(client.asBinder()); + if (cs == null) { + throw new IllegalArgumentException("unknown client " + client.asBinder()); + } + if (!mWindowManagerInternal.isInputMethodClientFocus(cs.uid, cs.pid)) { if (DEBUG) { Slog.w(TAG, "Ignoring hideSoftInput of uid " + uid + ": " + client); } @@ -2734,7 +2742,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub + client.asBinder()); } - if (!mWindowManagerInternal.inputMethodClientHasFocus(cs.client)) { + if (!mWindowManagerInternal.isInputMethodClientFocus(cs.uid, cs.pid)) { // Check with the window manager to make sure this client actually // has a window with focus. If not, reject. This is thread safe // because if the focus changes some time before or after, the diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index ac6582634bf8a..d0d98fed04a64 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -150,7 +150,6 @@ import android.view.SurfaceSession; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ToBooleanFunction; -import com.android.internal.view.IInputMethodClient; import com.android.server.policy.WindowManagerPolicy; import com.android.server.wm.utils.RotationCache; import com.android.server.wm.utils.WmDisplayCutout; @@ -2946,7 +2945,7 @@ class DisplayContent extends WindowContainer= 0; --i) { final DisplayContent displayContent = mRoot.mChildren.get(i); - if (displayContent.inputMethodClientHasFocus(client)) { + if (displayContent.isInputMethodClientFocus(uid, pid)) { return true; } } @@ -7430,8 +7430,8 @@ public class WindowManagerService extends IWindowManager.Stub // press home. Sometimes the IME won't go down.) // Would be nice to fix this more correctly, but it's // way at the end of a release, and this should be good enough. - if (mCurrentFocus != null && mCurrentFocus.mSession.mClient != null - && mCurrentFocus.mSession.mClient.asBinder() == client.asBinder()) { + if (mCurrentFocus != null && mCurrentFocus.mSession.mUid == uid + && mCurrentFocus.mSession.mPid == pid) { return true; } }