Skip to content

Commit 1f22b6a

Browse files
committed
Accessibility services that do not accept events are mismanaged.
1. If an accessibility service does not specify that it handles any event types it was never added to the list of services while the system is bound to it. Since the service is not in the list with enabled services we never unbind it, hence it consumes resources without doing nothing. This is also semantically incorrect because a sevice may not want to receive events while handling only gestures. bug:5648345 Change-Id: Id478a4704cdeeb1729330f6ae4b8ff9e06320952
1 parent 7befb7d commit 1f22b6a

File tree

1 file changed

+9
-11
lines changed

1 file changed

+9
-11
lines changed

services/java/com/android/server/accessibility/AccessibilityManagerService.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -827,7 +827,7 @@ private void notifyAccessibilityServicesDelayedLocked(AccessibilityEvent event,
827827
private void tryAddServiceLocked(Service service, int userId) {
828828
try {
829829
UserState userState = getUserStateLocked(userId);
830-
if (userState.mServices.contains(service) || !service.isConfigured()) {
830+
if (userState.mServices.contains(service)) {
831831
return;
832832
}
833833
service.linkToOwnDeath();
@@ -876,7 +876,7 @@ private boolean tryRemoveServiceLocked(Service service) {
876876
private boolean canDispathEventLocked(Service service, AccessibilityEvent event,
877877
int handledFeedbackTypes) {
878878

879-
if (!service.isConfigured()) {
879+
if (!service.canReceiveEvents()) {
880880
return false;
881881
}
882882

@@ -1192,7 +1192,8 @@ private void handleTouchExplorationGrantedAccessibilityServicesChangedLocked(
11921192

11931193
private void tryEnableTouchExplorationLocked(final Service service) {
11941194
UserState userState = getUserStateLocked(service.mUserId);
1195-
if (!userState.mIsTouchExplorationEnabled && service.mRequestTouchExplorationMode) {
1195+
if (!userState.mIsTouchExplorationEnabled && service.mRequestTouchExplorationMode
1196+
&& service.canReceiveEvents()) {
11961197
final boolean canToggleTouchExploration =
11971198
userState.mTouchExplorationGrantedServices.contains(service.mComponentName);
11981199
if (!service.mIsAutomation && !canToggleTouchExploration) {
@@ -1205,6 +1206,9 @@ private void tryEnableTouchExplorationLocked(final Service service) {
12051206
}
12061207

12071208
private void tryDisableTouchExplorationLocked(Service service) {
1209+
if (!service.canReceiveEvents()) {
1210+
return;
1211+
}
12081212
UserState userState = getUserStateLocked(service.mUserId);
12091213
if (userState.mIsTouchExplorationEnabled) {
12101214
final int serviceCount = userState.mServices.size();
@@ -1464,7 +1468,7 @@ public void setDynamicallyConfigurableProperties(AccessibilityServiceInfo info)
14641468
// If this service is up and running we may have to enable touch
14651469
// exploration, otherwise this will happen when the service connects.
14661470
synchronized (mLock) {
1467-
if (isConfigured()) {
1471+
if (canReceiveEvents()) {
14681472
if (mRequestTouchExplorationMode) {
14691473
tryEnableTouchExplorationLocked(this);
14701474
} else {
@@ -1505,13 +1509,7 @@ public boolean unbind() {
15051509
return false;
15061510
}
15071511

1508-
/**
1509-
* Returns if the service is configured i.e. at least event types of interest
1510-
* and feedback type must be set.
1511-
*
1512-
* @return True if the service is configured, false otherwise.
1513-
*/
1514-
public boolean isConfigured() {
1512+
public boolean canReceiveEvents() {
15151513
return (mEventTypes != 0 && mFeedbackType != 0 && mService != null);
15161514
}
15171515

0 commit comments

Comments
 (0)