From 6f2da205cc9b737356c67c8007f9fa7fbf92a4df Mon Sep 17 00:00:00 2001 From: Phil Weaver Date: Tue, 5 Sep 2017 16:00:38 -0700 Subject: [PATCH] Don't call disconnected AccessibilityServices An AccessibilityService that doesn't have a connection is not able to access the resources it needs to respond to callbacks. Bug: 65367289 Test: Toggle Select to Speak several times, with and without TalkBack enabled. No longer crashes. A11y unit tests and A11yService CTS passes. Change-Id: I03c647cbaf68d5defcc7fbcec1c746af9968bd35 --- .../AccessibilityService.java | 64 ++++++++++++------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index cec5db94600e5..a558d6850af15 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -26,7 +26,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ParceledListSlice; import android.graphics.Region; -import android.hardware.fingerprint.FingerprintManager; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -52,8 +51,6 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.List; -import static android.content.pm.PackageManager.FEATURE_FINGERPRINT; - /** * Accessibility services should only be used to assist users with disabilities in using * Android devices and apps. They run in the background and receive callbacks by the system @@ -394,7 +391,7 @@ public abstract class AccessibilityService extends Service { public static final int SHOW_MODE_AUTO = 0; public static final int SHOW_MODE_HIDDEN = 1; - private int mConnectionId; + private int mConnectionId = AccessibilityInteractionClient.NO_ID; private AccessibilityServiceInfo mInfo; @@ -1612,7 +1609,7 @@ public abstract class AccessibilityService extends Service { private final Callbacks mCallback; - private int mConnectionId; + private int mConnectionId = AccessibilityInteractionClient.NO_ID; public IAccessibilityServiceClientWrapper(Context context, Looper looper, Callbacks callback) { @@ -1707,7 +1704,8 @@ public abstract class AccessibilityService extends Service { if (event != null) { // Send the event to AccessibilityCache via AccessibilityInteractionClient AccessibilityInteractionClient.getInstance().onAccessibilityEvent(event); - if (serviceWantsEvent) { + if (serviceWantsEvent + && (mConnectionId != AccessibilityInteractionClient.NO_ID)) { // Send the event to AccessibilityService mCallback.onAccessibilityEvent(event); } @@ -1721,7 +1719,9 @@ public abstract class AccessibilityService extends Service { } return; case DO_ON_INTERRUPT: { - mCallback.onInterrupt(); + if (mConnectionId != AccessibilityInteractionClient.NO_ID) { + mCallback.onInterrupt(); + } } return; case DO_INIT: { @@ -1746,8 +1746,10 @@ public abstract class AccessibilityService extends Service { } return; case DO_ON_GESTURE: { - final int gestureId = message.arg1; - mCallback.onGesture(gestureId); + if (mConnectionId != AccessibilityInteractionClient.NO_ID) { + final int gestureId = message.arg1; + mCallback.onGesture(gestureId); + } } return; case DO_CLEAR_ACCESSIBILITY_CACHE: { @@ -1779,37 +1781,51 @@ public abstract class AccessibilityService extends Service { } return; case DO_ON_MAGNIFICATION_CHANGED: { - final SomeArgs args = (SomeArgs) message.obj; - final Region region = (Region) args.arg1; - final float scale = (float) args.arg2; - final float centerX = (float) args.arg3; - final float centerY = (float) args.arg4; - mCallback.onMagnificationChanged(region, scale, centerX, centerY); + if (mConnectionId != AccessibilityInteractionClient.NO_ID) { + final SomeArgs args = (SomeArgs) message.obj; + final Region region = (Region) args.arg1; + final float scale = (float) args.arg2; + final float centerX = (float) args.arg3; + final float centerY = (float) args.arg4; + mCallback.onMagnificationChanged(region, scale, centerX, centerY); + } } return; case DO_ON_SOFT_KEYBOARD_SHOW_MODE_CHANGED: { - final int showMode = (int) message.arg1; - mCallback.onSoftKeyboardShowModeChanged(showMode); + if (mConnectionId != AccessibilityInteractionClient.NO_ID) { + final int showMode = (int) message.arg1; + mCallback.onSoftKeyboardShowModeChanged(showMode); + } } return; case DO_GESTURE_COMPLETE: { - final boolean successfully = message.arg2 == 1; - mCallback.onPerformGestureResult(message.arg1, successfully); + if (mConnectionId != AccessibilityInteractionClient.NO_ID) { + final boolean successfully = message.arg2 == 1; + mCallback.onPerformGestureResult(message.arg1, successfully); + } } return; case DO_ON_FINGERPRINT_ACTIVE_CHANGED: { - mCallback.onFingerprintCapturingGesturesChanged(message.arg1 == 1); + if (mConnectionId != AccessibilityInteractionClient.NO_ID) { + mCallback.onFingerprintCapturingGesturesChanged(message.arg1 == 1); + } } return; case DO_ON_FINGERPRINT_GESTURE: { - mCallback.onFingerprintGesture(message.arg1); + if (mConnectionId != AccessibilityInteractionClient.NO_ID) { + mCallback.onFingerprintGesture(message.arg1); + } } return; case (DO_ACCESSIBILITY_BUTTON_CLICKED): { - mCallback.onAccessibilityButtonClicked(); + if (mConnectionId != AccessibilityInteractionClient.NO_ID) { + mCallback.onAccessibilityButtonClicked(); + } } return; case (DO_ACCESSIBILITY_BUTTON_AVAILABILITY_CHANGED): { - final boolean available = (message.arg1 != 0); - mCallback.onAccessibilityButtonAvailabilityChanged(available); + if (mConnectionId != AccessibilityInteractionClient.NO_ID) { + final boolean available = (message.arg1 != 0); + mCallback.onAccessibilityButtonAvailabilityChanged(available); + } } return; default :