package com.stoutner.privacybrowser;
import android.annotation.SuppressLint;
-import android.annotation.TargetApi;
import android.app.Activity;
import android.app.DownloadManager;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
+import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.app.DialogFragment;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.widget.DrawerLayout;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.ActionBar;
+import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.AppCompatDialogFragment;
import android.support.v7.widget.Toolbar;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ProgressBar;
-import android.widget.Toast;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URLEncoder;
// We need to use AppCompatActivity from android.support.v7.app.AppCompatActivity to have access to the SupportActionBar until the minimum API is >= 21.
-public class MainWebViewActivity extends AppCompatActivity implements CreateHomeScreenShortcut.CreateHomeScreenSchortcutListener {
+public class MainWebViewActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, CreateHomeScreenShortcut.CreateHomeScreenSchortcutListener {
// favoriteIcon is public static so it can be accessed from CreateHomeScreenShortcut.
public static Bitmap favoriteIcon;
- // mainWebView is public static so it can be accessed from AboutDialog. It is also used in onCreate(), onOptionsItemSelected(), and loadUrlFromTextBox().
+ // mainWebView is public static so it can be accessed from AboutDialog. It is also used in onCreate(), onOptionsItemSelected(), onNavigationItemSelected(), and loadUrlFromTextBox().
public static WebView mainWebView;
+ // drawerToggle is used in onCreate(), onPostCreate(), onConfigurationChanged(), onNewIntent(), and onNavigationItemSelected().
+ private ActionBarDrawerToggle drawerToggle;
+ // drawerLayout is used in onCreate(), onNewIntent(), and onBackPressed().
+ private DrawerLayout drawerLayout;
// mainMenu is used in onCreateOptionsMenu() and onOptionsItemSelected().
private Menu mainMenu;
// formattedUrlString is used in onCreate(), onOptionsItemSelected(), onCreateHomeScreenShortcutCreate(), and loadUrlFromTextBox().
private boolean saveFormDataEnabled;
*/
- // cookieManager is used in onCreate() and onOptionsItemSelected().
+ // cookieManager is used in onCreate(), onOptionsItemSelected(), and onNavigationItemSelected().
private CookieManager cookieManager;
// cookiesEnabled is used in onCreate(), onCreateOptionsMenu(), and onOptionsItemSelected().
private boolean cookiesEnabled;
@SuppressLint("SetJavaScriptEnabled")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_webview);
+ setContentView(R.layout.coordinator_layout);
// We need to use the SupportActionBar from android.support.v7.app.ActionBar until the minimum API is >= 21.
Toolbar supportAppBar = (Toolbar) findViewById(R.id.appBar);
});
}
+ // Create the navigation drawer.
+ drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
+ // The DrawerTitle identifies the drawer in accessibility mode.
+ drawerLayout.setDrawerTitle(GravityCompat.START, getString(R.string.navigation_drawer));
+
+ // Listen for touches on the navigation menu.
+ final NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView);
+ navigationView.setNavigationItemSelectedListener(this);
+
+ // drawerToggle creates the hamburger icon at the start of the AppBar.
+ drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, supportAppBar, R.string.open_navigation, R.string.close_navigation);
+
mainWebView.setWebViewClient(new WebViewClient() {
// shouldOverrideUrlLoading makes this WebView the default handler for URLs inside the app, so that links are not kicked out to other apps.
@Override
@Override
public void onPageFinished(WebView view, String url) {
formattedUrlString = url;
- urlTextBox.setText(formattedUrlString);
+
+ // Only update urlTextBox if the user is not typing in it.
+ if (!urlTextBox.hasFocus()) {
+ urlTextBox.setText(formattedUrlString);
+ }
}
});
*/
// Set the one flag supported by API >= 14.
- if (Build.VERSION.SDK_INT >= 14) {
- view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
- }
+ view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
// Set the two flags that are supported by API >= 16.
if (Build.VERSION.SDK_INT >= 16) {
// Add the URL as the description for the download.
requestUri.setDescription(url);
- // Show the download notification after the download is completed if the API is 11 or greater.
- if (Build.VERSION.SDK_INT >= 11) {
- requestUri.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
- }
+ // Show the download notification after the download is completed.
+ requestUri.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
+ // Initiate the download and display a Snackbar.
downloadManager.enqueue(requestUri);
Snackbar.make(findViewById(R.id.mainWebView), R.string.download_started, Snackbar.LENGTH_SHORT).show();
}
// Allow pinch to zoom.
mainWebView.getSettings().setBuiltInZoomControls(true);
- // Hide zoom controls if the API is 11 or greater.
- if (Build.VERSION.SDK_INT >= 11) {
- mainWebView.getSettings().setDisplayZoomControls(false);
- }
+ // Hide zoom controls.
+ mainWebView.getSettings().setDisplayZoomControls(false);
// Initialize the default preference values the first time the program is run.
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
formattedUrlString = intentUriData.toString();
}
+ // Close the navigation drawer if it is open.
+ if (drawerLayout.isDrawerVisible(GravityCompat.START)) {
+ drawerLayout.closeDrawer(GravityCompat.START);
+ }
+
// Load the website.
mainWebView.loadUrl(formattedUrlString);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.menu_webview, menu);
+ getMenuInflater().inflate(R.menu.menu_options, menu);
// Set mainMenu so it can be used by onOptionsItemSelected.
mainMenu = menu;
MenuItem clearCookies = menu.findItem(R.id.clearCookies);
clearCookies.setEnabled(cookieManager.hasCookies());
- // Enable Back if canGoBack().
- MenuItem back = menu.findItem(R.id.back);
- back.setEnabled(mainWebView.canGoBack());
-
- // Enable forward if canGoForward().
- MenuItem forward = menu.findItem(R.id.forward);
- forward.setEnabled(mainWebView.canGoForward());
-
// Run all the other default commands.
super.onPrepareOptionsMenu(menu);
}
@Override
- // @TargetApi(11) turns off the errors regarding copy and paste, which are removed from view in menu_webview.xml for lower version of Android.
- @TargetApi(11)
// Remove Android Studio's warning about the dangers of using SetJavaScriptEnabled.
@SuppressLint("SetJavaScriptEnabled")
// removeAllCookies is deprecated, but it is required for API < 21.
Snackbar.make(findViewById(R.id.mainWebView), R.string.cookies_deleted, Snackbar.LENGTH_SHORT).show();
return true;
+ case R.id.share:
+ Intent shareIntent = new Intent();
+ shareIntent.setAction(Intent.ACTION_SEND);
+ shareIntent.putExtra(Intent.EXTRA_TEXT, urlTextBox.getText().toString());
+ shareIntent.setType("text/plain");
+ startActivity(Intent.createChooser(shareIntent, "Share URL"));
+ return true;
+
case R.id.addToHomescreen:
// Show the CreateHomeScreenShortcut AlertDialog and name this instance createShortcut.
AppCompatDialogFragment shortcutDialog = new CreateHomeScreenShortcut();
//Everything else will be handled by CreateHomeScreenShortcut and the associated listeners below.
return true;
- case R.id.downloads:
- // Launch the system Download Manager.
- Intent downloadManagerIntent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS);
-
- // Launch as a new task so that Download Manager and Privacy Browser show as separate windows in the recent tasks list.
- downloadManagerIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ default:
+ return super.onOptionsItemSelected(menuItem);
+ }
+ }
- startActivity(downloadManagerIntent);
- return true;
+ @Override
+ // removeAllCookies is deprecated, but it is required for API < 21.
+ @SuppressWarnings("deprecation")
+ public boolean onNavigationItemSelected(MenuItem menuItem) {
+ int menuItemId = menuItem.getItemId();
+ switch (menuItemId) {
case R.id.home:
mainWebView.loadUrl(homepage);
- return true;
+ break;
case R.id.back:
- mainWebView.goBack();
- return true;
+ if (mainWebView.canGoBack()) {
+ mainWebView.goBack();
+ }
+ break;
case R.id.forward:
- mainWebView.goForward();
- return true;
+ if (mainWebView.canGoForward()) {
+ mainWebView.goForward();
+ }
+ break;
- case R.id.share:
- Intent shareIntent = new Intent();
- shareIntent.setAction(Intent.ACTION_SEND);
- shareIntent.putExtra(Intent.EXTRA_TEXT, urlTextBox.getText().toString());
- shareIntent.setType("text/plain");
- startActivity(Intent.createChooser(shareIntent, "Share URL"));
- return true;
+ case R.id.downloads:
+ // Launch the system Download Manager.
+ Intent downloadManagerIntent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS);
+
+ // Launch as a new task so that Download Manager and Privacy Browser show as separate windows in the recent tasks list.
+ downloadManagerIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ startActivity(downloadManagerIntent);
+ break;
case R.id.settings:
// Launch SettingsActivity.
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
- return true;
+ break;
case R.id.about:
// Show the AboutDialog AlertDialog and name this instance aboutDialog.
AppCompatDialogFragment aboutDialog = new AboutDialog();
aboutDialog.show(getSupportFragmentManager(), "aboutDialog");
- return true;
+ break;
case R.id.clearAndExit:
// Clear DOM storage.
} else {
finish();
}
- return true;
+ break;
default:
- return super.onOptionsItemSelected(menuItem);
+ break;
}
+
+ // Close the navigation drawer.
+ drawerLayout.closeDrawer(GravityCompat.START);
+ return true;
+ }
+
+ @Override
+ public void onPostCreate(Bundle savedInstanceState) {
+ super.onPostCreate(savedInstanceState);
+
+ // Sync the state of the DrawerToggle after onRestoreInstanceState has finished.
+ drawerToggle.syncState();
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+
+ // Update the status of the drawerToggle icon.
+ drawerToggle.onConfigurationChanged(newConfig);
}
@Override
sendBroadcast(placeBookmarkShortcut);
}
- // Override onBackPressed so that if mainWebView can go back it does when the system back button is pressed.
+ // Override onBackPressed to handle the navigation drawer and mainWebView.
@Override
public void onBackPressed() {
final WebView mainWebView = (WebView) findViewById(R.id.mainWebView);
- if (mainWebView.canGoBack()) {
- mainWebView.goBack();
+ // Close the navigation drawer if it is available. GravityCompat.START is the drawer on the left on Left-to-Right layout text.
+ if (drawerLayout.isDrawerVisible(GravityCompat.START)) {
+ drawerLayout.closeDrawer(GravityCompat.START);
} else {
- super.onBackPressed();
+ // Load the previous URL if available.
+ if (mainWebView.canGoBack()) {
+ mainWebView.goBack();
+ } else {
+ // Pass onBackPressed to the system.
+ super.onBackPressed();
+ }
}
}