diff options
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/view/accessibility/AccessibilityCache.java | 77 |
1 files changed, 28 insertions, 49 deletions
diff --git a/core/java/android/view/accessibility/AccessibilityCache.java b/core/java/android/view/accessibility/AccessibilityCache.java index 9ab2c2b8bcb1..d14dc6e71c00 100644 --- a/core/java/android/view/accessibility/AccessibilityCache.java +++ b/core/java/android/view/accessibility/AccessibilityCache.java @@ -158,6 +158,7 @@ public class AccessibilityCache { * @param event An event. */ public void onAccessibilityEvent(AccessibilityEvent event) { + AccessibilityNodeInfo nodeToRefresh = null; synchronized (mLock) { if (DEBUG) { Log.i(LOG_TAG, "onAccessibilityEvent(" + event + ")"); @@ -166,17 +167,19 @@ public class AccessibilityCache { switch (eventType) { case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: { if (mAccessibilityFocus != AccessibilityNodeInfo.UNDEFINED_ITEM_ID) { - refreshCachedNodeLocked(mAccessibilityFocusedWindow, mAccessibilityFocus); + removeCachedNodeLocked(mAccessibilityFocusedWindow, mAccessibilityFocus); } mAccessibilityFocus = event.getSourceNodeId(); mAccessibilityFocusedWindow = event.getWindowId(); - refreshCachedNodeLocked(mAccessibilityFocusedWindow, mAccessibilityFocus); + nodeToRefresh = removeCachedNodeLocked(mAccessibilityFocusedWindow, + mAccessibilityFocus); } break; case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED: { if (mAccessibilityFocus == event.getSourceNodeId() && mAccessibilityFocusedWindow == event.getWindowId()) { - refreshCachedNodeLocked(mAccessibilityFocusedWindow, mAccessibilityFocus); + nodeToRefresh = removeCachedNodeLocked(mAccessibilityFocusedWindow, + mAccessibilityFocus); mAccessibilityFocus = AccessibilityNodeInfo.UNDEFINED_ITEM_ID; mAccessibilityFocusedWindow = AccessibilityWindowInfo.UNDEFINED_WINDOW_ID; } @@ -184,17 +187,18 @@ public class AccessibilityCache { case AccessibilityEvent.TYPE_VIEW_FOCUSED: { if (mInputFocus != AccessibilityNodeInfo.UNDEFINED_ITEM_ID) { - refreshCachedNodeLocked(event.getWindowId(), mInputFocus); + removeCachedNodeLocked(event.getWindowId(), mInputFocus); } mInputFocus = event.getSourceNodeId(); - refreshCachedNodeLocked(event.getWindowId(), mInputFocus); + nodeToRefresh = removeCachedNodeLocked(event.getWindowId(), mInputFocus); } break; case AccessibilityEvent.TYPE_VIEW_SELECTED: case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED: case AccessibilityEvent.TYPE_VIEW_CLICKED: case AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED: { - refreshCachedNodeLocked(event.getWindowId(), event.getSourceNodeId()); + nodeToRefresh = removeCachedNodeLocked(event.getWindowId(), + event.getSourceNodeId()); } break; case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED: { @@ -205,7 +209,7 @@ public class AccessibilityCache { & AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE) != 0) { clearSubTreeLocked(windowId, sourceId); } else { - refreshCachedNodeLocked(windowId, sourceId); + nodeToRefresh = removeCachedNodeLocked(windowId, sourceId); } } } break; @@ -218,8 +222,8 @@ public class AccessibilityCache { if (event.getWindowChanges() == AccessibilityEvent.WINDOWS_CHANGE_ACCESSIBILITY_FOCUSED) { // Don't need to clear all cache. Unless the changes are related to - // content, we won't clear all cache here. - refreshCachedWindowLocked(event.getWindowId()); + // content, we won't clear all cache here with clear(). + clearWindowCacheLocked(); break; } case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: { @@ -228,59 +232,34 @@ public class AccessibilityCache { } } + if (nodeToRefresh != null) { + if (DEBUG) { + Log.i(LOG_TAG, "Refreshing and re-adding cached node."); + } + if (mAccessibilityNodeRefresher.refreshNode(nodeToRefresh, true)) { + add(nodeToRefresh); + } + } if (CHECK_INTEGRITY) { checkIntegrity(); } } - private void refreshCachedNodeLocked(int windowId, long sourceId) { + private AccessibilityNodeInfo removeCachedNodeLocked(int windowId, long sourceId) { if (DEBUG) { - Log.i(LOG_TAG, "Refreshing cached node."); + Log.i(LOG_TAG, "Removing cached node."); } - LongSparseArray<AccessibilityNodeInfo> nodes = mNodeCache.get(windowId); if (nodes == null) { - return; + return null; } AccessibilityNodeInfo cachedInfo = nodes.get(sourceId); // If the source is not in the cache - nothing to do. if (cachedInfo == null) { - return; - } - // The node changed so we will just refresh it right now. - if (mAccessibilityNodeRefresher.refreshNode(cachedInfo, true)) { - return; - } - // Weird, we could not refresh. Just evict the entire sub-tree. - clearSubTreeLocked(windowId, sourceId); - } - - private void refreshCachedWindowLocked(int windowId) { - if (DEBUG) { - Log.i(LOG_TAG, "Refreshing cached window."); - } - - if (windowId == AccessibilityWindowInfo.UNDEFINED_WINDOW_ID) { - return; - } - - final int displayCounts = mWindowCacheByDisplay.size(); - for (int i = 0; i < displayCounts; i++) { - final SparseArray<AccessibilityWindowInfo> windowsOfDisplay = - mWindowCacheByDisplay.valueAt(i); - if (windowsOfDisplay == null) { - continue; - } - final AccessibilityWindowInfo window = windowsOfDisplay.get(windowId); - if (window == null) { - continue; - } - if (!mAccessibilityNodeRefresher.refreshWindow(window)) { - // If we fail to refresh the window, clear all windows. - clearWindowCacheLocked(); - } - return; + return null; } + nodes.remove(sourceId); + return cachedInfo; } /** @@ -450,7 +429,7 @@ public class AccessibilityCache { if (clone.isAccessibilityFocused()) { if (mAccessibilityFocus != AccessibilityNodeInfo.UNDEFINED_ITEM_ID && mAccessibilityFocus != sourceId) { - refreshCachedNodeLocked(windowId, mAccessibilityFocus); + removeCachedNodeLocked(windowId, mAccessibilityFocus); } mAccessibilityFocus = sourceId; mAccessibilityFocusedWindow = windowId; |
