summaryrefslogtreecommitdiffstats
path: root/core/java/android/view/accessibility
diff options
context:
space:
mode:
authorSvetoslav Ganov <svetoslavganov@google.com>2012-02-24 10:15:29 -0800
committerSvetoslav Ganov <svetoslavganov@google.com>2012-02-24 10:22:00 -0800
commitafd5fab3ab001e90269dfef37d87e69e0e261826 (patch)
tree21d0e9b38abbd01b4094b25d3b6d16e54c1624ca /core/java/android/view/accessibility
parent42d840b91d161fe98ebe3305f011b3b0f6d4561c (diff)
downloadframeworks_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.java34
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();
}