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);