summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/view/accessibility/AccessibilityCache.java17
-rw-r--r--core/java/android/view/accessibility/AccessibilityInteractionClient.java4
2 files changed, 19 insertions, 2 deletions
diff --git a/core/java/android/view/accessibility/AccessibilityCache.java b/core/java/android/view/accessibility/AccessibilityCache.java
index dc019909129d..91ef8a560013 100644
--- a/core/java/android/view/accessibility/AccessibilityCache.java
+++ b/core/java/android/view/accessibility/AccessibilityCache.java
@@ -20,6 +20,7 @@ package android.view.accessibility;
import static android.view.accessibility.AccessibilityNodeInfo.FOCUS_ACCESSIBILITY;
import android.os.Build;
+import android.os.SystemClock;
import android.util.ArraySet;
import android.util.Log;
import android.util.LongArray;
@@ -71,6 +72,11 @@ public class AccessibilityCache {
private long mAccessibilityFocus = AccessibilityNodeInfo.UNDEFINED_ITEM_ID;
private long mInputFocus = AccessibilityNodeInfo.UNDEFINED_ITEM_ID;
+ /**
+ * The event time of the {@link AccessibilityEvent} which presents the populated windows cache
+ * before it is stale.
+ */
+ private long mValidWindowCacheTimeStamp = 0;
private int mAccessibilityFocusedWindow = AccessibilityWindowInfo.UNDEFINED_WINDOW_ID;
private int mInputFocusWindow = AccessibilityWindowInfo.UNDEFINED_WINDOW_ID;
@@ -97,13 +103,20 @@ public class AccessibilityCache {
* The key of SparseArray is display ID.
*
* @param windowsOnAllDisplays The accessibility windows of all displays.
+ * @param populationTimeStamp The timestamp from {@link SystemClock#uptimeMillis()} when the
+ * client requests the data.
*/
public void setWindowsOnAllDisplays(
- SparseArray<List<AccessibilityWindowInfo>> windowsOnAllDisplays) {
+ SparseArray<List<AccessibilityWindowInfo>> windowsOnAllDisplays,
+ long populationTimeStamp) {
synchronized (mLock) {
if (DEBUG) {
Log.i(LOG_TAG, "Set windows");
}
+ if (mValidWindowCacheTimeStamp > populationTimeStamp) {
+ // Discard the windows because it might be stale.
+ return;
+ }
clearWindowCacheLocked();
if (windowsOnAllDisplays == null) {
return;
@@ -224,6 +237,7 @@ public class AccessibilityCache {
} break;
case AccessibilityEvent.TYPE_WINDOWS_CHANGED:
+ mValidWindowCacheTimeStamp = event.getEventTime();
if (event.getWindowChanges()
== AccessibilityEvent.WINDOWS_CHANGE_ACCESSIBILITY_FOCUSED) {
// Don't need to clear all cache. Unless the changes are related to
@@ -232,6 +246,7 @@ public class AccessibilityCache {
break;
}
case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: {
+ mValidWindowCacheTimeStamp = event.getEventTime();
clear();
} break;
}
diff --git a/core/java/android/view/accessibility/AccessibilityInteractionClient.java b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
index 6975bb2ed603..bc2148840187 100644
--- a/core/java/android/view/accessibility/AccessibilityInteractionClient.java
+++ b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
@@ -435,8 +435,10 @@ public final class AccessibilityInteractionClient
}
}
+ long populationTimeStamp;
final long identityToken = Binder.clearCallingIdentity();
try {
+ populationTimeStamp = SystemClock.uptimeMillis();
windows = connection.getWindows();
} finally {
Binder.restoreCallingIdentity(identityToken);
@@ -446,7 +448,7 @@ public final class AccessibilityInteractionClient
}
if (windows != null) {
if (sAccessibilityCache != null) {
- sAccessibilityCache.setWindowsOnAllDisplays(windows);
+ sAccessibilityCache.setWindowsOnAllDisplays(windows, populationTimeStamp);
}
return windows;
}