summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/accessibility/AccessibilityManager.java13
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java23
2 files changed, 28 insertions, 8 deletions
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java
index 8084195468c5..13d5b856ef1e 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -350,7 +350,18 @@ public final class AccessibilityManager {
return;
}
if (!mIsEnabled) {
- throw new IllegalStateException("Accessibility off. Did you forget to check that?");
+ Looper myLooper = Looper.myLooper();
+ if (myLooper == Looper.getMainLooper()) {
+ throw new IllegalStateException(
+ "Accessibility off. Did you forget to check that?");
+ } else {
+ // If we're not running on the thread with the main looper, it's possible for
+ // the state of accessibility to change between checking isEnabled and
+ // calling this method. So just log the error rather than throwing the
+ // exception.
+ Log.e(LOG_TAG, "Interrupt called with accessibility disabled");
+ return;
+ }
}
userId = mUserId;
}
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index df71cedb0fef..386fbc92ef0d 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -560,7 +560,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
@Override
public void interrupt(int userId) {
- CopyOnWriteArrayList<Service> services;
+ List<IAccessibilityServiceClient> interfacesToInterrupt;
synchronized (mLock) {
// We treat calls from a profile as if made by its parent as profiles
// share the accessibility state of the parent. The call below
@@ -571,15 +571,24 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
if (resolvedUserId != mCurrentUserId) {
return;
}
- services = getUserStateLocked(resolvedUserId).mBoundServices;
+ List<Service> services = getUserStateLocked(resolvedUserId).mBoundServices;
+ int numServices = services.size();
+ interfacesToInterrupt = new ArrayList<>(numServices);
+ for (int i = 0; i < numServices; i++) {
+ Service service = services.get(i);
+ IBinder a11yServiceBinder = service.mService;
+ IAccessibilityServiceClient a11yServiceInterface = service.mServiceInterface;
+ if ((a11yServiceBinder != null) && (a11yServiceInterface != null)) {
+ interfacesToInterrupt.add(a11yServiceInterface);
+ }
+ }
}
- for (int i = 0, count = services.size(); i < count; i++) {
- Service service = services.get(i);
+ for (int i = 0, count = interfacesToInterrupt.size(); i < count; i++) {
try {
- service.mServiceInterface.onInterrupt();
+ interfacesToInterrupt.get(i).onInterrupt();
} catch (RemoteException re) {
- Slog.e(LOG_TAG, "Error during sending interrupt request to "
- + service.mService, re);
+ Slog.e(LOG_TAG, "Error sending interrupt request to "
+ + interfacesToInterrupt.get(i), re);
}
}
}