Test for scroll after stretch

Bug: 189294917

Test for scrolling immediately after stretching ListView.

Test: this
Change-Id: Ie456f40a9d1a5b84fb1a0458e352bc9498ca24ed
diff --git a/tests/tests/widget/src/android/widget/cts/ListViewTest.java b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
index 2c00682..f58eaa0 100644
--- a/tests/tests/widget/src/android/widget/cts/ListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
@@ -80,6 +80,7 @@
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.compatibility.common.util.CtsKeyEventUtil;
+import com.android.compatibility.common.util.CtsTouchUtils;
 import com.android.compatibility.common.util.PollingCheck;
 import com.android.compatibility.common.util.WidgetTestUtils;
 
@@ -1271,6 +1272,63 @@
         assertTrue(edgeEffect.onAbsorbVelocity > 0);
     }
 
+    @Test
+    public void testScrollAfterStretch() throws Throwable {
+        showOnlyStretch();
+        NoReleaseEdgeEffect edgeEffect = new NoReleaseEdgeEffect(mActivity);
+        mActivityRule.runOnUiThread(() -> {
+            mListViewStretch.setAdapter(new ClickColorAdapter(mActivity, mColorList));
+            mListViewStretch.mEdgeGlowTop = edgeEffect;
+        });
+        mActivityRule.runOnUiThread(() -> {});
+
+        int[] locationOnScreen = new int[2];
+        mActivityRule.runOnUiThread(() -> {
+            mListViewStretch.getLocationOnScreen(locationOnScreen);
+        });
+
+        int screenX = locationOnScreen[0];
+        int screenY = locationOnScreen[1];
+
+        int lastVisiblePositionBeforeScroll = mListViewStretch.getLastVisiblePosition();
+        int firstVisiblePositionBeforeScroll = mListViewStretch.getFirstVisiblePosition();
+
+
+        // Cause a stretch
+        CtsTouchUtils.emulateDragGesture(
+                mInstrumentation,
+                mActivityRule,
+                screenX + mListViewStretch.getWidth() / 2,
+                screenY + mListViewStretch.getHeight() / 2,
+                0,
+                300,
+                300,
+                20,
+                false,
+                null
+        );
+
+        // Now scroll the other direction
+        CtsTouchUtils.emulateDragGesture(
+                mInstrumentation,
+                mActivityRule,
+                screenX + mListViewStretch.getWidth() / 2,
+                screenY + mListViewStretch.getHeight() / 2,
+                0,
+                -600,
+                160,
+                20,
+                false,
+                null
+        );
+
+        int lastVisiblePositionAfterScroll = mListViewStretch.getLastVisiblePosition();
+        int firstVisiblePositionAfterScroll = mListViewStretch.getFirstVisiblePosition();
+
+        assertTrue(lastVisiblePositionAfterScroll > lastVisiblePositionBeforeScroll);
+        assertTrue(firstVisiblePositionAfterScroll > firstVisiblePositionBeforeScroll);
+    }
+
     private void showOnlyStretch() throws Throwable {
         mActivityRule.runOnUiThread(() -> {
             ViewGroup parent = (ViewGroup) mListViewStretch.getParent();
@@ -1475,4 +1533,18 @@
             return view;
         }
     }
+
+    private static class ClickColorAdapter extends ColorAdapter {
+        ClickColorAdapter(Context context, int[] colors) {
+            super(context, colors);
+        }
+
+        @NonNull
+        @Override
+        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
+            View view = super.getView(position, convertView, parent);
+            view.setOnClickListener((v) -> { });
+            return view;
+        }
+    }
 }