1616
1717package android .view .accessibility ;
1818
19- import android .os .Process ;
2019import android .util .Log ;
2120import 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