diff options
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/view/accessibility/AccessibilityCache.java | 17 | ||||
| -rw-r--r-- | core/java/android/view/accessibility/AccessibilityInteractionClient.java | 4 |
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; } |
