From 6685f1bacead5f765c71a49f5cf0dc88750344d5 Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Mon, 9 Sep 2013 13:36:43 -0700 Subject: [PATCH] AccessibilityNodeInfo incorrectly cloned. The code that creates a clone of an AccessibilityNodeInfo was not cloning the extension objects (CollectionInfo, CollectionItemInfo, and RangeInfo) and as a result if the original accessibility node info is recycled the extension objects of the clone are also recycled and now if one tries to recycle the clone gets an exception that the extension objects are already recycled. Fun! bug:10642952 Change-Id: I84192466bff0e865de04b79079e6ceecdffb37a6 --- .../accessibility/AccessibilityNodeInfo.java | 44 +++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java index ba634212a757e..c61516b4d3c2d 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java @@ -2279,9 +2279,12 @@ public class AccessibilityNodeInfo implements Parcelable { if (other.mExtras != null && !other.mExtras.isEmpty()) { getExtras().putAll(other.mExtras); } - mRangeInfo = other.mRangeInfo; - mCollectionInfo = other.mCollectionInfo; - mCollectionItemInfo = other.mCollectionItemInfo; + mRangeInfo = (other.mRangeInfo != null) + ? RangeInfo.obtain(other.mRangeInfo) : null; + mCollectionInfo = (other.mCollectionInfo != null) + ? CollectionInfo.obtain(other.mCollectionInfo) : null; + mCollectionItemInfo = (other.mCollectionItemInfo != null) + ? CollectionItemInfo.obtain(other.mCollectionItemInfo) : null; } /** @@ -2601,6 +2604,17 @@ public class AccessibilityNodeInfo implements Parcelable { private float mMax; private float mCurrent; + /** + * Obtains a pooled instance that is a clone of another one. + * + * @param other The instance to clone. + * + * @hide + */ + public static RangeInfo obtain(RangeInfo other) { + return obtain(other.mType, other.mMin, other.mMax, other.mCurrent); + } + /** * Obtains a pooled instance. * @@ -2707,6 +2721,18 @@ public class AccessibilityNodeInfo implements Parcelable { private int mColumnCount; private boolean mHierarchical; + /** + * Obtains a pooled instance that is a clone of another one. + * + * @param other The instance to clone. + * + * @hide + */ + public static CollectionInfo obtain(CollectionInfo other) { + return CollectionInfo.obtain(other.mRowCount, other.mColumnCount, + other.mHierarchical); + } + /** * Obtains a pooled instance. * @@ -2795,6 +2821,18 @@ public class AccessibilityNodeInfo implements Parcelable { private static final SynchronizedPool sPool = new SynchronizedPool(MAX_POOL_SIZE); + /** + * Obtains a pooled instance that is a clone of another one. + * + * @param other The instance to clone. + * + * @hide + */ + public static CollectionItemInfo obtain(CollectionItemInfo other) { + return CollectionItemInfo.obtain(other.mRowIndex, other.mRowSpan, + other.mColumnIndex, other.mColumnSpan, other.mHeading); + } + /** * Obtains a pooled instance. *