]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/Webview.java
Update urlTextBox when the forward or back buttons are pressed.
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / Webview.java
index ab78eee08a937110885f297109a0bca879446dc5..ce6fdb88ebb998db6a8f6cd30c59a328e6a802b6 100644 (file)
@@ -3,23 +3,33 @@ package com.stoutner.privacybrowser;
 import android.app.Activity;
 import android.content.Intent;
 import android.net.Uri;
-import android.support.v7.app.ActionBarActivity;
 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;
+import android.webkit.WebViewClient;
 import android.widget.EditText;
-
+import android.widget.ProgressBar;
+import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
 import java.net.URL;
+import java.net.URLEncoder;
 
-
-public class Webview extends ActionBarActivity {
+public class Webview extends AppCompatActivity {
 
     static String formattedUrlString;
     static WebView mainWebView;
+    static ProgressBar progressBar;
+    static SwipeRefreshLayout swipeToRefresh;
+    static EditText urlTextBox;
     static final String homepage = "https://www.duckduckgo.com";
 
     @Override
@@ -27,8 +37,61 @@ public class Webview extends ActionBarActivity {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_webview);
 
-        final EditText urlTextBox = (EditText) findViewById(R.id.urlTextBox);
+        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;
+                urlTextBox.setText(formattedUrlString);
+                mainWebView.loadUrl(formattedUrlString);
+                return true;
+            }
+        });
+
+        // Update the progress bar when a page is loading.
+        mainWebView.setWebChromeClient(new WebChromeClient() {
+            public void onProgressChanged(WebView view, int progress) {
+                progressBar.setProgress(progress);
+                if (progress < 100) {
+                    progressBar.setVisibility(View.VISIBLE);
+                } else {
+                    progressBar.setVisibility(View.GONE);
+
+                    // Stop the refreshing indicator if it is running.
+                    swipeToRefresh.setRefreshing(false);
+
+                    // Update the URL in urlTextBox.  It is necessary to do this after the page finishes loading to get the final URL, which can change during load.
+                    formattedUrlString = mainWebView.getUrl();
+                    urlTextBox.setText(formattedUrlString);
+                }
+            }
+        });
 
         // Allow pinch to zoom.
         mainWebView.getSettings().setBuiltInZoomControls(true);
