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

Commit 107b9413 authored by yingleiw's avatar yingleiw
Browse files

Add accessibilitySessions to InputBindResult

This way, we can pass back a11y sessions from direct startInput()
return value. And a11yManagerService will only request sessions
from a11y services which the client doesn't have sessions yet
(will not request existing a11y sessions again).

Bug: 187453053

Test: tested manually with talkback. Tested client switching within
"recent apps".

Change-Id: I8efdc9886ce33185a2195b741668c12e319ea660
parent 8cb76d59
Loading
Loading
Loading
Loading
+32 −21
Original line number Diff line number Diff line
@@ -930,8 +930,10 @@ public final class InputMethodManager {
                        // Since IMM can start inputting text before a11y sessions are back,
                        // we send a notification so that the a11y service knows the session is
                        // registered and update the a11y service with the current cursor positions.
                        if (res.accessibilitySessions != null) {
                            InputMethodSessionWrapper wrapper =
                                InputMethodSessionWrapper.createOrNull(res.method);
                                    InputMethodSessionWrapper.createOrNull(
                                            res.accessibilitySessions.get(id));
                            if (wrapper != null) {
                                mAccessibilityInputMethodSession.put(id, wrapper);
                                if (mServedInputConnection != null) {
@@ -949,6 +951,7 @@ public final class InputMethodManager {
                                            -1);
                                }
                            }
                        }
                        mBindSequence = res.sequence;
                    }
                    startInputInner(StartInputReason.BOUND_ACCESSIBILITY_SESSION_TO_IMMS, null,
@@ -1508,6 +1511,7 @@ public final class InputMethodManager {
    /**
     * Reset all of the state associated with being bound to an input method.
     */
    @GuardedBy("mH")
    void clearBindingLocked() {
        if (DEBUG) Log.v(TAG, "Clearing binding!");
        clearConnectionLocked();
@@ -2235,14 +2239,21 @@ public final class InputMethodManager {
            }
            mIsInputMethodSuppressingSpellChecker = res.isInputMethodSuppressingSpellChecker;
            if (res.id != null) {
                // we might need to put a11y sessions and channels into res and restore them here.
                // Currently we have a workaround to request a11y session after each client
                // switching, even when the new client is opened before and is in memory (has
                // existing a11y sessions).
                setInputChannelLocked(res.channel);
                mBindSequence = res.sequence;
                mCurMethod = res.method; // for @UnsupportedAppUsage
                mCurrentInputMethodSession = InputMethodSessionWrapper.createOrNull(res.method);
                mAccessibilityInputMethodSession.clear();
                if (res.accessibilitySessions != null) {
                    for (int i = 0; i < res.accessibilitySessions.size(); i++) {
                        InputMethodSessionWrapper wrapper = InputMethodSessionWrapper.createOrNull(
                                res.accessibilitySessions.valueAt(i));
                        if (wrapper != null) {
                            mAccessibilityInputMethodSession.append(
                                    res.accessibilitySessions.keyAt(i), wrapper);
                        }
                    }
                }
                mCurId = res.id;
            } else if (res.channel != null && res.channel != mCurChannel) {
                res.channel.dispose();
+37 −2
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseArray;
import android.view.InputChannel;

import com.android.internal.view.IInputMethodSession;
@@ -180,6 +181,11 @@ public final class InputBindResult implements Parcelable {
     */
    public final IInputMethodSession method;

    /**
     * The accessibility services.
     */
    public SparseArray<IInputMethodSession> accessibilitySessions;

    /**
     * The input channel used to send input events to this IME.
     */
@@ -206,6 +212,8 @@ public final class InputBindResult implements Parcelable {
     *
     * @param result A result code defined in {@link ResultCode}.
     * @param method {@link IInputMethodSession} to interact with the IME.
     * @param accessibilitySessions {@link IInputMethodSession} to interact with accessibility
     *                              services.
     * @param channel {@link InputChannel} to forward input events to the IME.
     * @param id The {@link String} representations of the IME, which is the same as
     *           {@link android.view.inputmethod.InputMethodInfo#getId()} and
@@ -215,10 +223,12 @@ public final class InputBindResult implements Parcelable {
     *                                             {@code suppressesSpellChecker="true"}.
     */
    public InputBindResult(@ResultCode int result,
            IInputMethodSession method, InputChannel channel, String id, int sequence,
            IInputMethodSession method, SparseArray<IInputMethodSession> accessibilitySessions,
            InputChannel channel, String id, int sequence,
            boolean isInputMethodSuppressingSpellChecker) {
        this.result = result;
        this.method = method;
        this.accessibilitySessions = accessibilitySessions;
        this.channel = channel;
        this.id = id;
        this.sequence = sequence;
@@ -228,6 +238,19 @@ public final class InputBindResult implements Parcelable {
    private InputBindResult(Parcel source) {
        result = source.readInt();
        method = IInputMethodSession.Stub.asInterface(source.readStrongBinder());
        int n = source.readInt();
        if (n < 0) {
            accessibilitySessions = null;
        } else {
            accessibilitySessions = new SparseArray<>(n);
            while (n > 0) {
                int key = source.readInt();
                IInputMethodSession value =
                        IInputMethodSession.Stub.asInterface(source.readStrongBinder());
                accessibilitySessions.append(key, value);
                n--;
            }
        }
        if (source.readInt() != 0) {
            channel = InputChannel.CREATOR.createFromParcel(source);
        } else {
@@ -256,6 +279,18 @@ public final class InputBindResult implements Parcelable {
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(result);
        dest.writeStrongInterface(method);
        if (accessibilitySessions == null) {
            dest.writeInt(-1);
        } else {
            int n = accessibilitySessions.size();
            dest.writeInt(n);
            int i = 0;
            while (i < n) {
                dest.writeInt(accessibilitySessions.keyAt(i));
                dest.writeStrongInterface(accessibilitySessions.valueAt(i));
                i++;
            }
        }
        if (channel != null) {
            dest.writeInt(1);
            channel.writeToParcel(dest, flags);
@@ -331,7 +366,7 @@ public final class InputBindResult implements Parcelable {
    }

    private static InputBindResult error(@ResultCode int result) {
        return new InputBindResult(result, null, null, null, -1, false);
        return new InputBindResult(result, null, null, null, null, -1, false);
    }

    /**
+6 −5
Original line number Diff line number Diff line
@@ -336,8 +336,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        }

        @Override
        public void createImeSession() {
            mService.createImeSession();
        public void createImeSession(ArraySet<Integer> ignoreSet) {
            mService.createImeSession(ignoreSet);
        }

        @Override
@@ -4419,16 +4419,17 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
    }

    /**
     * Request input sessions from all accessibility services which request ime capabilities.
     * Request input sessions from all accessibility services which request ime capabilities and
     * whose id is not in the ignoreSet
     */
    public void createImeSession() {
    public void createImeSession(ArraySet<Integer> ignoreSet) {
        AccessibilityUserState userState;
        synchronized (mLock) {
            mInputSessionRequested = true;
            userState = getCurrentUserStateLocked();
            for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) {
                final AccessibilityServiceConnection service = userState.mBoundServices.get(i);
                if (service.requestImeApis()) {
                if ((!ignoreSet.contains(service.mId)) && service.requestImeApis()) {
                    service.createImeSessionLocked();
                }
            }
+7 −3
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server;

import android.annotation.NonNull;
import android.os.IBinder;
import android.util.ArraySet;
import android.util.SparseArray;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputBinding;
@@ -39,8 +40,11 @@ public abstract class AccessibilityManagerInternal {
    /** Bind input for all accessibility services which require ime capabilities. */
    public abstract void bindInput(InputBinding binding);

    /** Request input session from all accessibility services which require ime capabilities. */
    public abstract void createImeSession();
    /**
     * Request input session from all accessibility services which require ime capabilities and
     * whose id is not in the ignoreSet.
     */
    public abstract void createImeSession(ArraySet<Integer> ignoreSet);

    /** Start input for all accessibility services which require ime capabilities. */
    public abstract void startInput(IBinder startInputToken, IInputContext inputContext,
@@ -61,7 +65,7 @@ public abstract class AccessibilityManagerInternal {
        }

        @Override
        public void createImeSession() {
        public void createImeSession(ArraySet<Integer> ignoreSet) {
        }

        @Override
+1 −1
Original line number Diff line number Diff line
@@ -422,7 +422,7 @@ final class InputMethodBindingController {
            addFreshWindowToken();
            return new InputBindResult(
                    InputBindResult.ResultCode.SUCCESS_WAITING_IME_BINDING,
                    null, null, mCurId, mCurSeq, false);
                    null, null, null, mCurId, mCurSeq, false);
        }

        Slog.w(InputMethodManagerService.TAG,
Loading