summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java51
-rw-r--r--services/accessibility/java/com/android/server/accessibility/TouchExplorer.java8
2 files changed, 48 insertions, 11 deletions
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index aae5dd83723a..d1042b810c5f 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -912,8 +912,21 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
*/
// TODO: (multi-display) Make sure this works for multiple displays.
boolean getAccessibilityFocusClickPointInScreen(Point outPoint) {
- return getInteractionBridgeLocked()
- .getAccessibilityFocusClickPointInScreenNotLocked(outPoint);
+ return getInteractionBridge().getAccessibilityFocusClickPointInScreenNotLocked(outPoint);
+ }
+
+ /**
+ * Perform an accessibility action on the view that currently has accessibility focus.
+ * Has no effect if no item has accessibility focus, if the item with accessibility
+ * focus does not expose the specified action, or if the action fails.
+ *
+ * @param actionId The id of the action to perform.
+ *
+ * @return {@code true} if the action was performed. {@code false} if it was not.
+ */
+ public boolean performActionOnAccessibilityFocusedItem(
+ AccessibilityNodeInfo.AccessibilityAction action) {
+ return getInteractionBridge().performActionOnAccessibilityFocusedItemNotLocked(action);
}
/**
@@ -1029,11 +1042,13 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
onUserStateChangedLocked(userState);
}
- private InteractionBridge getInteractionBridgeLocked() {
- if (mInteractionBridge == null) {
- mInteractionBridge = new InteractionBridge();
+ private InteractionBridge getInteractionBridge() {
+ synchronized (mLock) {
+ if (mInteractionBridge == null) {
+ mInteractionBridge = new InteractionBridge();
+ }
+ return mInteractionBridge;
}
- return mInteractionBridge;
}
private boolean notifyGestureLocked(int gestureId, boolean isDefault) {
@@ -2274,11 +2289,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
case MSG_CLEAR_ACCESSIBILITY_FOCUS: {
final int windowId = msg.arg1;
- InteractionBridge bridge;
- synchronized (mLock) {
- bridge = getInteractionBridgeLocked();
- }
- bridge.clearAccessibilityFocusNotLocked(windowId);
+ getInteractionBridge().clearAccessibilityFocusNotLocked(windowId);
} break;
case MSG_SEND_SERVICES_STATE_CHANGED_TO_CLIENTS: {
@@ -4051,6 +4062,24 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
}
}
+ /**
+ * Perform an accessibility action on the view that currently has accessibility focus.
+ * Has no effect if no item has accessibility focus, if the item with accessibility
+ * focus does not expose the specified action, or if the action fails.
+ *
+ * @param actionId The id of the action to perform.
+ *
+ * @return {@code true} if the action was performed. {@code false} if it was not.
+ */
+ public boolean performActionOnAccessibilityFocusedItemNotLocked(
+ AccessibilityNodeInfo.AccessibilityAction action) {
+ AccessibilityNodeInfo focus = getAccessibilityFocusNotLocked();
+ if ((focus == null) || !focus.getActionList().contains(action)) {
+ return false;
+ }
+ return focus.performAction(action.getId());
+ }
+
public boolean getAccessibilityFocusClickPointInScreenNotLocked(Point outPoint) {
AccessibilityNodeInfo focus = getAccessibilityFocusNotLocked();
if (focus == null) {
diff --git a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
index ecba24501a3e..6e87f88602f1 100644
--- a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
+++ b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
@@ -29,6 +29,7 @@ import android.view.ViewConfiguration;
import android.view.WindowManagerPolicy;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.AccessibilityNodeInfo;
import java.util.ArrayList;
import java.util.Arrays;
@@ -407,6 +408,13 @@ class TouchExplorer implements EventStreamTransformation, AccessibilityGestureDe
mSendTouchInteractionEndDelayed.forceSendAndRemove();
}
+ // Try to use the standard accessibility API to click
+ if (mAms.performActionOnAccessibilityFocusedItem(
+ AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK)) {
+ return true;
+ }
+ Slog.e(LOG_TAG, "ACTION_CLICK failed. Dispatching motion events to simulate click.");
+
final int pointerIndex = event.getActionIndex();
final int pointerId = event.getPointerId(pointerIndex);