Merge "Fix bug 6499508" into jb-dev
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java
index e1abb23..f85007e 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java
@@ -41,7 +41,8 @@
 import com.android.systemui.SwipeHelper;
 import com.android.systemui.recent.RecentsPanelView.TaskDescriptionAdapter;
 
-import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
 
 public class RecentsHorizontalScrollView extends HorizontalScrollView
         implements SwipeHelper.Callback, RecentsPanelView.RecentsScrollView {
@@ -53,7 +54,7 @@
     protected int mLastScrollPosition;
     private SwipeHelper mSwipeHelper;
     private RecentsScrollViewPerformanceHelper mPerformanceHelper;
-    private ArrayList<View> mRecycledViews;
+    private HashSet<View> mRecycledViews;
     private int mNumItemsInOneScreenful;
 
     public RecentsHorizontalScrollView(Context context, AttributeSet attrs) {
@@ -62,7 +63,7 @@
         float pagingTouchSlop = ViewConfiguration.get(mContext).getScaledPagingTouchSlop();
         mSwipeHelper = new SwipeHelper(SwipeHelper.Y, this, densityScale, pagingTouchSlop);
         mPerformanceHelper = RecentsScrollViewPerformanceHelper.create(context, attrs, this, false);
-        mRecycledViews = new ArrayList<View>();
+        mRecycledViews = new HashSet<View>();
     }
 
     public void setMinSwipeAlpha(float minAlpha) {
@@ -89,16 +90,12 @@
         setLayoutTransition(null);
 
         mLinearLayout.removeAllViews();
-        for (int i = 0; i < mRecycledViews.size(); i++) {
-            View child = mRecycledViews.get(i);
-            if (child.getParent() != null) {
-                throw new RuntimeException("Recycled child has a parent");
-            }
-        }
+        Iterator<View> recycledViews = mRecycledViews.iterator();
         for (int i = 0; i < mAdapter.getCount(); i++) {
             View old = null;
-            if (mRecycledViews.size() != 0) {
-                old = mRecycledViews.remove(mRecycledViews.size() - 1);
+            if (recycledViews.hasNext()) {
+                old = recycledViews.next();
+                recycledViews.remove();
                 old.setVisibility(VISIBLE);
             }
 
@@ -195,9 +192,6 @@
     public void onChildDismissed(View v) {
         addToRecycledViews(v);
         mLinearLayout.removeView(v);
-        if (v.getParent() != null) {
-            throw new RuntimeException("Recycled child has parent");
-        }
         mCallback.handleSwipe(v);
         // Restore the alpha/translation parameters to what they were before swiping
         // (for when these items are recycled)
@@ -369,15 +363,9 @@
         mNumItemsInOneScreenful =
                 (int) FloatMath.ceil(dm.widthPixels / (float) child.getMeasuredWidth());
         addToRecycledViews(child);
-        if (child.getParent() != null) {
-            throw new RuntimeException("First recycled child has parent");
-        }
 
         for (int i = 0; i < mNumItemsInOneScreenful - 1; i++) {
             addToRecycledViews(mAdapter.createView(mLinearLayout));
-            if (mRecycledViews.get(mRecycledViews.size() - 1).getParent() != null) {
-                throw new RuntimeException("Recycled child has parent");
-            }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
index a1e36fb..d387515 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
@@ -41,7 +41,8 @@
 import com.android.systemui.SwipeHelper;
 import com.android.systemui.recent.RecentsPanelView.TaskDescriptionAdapter;
 
-import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
 
 public class RecentsVerticalScrollView extends ScrollView
         implements SwipeHelper.Callback, RecentsPanelView.RecentsScrollView {
@@ -53,7 +54,7 @@
     protected int mLastScrollPosition;
     private SwipeHelper mSwipeHelper;
     private RecentsScrollViewPerformanceHelper mPerformanceHelper;
-    private ArrayList<View> mRecycledViews;
+    private HashSet<View> mRecycledViews;
     private int mNumItemsInOneScreenful;
 
     public RecentsVerticalScrollView(Context context, AttributeSet attrs) {
@@ -63,7 +64,7 @@
         mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, densityScale, pagingTouchSlop);
 
         mPerformanceHelper = RecentsScrollViewPerformanceHelper.create(context, attrs, this, true);
-        mRecycledViews = new ArrayList<View>();
+        mRecycledViews = new HashSet<View>();
     }
 
     public void setMinSwipeAlpha(float minAlpha) {
@@ -93,19 +94,16 @@
         setLayoutTransition(null);
 
         mLinearLayout.removeAllViews();
-        for (int i = 0; i < mRecycledViews.size(); i++) {
-            View child = mRecycledViews.get(i);
-            if (child.getParent() != null) {
-                throw new RuntimeException("Recycled child has parent");
-            }
-        }
+
         // Once we can clear the data associated with individual item views,
         // we can get rid of the removeAllViews() and the code below will
         // recycle them.
+        Iterator<View> recycledViews = mRecycledViews.iterator();
         for (int i = 0; i < mAdapter.getCount(); i++) {
             View old = null;
-            if (mRecycledViews.size() != 0) {
-                old = mRecycledViews.remove(mRecycledViews.size() - 1);
+            if (recycledViews.hasNext()) {
+                old = recycledViews.next();
+                recycledViews.remove();
                 old.setVisibility(VISIBLE);
                 if (old.getParent() != null) {
                     throw new RuntimeException("Recycled child has parent (i: " + i + ", recycled i: " + mRecycledViews.size());
@@ -150,9 +148,6 @@
             thumbnailView.setClickable(true);
             thumbnailView.setOnClickListener(launchAppListener);
             thumbnailView.setOnLongClickListener(longClickListener);
-            if (view.getParent() != null) {
-                throw new RuntimeException("Recycled child has parent");
-            }
 
             // We don't want to dismiss recents if a user clicks on the app title
             // (we also don't want to launch the app either, though, because the
@@ -162,9 +157,6 @@
             appTitle.setOnTouchListener(noOpListener);
             final View calloutLine = view.findViewById(R.id.recents_callout_line);
             calloutLine.setOnTouchListener(noOpListener);
-            if (view.getParent() != null) {
-                throw new RuntimeException("Recycled child has parent");
-            }
 
             mLinearLayout.addView(view);
         }
@@ -213,9 +205,6 @@
     public void onChildDismissed(View v) {
         addToRecycledViews(v);
         mLinearLayout.removeView(v);
-        if (v.getParent() != null) {
-            throw new RuntimeException("Recycled child has parent");
-        }
         mCallback.handleSwipe(v);
         // Restore the alpha/translation parameters to what they were before swiping
         // (for when these items are recycled)
@@ -389,15 +378,9 @@
         mNumItemsInOneScreenful =
                 (int) FloatMath.ceil(dm.heightPixels / (float) child.getMeasuredHeight());
         addToRecycledViews(child);
-        if (child.getParent() != null) {
-            throw new RuntimeException("First recycled child has parent");
-        }
 
         for (int i = 0; i < mNumItemsInOneScreenful - 1; i++) {
             addToRecycledViews(mAdapter.createView(mLinearLayout));
-            if (mRecycledViews.get(mRecycledViews.size() - 1).getParent() != null) {
-                throw new RuntimeException("Recycled child has parent");
-            }
         }
     }