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

Commit bd68525d authored by Yohei Yukawa's avatar Yohei Yukawa Committed by Android (Google) Code Review
Browse files

Merge "Introduce IMMS#getInputMethodBindingController()" into main

parents cc311ae3 fc09b798
Loading
Loading
Loading
Loading
+38 −56
Original line number Diff line number Diff line
@@ -491,6 +491,12 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
     */
    boolean mSystemReady;

    @GuardedBy("ImfLock.class")
    @NonNull
    InputMethodBindingController getInputMethodBindingController(@UserIdInt int userId) {
        return mUserDataRepository.getOrCreate(userId).mBindingController;
    }

    /**
     * Id obtained with {@link InputMethodInfo#getId()} for the currently selected input method.
     * This is to be synchronized with the secure settings keyed with
@@ -507,8 +513,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
    @GuardedBy("ImfLock.class")
    @Nullable
    String getSelectedMethodIdLocked() {
        final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
        return userData.mBindingController.getSelectedMethodId();
        return getInputMethodBindingController(mCurrentUserId).getSelectedMethodId();
    }

    @GuardedBy("ImfLock.class")
@@ -594,8 +599,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
    @GuardedBy("ImfLock.class")
    @Nullable
    IBinder getCurTokenLocked() {
        final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
        return userData.mBindingController.getCurToken();
        return getInputMethodBindingController(mCurrentUserId).getCurToken();
    }

    /**
@@ -603,8 +607,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
     */
    @GuardedBy("ImfLock.class")
    int getCurTokenDisplayIdLocked() {
        final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
        return userData.mBindingController.getCurTokenDisplayId();
        return getInputMethodBindingController(mCurrentUserId).getCurTokenDisplayId();
    }

    /**
@@ -620,8 +623,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
    @GuardedBy("ImfLock.class")
    @Nullable
    IInputMethodInvoker getCurMethodLocked() {
        final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
        return userData.mBindingController.getCurMethod();
        return getInputMethodBindingController(mCurrentUserId).getCurMethod();
    }

    /**
@@ -1427,8 +1429,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.

        // Note that in b/197848765 we want to see if we can keep the binding alive for better
        // profile switching.
        final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
        final var bindingController = userData.mBindingController;
        final var bindingController = getInputMethodBindingController(mCurrentUserId);
        bindingController.unbindCurrentMethod();

        unbindCurrentClientLocked(UnbindReason.SWITCH_USER);
@@ -1648,8 +1649,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.

            // Check if selected IME of current user supports handwriting.
            if (userId == mCurrentUserId) {
                final var userData = mUserDataRepository.getOrCreate(userId);
                final var bindingController = userData.mBindingController;
                final var bindingController = getInputMethodBindingController(userId);
                return bindingController.supportsStylusHandwriting()
                        && (!connectionless
                        || bindingController.supportsConnectionlessStylusHandwriting());
@@ -1849,8 +1849,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            // TODO(b/325515685): make binding controller user independent. Before this change, the
            //  following dependencies also need to be user independent: mCurClient, mBoundToMethod,
            //  getCurMethodLocked(), and mMenuController.
            final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
            final var bindingController = userData.mBindingController;
            final var bindingController = getInputMethodBindingController(mCurrentUserId);
            mCurClient.mClient.onUnbindMethod(bindingController.getSequenceNumber(),
                    unbindClientReason);
            mCurClient.mSessionRequested = false;
@@ -1930,8 +1929,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.

        final boolean restarting = !initial;
        final Binder startInputToken = new Binder();
        final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
        final var bindingController = userData.mBindingController;
        final var bindingController = getInputMethodBindingController(mCurrentUserId);
        final StartInputInfo info = new StartInputInfo(mCurrentUserId,
                getCurTokenLocked(),
                getCurTokenDisplayIdLocked(), bindingController.getCurId(), startInputReason,
@@ -2634,8 +2632,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        // When the IME switcher dialog is shown, the IME switcher button should be hidden.
        if (mMenuController.getSwitchingDialogLocked() != null) return false;
        // When we are switching IMEs, the IME switcher button should be hidden.
        final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
        final var bindingController = userData.mBindingController;
        final var bindingController = getInputMethodBindingController(mCurrentUserId);
        if (!Objects.equals(bindingController.getCurId(),
                bindingController.getSelectedMethodId())) {
            return false;
@@ -2799,8 +2796,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            } else {
                vis &= ~InputMethodService.IME_VISIBLE_IMPERCEPTIBLE;
            }
            final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
            final var curId = userData.mBindingController.getCurId();
            final var curId = getInputMethodBindingController(mCurrentUserId).getCurId();
            if (mMenuController.getSwitchingDialogLocked() != null
                    || !Objects.equals(curId, getSelectedMethodIdLocked())) {
                // When the IME switcher dialog is shown, or we are switching IMEs,
@@ -2861,8 +2857,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            id = imi.getId();
            settings.putSelectedInputMethod(id);
        }
        final var userData = mUserDataRepository.getOrCreate(userId);
        final var bindingController = userData.mBindingController;
        final var bindingController = getInputMethodBindingController(userId);
        bindingController.setSelectedMethodId(id);
    }

@@ -3038,8 +3033,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            // mCurMethodId should be updated after setSelectedInputMethodAndSubtypeLocked()
            // because mCurMethodId is stored as a history in
            // setSelectedInputMethodAndSubtypeLocked().
            final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
            userData.mBindingController.setSelectedMethodId(id);
            getInputMethodBindingController(mCurrentUserId).setSelectedMethodId(id);

            if (mActivityManagerInternal.isSystemReady()) {
                Intent intent = new Intent(Intent.ACTION_INPUT_METHOD_CHANGED);
@@ -3094,8 +3088,8 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            @Nullable String delegatorPackageName,
            @NonNull IConnectionlessHandwritingCallback callback) {
        synchronized (ImfLock.class) {
            final var userData = mUserDataRepository.getOrCreate(userId);
            if (!userData.mBindingController.supportsConnectionlessStylusHandwriting()) {
            final var bindingController = getInputMethodBindingController(userId);
            if (!bindingController.supportsConnectionlessStylusHandwriting()) {
                Slog.w(TAG, "Connectionless stylus handwriting mode unsupported by IME.");
                try {
                    callback.onError(CONNECTIONLESS_HANDWRITING_ERROR_UNSUPPORTED);
@@ -3178,8 +3172,8 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                }
                final long ident = Binder.clearCallingIdentity();
                try {
                    final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
                    if (!userData.mBindingController.supportsStylusHandwriting()) {
                    final var bindingController = getInputMethodBindingController(mCurrentUserId);
                    if (!bindingController.supportsStylusHandwriting()) {
                        Slog.w(TAG,
                                "Stylus HW unsupported by IME. Ignoring startStylusHandwriting()");
                        return false;
@@ -3362,8 +3356,8 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        mVisibilityStateComputer.requestImeVisibility(windowToken, true);

        // Ensure binding the connection when IME is going to show.
        final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
        userData.mBindingController.setCurrentMethodVisible();
        final var bindingController = getInputMethodBindingController(mCurrentUserId);
        bindingController.setCurrentMethodVisible();
        final IInputMethodInvoker curMethod = getCurMethodLocked();
        ImeTracker.forLogging().onCancelled(mCurStatsToken, ImeTracker.PHASE_SERVER_WAIT_IME);
        final boolean readyToDispatchToIme;
@@ -3471,8 +3465,8 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        } else {
            ImeTracker.forLogging().onCancelled(statsToken, ImeTracker.PHASE_SERVER_SHOULD_HIDE);
        }
        final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
        userData.mBindingController.setCurrentMethodNotVisible();
        final var bindingController = getInputMethodBindingController(mCurrentUserId);
        bindingController.setCurrentMethodNotVisible();
        mVisibilityStateComputer.clearImeShowFlags();
        // Cancel existing statsToken for show IME as we got a hide request.
        ImeTracker.forLogging().onCancelled(mCurStatsToken, ImeTracker.PHASE_SERVER_WAIT_IME);
@@ -3540,8 +3534,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                    "InputMethodManagerService#startInputOrWindowGainedFocus", mDumper);
            final InputBindResult result;
            synchronized (ImfLock.class) {
                final var userData = mUserDataRepository.getOrCreate(userId);
                final var bindingController = userData.mBindingController;
                final var bindingController = getInputMethodBindingController(userId);
                // If the system is not yet ready, we shouldn't be running third party code.
                if (!mSystemReady) {
                    return new InputBindResult(
@@ -3810,8 +3803,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        if (mCurrentUserId != UserHandle.getUserId(uid)) {
            return false;
        }
        final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
        final var curIntent = userData.mBindingController.getCurIntent();
        final var curIntent = getInputMethodBindingController(mCurrentUserId).getCurIntent();
        if (curIntent != null && InputMethodUtils.checkIfPackageBelongsToUid(
                mPackageManagerInternal, uid, curIntent.getComponent().getPackageName())) {
            return true;
@@ -4220,8 +4212,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        mStylusIds.add(deviceId);
        // a new Stylus is detected. If IME supports handwriting, and we don't have
        // handwriting initialized, lets do it now.
        final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
        final var bindingController = userData.mBindingController;
        final var bindingController = getInputMethodBindingController(mCurrentUserId);
        if (!mHwController.getCurrentRequestId().isPresent()
                && bindingController.supportsStylusHandwriting()) {
            scheduleResetStylusHandwriting();
@@ -4402,8 +4393,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.

    private void dumpDebug(ProtoOutputStream proto, long fieldId) {
        synchronized (ImfLock.class) {
            final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
            final var bindingController = userData.mBindingController;
            final var bindingController = getInputMethodBindingController(mCurrentUserId);
            final long token = proto.start(fieldId);
            proto.write(CUR_METHOD_ID, getSelectedMethodIdLocked());
            proto.write(CUR_SEQ, bindingController.getSequenceNumber());
@@ -4793,8 +4783,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.

            case MSG_RESET_HANDWRITING: {
                synchronized (ImfLock.class) {
                    final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
                    final var bindingController = userData.mBindingController;
                    final var bindingController = getInputMethodBindingController(mCurrentUserId);
                    if (bindingController.supportsStylusHandwriting()
                            && getCurMethodLocked() != null && hasSupportedStylusLocked()) {
                        Slog.d(TAG, "Initializing Handwriting Spy");
@@ -4820,8 +4809,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                    if (curMethod == null || mImeBindingState.mFocusedWindow == null) {
                        return true;
                    }
                    final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
                    final var bindingController = userData.mBindingController;
                    final var bindingController = getInputMethodBindingController(mCurrentUserId);
                    final HandwritingModeController.HandwritingSession session =
                            mHwController.startHandwritingSession(
                                    msg.arg1 /*requestId*/,
