Merge "add a test for LOAD_EFFECT_LIBRARY Binder call" into klp-dev
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/LeakTest.java b/tests/tests/renderscript/src/android/renderscript/cts/LeakTest.java
index 7662ffd..ce9153b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/LeakTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/LeakTest.java
@@ -55,7 +55,7 @@
             Allocation A = Allocation.createTyped(mRS, t);
             leak.set_a(A);
             A = null;
-            System.gc();
+            //System.gc();
             leak.destroy();
             mRS.finish();
         }
diff --git a/tests/tests/widget/src/android/widget/cts/ListViewTest.java b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
index d2bd4f4..7af8c2e 100644
--- a/tests/tests/widget/src/android/widget/cts/ListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
@@ -44,6 +44,9 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 import junit.framework.Assert;
@@ -745,4 +748,94 @@
             return new MockView(getContext());
         }
     }
+
+    public void testTransientStateUnstableIds() throws Exception {
+        final ListView listView = mListView;
+        final ArrayList<String> items = new ArrayList<String>(Arrays.asList(mCountryList));
+        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(mActivity,
+                android.R.layout.simple_list_item_1, items);
+
+        mInstrumentation.runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                listView.setAdapter(adapter);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        final View oldItem = listView.getChildAt(2);
+        final CharSequence oldText = ((TextView) oldItem.findViewById(android.R.id.text1))
+                .getText();
+        oldItem.setHasTransientState(true);
+
+        mInstrumentation.runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                adapter.remove(adapter.getItem(0));
+                adapter.notifyDataSetChanged();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        final View newItem = listView.getChildAt(2);
+        final CharSequence newText = ((TextView) newItem.findViewById(android.R.id.text1))
+                .getText();
+
+        Assert.assertFalse(oldText.equals(newText));
+    }
+
+    public void testTransientStateStableIds() throws Exception {
+        final ListView listView = mListView;
+        final ArrayList<String> items = new ArrayList<String>(Arrays.asList(mCountryList));
+        final StableArrayAdapter<String> adapter = new StableArrayAdapter<String>(mActivity,
+                android.R.layout.simple_list_item_1, items);
+
+        mInstrumentation.runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                listView.setAdapter(adapter);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        final Object tag = new Object();
+        final View oldItem = listView.getChildAt(2);
+        final CharSequence oldText = ((TextView) oldItem.findViewById(android.R.id.text1))
+                .getText();
+        oldItem.setHasTransientState(true);
+        oldItem.setTag(tag);
+
+        mInstrumentation.runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                adapter.remove(adapter.getItem(0));
+                adapter.notifyDataSetChanged();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        final View newItem = listView.getChildAt(1);
+        final CharSequence newText = ((TextView) newItem.findViewById(android.R.id.text1))
+                .getText();
+
+        Assert.assertTrue(newItem.hasTransientState());
+        Assert.assertEquals(oldText, newText);
+        Assert.assertEquals(tag, newItem.getTag());
+    }
+
+    private static class StableArrayAdapter<T> extends ArrayAdapter<T> {
+        public StableArrayAdapter(Context context, int resource, List<T> objects) {
+            super(context, resource, objects);
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return getItem(position).hashCode();
+        }
+
+        @Override
+        public boolean hasStableIds() {
+            return true;
+        }
+    }
 }