summaryrefslogtreecommitdiffstats
path: root/core/java/android/view/accessibility
diff options
context:
space:
mode:
authorSvetoslav <svetoslavganov@google.com>2015-01-30 20:28:41 -0800
committerSvetoslav Ganov <svetoslavganov@google.com>2015-02-02 23:17:17 +0000
commitded133c446fa9d0d23e6bde19a66fb2ce3980491 (patch)
tree41f26af8f4fce5f667a3c167ff6ddfae503b9663 /core/java/android/view/accessibility
parent175ddbcf2ed71fdcd44a9b64cdc5d479df496a4d (diff)
downloadframeworks_base-ded133c446fa9d0d23e6bde19a66fb2ce3980491.zip
frameworks_base-ded133c446fa9d0d23e6bde19a66fb2ce3980491.tar.gz
frameworks_base-ded133c446fa9d0d23e6bde19a66fb2ce3980491.tar.bz2
Fix broken activation of the selected view in accessibility mode.
We were using an approximation to determine where to send a pair of down and up events to click on the view that has accessibility focus. We were doing reverse computation to figuring out which portion of the view is not covered by interactive views and get a point in this region. However, determining whether a view is interactive is not feasible in general since for example may override onTouchEvent. This results in views not being activated or which is worse wrong views being activated. This change swithes to a new approach to activate views in accessibility mode which is guaranteed to always work except the very rare case of a view that overrides dispatchTouchEvent (which developers shouldn't be doing). The new approach is to flag the down and up events pair sent by the touch explorer as targeting the accessibility focused view. Such events are dispatched such that views predecessors of the accessibility focus do not handle them guaranteeing that these events reach the accessibiliy focused view. Once the accessibiliy focused view gets such an event it clears the flag and the event is dispatched following the normal event dispatch semantics. The new approach is semantically equivalent to requesting the view to perform a click accessiblitiy action but is more generic as it is not affected by views not implementing click action support correctly. bug:18986806 bug:18889611 Change-Id: Id4b7b886c9fd34f7eb11e606636d8e3bab122869
Diffstat (limited to 'core/java/android/view/accessibility')
-rw-r--r--core/java/android/view/accessibility/AccessibilityInteractionClient.java68
-rw-r--r--core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl4
-rw-r--r--core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl8
3 files changed, 0 insertions, 80 deletions
diff --git a/core/java/android/view/accessibility/AccessibilityInteractionClient.java b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
index 374f7e0..cefd34d 100644
--- a/core/java/android/view/accessibility/AccessibilityInteractionClient.java
+++ b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
@@ -99,8 +99,6 @@ public final class AccessibilityInteractionClient
private boolean mPerformAccessibilityActionResult;
- private Point mComputeClickPointResult;
-
private Message mSameThreadMessage;
private static final SparseArray<IAccessibilityServiceConnection> sConnectionCache =
@@ -522,43 +520,6 @@ public final class AccessibilityInteractionClient
return false;
}
- /**
- * Computes a point in screen coordinates where sending a down/up events would
- * perform a click on an {@link AccessibilityNodeInfo}.
- *
- * @param connectionId The id of a connection for interacting with the system.
- * @param accessibilityWindowId A unique window id. Use
- * {@link android.view.accessibility.AccessibilityNodeInfo#ACTIVE_WINDOW_ID}
- * to query the currently active window.
- * @param accessibilityNodeId A unique view id or virtual descendant id from
- * where to start the search. Use
- * {@link android.view.accessibility.AccessibilityNodeInfo#ROOT_NODE_ID}
- * to start from the root.
- * @return Point the click point of null if no such point.
- */
- public Point computeClickPointInScreen(int connectionId, int accessibilityWindowId,
- long accessibilityNodeId) {
- try {
- IAccessibilityServiceConnection connection = getConnection(connectionId);
- if (connection != null) {
- final int interactionId = mInteractionIdCounter.getAndIncrement();
- final boolean success = connection.computeClickPointInScreen(
- accessibilityWindowId, accessibilityNodeId,
- interactionId, this, Thread.currentThread().getId());
- if (success) {
- return getComputeClickPointInScreenResultAndClear(interactionId);
- }
- } else {
- if (DEBUG) {
- Log.w(LOG_TAG, "No connection for connection id: " + connectionId);
- }
- }
- } catch (RemoteException re) {
- Log.w(LOG_TAG, "Error while calling remote computeClickPointInScreen", re);
- }
- return null;
- }
-
public void clearCache() {
sAccessibilityCache.clear();
}
@@ -674,34 +635,6 @@ public final class AccessibilityInteractionClient
}
/**
- * Gets the result of a request to compute a point in screen for clicking on a node.
- *
- * @param interactionId The interaction id to match the result with the request.
- * @return The point or null if no such point.
- */
- private Point getComputeClickPointInScreenResultAndClear(int interactionId) {
- synchronized (mInstanceLock) {
- final boolean success = waitForResultTimedLocked(interactionId);
- Point result = success ? mComputeClickPointResult : null;
- clearResultLocked();
- return result;
- }
- }
-
- /**
- * {@inheritDoc}
- */
- public void setComputeClickPointInScreenActionResult(Point point, int interactionId) {
- synchronized (mInstanceLock) {
- if (interactionId > mInteractionId) {
- mComputeClickPointResult = point;
- mInteractionId = interactionId;
- }
- mInstanceLock.notifyAll();
- }
- }
-
- /**
* Clears the result state.
*/
private void clearResultLocked() {
@@ -709,7 +642,6 @@ public final class AccessibilityInteractionClient
mFindAccessibilityNodeInfoResult = null;
mFindAccessibilityNodeInfosResult = null;
mPerformAccessibilityActionResult = false;
- mComputeClickPointResult = null;
}
/**
diff --git a/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl b/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl
index 66a3f46..cecc4af 100644
--- a/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl
+++ b/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl
@@ -54,8 +54,4 @@ oneway interface IAccessibilityInteractionConnection {
void performAccessibilityAction(long accessibilityNodeId, int action, in Bundle arguments,
int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags,
int interrogatingPid, long interrogatingTid);
-
- void computeClickPointInScreen(long accessibilityNodeId, in Region bounds, int interactionId,
- IAccessibilityInteractionConnectionCallback callback, int interrogatingPid,
- long interrogatingTid, in MagnificationSpec spec);
}
diff --git a/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl b/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl
index f480216..42ae1b3 100644
--- a/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl
+++ b/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl
@@ -52,12 +52,4 @@ oneway interface IAccessibilityInteractionConnectionCallback {
* @param interactionId The interaction id to match the result with the request.
*/
void setPerformAccessibilityActionResult(boolean succeeded, int interactionId);
-
- /**
- * Sets the result of a request to compute a point for clicking in a view.
- *
- * @param point The point of null if no such point.
- * @param interactionId The interaction id to match the result with the request.
- */
- void setComputeClickPointInScreenActionResult(in Point point, int interactionId);
}