Skip to content

Commit 88c6d6e

Browse files
sganovAndroid (Google) Code Review
authored andcommitted
Merge "AccessibilityNodeInfos node properly cached."
2 parents 0d41348 + afd5fab commit 88c6d6e

File tree

1 file changed

+21
-13
lines changed

1 file changed

+21
-13
lines changed

core/java/android/view/accessibility/AccessibilityNodeInfoCache.java

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package android.view.accessibility;
1818

19-
import android.os.Process;
2019
import android.util.Log;
2120
import android.util.LongSparseArray;
2221

@@ -81,14 +80,16 @@ public void onAccessibilityEvent(AccessibilityEvent event) {
8180
public AccessibilityNodeInfo get(long accessibilityNodeId) {
8281
if (ENABLED) {
8382
synchronized(mLock) {
83+
AccessibilityNodeInfo info = mCacheImpl.get(accessibilityNodeId);
84+
if (info != null) {
85+
// Return a copy since the client calls to AccessibilityNodeInfo#recycle()
86+
// will wipe the data of the cached info.
87+
info = AccessibilityNodeInfo.obtain(info);
88+
}
8489
if (DEBUG) {
85-
AccessibilityNodeInfo info = mCacheImpl.get(accessibilityNodeId);
86-
Log.i(LOG_TAG, "Process: " + Process.myPid() +
87-
" get(" + accessibilityNodeId + ") = " + info);
88-
return info;
89-
} else {
90-
return mCacheImpl.get(accessibilityNodeId);
90+
Log.i(LOG_TAG, "get(" + accessibilityNodeId + ") = " + info);
9191
}
92+
return info;
9293
}
9394
} else {
9495
return null;
@@ -105,10 +106,12 @@ public void put(long accessibilityNodeId, AccessibilityNodeInfo info) {
105106
if (ENABLED) {
106107
synchronized(mLock) {
107108
if (DEBUG) {
108-
Log.i(LOG_TAG, "Process: " + Process.myPid()
109-
+ " put(" + accessibilityNodeId + ", " + info + ")");
109+
Log.i(LOG_TAG, "put(" + accessibilityNodeId + ", " + info + ")");
110110
}
111-
mCacheImpl.put(accessibilityNodeId, info);
111+
// Cache a copy since the client calls to AccessibilityNodeInfo#recycle()
112+
// will wipe the data of the cached info.
113+
AccessibilityNodeInfo clone = AccessibilityNodeInfo.obtain(info);
114+
mCacheImpl.put(accessibilityNodeId, clone);
112115
}
113116
}
114117
}
@@ -138,8 +141,7 @@ public void remove(long accessibilityNodeId) {
138141
if (ENABLED) {
139142
synchronized(mLock) {
140143
if (DEBUG) {
141-
Log.i(LOG_TAG, "Process: " + Process.myPid()
142-
+ " remove(" + accessibilityNodeId + ")");
144+
Log.i(LOG_TAG, "remove(" + accessibilityNodeId + ")");
143145
}
144146
mCacheImpl.remove(accessibilityNodeId);
145147
}
@@ -153,7 +155,13 @@ public void clear() {
153155
if (ENABLED) {
154156
synchronized(mLock) {
155157
if (DEBUG) {
156-
Log.i(LOG_TAG, "Process: " + Process.myPid() + "clear()");
158+
Log.i(LOG_TAG, "clear()");
159+
}
160+
// Recycle the nodes before clearing the cache.
161+
final int nodeCount = mCacheImpl.size();
162+
for (int i = 0; i < nodeCount; i++) {
163+
AccessibilityNodeInfo info = mCacheImpl.valueAt(i);
164+
info.recycle();
157165
}
158166
mCacheImpl.clear();
159167
}

0 commit comments

Comments
 (0)