@@ -46,18 +109,9 @@ public class Webview extends ActionBarActivity {
         final Intent intent = getIntent();
 
         if (intent.getData() != null) {
-            // Get the intent data.
+            // Get the intent data and convert it to a string.
             final Uri intentUriData = intent.getData();
-
-            // Try to parse the intent data and store it in urlData.
-            URL urlData = null;
-            try {
-                urlData = new URL(intentUriData.getScheme(), intentUriData.getHost(), intentUriData.getPath());
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-
-            Webview.formattedUrlString = urlData.toString();
+            Webview.formattedUrlString = intentUriData.toString();
         }
 
         // If formattedUrlString is null assign the homepage to it.
@@ -76,7 +130,11 @@ public class Webview extends ActionBarActivity {
                 if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                         (keyCode == KeyEvent.KEYCODE_ENTER)) {
                     // Load the URL into the mainWebView and consume the event.
-                    loadUrl(mainWebView);
+                    try {
+                        loadUrlFromTextBox(mainWebView);
+                    } catch (UnsupportedEncodingException e) {
+                        e.printStackTrace();
+                    }
                     return true;
                 }
                 // Do not consume the event.
@@ -98,13 +156,26 @@ public class Webview extends ActionBarActivity {
         int menuItemId = menuItem.getItemId();
         final WebView mainWebView = (WebView) findViewById(R.id.mainWebView);
 
-        // Use the menu items to go forward or back.
+        // Sets the commands that relate to the menu entries.
         switch (menuItemId) {
+            case R.id.home:
+                formattedUrlString = homepage;
+                urlTextBox.setText(formattedUrlString);
+                mainWebView.loadUrl(formattedUrlString);
+                break;
             case R.id.back:
                 mainWebView.goBack();
+
+                // Update the URL in urlTextBox with the URL we are intending to load.  Because this can be altered during load, the final URL is loaded after the progress bar reaches 100%
+                formattedUrlString = mainWebView.getOriginalUrl();
+                urlTextBox.setText(formattedUrlString);
                 break;
             case R.id.forward:
                 mainWebView.goForward();
+
+                // Update the URL in urlTextBox with the URL we are intending to load.  Because this can be altered during load, the final URL is loaded after the progress bar reaches 100%
+                formattedUrlString = mainWebView.getOriginalUrl();
+                urlTextBox.setText(formattedUrlString);
                 break;
         }
 
@@ -116,57 +187,60 @@ public class Webview extends ActionBarActivity {
     public void onBackPressed() {
         if (mainWebView.canGoBack()) {
             mainWebView.goBack();
+
+            // Update the URL in urlTextBox with the URL we are intending to load.  Because this can be altered during load, the final URL is loaded after the progress bar reaches 100%
+            formattedUrlString = mainWebView.getOriginalUrl();
+            urlTextBox.setText(formattedUrlString);
         } else {
             super.onBackPressed();
         }
     }
 
-    public void loadUrl(View view) {
+    public void loadUrlFromTextBox(View view) throws UnsupportedEncodingException {
         // Get the text from urlTextInput and convert it to a string.
         final EditText urlTextBox = (EditText) findViewById(R.id.urlTextBox);
-        final String unformattedUrlString = urlTextBox.getText().toString();
+        final WebView mainWebView = (WebView) findViewById(R.id.mainWebView);
+        String unformattedUrlString = urlTextBox.getText().toString();
+        URL unformattedUrl = null;
+        Uri.Builder formattedUri = new Uri.Builder();
+        String scheme;
 
-        // Don't do anything unless unformattedUrlString is at least 6 characters long.
-        if (unformattedUrlString.length() < 6) { return; }
+        // Check to see if unformattedUrlString is a valid URL.  Otherwise, convert it into a Duck Duck Go search.
+        if (Patterns.WEB_URL.matcher(unformattedUrlString).matches()) {
 
-        // Add correct protocol formatting to the beginning of the URL if needed.
-        final String firstSixCharacters = unformattedUrlString.substring(0, 6);
+            // Add http:// at the beginning if it is missing.  Otherwise the app will segfault.
+            if (!unformattedUrlString.startsWith("http")) {
+                unformattedUrlString = "http://" + unformattedUrlString;
+            }
 
-        switch (firstSixCharacters) {
-            case "http:/":
-                formattedUrlString = unformattedUrlString;
-                break;
-            case "https:":
-                formattedUrlString = unformattedUrlString;
-                break;
-            case "ftp://":
-                formattedUrlString = unformattedUrlString;
-                break;
-            default:
-                formattedUrlString = "http://" + unformattedUrlString;
-        }
+            // Convert unformattedUrlString to a URL, then to a URI, and then back to a string, which sanitizes the input and adds in any missing components.
+            try {
+                unformattedUrl = new URL(unformattedUrlString);
+            } catch (MalformedURLException e) {
+                e.printStackTrace();
+            }
 
-        /*
-        // Parse the unformattedURLString into a Uri.
+            if (unformattedUrl.getProtocol() != null) {
+                scheme = unformattedUrl.getProtocol();
+            } else {
+                scheme = "http";
+            }
 
-        final Uri uriData = Uri.parse(unformattedUrlString);
+            final String authority = unformattedUrl.getAuthority();
+            final String path = unformattedUrl.getPath();
+            final String query = unformattedUrl.getQuery();
+            final String fragment = unformattedUrl.getRef();
 
-        // Convert the Uri to a URL, chicking for any problems with the formatting.
-        URL urlData = null;
+            formattedUri.scheme(scheme).authority(authority).path(path).query(query).fragment(fragment);
+            formattedUrlString = formattedUri.build().toString();
 
-        try {
-            urlData = new URL(uriData.getScheme(), uriData.getHost(), uriData.getPath());
-        } catch (Exception e) {
-            e.printStackTrace();
+        } else {
+            // Sanitize the search input.
+            final String encodedUrlString = URLEncoder.encode(unformattedUrlString, "UTF-8");
+            formattedUrlString = "https://duckduckgo.com/?q=" + encodedUrlString;
         }
 
-        //  Convert urlData to a string, which is reqauired by loadUrl method.
-        formattedUrlString = urlData.toString();
-        */
-
-        final WebView mainWebView = (WebView) findViewById(R.id.mainWebView);
-
-        // Place the URL text back in the address bar and load the website.
+        // Place formattedUrlString back in the address bar and load the website.
         urlTextBox.setText(formattedUrlString);
         mainWebView.loadUrl(formattedUrlString);