Fix IMM#showInputMethodAndSubtypeEnabler().
At least on AOSP InputMethodManager#showInputMethodAndSubtypeEnabler()
has been broken since its beginning. As of Android M, there are three
separate issues:
1. Type mismatch in message dispatching layer.
2. It does not correctly reject API calls from clients that do not
have IME focus.
3. Context#startActivityAsUser(intent, null, UserHandle.CURRENT) ends
up with java.lang.SecurityException:
Permission Denial: startActivity asks to run as user -2 but is
calling from user 0; this requires
android.permission.INTERACT_ACROSS_USERS_FULL.
Given that we have a good alternative to achieve the same result, it
would make sense to deprecate that method and encourage developers to
use Intent-based solution instead.
Before doing that, this CL fixes the issues just for the record.
Bug: 26189558
Change-Id: Ic7a0df3203fee19542a3143abba9bc31baf9698a
This commit is contained in:
@@ -2383,10 +2383,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
|
||||
return;
|
||||
}
|
||||
synchronized (mMethodMap) {
|
||||
if (mCurClient == null || client == null
|
||||
|| mCurClient.client.asBinder() != client.asBinder()) {
|
||||
Slog.w(TAG, "Ignoring showInputMethodAndSubtypeEnablerFromClient of: " + client);
|
||||
}
|
||||
executeOrSendMessage(mCurMethod, mCaller.obtainMessageO(
|
||||
MSG_SHOW_IM_SUBTYPE_ENABLER, inputMethodId));
|
||||
}
|
||||
@@ -2716,9 +2712,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
|
||||
return true;
|
||||
|
||||
case MSG_SHOW_IM_SUBTYPE_ENABLER:
|
||||
args = (SomeArgs)msg.obj;
|
||||
showInputMethodAndSubtypeEnabler((String)args.arg1);
|
||||
args.recycle();
|
||||
showInputMethodAndSubtypeEnabler((String)msg.obj);
|
||||
return true;
|
||||
|
||||
case MSG_SHOW_IM_CONFIG:
|
||||
@@ -3005,7 +2999,11 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
|
||||
if (!TextUtils.isEmpty(inputMethodId)) {
|
||||
intent.putExtra(Settings.EXTRA_INPUT_METHOD_ID, inputMethodId);
|
||||
}
|
||||
mContext.startActivityAsUser(intent, null, UserHandle.CURRENT);
|
||||
final int userId;
|
||||
synchronized (mMethodMap) {
|
||||
userId = mSettings.getCurrentUserId();
|
||||
}
|
||||
mContext.startActivityAsUser(intent, null, UserHandle.of(userId));
|
||||
}
|
||||
|
||||
private void showConfigureInputMethods() {
|
||||
|
||||
Reference in New Issue
Block a user