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

Commit da6d14b9 authored by Yinglei Wang's avatar Yinglei Wang Committed by Android (Google) Code Review
Browse files

Merge "resolve possible Imf lock and a11y mLock deadlock" into tm-dev

parents da78c9e2 2db234db
Loading
Loading
Loading
Loading
+41 −21
Original line number Original line Diff line number Diff line
@@ -322,28 +322,28 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        @Override
        @Override
        public void setImeSessionEnabled(SparseArray<IInputMethodSession> sessions,
        public void setImeSessionEnabled(SparseArray<IInputMethodSession> sessions,
                boolean enabled) {
                boolean enabled) {
            mService.setImeSessionEnabled(sessions, enabled);
            mService.scheduleSetImeSessionEnabled(sessions, enabled);
        }
        }


        @Override
        @Override
        public void unbindInput() {
        public void unbindInput() {
            mService.unbindInput();
            mService.scheduleUnbindInput();
        }
        }


        @Override
        @Override
        public void bindInput(InputBinding binding) {
        public void bindInput(InputBinding binding) {
            mService.bindInput(binding);
            mService.scheduleBindInput(binding);
        }
        }


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


        @Override
        @Override
        public void startInput(IBinder startInputToken, IInputContext inputContext,
        public void startInput(IBinder startInputToken, IInputContext inputContext,
                EditorInfo editorInfo, boolean restarting) {
                EditorInfo editorInfo, boolean restarting) {
            mService.startInput(startInputToken, inputContext, editorInfo, restarting);
            mService.scheduleStartInput(startInputToken, inputContext, editorInfo, restarting);
        }
        }
    }
    }


