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

Commit 225a21fe authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Simplify InputMethodPrivilegedOperationsImpl callbacks" into main

parents 0da7935b 617c0af0
Loading
Loading
Loading
Loading
+69 −74
Original line number Diff line number Diff line
@@ -2274,9 +2274,10 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                    + bindingController.getCurTokenDisplayId());
        }
        final int userId = bindingController.getUserId();
        final var userData = getUserData(userId);
        inputMethod.initializeInternal(token,
                new InputMethodPrivilegedOperationsImpl(this, token, userId),
                getInputMethodNavButtonFlagsLocked(getUserData(userId)));
                new InputMethodPrivilegedOperationsImpl(this, token, userData),
                getInputMethodNavButtonFlagsLocked(userData));
    }

    @AnyThread
@@ -2530,8 +2531,8 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.

    @BinderThread
    private void updateStatusIcon(@NonNull IBinder token, String packageName,
            @DrawableRes int iconId, @UserIdInt int userId) {
        final var userData = getUserData(userId);
            @DrawableRes int iconId, @NonNull UserData userData) {
        final int userId = userData.mUserId;
        synchronized (ImfLock.class) {
            if (!calledWithValidTokenLocked(token, userData)) {
                return;
@@ -2671,10 +2672,10 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
    @BinderThread
    @SuppressWarnings("deprecation")
    private void setImeWindowStatus(@NonNull IBinder token, int vis, int backDisposition,
            @UserIdInt int userId) {
            @NonNull UserData userData) {
        final int topFocusedDisplayId = mWindowManagerInternal.getTopFocusedDisplayId();

        final var userData = getUserData(userId);
        final int userId = userData.mUserId;
        synchronized (ImfLock.class) {
            if (!calledWithValidTokenLocked(token, userData)) {
                return;
@@ -2711,8 +2712,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.

    @BinderThread
    private void reportStartInput(@NonNull IBinder token, IBinder startInputToken,
            @UserIdInt int userId) {
        final var userData = getUserData(userId);
            @NonNull UserData userData) {
        synchronized (ImfLock.class) {
            if (!calledWithValidTokenLocked(token, userData)) {
                return;
@@ -3971,8 +3971,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.

    @BinderThread
    private void onImeSwitchButtonClickFromClient(@NonNull IBinder token, int displayId,
            @UserIdInt int userId) {
        final var userData = getUserData(userId);
            @NonNull UserData userData) {
        synchronized (ImfLock.class) {
            if (!calledWithValidTokenLocked(token, userData)) {
                return;
@@ -3996,9 +3995,9 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
    }

    @BinderThread
    private void setInputMethod(@NonNull IBinder token, String id, @UserIdInt int userId) {
    private void setInputMethod(@NonNull IBinder token, String id, @NonNull UserData userData) {
        final int callingUid = Binder.getCallingUid();
        final var userData = getUserData(userId);
        final int userId = userData.mUserId;
        synchronized (ImfLock.class) {
            if (!calledWithValidTokenLocked(token, userData)) {
                return;
@@ -4015,9 +4014,9 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.

    @BinderThread
    private void setInputMethodAndSubtype(@NonNull IBinder token, String id,
            InputMethodSubtype subtype, @UserIdInt int userId) {
            InputMethodSubtype subtype, @NonNull UserData userData) {
        final int callingUid = Binder.getCallingUid();
        final var userData = getUserData(userId);
        final int userId = userData.mUserId;
        synchronized (ImfLock.class) {
            if (!calledWithValidTokenLocked(token, userData)) {
                return;
@@ -4032,14 +4031,15 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                setInputMethodWithSubtypeIdLocked(token, id,
                        SubtypeUtils.getSubtypeIdFromHashCode(imi, subtype.hashCode()), userId);
            } else {
                setInputMethod(token, id, userId);
                setInputMethod(token, id, userData);
            }
        }
    }

    @BinderThread
    private boolean switchToPreviousInputMethod(@NonNull IBinder token, @UserIdInt int userId) {
        final var userData = getUserData(userId);
    private boolean switchToPreviousInputMethod(@NonNull IBinder token,
            @NonNull UserData userData) {
        final int userId = userData.mUserId;
        synchronized (ImfLock.class) {
            if (!calledWithValidTokenLocked(token, userData)) {
                return false;
@@ -4121,22 +4121,21 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.

    @BinderThread
    private boolean switchToNextInputMethod(@NonNull IBinder token, boolean onlyCurrentIme,
            @UserIdInt int userId) {
        final var userData = getUserData(userId);
            @NonNull UserData userData) {
        synchronized (ImfLock.class) {
            if (!calledWithValidTokenLocked(token, userData)) {
                return false;
            }
            return switchToNextInputMethodLocked(token, onlyCurrentIme, userId);
            return switchToNextInputMethodLocked(token, onlyCurrentIme, userData);
        }
    }

    @GuardedBy("ImfLock.class")
    private boolean switchToNextInputMethodLocked(@Nullable IBinder token, boolean onlyCurrentIme,
            @UserIdInt int userId) {
        final var bindingController = getInputMethodBindingController(userId);
            @NonNull UserData userData) {
        final var bindingController = userData.mBindingController;
        final var currentImi = bindingController.getSelectedMethod();
        final ImeSubtypeListItem nextSubtype = getUserData(userId).mSwitchingController
        final ImeSubtypeListItem nextSubtype = userData.mSwitchingController
                .getNextInputMethodLocked(onlyCurrentIme, currentImi,
                        bindingController.getCurrentSubtype(),
                        MODE_AUTO, true /* forward */);
@@ -4144,14 +4143,13 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            return false;
        }
        setInputMethodWithSubtypeIdLocked(token, nextSubtype.mImi.getId(),
                nextSubtype.mSubtypeId, userId);
                nextSubtype.mSubtypeId, userData.mUserId);
        return true;
    }

    @BinderThread
    private boolean shouldOfferSwitchingToNextInputMethod(@NonNull IBinder token,
            @UserIdInt int userId) {
        final var userData = getUserData(userId);
            @NonNull UserData userData) {
        synchronized (ImfLock.class) {
            if (!calledWithValidTokenLocked(token, userData)) {
                return false;
@@ -4591,12 +4589,12 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
    }

    @BinderThread
    private void notifyUserAction(@NonNull IBinder token, @UserIdInt int userId) {
    private void notifyUserAction(@NonNull IBinder token, @NonNull UserData userData) {
        if (DEBUG) {
            Slog.d(TAG, "Got the notification of a user action.");
        }
        synchronized (ImfLock.class) {
            final var bindingController = getInputMethodBindingController(userId);
            final var bindingController = userData.mBindingController;
            if (bindingController.getCurToken() != token) {
                if (DEBUG) {
                    Slog.d(TAG, "Ignoring the user action notification from IMEs that are no longer"
@@ -4606,7 +4604,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            }
            final InputMethodInfo imi = bindingController.getSelectedMethod();
            if (imi != null) {
                getUserData(userId).mSwitchingController.onUserActionLocked(imi,
                userData.mSwitchingController.onUserActionLocked(imi,
                        bindingController.getCurrentSubtype());
            }
        }
@@ -4614,10 +4612,10 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.

    @BinderThread
    private void applyImeVisibility(IBinder token, IBinder windowToken, boolean setVisible,
            @NonNull ImeTracker.Token statsToken, @UserIdInt int userId) {
            @NonNull ImeTracker.Token statsToken, @NonNull UserData userData) {
        try {
            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMMS.applyImeVisibility");
            final var userData = getUserData(userId);
            final int userId = userData.mUserId;
            synchronized (ImfLock.class) {
                if (!calledWithValidTokenLocked(token, userData)) {
                    ImeTracker.forLogging().onFailed(statsToken,
@@ -4715,10 +4713,10 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
    @BinderThread
    private void hideMySoftInput(@NonNull IBinder token, @NonNull ImeTracker.Token statsToken,
            @InputMethodManager.HideFlags int flags, @SoftInputShowHideReason int reason,
            @UserIdInt int userId) {
            @NonNull UserData userData) {
        try {
            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMMS.hideMySoftInput");
            final var userData = getUserData(userId);
            final int userId = userData.mUserId;
            synchronized (ImfLock.class) {
                if (!calledWithValidTokenLocked(token, userData)) {
                    ImeTracker.forLogging().onFailed(statsToken,
@@ -4754,10 +4752,10 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
    @BinderThread
    private void showMySoftInput(@NonNull IBinder token, @NonNull ImeTracker.Token statsToken,
            @InputMethodManager.ShowFlags int flags, @SoftInputShowHideReason int reason,
            @UserIdInt int userId) {
            @NonNull UserData userData) {
        try {
            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMMS.showMySoftInput");
            final var userData = getUserData(userId);
            final int userId = userData.mUserId;
            synchronized (ImfLock.class) {
                if (!calledWithValidTokenLocked(token, userData)) {
                    ImeTracker.forLogging().onFailed(statsToken,
@@ -5036,8 +5034,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            case MSG_START_HANDWRITING:
                final var handwritingRequest = (HandwritingRequest) msg.obj;
                synchronized (ImfLock.class) {
                    final int userId = handwritingRequest.userId;
                    final var userData = getUserData(userId);
                    final var userData = handwritingRequest.userData;
                    final var bindingController = userData.mBindingController;
                    IInputMethodInvoker curMethod = bindingController.getCurMethod();
                    if (curMethod == null || userData.mImeBindingState.mFocusedWindow == null) {
@@ -5083,12 +5080,12 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        return false;
    }

    private record HandwritingRequest(int requestId, int pid, @UserIdInt int userId) { }
    private record HandwritingRequest(int requestId, int pid, @NonNull UserData userData) { }

    @BinderThread
    private void onStylusHandwritingReady(int requestId, int pid, @UserIdInt int userId) {
    private void onStylusHandwritingReady(int requestId, int pid, @NonNull UserData userData) {
        mHandler.obtainMessage(MSG_START_HANDWRITING,
                new HandwritingRequest(requestId, pid, userId)).sendToTarget();
                new HandwritingRequest(requestId, pid, userData)).sendToTarget();
    }

    private void handleSetInteractive(final boolean interactive) {
@@ -5601,10 +5598,11 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
    }

    @GuardedBy("ImfLock.class")
    private void switchKeyboardLayoutLocked(int direction, @UserIdInt int userId) {
    private void switchKeyboardLayoutLocked(int direction, @NonNull UserData userData) {
        final int userId = userData.mUserId;
        final InputMethodSettings settings = InputMethodSettingsRepository.get(userId);

        final var bindingController = getInputMethodBindingController(userId);
        final var bindingController = userData.mBindingController;
        final InputMethodInfo currentImi = settings.getMethodMap().get(
                bindingController.getSelectedMethodId());
        if (currentImi == null) {
@@ -5613,7 +5611,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        final var currentSubtype = bindingController.getCurrentSubtype();
        final InputMethodSubtypeHandle nextSubtypeHandle;
        if (Flags.imeSwitcherRevamp()) {
            final var nextItem = getUserData(userId).mSwitchingController
            final var nextItem = userData.mSwitchingController
                    .getNextInputMethodForHardware(
                            false /* onlyCurrentIme */, currentImi, currentSubtype, MODE_AUTO,
                            direction > 0 /* forward */);
@@ -5629,8 +5627,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        } else {
            final InputMethodSubtypeHandle currentSubtypeHandle =
                    InputMethodSubtypeHandle.of(currentImi, currentSubtype);
            nextSubtypeHandle =
                    getUserData(userId).mHardwareKeyboardShortcutController.onSubtypeSwitch(
            nextSubtypeHandle = userData.mHardwareKeyboardShortcutController.onSubtypeSwitch(
                        currentSubtypeHandle, direction > 0);
        }
        if (nextSubtypeHandle == null) {
@@ -5917,14 +5914,14 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                IBinder targetWindowToken) {
            synchronized (ImfLock.class) {
                // TODO(b/305849394): Infer userId from displayId
                switchKeyboardLayoutLocked(direction, mCurrentUserId);
                switchKeyboardLayoutLocked(direction, getUserData(mCurrentUserId));
            }
        }
    }

    @BinderThread
    private IInputContentUriToken createInputContentUriToken(@Nullable IBinder token,
            @Nullable Uri contentUri, @Nullable String packageName, @UserIdInt int imeUserId) {
            @Nullable Uri contentUri, @Nullable String packageName, @NonNull UserData userData) {
        if (token == null) {
            throw new NullPointerException("token");
        }
@@ -5941,7 +5938,6 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.

        synchronized (ImfLock.class) {
            final int uid = Binder.getCallingUid();
            final var userData = getUserData(imeUserId);
            final var bindingController = userData.mBindingController;
            if (bindingController.getSelectedMethodId() == null) {
                return null;
@@ -5965,7 +5961,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            final int appUserId = UserHandle.getUserId(userData.mCurClient.mUid);
            // This user ID may be invalid if "contentUri" embedded an invalid user ID.
            final int contentUriOwnerUserId = ContentProvider.getUserIdFromUri(contentUri,
                    imeUserId);
                    userData.mUserId);
            final Uri contentUriWithoutUserId = ContentProvider.getUriWithoutUserId(contentUri);
            // Note: InputContentUriTokenHandler.take() checks whether the IME (specified by "uid")
            // actually has the right to grant a read permission for "contentUriWithoutUserId" that
@@ -5980,8 +5976,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.

    @BinderThread
    private void reportFullscreenMode(@NonNull IBinder token, boolean fullscreen,
            @UserIdInt int userId) {
        final var userData = getUserData(userId);
            @NonNull UserData userData) {
        synchronized (ImfLock.class) {
            if (!calledWithValidTokenLocked(token, userData)) {
                return;
@@ -6813,26 +6808,26 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        private final InputMethodManagerService mImms;
        @NonNull
        private final IBinder mToken;
        @UserIdInt
        private final int mUserId;
        @NonNull
        private final UserData mUserData;

        InputMethodPrivilegedOperationsImpl(InputMethodManagerService imms,
                @NonNull IBinder token, @UserIdInt int userId) {
                @NonNull IBinder token, @NonNull UserData userData) {
            mImms = imms;
            mToken = token;
            mUserId = userId;
            mUserData = userData;
        }

        @BinderThread
        @Override
        public void setImeWindowStatusAsync(int vis, int backDisposition) {
            mImms.setImeWindowStatus(mToken, vis, backDisposition, mUserId);
            mImms.setImeWindowStatus(mToken, vis, backDisposition, mUserData);
        }

        @BinderThread
        @Override
        public void reportStartInputAsync(IBinder startInputToken) {
            mImms.reportStartInput(mToken, startInputToken, mUserId);
            mImms.reportStartInput(mToken, startInputToken, mUserData);
        }

        @BinderThread
@@ -6848,7 +6843,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            @SuppressWarnings("unchecked") final AndroidFuture<IBinder> typedFuture = future;
            try {
                typedFuture.complete(mImms.createInputContentUriToken(
                        mToken, contentUri, packageName, mUserId).asBinder());
                        mToken, contentUri, packageName, mUserData).asBinder());
            } catch (Throwable e) {
                typedFuture.completeExceptionally(e);
            }
@@ -6857,7 +6852,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        @BinderThread
        @Override
        public void reportFullscreenModeAsync(boolean fullscreen) {
            mImms.reportFullscreenMode(mToken, fullscreen, mUserId);
            mImms.reportFullscreenMode(mToken, fullscreen, mUserData);
        }

        @BinderThread
@@ -6865,7 +6860,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        public void setInputMethod(String id, AndroidFuture future /* T=Void */) {
            @SuppressWarnings("unchecked") final AndroidFuture<Void> typedFuture = future;
            try {
                mImms.setInputMethod(mToken, id, mUserId);
                mImms.setInputMethod(mToken, id, mUserData);
                typedFuture.complete(null);
            } catch (Throwable e) {
                typedFuture.completeExceptionally(e);
@@ -6878,7 +6873,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                AndroidFuture future /* T=Void */) {
            @SuppressWarnings("unchecked") final AndroidFuture<Void> typedFuture = future;
            try {
                mImms.setInputMethodAndSubtype(mToken, id, subtype, mUserId);
                mImms.setInputMethodAndSubtype(mToken, id, subtype, mUserData);
                typedFuture.complete(null);
            } catch (Throwable e) {
                typedFuture.completeExceptionally(e);
@@ -6892,7 +6887,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                AndroidFuture future /* T=Void */) {
            @SuppressWarnings("unchecked") final AndroidFuture<Void> typedFuture = future;
            try {
                mImms.hideMySoftInput(mToken, statsToken, flags, reason, mUserId);
                mImms.hideMySoftInput(mToken, statsToken, flags, reason, mUserData);
                typedFuture.complete(null);
            } catch (Throwable e) {
                typedFuture.completeExceptionally(e);
@@ -6906,7 +6901,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                AndroidFuture future /* T=Void */) {
            @SuppressWarnings("unchecked") final AndroidFuture<Void> typedFuture = future;
            try {
                mImms.showMySoftInput(mToken, statsToken, flags, reason, mUserId);
                mImms.showMySoftInput(mToken, statsToken, flags, reason, mUserData);
                typedFuture.complete(null);
            } catch (Throwable e) {
                typedFuture.completeExceptionally(e);
@@ -6916,7 +6911,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        @BinderThread
        @Override
        public void updateStatusIconAsync(String packageName, @DrawableRes int iconId) {
            mImms.updateStatusIcon(mToken, packageName, iconId, mUserId);
            mImms.updateStatusIcon(mToken, packageName, iconId, mUserData);
        }

        @BinderThread
@@ -6924,7 +6919,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        public void switchToPreviousInputMethod(AndroidFuture future /* T=Boolean */) {
            @SuppressWarnings("unchecked") final AndroidFuture<Boolean> typedFuture = future;
            try {
                typedFuture.complete(mImms.switchToPreviousInputMethod(mToken, mUserId));
                typedFuture.complete(mImms.switchToPreviousInputMethod(mToken, mUserData));
            } catch (Throwable e) {
                typedFuture.completeExceptionally(e);
            }
@@ -6937,7 +6932,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            @SuppressWarnings("unchecked") final AndroidFuture<Boolean> typedFuture = future;
            try {
                typedFuture.complete(mImms.switchToNextInputMethod(mToken, onlyCurrentIme,
                        mUserId));
                        mUserData));
            } catch (Throwable e) {
                typedFuture.completeExceptionally(e);
            }
@@ -6948,7 +6943,8 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        public void shouldOfferSwitchingToNextInputMethod(AndroidFuture future /* T=Boolean */) {
            @SuppressWarnings("unchecked") final AndroidFuture<Boolean> typedFuture = future;
            try {
                typedFuture.complete(mImms.shouldOfferSwitchingToNextInputMethod(mToken, mUserId));
                typedFuture.complete(mImms.shouldOfferSwitchingToNextInputMethod(mToken,
                        mUserData));
            } catch (Throwable e) {
                typedFuture.completeExceptionally(e);
            }
@@ -6957,26 +6953,26 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        @BinderThread
        @Override
        public void onImeSwitchButtonClickFromClient(int displayId) {
            mImms.onImeSwitchButtonClickFromClient(mToken, displayId, mUserId);
            mImms.onImeSwitchButtonClickFromClient(mToken, displayId, mUserData);
        }

        @BinderThread
        @Override
        public void notifyUserActionAsync() {
            mImms.notifyUserAction(mToken, mUserId);
            mImms.notifyUserAction(mToken, mUserData);
        }

        @BinderThread
        @Override
        public void applyImeVisibilityAsync(IBinder windowToken, boolean setVisible,
                @NonNull ImeTracker.Token statsToken) {
            mImms.applyImeVisibility(mToken, windowToken, setVisible, statsToken, mUserId);
            mImms.applyImeVisibility(mToken, windowToken, setVisible, statsToken, mUserData);
        }

        @BinderThread
        @Override
        public void onStylusHandwritingReady(int requestId, int pid) {
            mImms.onStylusHandwritingReady(requestId, pid, mUserId);
            mImms.onStylusHandwritingReady(requestId, pid, mUserData);
        }

        @BinderThread
@@ -6988,14 +6984,13 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        @BinderThread
        @Override
        public void switchKeyboardLayoutAsync(int direction) {
            final var userData = mImms.getUserData(mUserId);
            synchronized (ImfLock.class) {
                if (!mImms.calledWithValidTokenLocked(mToken, userData)) {
                if (!mImms.calledWithValidTokenLocked(mToken, mUserData)) {
                    return;
                }
                final long ident = Binder.clearCallingIdentity();
                try {
                    mImms.switchKeyboardLayoutLocked(direction, mUserId);
                    mImms.switchKeyboardLayoutLocked(direction, mUserData);
                } finally {
                    Binder.restoreCallingIdentity(ident);
                }