Merge "DO NOT MERGE ANYWHERE Update support library to 24.2.1-SNAPSHOT r37" into nyc-support-24.1-dev
diff --git a/core-ui/java/android/support/v4/widget/SwipeRefreshLayout.java b/core-ui/java/android/support/v4/widget/SwipeRefreshLayout.java
index 02fd3dd..769a08b 100644
--- a/core-ui/java/android/support/v4/widget/SwipeRefreshLayout.java
+++ b/core-ui/java/android/support/v4/widget/SwipeRefreshLayout.java
@@ -322,10 +322,6 @@
         setWillNotDraw(false);
         mDecelerateInterpolator = new DecelerateInterpolator(DECELERATE_INTERPOLATION_FACTOR);
 
-        final TypedArray a = context.obtainStyledAttributes(attrs, LAYOUT_ATTRS);
-        setEnabled(a.getBoolean(0, true));
-        a.recycle();
-
         final DisplayMetrics metrics = getResources().getDisplayMetrics();
         mCircleDiameter = (int) (CIRCLE_DIAMETER * metrics.density);
 
@@ -341,6 +337,10 @@
 
         mOriginalOffsetTop = mCurrentTargetOffsetTop = -mCircleDiameter;
         moveToStart(1.0f);
+
+        final TypedArray a = context.obtainStyledAttributes(attrs, LAYOUT_ATTRS);
+        setEnabled(a.getBoolean(0, true));
+        a.recycle();
     }
 
     @Override
diff --git a/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActions.java b/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActions.java
index 27b7be6..b337ec8 100644
--- a/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActions.java
+++ b/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActions.java
@@ -74,4 +74,28 @@
             }
         };
     }
+
+    public static ViewAction setEnabled(final boolean enabled) {
+        return new ViewAction() {
+            @Override
+            public Matcher<View> getConstraints() {
+                return isAssignableFrom(SwipeRefreshLayout.class);
+            }
+
+            @Override
+            public String getDescription() {
+                return "Set SwipeRefreshLayout enabled state";
+            }
+
+            @Override
+            public void perform(UiController uiController, View view) {
+                uiController.loopMainThreadUntilIdle();
+
+                SwipeRefreshLayout swipeRefreshLayout = (SwipeRefreshLayout) view;
+                swipeRefreshLayout.setEnabled(enabled);
+
+                uiController.loopMainThreadUntilIdle();
+            }
+        };
+    }
 }
diff --git a/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutTest.java b/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutTest.java
index 3f9ed9c..0d0ac22 100644
--- a/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutTest.java
+++ b/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutTest.java
@@ -18,6 +18,7 @@
 
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.v4.widget.SwipeRefreshLayoutActions.setEnabled;
 import static android.support.v4.widget.SwipeRefreshLayoutActions.setRefreshing;
 import static android.support.v4.widget.SwipeRefreshLayoutActions.setSize;
 
@@ -26,6 +27,7 @@
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.*;
 
+import android.app.Activity;
 import android.support.test.espresso.action.ViewActions;
 import android.support.coreui.test.R;
 import android.support.v4.BaseInstrumentationTestCase;
@@ -96,19 +98,7 @@
     public void testSwipeDownToRefresh() throws Throwable {
         assertFalse(mSwipeRefresh.isRefreshing());
 
-        final CountDownLatch latch = new CountDownLatch(1);
-        SwipeRefreshLayout.OnRefreshListener listener = new SwipeRefreshLayout.OnRefreshListener() {
-            @Override
-            public void onRefresh() {
-                latch.countDown();
-                assertTrue(mSwipeRefresh.isRefreshing());
-                mSwipeRefresh.setRefreshing(false);
-            }
-        };
-        mSwipeRefresh.setOnRefreshListener(listener);
-        onView(withId(R.id.content)).perform(ViewActions.swipeDown());
-        assertTrue("SwipeRefreshLayout never started refreshing",
-                latch.await(500, TimeUnit.MILLISECONDS));
+        swipeToRefreshVerifyThenStopRefreshing(true);
     }
 
     @Test
@@ -145,4 +135,47 @@
         assertFalse(mSwipeRefresh.canChildScrollUp());
         assertFalse(mSwipeRefresh.canChildScrollUp());
     }
+
+    @Test
+    @SmallTest
+    public void testSwipeDownToRefreshInitiallyDisabled() throws Throwable {
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivityTestRule.getActivity().setContentView(
+                        R.layout.swipe_refresh_layout_disabled_activity);
+            }
+        });
+        mSwipeRefresh = (SwipeRefreshLayout) mActivityTestRule.getActivity().findViewById(
+                R.id.swipe_refresh);
+
+        assertFalse(mSwipeRefresh.isRefreshing());
+
+        swipeToRefreshVerifyThenStopRefreshing(false);
+
+        onView(withId(R.id.swipe_refresh)).perform(setEnabled(true));
+
+        swipeToRefreshVerifyThenStopRefreshing(true);
+    }
+
+    private void swipeToRefreshVerifyThenStopRefreshing(boolean expectRefreshing) throws Throwable {
+        final CountDownLatch latch = new CountDownLatch(1);
+        SwipeRefreshLayout.OnRefreshListener listener = new SwipeRefreshLayout.OnRefreshListener() {
+            @Override
+            public void onRefresh() {
+                latch.countDown();
+                assertTrue(mSwipeRefresh.isRefreshing());
+                mSwipeRefresh.setRefreshing(false);
+            }
+        };
+        mSwipeRefresh.setOnRefreshListener(listener);
+        onView(withId(R.id.content)).perform(ViewActions.swipeDown());
+        if (expectRefreshing) {
+            assertTrue("SwipeRefreshLayout never started refreshing",
+                    latch.await(500, TimeUnit.MILLISECONDS));
+        } else {
+            assertFalse("SwipeRefreshLayout unexpectedly started refreshing",
+                    latch.await(500, TimeUnit.MILLISECONDS));
+        }
+    }
 }
diff --git a/core-ui/tests/res/layout/swipe_refresh_layout_disabled_activity.xml b/core-ui/tests/res/layout/swipe_refresh_layout_disabled_activity.xml
new file mode 100644
index 0000000..fe5b364
--- /dev/null
+++ b/core-ui/tests/res/layout/swipe_refresh_layout_disabled_activity.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<android.support.v4.widget.SwipeRefreshLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/swipe_refresh"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:enabled="false">
+<!-- some full screen pullable view that will be the offsetable content -->
+    <ListView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:id="@+id/content"/>
+</android.support.v4.widget.SwipeRefreshLayout>
\ No newline at end of file