@@ -4377,12 +4377,16 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
     *
     *
     * @param binding Information given to an accessibility service about a client connecting to it.
     * @param binding Information given to an accessibility service about a client connecting to it.
     */
     */
    public void bindInput(InputBinding binding) {
    public void scheduleBindInput(InputBinding binding) {
        AccessibilityUserState userState;
        mMainHandler.sendMessage(obtainMessage(AccessibilityManagerService::bindInput, this,
                binding));
    }

    private void bindInput(InputBinding binding) {
        synchronized (mLock) {
        synchronized (mLock) {
            // Keep records of these in case new Accessibility Services are enabled.
            // Keep records of these in case new Accessibility Services are enabled.
            mInputBinding = binding;
            mInputBinding = binding;
            userState = getCurrentUserStateLocked();
            AccessibilityUserState userState = getCurrentUserStateLocked();
            for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) {
            for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) {
                final AccessibilityServiceConnection service = userState.mBoundServices.get(i);
                final AccessibilityServiceConnection service = userState.mBoundServices.get(i);
                if (service.requestImeApis()) {
                if (service.requestImeApis()) {
@@ -4395,11 +4399,13 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
    /**
    /**
     * Unbind input for accessibility services which request ime capabilities.
     * Unbind input for accessibility services which request ime capabilities.
     */
     */
    public void unbindInput() {
    public void scheduleUnbindInput() {
        AccessibilityUserState userState;
        mMainHandler.sendMessage(obtainMessage(AccessibilityManagerService::unbindInput, this));
        // TODO(b/218182733): Resolve the Imf lock and mLock possible deadlock
    }

    private void unbindInput() {
        synchronized (mLock) {
        synchronized (mLock) {
            userState = getCurrentUserStateLocked();
            AccessibilityUserState userState = getCurrentUserStateLocked();
            for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) {
            for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) {
                final AccessibilityServiceConnection service = userState.mBoundServices.get(i);
                final AccessibilityServiceConnection service = userState.mBoundServices.get(i);
                if (service.requestImeApis()) {
                if (service.requestImeApis()) {
@@ -4412,16 +4418,21 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
    /**
    /**
     * Start input for accessibility services which request ime capabilities.
     * Start input for accessibility services which request ime capabilities.
     */
     */
    public void startInput(IBinder startInputToken, IInputContext inputContext,
    public void scheduleStartInput(IBinder startInputToken, IInputContext inputContext,
            EditorInfo editorInfo, boolean restarting) {
        mMainHandler.sendMessage(obtainMessage(AccessibilityManagerService::startInput, this,
                startInputToken, inputContext, editorInfo, restarting));
    }

    private void startInput(IBinder startInputToken, IInputContext inputContext,
            EditorInfo editorInfo, boolean restarting) {
            EditorInfo editorInfo, boolean restarting) {
        AccessibilityUserState userState;
        synchronized (mLock) {
        synchronized (mLock) {
            // Keep records of these in case new Accessibility Services are enabled.
            // Keep records of these in case new Accessibility Services are enabled.
            mStartInputToken = startInputToken;
            mStartInputToken = startInputToken;
            mInputContext = inputContext;
            mInputContext = inputContext;
            mEditorInfo = editorInfo;
            mEditorInfo = editorInfo;
            mRestarting = restarting;
            mRestarting = restarting;
            userState = getCurrentUserStateLocked();
            AccessibilityUserState userState = getCurrentUserStateLocked();
            for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) {
            for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) {
                final AccessibilityServiceConnection service = userState.mBoundServices.get(i);
                final AccessibilityServiceConnection service = userState.mBoundServices.get(i);
                if (service.requestImeApis()) {
                if (service.requestImeApis()) {
@@ -4435,11 +4446,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
     * Request input sessions from all accessibility services which request ime capabilities and
     * Request input sessions from all accessibility services which request ime capabilities and
     * whose id is not in the ignoreSet
     * whose id is not in the ignoreSet
     */
     */
    public void createImeSession(ArraySet<Integer> ignoreSet) {
    public void scheduleCreateImeSession(ArraySet<Integer> ignoreSet) {
        AccessibilityUserState userState;
        mMainHandler.sendMessage(obtainMessage(AccessibilityManagerService::createImeSession,
                this, ignoreSet));
    }

    private void createImeSession(ArraySet<Integer> ignoreSet) {
        synchronized (mLock) {
        synchronized (mLock) {
            mInputSessionRequested = true;
            mInputSessionRequested = true;
            userState = getCurrentUserStateLocked();
            AccessibilityUserState userState = getCurrentUserStateLocked();
            for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) {
            for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) {
                final AccessibilityServiceConnection service = userState.mBoundServices.get(i);
                final AccessibilityServiceConnection service = userState.mBoundServices.get(i);
                if ((!ignoreSet.contains(service.mId)) && service.requestImeApis()) {
                if ((!ignoreSet.contains(service.mId)) && service.requestImeApis()) {
@@ -4455,10 +4470,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
     * @param sessions Sessions to enable or disable.
     * @param sessions Sessions to enable or disable.
     * @param enabled True if enable the sessions or false if disable the sessions.
     * @param enabled True if enable the sessions or false if disable the sessions.
     */
     */
    public void setImeSessionEnabled(SparseArray<IInputMethodSession> sessions, boolean enabled) {
    public void scheduleSetImeSessionEnabled(SparseArray<IInputMethodSession> sessions,
        AccessibilityUserState userState;
            boolean enabled) {
        mMainHandler.sendMessage(obtainMessage(AccessibilityManagerService::setImeSessionEnabled,
                this, sessions, enabled));
    }

    private void setImeSessionEnabled(SparseArray<IInputMethodSession> sessions, boolean enabled) {
        synchronized (mLock) {
        synchronized (mLock) {
            userState = getCurrentUserStateLocked();
            AccessibilityUserState userState = getCurrentUserStateLocked();
            for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) {
            for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) {
                final AccessibilityServiceConnection service = userState.mBoundServices.get(i);
                final AccessibilityServiceConnection service = userState.mBoundServices.get(i);
                if (sessions.contains(service.mId) && service.requestImeApis()) {
                if (sessions.contains(service.mId) && service.requestImeApis()) {