Reload change list on vertical swipe gesture

Change-Id: Ifccebd0492c01dde5120fa8b192060f07f53295d
Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/app/src/main/java/com/google/reviewit/ReviewChangesFragment.java b/app/src/main/java/com/google/reviewit/ReviewChangesFragment.java
index e667928..18d8281 100644
--- a/app/src/main/java/com/google/reviewit/ReviewChangesFragment.java
+++ b/app/src/main/java/com/google/reviewit/ReviewChangesFragment.java
@@ -17,6 +17,7 @@
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.support.annotation.LayoutRes;
+import android.support.v4.widget.SwipeRefreshLayout;
 import android.util.Log;
 import android.util.TypedValue;
 import android.view.Menu;
@@ -62,6 +63,19 @@
   }
 
   private void init() {
+    SwipeRefreshLayout swipeRefreshLayout =
+        (SwipeRefreshLayout) v(R.id.swipeRefreshLayout);
+    swipeRefreshLayout.setColorSchemeColors(R.color.progressBar);
+    swipeRefreshLayout.setRefreshing(true);
+    swipeRefreshLayout.setOnRefreshListener(
+        new SwipeRefreshLayout.OnRefreshListener() {
+          @Override
+          public void onRefresh() {
+            getApp().getQueryHandler().reset();
+            display(true);
+          }
+        });
+
     v(R.id.reloadButton).setOnClickListener(new View.OnClickListener() {
       public void onClick(View v) {
         reloadQuery();
@@ -89,6 +103,10 @@
   }
 
   private void display() {
+    display(false);
+  }
+
+  private void display(final boolean clear) {
     if (!isOnline()) {
       setInvisible(v(R.id.progress));
       setGone(v(R.id.initialProgress));
@@ -100,6 +118,7 @@
     }
 
     new AsyncTask<Void, Void, ChangeListData>() {
+      private SwipeRefreshLayout swipeRefreshLayout;
       private View progress;
       private View initialProgress;
       private View nextPageProgress;
@@ -110,6 +129,7 @@
       @Override
       protected void onPreExecute() {
         super.onPreExecute();
+        swipeRefreshLayout = (SwipeRefreshLayout) v(R.id.swipeRefreshLayout);
         progress = v(R.id.progress);
         initialProgress = v(R.id.initialProgress);
         nextPageProgress = v(R.id.nextPageProgress);
@@ -151,6 +171,7 @@
         getActivity().invalidateOptionsMenu();
         setInvisible(progress);
         setGone(initialProgress, reloadButton, nextPageProgress);
+        swipeRefreshLayout.setRefreshing(false);
 
         if (changeListData.error != null) {
           statusText.setText(changeListData.error);
@@ -159,6 +180,9 @@
 
         if (!changeListData.changeList.isEmpty()) {
           setGone(statusText);
+          if (clear) {
+            changeList.removeAllViews();
+          }
           for (Change change : changeListData.changeList) {
             ChangeEntry changeEntry = new ChangeEntry(getContext());
             changeEntry.init(getApp(), change);
diff --git a/app/src/main/res/layout/content_review_changes.xml b/app/src/main/res/layout/content_review_changes.xml
index 35e87b5..8d2d1c1 100644
--- a/app/src/main/res/layout/content_review_changes.xml
+++ b/app/src/main/res/layout/content_review_changes.xml
@@ -21,57 +21,63 @@
 
   <include layout="@layout/progress"/>
 
-  <ScrollView
-    android:id="@+id/scrollView"
+  <android.support.v4.widget.SwipeRefreshLayout
+    android:id="@+id/swipeRefreshLayout"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <LinearLayout
-      android:orientation="vertical"
+    <ScrollView
+      android:id="@+id/scrollView"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
 
-      <TextView
-        android:id="@+id/statusText"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center_horizontal"
-        android:layout_marginTop="15dp"
-        android:textSize="24sp"
-        android:text="@string/loading"/>
-
-      <ProgressBar
-        android:id="@+id/initialProgress"
-        android:layout_marginTop="20dp"
-        android:layout_width="match_parent"
-        android:layout_height="150dp"
-        android:indeterminate="true"/>
-
-      <ImageView
-        android:id="@+id/reloadButton"
-        android:layout_width="match_parent"
-        android:layout_height="150dp"
-        android:layout_marginTop="20dp"
-        android:gravity="center_horizontal"
-        android:clickable="true"
-        android:src="@drawable/ic_refresh_black_48dp"
-        android:visibility="gone"/>
-
       <LinearLayout
-        android:id="@+id/changeList"
         android:orientation="vertical"
         android:layout_width="match_parent"
         android:layout_height="match_parent">
-      </LinearLayout>
 
-      <ProgressBar
-        android:id="@+id/nextPageProgress"
-        android:layout_marginTop="3dp"
-        android:layout_marginBottom="3dp"
-        android:layout_width="match_parent"
-        android:layout_height="40dp"
-        android:indeterminate="true"
-        android:visibility="gone"/>
-    </LinearLayout>
-  </ScrollView>
+        <TextView
+          android:id="@+id/statusText"
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          android:gravity="center_horizontal"
+          android:layout_marginTop="15dp"
+          android:textSize="24sp"
+          android:text="@string/loading"/>
+
+        <ProgressBar
+          android:id="@+id/initialProgress"
+          android:layout_marginTop="20dp"
+          android:layout_width="match_parent"
+          android:layout_height="150dp"
+          android:indeterminate="true"/>
+
+        <ImageView
+          android:id="@+id/reloadButton"
+          android:layout_width="match_parent"
+          android:layout_height="150dp"
+          android:layout_marginTop="20dp"
+          android:gravity="center_horizontal"
+          android:clickable="true"
+          android:src="@drawable/ic_refresh_black_48dp"
+          android:visibility="gone"/>
+
+        <LinearLayout
+          android:id="@+id/changeList"
+          android:orientation="vertical"
+          android:layout_width="match_parent"
+          android:layout_height="match_parent">
+        </LinearLayout>
+
+        <ProgressBar
+          android:id="@+id/nextPageProgress"
+          android:layout_marginTop="3dp"
+          android:layout_marginBottom="3dp"
+          android:layout_width="match_parent"
+          android:layout_height="40dp"
+          android:indeterminate="true"
+          android:visibility="gone"/>
+      </LinearLayout>
+    </ScrollView>
+  </android.support.v4.widget.SwipeRefreshLayout>
 </LinearLayout>