@@ -4877,8 +4865,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                return;
            }
            // TODO(b/325515685): user data must be retrieved by a userId parameter
            final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
            final var bindingController = userData.mBindingController;
            final var bindingController = getInputMethodBindingController(mCurrentUserId);
            if (mImePlatformCompatUtils.shouldUseSetInteractiveProtocol(
                    bindingController.getCurMethodUid())) {
                // Handle IME visibility when interactive changed before finishing the input to
@@ -5103,8 +5090,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.

    @GuardedBy("ImfLock.class")
    void sendOnNavButtonFlagsChangedLocked() {
        final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
        final var bindingController = userData.mBindingController;
        final var bindingController = getInputMethodBindingController(mCurrentUserId);
        final IInputMethodInvoker curMethod = bindingController.getCurMethod();
        if (curMethod == null) {
            // No need to send the data if the IME is not yet bound.
@@ -5591,8 +5577,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        public void onSessionForAccessibilityCreated(int accessibilityConnectionId,
                IAccessibilityInputMethodSession session, @UserIdInt int userId) {
            synchronized (ImfLock.class) {
                final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
                final var bindingController = userData.mBindingController;
                final var bindingController = getInputMethodBindingController(mCurrentUserId);
                // TODO(b/305829876): Implement user ID verification
                if (mCurClient != null) {
                    clearClientSessionForAccessibilityLocked(mCurClient, accessibilityConnectionId);
@@ -5627,8 +5612,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        public void unbindAccessibilityFromCurrentClient(int accessibilityConnectionId,
                @UserIdInt int userId) {
            synchronized (ImfLock.class) {
                final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
                final var bindingController = userData.mBindingController;
                final var bindingController = getInputMethodBindingController(mCurrentUserId);
                // TODO(b/305829876): Implement user ID verification
                if (mCurClient != null) {
                    if (DEBUG) {
@@ -5860,8 +5844,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                p.println("    pid=" + c.mPid);
            };
            mClientController.forAllClients(clientControllerDump);
            final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
            final var bindingController = userData.mBindingController;
            final var bindingController = getInputMethodBindingController(mCurrentUserId);
            p.println("  mCurrentUserId=" + mCurrentUserId);
            p.println("  mCurMethodId=" + getSelectedMethodIdLocked());
            client = mCurClient;
@@ -6383,8 +6366,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                    if (userId == mCurrentUserId) {
                        hideCurrentInputLocked(mImeBindingState.mFocusedWindow, 0 /* flags */,
                                SoftInputShowHideReason.HIDE_RESET_SHELL_COMMAND);
                        final var userData = mUserDataRepository.getOrCreate(userId);
                        final var bindingController = userData.mBindingController;
                        final var bindingController = getInputMethodBindingController(userId);
                        bindingController.unbindCurrentMethod();

                        // Enable default IMEs, disable others