package com.stoutner.privacybrowser;
+import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
-import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
+import android.support.v7.app.AppCompatDelegate;
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.ClientCertRequest;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
static String formattedUrlString;
static WebView mainWebView;
static ProgressBar progressBar;
- static SwipeRefreshLayout swipeToRefresh;
static EditText urlTextBox;
static ImageView favoriteIcon;
- static final String homepage = "https://www.duckduckgo.com";
+ static final String homepage = "https://www.duckduckgo.com/";
+
+ // Remove Android Studio's warning about the dangers of using SetJavaScriptEnabled.
+ @SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webview);
- urlTextBox = (EditText) findViewById(R.id.urlTextBox);
- swipeToRefresh = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayoutContainer);
mainWebView = (WebView) findViewById(R.id.mainWebView);
- progressBar = (ProgressBar) findViewById(R.id.progressBar);
- favoriteIcon = (ImageView) findViewById(R.id.favoriteIcon);
- // Remove the title from the action bar.
final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
+ // Remove the title from the action bar.
actionBar.setDisplayShowTitleEnabled(false);
- // actionBar.setHideOnContentScrollEnabled(true);
- }
- // Implement swipe down to refresh.
- swipeToRefresh.setColorSchemeColors(0xFF0097FF);
- swipeToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
- @Override
- public void onRefresh() {
- mainWebView.loadUrl(formattedUrlString);
- }
- });
+ // Add the custom app_bar layout, which shows the favoriteIcon, urlTextBar, and progressBar.
+ actionBar.setCustomView(R.layout.app_bar);
+ actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
- // 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);
- }
- }
- });
+ // Initialize the variables for favoriteIcon, urlTextBox, and progressBar
+ favoriteIcon = (ImageView) actionBar.getCustomView().findViewById(R.id.favoriteIcon);
+ urlTextBox = (EditText) actionBar.getCustomView().findViewById(R.id.urlTextBox);
+ progressBar = (ProgressBar) actionBar.getCustomView().findViewById(R.id.progressBar);
+ }
mainWebView.setWebViewClient(new WebViewClient() {
// Save the URL to formattedUrlString and update urlTextBox before loading mainWebView.
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
- formattedUrlString = url;
- urlTextBox.setText(formattedUrlString);
- mainWebView.loadUrl(formattedUrlString);
+ mainWebView.loadUrl(url);
return true;
}
+ // Update the URL in urlTextBox when the page starts to load.
+ @Override
+ public void onPageStarted(WebView view, String url, Bitmap favicon) {
+ urlTextBox.setText(url);
+ }
+
+ // Update formattedUrlString and urlTextBox. It is necessary to do this after the page finishes loading because the final URL can change during load.
@Override
public void onPageFinished(WebView view, String url) {
- // 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();
+ formattedUrlString = url;
urlTextBox.setText(formattedUrlString);
}
});
progressBar.setVisibility(View.VISIBLE);
} else {
progressBar.setVisibility(View.GONE);
-
- // Stop the refreshing indicator if it is running.
- swipeToRefresh.setRefreshing(false);
}
}
- // Set the favorite icon if it changes.
+ // Set the favorite icon when it changes.
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
- favoriteIcon.setImageBitmap(icon);
+ favoriteIcon.setImageBitmap(Bitmap.createScaledBitmap(icon, 64, 64, true));
}
});
if (intent.getData() != null) {
// Get the intent data and convert it to a string.
final Uri intentUriData = intent.getData();
- Webview.formattedUrlString = intentUriData.toString();
+ formattedUrlString = intentUriData.toString();
}
// If formattedUrlString is null assign the homepage to it.
formattedUrlString = homepage;
}
- // Place the formattedUrlString in the address bar and load the website.
- urlTextBox.setText(formattedUrlString);
+ // Load the initial website.
mainWebView.loadUrl(formattedUrlString);
}
// Sets the commands that relate to the menu entries.
switch (menuItemId) {
case R.id.home:
- formattedUrlString = homepage;
- urlTextBox.setText(formattedUrlString);
+ mainWebView.loadUrl(homepage);
+ break;
+
+ case R.id.refresh:
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;
}
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();
}
String unformattedUrlString = urlTextBox.getText().toString();
URL unformattedUrl = null;
Uri.Builder formattedUri = new Uri.Builder();
- String scheme;
// 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()) {
e.printStackTrace();
}
- if (unformattedUrl.getProtocol() != null) {
- scheme = unformattedUrl.getProtocol();
- } else {
- scheme = "http";
- }
-
- final String authority = unformattedUrl.getAuthority();
- final String path = unformattedUrl.getPath();
- final String query = unformattedUrl.getQuery();
- final String fragment = unformattedUrl.getRef();
+ // The ternary operator (? :) makes sure that unformattedUrl.get() does not cause a null pointer exception.
+ final String scheme = unformattedUrl != null ? unformattedUrl.getProtocol() : null;
+ final String authority = unformattedUrl != null ? unformattedUrl.getAuthority() : null;
+ final String path = unformattedUrl != null ? unformattedUrl.getPath() : null;
+ final String query = unformattedUrl != null ? unformattedUrl.getQuery() : null;
+ final String fragment = unformattedUrl != null ? unformattedUrl.getRef() : null;
formattedUri.scheme(scheme).authority(authority).path(path).query(query).fragment(fragment);
formattedUrlString = formattedUri.build().toString();
formattedUrlString = "https://duckduckgo.com/?q=" + encodedUrlString;
}
- // Place formattedUrlString back in the address bar and load the website.
- urlTextBox.setText(formattedUrlString);
mainWebView.loadUrl(formattedUrlString);
// Hides the keyboard so we can see the webpage.