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 0e99265905119..b663521e222f5 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -4302,7 +4302,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( @@ -4310,12 +4310,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(); @@ -4323,7 +4323,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); @@ -4333,7 +4333,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();