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:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user