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 14e78228a1)
This commit is contained in:
yingleiw
2022-02-16 16:55:17 -08:00
committed by Yinglei Wang
parent 87d60042aa
commit 89da511a1f
3 changed files with 29 additions and 19 deletions

View File

@@ -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();
}

View File

@@ -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);

View File

@@ -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();