Implement swipe to refresh.
authorSoren Stoutner <soren@stoutner.com>
Thu, 15 Oct 2015 21:49:49 +0000 (14:49 -0700)
committerSoren Stoutner <soren@stoutner.com>
Thu, 15 Oct 2015 21:49:49 +0000 (14:49 -0700)
app/src/main/java/com/stoutner/privacybrowser/Webview.java
app/src/main/res/layout/activity_webview.xml

index 3c69aa70b469330ba1d4e46c5a85b0d05196a7d8..c75c35766ca9fcadd4882fc025c38a1330afa990 100644 (file)
@@ -4,12 +4,14 @@ import android.app.Activity;
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Bundle;
+import android.support.v4.widget.SwipeRefreshLayout;
 import android.support.v7.app.AppCompatActivity;
 import android.util.Patterns;
 import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
+import android.view.ViewTreeObserver;
 import android.view.inputmethod.InputMethodManager;
 import android.webkit.WebChromeClient;
 import android.webkit.WebView;
@@ -26,6 +28,7 @@ public class Webview extends AppCompatActivity {
     static String formattedUrlString;
     static WebView mainWebView;
     static ProgressBar progressBar;
+    static SwipeRefreshLayout swipeToRefresh;
     static final String homepage = "https://www.duckduckgo.com";
 
     @Override
@@ -34,14 +37,36 @@ public class Webview extends AppCompatActivity {
         setContentView(R.layout.activity_webview);
 
         final EditText urlTextBox = (EditText) findViewById(R.id.urlTextBox);
+        swipeToRefresh = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayoutContainer);
         mainWebView = (WebView) findViewById(R.id.mainWebView);
         progressBar = (ProgressBar) findViewById(R.id.progressBar);
 
+        // Implement swipe down to refresh.
+        swipeToRefresh.setColorSchemeColors(0xFF0097FF);
+        swipeToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+            @Override
+            public void onRefresh() {
+                mainWebView.loadUrl(formattedUrlString);
+            }
+        });
+
+        // Only enable swipeToRefresh if is mainWebView is scrolled to the top.
+        mainWebView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
+            @Override
+            public void onScrollChanged() {
+                if (mainWebView.getScrollY() == 0) {
+                    swipeToRefresh.setEnabled(true);
+                } else {
+                    swipeToRefresh.setEnabled(false);
+                }
+            }
+        });
+
         // setWebViewClient makes this WebView the default handler for URLs inside the app, so that links are not kicked out to other apps.
         // Save the URL to formattedUrlString and update urlTextBox before loading mainWebView.
         mainWebView.setWebViewClient(new WebViewClient() {
             public boolean shouldOverrideUrlLoading(WebView view, String url) {
-                formattedUrlString=url;
+                formattedUrlString = url;
                 urlTextBox.setText(formattedUrlString);
                 mainWebView.loadUrl(formattedUrlString);
                 return true;
@@ -56,6 +81,8 @@ public class Webview extends AppCompatActivity {
                     progressBar.setVisibility(View.VISIBLE);
                 } else {
                     progressBar.setVisibility(View.GONE);
+                    // Stop the refreshing indicator if it is running.
+                    swipeToRefresh.setRefreshing(false);
                 }
             }
         });
index 2b701ae033cad6edcf1c8e3cd7a34e37e33a9f80..4eb9901b616b962c764b7a3bf7ec816ad9d68152 100644 (file)
@@ -1,58 +1,71 @@
-<RelativeLayout
+<android.support.v4.widget.SwipeRefreshLayout
+    android:id="@+id/swipeRefreshLayoutContainer"
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".Webview" >
+    android:layout_height="match_parent">
+    // SwipeRefreshLayout allows the user to swipe down to refresh.
 
-    // FrameLayout lets the ProgressBar float on top of the LinearLayout.
-    <FrameLayout
+    <RelativeLayout
+        android:id="@+id/relativeLayoutContainer"
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:tools="http://schemas.android.com/tools"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:id="@+id/topFrameLayout">
+        android:layout_height="match_parent"
+        tools:context=".Webview" >
 
-        <LinearLayout
+        // FrameLayout lets the ProgressBar float on top of the LinearLayout.
+        <FrameLayout
+            android:id="@+id/addressBarFrameLayout"
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal"
-            android:id="@+id/topBarLayout">
-
-            // android:inputType="textUri" sets the keyboard to have a go arrow.
-            <EditText
-                android:id="@+id/urlTextBox"
-                android:layout_width="0dp"
+            android:layout_height="wrap_content">
+
+            <LinearLayout
+                android:id="@+id/addressBarLinearLayout"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:inputType="textUri"
-                android:imeOptions="actionGo"
-                android:layout_weight="1"/>
-
-            <Button
-                android:id="@+id/goButton"
-                android:text="@string/go_button"
-                android:onClick="loadUrlFromTextBox"
-                style="?android:attr/buttonStyleSmall"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content" />
+                android:orientation="horizontal">
+
+                // android:inputType="textUri" sets the keyboard to have a go arrow.
+                <EditText
+                    android:id="@+id/urlTextBox"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:inputType="textUri"
+                    android:imeOptions="actionGo"
+                    android:layout_weight="1"/>
+
+                <Button
+                    android:id="@+id/goButton"
+                    android:text="@string/go_button"
+                    android:onClick="loadUrlFromTextBox"
+                    style="?android:attr/buttonStyleSmall"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content" />
+
             </LinearLayout>
 
-        // android:max changes the maximum ProgressBar value from 10000 to 100 to match progress percentage.
-        <ProgressBar
-            android:id="@+id/progressBar"
-            style="?android:attr/progressBarStyleHorizontal"
-            android:layout_width="fill_parent"
-            android:layout_height="7dp"
-            android:layout_gravity="bottom"
-            android:max="100"
-            android:progressTint="#FF29A8FF"
-            android:progressBackgroundTint="#FFFFFFFF"
-            android:visibility="gone" />
-    </FrameLayout>
-
-    <WebView
-        android:id="@+id/mainWebView"
-        android:layout_width="match_parent"
-        android:layout_height="fill_parent"
-        android:layout_below="@id/topFrameLayout"
-        android:focusable="true"
-        android:focusableInTouchMode="true" />
-</RelativeLayout>
+            // android:max changes the maximum ProgressBar value from 10000 to 100 to match progress percentage.
+            <ProgressBar
+                android:id="@+id/progressBar"
+                style="?android:attr/progressBarStyleHorizontal"
+                android:layout_width="fill_parent"
+                android:layout_height="7dp"
+                android:layout_gravity="bottom"
+                android:max="100"
+                android:progressTint="#FF0097FF"
+                android:progressBackgroundTint="#FFFFFFFF"
+                android:visibility="gone" />
+        </FrameLayout>
+
+
+        <WebView
+            android:id="@+id/mainWebView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_below="@id/addressBarFrameLayout"
+            android:focusable="true"
+            android:focusableInTouchMode="true" />
+
+    </RelativeLayout>
+
+</android.support.v4.widget.SwipeRefreshLayout>