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

Commit 22b9aa5b authored by Yohei Yukawa's avatar Yohei Yukawa
Browse files

Prepare to make HardwareKeyboardShortcutController per-user

Previously we have reused the same instance of

  InputMethodManagerService#mHardwareKeyboardShortcutController

across users, which needs to be updated before supporting concurrent
multiple users in InputMethodManagerService.

With this CL a new instance of HardwareKeyboardShortcutController will
be recreated every time the current IME user is switching.  This is an
important milestone to keep maintaining multiple instances of
HardwareKeyboardShortcutController for each user.

There must be no observable behavior change in this CL.

Bug: 309868254
Bug: 309837937
Test: presubmit
Change-Id: I679cbe81a475566d9f9651c9977023025bcae3a6
parent 46e75da5
Loading
Loading
Loading
Loading
+20 −1
Original line number Original line Diff line number Diff line
@@ -19,6 +19,8 @@ package com.android.server.inputmethod;
import android.annotation.AnyThread;
import android.annotation.AnyThread;
import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.util.ArrayMap;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodSubtype;
import android.view.inputmethod.InputMethodSubtype;


@@ -33,9 +35,26 @@ final class HardwareKeyboardShortcutController {
    @GuardedBy("ImfLock.class")
    @GuardedBy("ImfLock.class")
    private final ArrayList<InputMethodSubtypeHandle> mSubtypeHandles = new ArrayList<>();
    private final ArrayList<InputMethodSubtypeHandle> mSubtypeHandles = new ArrayList<>();


    @UserIdInt
    private final int mUserId;

    @AnyThread
    @UserIdInt
    int getUserId() {
        return mUserId;
    }

    HardwareKeyboardShortcutController(
            @NonNull ArrayMap<String, InputMethodInfo> methodMap, @UserIdInt int userId) {
        mUserId = userId;
        reset(methodMap);
    }

    @GuardedBy("ImfLock.class")
    @GuardedBy("ImfLock.class")
    void reset(@NonNull InputMethodUtils.InputMethodSettings settings) {
    void reset(@NonNull ArrayMap<String, InputMethodInfo> methodMap) {
        mSubtypeHandles.clear();
        mSubtypeHandles.clear();
        final InputMethodUtils.InputMethodSettings settings =
                new InputMethodUtils.InputMethodSettings(methodMap, mUserId);
        for (final InputMethodInfo imi : settings.getEnabledInputMethodListLocked()) {
        for (final InputMethodInfo imi : settings.getEnabledInputMethodListLocked()) {
            if (!imi.shouldShowInInputMethodPicker()) {
            if (!imi.shouldShowInInputMethodPicker()) {
                continue;
                continue;
+19 −6
Original line number Original line Diff line number Diff line
@@ -319,8 +319,9 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
    // TODO: Instantiate mSwitchingController for each user.
    // TODO: Instantiate mSwitchingController for each user.
    @NonNull
    @NonNull
    private InputMethodSubtypeSwitchingController mSwitchingController;
    private InputMethodSubtypeSwitchingController mSwitchingController;
    final HardwareKeyboardShortcutController mHardwareKeyboardShortcutController =
    // TODO: Instantiate mHardwareKeyboardShortcutController for each user.
            new HardwareKeyboardShortcutController();
    @NonNull
    private HardwareKeyboardShortcutController mHardwareKeyboardShortcutController;


    /**
    /**
     * Tracks how many times {@link #mMethodMap} was updated.
     * Tracks how many times {@link #mMethodMap} was updated.
@@ -1701,7 +1702,8 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
        mSwitchingController =
        mSwitchingController =
                InputMethodSubtypeSwitchingController.createInstanceLocked(context, mMethodMap,
                InputMethodSubtypeSwitchingController.createInstanceLocked(context, mMethodMap,
                        userId);
                        userId);
        mHardwareKeyboardShortcutController.reset(mSettings);
        mHardwareKeyboardShortcutController =
                new HardwareKeyboardShortcutController(mMethodMap, userId);
        mMenuController = new InputMethodMenuController(this);
        mMenuController = new InputMethodMenuController(this);
        mBindingController =
        mBindingController =
                bindingControllerForTesting != null
                bindingControllerForTesting != null
@@ -3215,8 +3217,13 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
            mSwitchingController = InputMethodSubtypeSwitchingController.createInstanceLocked(
            mSwitchingController = InputMethodSubtypeSwitchingController.createInstanceLocked(
                    mContext, mMethodMap, mSettings.getCurrentUserId());
                    mContext, mMethodMap, mSettings.getCurrentUserId());
        }
        }

        // TODO: Instantiate mHardwareKeyboardShortcutController for each user.
        mHardwareKeyboardShortcutController.reset(mSettings);
        if (mSettings.getCurrentUserId() == mHardwareKeyboardShortcutController.getUserId()) {
            mHardwareKeyboardShortcutController.reset(mMethodMap);
        } else {
            mHardwareKeyboardShortcutController = new HardwareKeyboardShortcutController(
                    mMethodMap, mSettings.getCurrentUserId());
        }
        sendOnNavButtonFlagsChangedLocked();
        sendOnNavButtonFlagsChangedLocked();
    }
    }


@@ -5224,7 +5231,13 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
            mSwitchingController = InputMethodSubtypeSwitchingController.createInstanceLocked(
            mSwitchingController = InputMethodSubtypeSwitchingController.createInstanceLocked(
                    mContext, mMethodMap, mSettings.getCurrentUserId());
                    mContext, mMethodMap, mSettings.getCurrentUserId());
        }
        }
        mHardwareKeyboardShortcutController.reset(mSettings);
        // TODO: Instantiate mHardwareKeyboardShortcutController for each user.
        if (mSettings.getCurrentUserId() == mHardwareKeyboardShortcutController.getUserId()) {
            mHardwareKeyboardShortcutController.reset(mMethodMap);
        } else {
            mHardwareKeyboardShortcutController = new HardwareKeyboardShortcutController(
                    mMethodMap, mSettings.getCurrentUserId());
        }


        sendOnNavButtonFlagsChangedLocked();
        sendOnNavButtonFlagsChangedLocked();