From 14e78228a1ad83b3e42347be84a5f58f169d5c93 Mon Sep 17 00:00:00 2001 From: yingleiw Date: Wed, 16 Feb 2022 16:55:17 -0800 Subject: [PATCH] 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 --- .../AccessibilityService.java | 27 +++++++++++-------- ...bstractAccessibilityServiceConnection.java | 11 +++++--- .../AccessibilityManagerService.java | 10 +++---- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index c82f5f6d54fca..3cb04e710d3be 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -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(); } diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java index 7f103144b7fb7..5ef1008afad5b 100644 --- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java +++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java @@ -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); diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 62da981bd9a74..916c18415e49d 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -4292,7 +4292,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( @@ -4300,12 +4300,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(); @@ -4313,7 +4313,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); @@ -4323,7 +4323,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();