diff options
| author | Svetoslav Ganov <svetoslavganov@google.com> | 2012-02-24 10:15:29 -0800 |
|---|---|---|
| committer | Svetoslav Ganov <svetoslavganov@google.com> | 2012-02-24 10:22:00 -0800 |
| commit | afd5fab3ab001e90269dfef37d87e69e0e261826 (patch) | |
| tree | 21d0e9b38abbd01b4094b25d3b6d16e54c1624ca /core/java/android/view/accessibility | |
| parent | 42d840b91d161fe98ebe3305f011b3b0f6d4561c (diff) | |
| download | frameworks_base-afd5fab3ab001e90269dfef37d87e69e0e261826.zip frameworks_base-afd5fab3ab001e90269dfef37d87e69e0e261826.tar.gz frameworks_base-afd5fab3ab001e90269dfef37d87e69e0e261826.tar.bz2 | |
AccessibilityNodeInfos node properly cached.
1. AccessibilityNodeInfo were not cloned when cached
and obtained from the cache. This was causing a
problem when the client calls #recycle() as he
should since this results in wiping the data of
the cached node info.
bug:6026952
Change-Id: I5807b09d95ef6f310327192ff91f036adf337e33
Diffstat (limited to 'core/java/android/view/accessibility')
| -rw-r--r-- | core/java/android/view/accessibility/AccessibilityNodeInfoCache.java | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfoCache.java b/core/java/android/view/accessibility/AccessibilityNodeInfoCache.java index 4fb0046..dfbfc70 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfoCache.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfoCache.java @@ -16,7 +16,6 @@ package android.view.accessibility; -import android.os.Process; import android.util.Log; import android.util.LongSparseArray; @@ -81,14 +80,16 @@ public class AccessibilityNodeInfoCache { public AccessibilityNodeInfo get(long accessibilityNodeId) { if (ENABLED) { synchronized(mLock) { + AccessibilityNodeInfo info = mCacheImpl.get(accessibilityNodeId); + if (info != null) { + // Return a copy since the client calls to AccessibilityNodeInfo#recycle() + // will wipe the data of the cached info. + info = AccessibilityNodeInfo.obtain(info); + } if (DEBUG) { - AccessibilityNodeInfo info = mCacheImpl.get(accessibilityNodeId); - Log.i(LOG_TAG, "Process: " + Process.myPid() + - " get(" + accessibilityNodeId + ") = " + info); - return info; - } else { - return mCacheImpl.get(accessibilityNodeId); + Log.i(LOG_TAG, "get(" + accessibilityNodeId + ") = " + info); } + return info; } } else { return null; @@ -105,10 +106,12 @@ public class AccessibilityNodeInfoCache { if (ENABLED) { synchronized(mLock) { if (DEBUG) { - Log.i(LOG_TAG, "Process: " + Process.myPid() - + " put(" + accessibilityNodeId + ", " + info + ")"); + Log.i(LOG_TAG, "put(" + accessibilityNodeId + ", " + info + ")"); } - mCacheImpl.put(accessibilityNodeId, info); + // Cache a copy since the client calls to AccessibilityNodeInfo#recycle() + // will wipe the data of the cached info. + AccessibilityNodeInfo clone = AccessibilityNodeInfo.obtain(info); + mCacheImpl.put(accessibilityNodeId, clone); } } } @@ -138,8 +141,7 @@ public class AccessibilityNodeInfoCache { if (ENABLED) { synchronized(mLock) { if (DEBUG) { - Log.i(LOG_TAG, "Process: " + Process.myPid() - + " remove(" + accessibilityNodeId + ")"); + Log.i(LOG_TAG, "remove(" + accessibilityNodeId + ")"); } mCacheImpl.remove(accessibilityNodeId); } @@ -153,7 +155,13 @@ public class AccessibilityNodeInfoCache { if (ENABLED) { synchronized(mLock) { if (DEBUG) { - Log.i(LOG_TAG, "Process: " + Process.myPid() + "clear()"); + Log.i(LOG_TAG, "clear()"); + } + // Recycle the nodes before clearing the cache. + final int nodeCount = mCacheImpl.size(); + for (int i = 0; i < nodeCount; i++) { + AccessibilityNodeInfo info = mCacheImpl.valueAt(i); + info.recycle(); } mCacheImpl.clear(); } |
