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

Commit 89da511a authored by yingleiw's avatar yingleiw Committed by Yinglei Wang
Browse files

handle dynamically set AccessibilityServiceInfo.FLAG_INPUT_METHOD_EDITOR

When the flag is set dynmatically, we need to create the InputMethod()
instance and request to bind ime. If the flag is unset, we clear the
InputMethod() instance and unbind ime.

Fix: 218193835
Test: Tested with talkback. When the flag is not set, we can't use
ime. When the flag is set, we can use ime again (dynamically set
flags).
Change-Id: Ied48d452108a593e8e4ee5c67c3208acbc87335e

Change-Id: I2a85c64b089983807cb7627de9b8512e8f716426
(cherry picked from commit 14e78228)
parent 87d60042
Loading
Loading
Loading
Loading
+16 −11
Original line number Diff line number Diff line
@@ -825,17 +825,7 @@ public abstract class AccessibilityService extends Service {
            for (int i = 0; i < mMagnificationControllers.size(); i++) {
                mMagnificationControllers.valueAt(i).onServiceConnectedLocked();
            }
            AccessibilityServiceInfo info = getServiceInfo();
            if (info != null) {
                boolean requestIme = (info.flags
                        & AccessibilityServiceInfo.FLAG_INPUT_METHOD_EDITOR) != 0;
                if (requestIme && !mInputMethodInitialized) {
                    mInputMethod = onCreateInputMethod();
                    mInputMethodInitialized = true;
                }
            } else {
                Log.e(LOG_TAG, "AccessibilityServiceInfo is null in dispatchServiceConnected");
            }
            updateInputMethod(getServiceInfo());
        }
        if (mSoftKeyboardController != null) {
            mSoftKeyboardController.onServiceConnected();
@@ -846,6 +836,20 @@ public abstract class AccessibilityService extends Service {
        onServiceConnected();
    }

    private void updateInputMethod(AccessibilityServiceInfo info) {
        if (info != null) {
            boolean requestIme = (info.flags
                    & AccessibilityServiceInfo.FLAG_INPUT_METHOD_EDITOR) != 0;
            if (requestIme && !mInputMethodInitialized) {
                mInputMethod = onCreateInputMethod();
                mInputMethodInitialized = true;
            } else if (!requestIme & mInputMethodInitialized) {
                mInputMethod = null;
                mInputMethodInitialized = false;
            }
        }
    }

    /**
     * This method is a part of the {@link AccessibilityService} lifecycle and is
     * called after the system has successfully bound to the service. If is
@@ -2521,6 +2525,7 @@ public abstract class AccessibilityService extends Service {
     */
    public final void setServiceInfo(AccessibilityServiceInfo info) {
        mInfo = info;
        updateInputMethod(info);
        sendServiceInfo();
    }

+8 −3
Original line number Diff line number Diff line
@@ -281,9 +281,9 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ

        void onDoubleTapAndHold(int displayId);

        void requestImeLocked(AccessibilityServiceConnection connection);
        void requestImeLocked(AbstractAccessibilityServiceConnection connection);

        void unbindImeLocked(AccessibilityServiceConnection connection);
        void unbindImeLocked(AbstractAccessibilityServiceConnection connection);
    }

    public AbstractAccessibilityServiceConnection(Context context, ComponentName componentName,
@@ -387,7 +387,6 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
                & AccessibilityServiceInfo.FLAG_REQUEST_FINGERPRINT_GESTURES) != 0;
        mRequestAccessibilityButton = (info.flags
                & AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0;
        // TODO(b/218193835): request ime when ime flag is set and clean up when ime flag is unset
        mRequestImeApis = (info.flags
                & AccessibilityServiceInfo.FLAG_INPUT_METHOD_EDITOR) != 0;
    }
@@ -439,6 +438,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
                // If the XML manifest had data to configure the service its info
                // should be already set. In such a case update only the dynamically
                // configurable properties.
                boolean oldRequestIme = mRequestImeApis;
                AccessibilityServiceInfo oldInfo = mAccessibilityServiceInfo;
                if (oldInfo != null) {
                    oldInfo.updateDynamicallyConfigurableProperties(mIPlatformCompat, info);
@@ -447,6 +447,11 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
                    setDynamicallyConfigurableProperties(info);
                }
                mSystemSupport.onClientChangeLocked(true);
                if (!oldRequestIme && mRequestImeApis) {
                    mSystemSupport.requestImeLocked(this);
                } else if (oldRequestIme && !mRequestImeApis) {
                    mSystemSupport.unbindImeLocked(this);
                }
            }
        } finally {
            Binder.restoreCallingIdentity(identity);
+5 −5
Original line number Diff line number Diff line
@@ -4305,7 +4305,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
    }

    @Override
    public void requestImeLocked(AccessibilityServiceConnection connection) {
    public void requestImeLocked(AbstractAccessibilityServiceConnection connection) {
        mMainHandler.sendMessage(obtainMessage(
                AccessibilityManagerService::createSessionForConnection, this, connection));
        mMainHandler.sendMessage(obtainMessage(
@@ -4313,12 +4313,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
    }

    @Override
    public void unbindImeLocked(AccessibilityServiceConnection connection) {
    public void unbindImeLocked(AbstractAccessibilityServiceConnection connection) {
        mMainHandler.sendMessage(obtainMessage(
                AccessibilityManagerService::unbindInputForConnection, this, connection));
    }

    private void createSessionForConnection(AccessibilityServiceConnection connection) {
    private void createSessionForConnection(AbstractAccessibilityServiceConnection connection) {
        synchronized (mLock) {
            if (mInputSessionRequested) {
                connection.createImeSessionLocked();
@@ -4326,7 +4326,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        }
    }

    private void bindAndStartInputForConnection(AccessibilityServiceConnection connection) {
    private void bindAndStartInputForConnection(AbstractAccessibilityServiceConnection connection) {
        synchronized (mLock) {
            if (mInputBinding != null) {
                connection.bindInputLocked(mInputBinding);
@@ -4336,7 +4336,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        }
    }

    private void unbindInputForConnection(AccessibilityServiceConnection connection) {
    private void unbindInputForConnection(AbstractAccessibilityServiceConnection connection) {
        InputMethodManagerInternal.get().unbindAccessibilityFromCurrentClient(connection.mId);
        synchronized (mLock) {
            connection.unbindInputLocked();