Merge "Remove the dependency on IInputMethodClient from IME focus check"

This commit is contained in:
TreeHugger Robot
2018-09-20 00:19:35 +00:00
committed by Android (Google) Code Review
5 changed files with 28 additions and 22 deletions

View File

@@ -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.</p>
*
* @see com.android.server.wm.WindowManagerInternal#inputMethodClientHasFocus(
* IInputMethodClient)
* @see com.android.server.wm.WindowManagerInternal#isInputMethodClientFocus(int, int)
*/
int ERROR_NOT_IME_TARGET_WINDOW = 11;
/**

View File

@@ -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

View File

@@ -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;
@@ -2949,7 +2948,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
}
}
boolean inputMethodClientHasFocus(IInputMethodClient client) {
boolean isInputMethodClientFocus(int uid, int pid) {
final WindowState imFocus = computeImeTarget(false /* updateImeTarget */);
if (imFocus == null) {
return false;
@@ -2961,17 +2960,13 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
Slog.i(TAG_WM, "Last focus: " + mService.mLastFocus);
}
final IInputMethodClient imeClient = imFocus.mSession.mClient;
if (DEBUG_INPUT_METHOD) {
Slog.i(TAG_WM, "IM target client: " + imeClient);
if (imeClient != null) {
Slog.i(TAG_WM, "IM target client binder: " + imeClient.asBinder());
Slog.i(TAG_WM, "Requesting client binder: " + client.asBinder());
}
Slog.i(TAG_WM, "IM target uid/pid: " + imFocus.mSession.mUid
+ "/" + imFocus.mSession.mPid);
Slog.i(TAG_WM, "Requesting client uid/pid: " + uid + "/" + pid);
}
return imeClient != null && imeClient.asBinder() == client.asBinder();
return imFocus.mSession.mUid == uid && imFocus.mSession.mPid == pid;
}
boolean hasSecureWindowOnScreen() {

View File

@@ -30,7 +30,6 @@ import android.view.InputChannel;
import android.view.MagnificationSpec;
import android.view.WindowInfo;
import com.android.internal.view.IInputMethodClient;
import com.android.server.input.InputManagerService;
import com.android.server.policy.WindowManagerPolicy;
@@ -444,9 +443,14 @@ public abstract class WindowManagerInternal {
public abstract boolean isUidFocused(int uid);
/**
* Returns {@code true} if a process that is identified by {@code client} has IME focus.
* Checks whether the specified process has IME focus or not.
*
* @param uid UID of the process to be queried
* @param pid PID of the process to be queried
* @return {@code true} if a process that is identified by {@code uid} and {@code pid} has IME
* focus
*/
public abstract boolean inputMethodClientHasFocus(IInputMethodClient client);
public abstract boolean isInputMethodClientFocus(int uid, int pid);
/**
* Return the display Id for given window.

View File

@@ -7412,12 +7412,12 @@ public class WindowManagerService extends IWindowManager.Stub
}
@Override
public boolean inputMethodClientHasFocus(IInputMethodClient client) {
public boolean isInputMethodClientFocus(int uid, int pid) {
synchronized (mWindowMap) {
// Check all displays if any input method window has focus.
for (int i = mRoot.mChildren.size() - 1; i >= 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;
}
}