Tests for setItemChecked data invalidation

Verify that when AbsListView.setItemChecked is called with a value that
is equal to the old value, data invalidation and layout request is not
made.

Bug: 25793105
Change-Id: I45186d132e3372b2903f66f12656962b932f0775
diff --git a/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java b/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
index 89a3448..cf8012e 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
@@ -16,6 +16,7 @@
 
 package android.widget.cts;
 
+import android.test.suitebuilder.annotation.MediumTest;
 import android.widget.cts.R;
 
 import org.xmlpull.v1.XmlPullParser;
@@ -648,6 +649,98 @@
         assertFalse(listView.isInFilterMode());
     }
 
+    @MediumTest
+    public void testSetItemChecked_multipleModeSameValue()
+            throws Throwable {
+        // Calling setItemChecked with the same value in multiple choice mode should not cause
+        // requestLayout
+        mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mListView.setItemChecked(0, false);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+        assertFalse(mListView.isLayoutRequested());
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mListView.setItemChecked(0, false);
+            }
+        });
+        assertFalse(mListView.isLayoutRequested());
+    }
+
+    @MediumTest
+    public void testSetItemChecked_singleModeSameValue()
+            throws Throwable {
+        // Calling setItemChecked with the same value in single choice mode should not cause
+        // requestLayout
+        mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mListView.setItemChecked(0, false);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+        assertFalse(mListView.isLayoutRequested());
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mListView.setItemChecked(0, false);
+            }
+        });
+        assertFalse(mListView.isLayoutRequested());
+    }
+
+    @MediumTest
+    public void testSetItemChecked_multipleModeDifferentValue()
+            throws Throwable {
+        // Calling setItemChecked with a different value in multiple choice mode should cause
+        // requestLayout
+        mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mListView.setItemChecked(0, false);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+        assertFalse(mListView.isLayoutRequested());
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mListView.setItemChecked(0, true);
+            }
+        });
+        assertTrue(mListView.isLayoutRequested());
+    }
+
+    @MediumTest
+    public void testSetItemChecked_singleModeDifferentValue()
+            throws Throwable {
+        // Calling setItemChecked with a different value in single choice mode should cause
+        // requestLayout
+        mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mListView.setItemChecked(0, false);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+        assertFalse(mListView.isLayoutRequested());
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mListView.setItemChecked(0, true);
+            }
+        });
+        assertTrue(mListView.isLayoutRequested());
+    }
+
     public void testLayoutChildren() {
         /**
          * the subclass ListView and GridView override this method, so we can not test