Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 41f34273 authored by Yohei Yukawa's avatar Yohei Yukawa
Browse files

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
parent edd137b9
Loading
Loading
Loading
Loading
+6 −8
Original line number Diff line number Diff line
@@ -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() {