Check for layout before handling touch events
This CL fixes a bug where RecyclerView would access layout
in motion event callbacks w/o checking if it exists
Bug: 21614659
Change-Id: I2cc6eb3afa1d24404c00bcc6c0cc7a30d441a1de
diff --git a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
index 27421cc..a3d8cde 100644
--- a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
+++ b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
@@ -2021,6 +2021,10 @@
return true;
}
+ if (mLayout == null) {
+ return false;
+ }
+
final boolean canScrollHorizontally = mLayout.canScrollHorizontally();
final boolean canScrollVertically = mLayout.canScrollVertically();
@@ -2120,6 +2124,10 @@
return true;
}
+ if (mLayout == null) {
+ return false;
+ }
+
final boolean canScrollHorizontally = mLayout.canScrollHorizontally();
final boolean canScrollVertically = mLayout.canScrollVertically();
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewBasicTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewBasicTest.java
index aa85698..4e327ef 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewBasicTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewBasicTest.java
@@ -19,9 +19,11 @@
import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
+import android.os.SystemClock;
import android.test.AndroidTestCase;
import android.util.AttributeSet;
import android.util.SparseArray;
+import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
@@ -103,6 +105,23 @@
mRecyclerView.smoothScrollToPosition(5);
}
+ public void testInterceptTouchWithoutLayoutManager() {
+ mRecyclerView.setAdapter(new MockAdapter(20));
+ measure();
+ layout();
+ assertFalse(mRecyclerView.onInterceptTouchEvent(
+ MotionEvent.obtain(SystemClock.uptimeMillis(),
+ SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 10, 10, 0)));
+ }
+
+ public void testOnTouchWithoutLayoutManager() {
+ mRecyclerView.setAdapter(new MockAdapter(20));
+ measure();
+ layout();
+ assertFalse(mRecyclerView.onTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
+ SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 10, 10, 0)));
+ }
+
public void testLayout() throws InterruptedException {
MockLayoutManager layoutManager = new MockLayoutManager();
mRecyclerView.setLayoutManager(layoutManager);