Add a menu item to toggle JavaScript.
authorSoren Stoutner <soren@stoutner.com>
Sun, 24 Jan 2016 03:48:35 +0000 (20:48 -0700)
committerSoren Stoutner <soren@stoutner.com>
Sun, 24 Jan 2016 03:48:35 +0000 (20:48 -0700)
app/src/main/java/com/stoutner/privacybrowser/AboutDialog.java
app/src/main/java/com/stoutner/privacybrowser/Webview.java
app/src/main/res/menu/menu_webview.xml
app/src/main/res/values/strings.xml

index ed6f8c3153eac4e9214579a016ead6e156820a1a..5cedfd6d28af410013ec183ae2bcf8d22b4fd38c 100644 (file)
@@ -37,7 +37,7 @@ public class AboutDialog extends AppCompatDialogFragment {
         aboutDialogWebView.loadUrl("file:///android_asset/about_text.html");
 
         // Use AlertDialog.Builder to create the AlertDialog
-        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
+        final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
         alertDialogBuilder.setTitle(R.string.about_privacy_browser);
         alertDialogBuilder.setView(aboutDialogWebView);
         alertDialogBuilder.setPositiveButton(R.string.dismiss, new DialogInterface.OnClickListener() {
index 2760e346e5458f1748fcb16e85144b53a782274c..138a35b0190494d151692b85f2f5b4de6989a0ae 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright 2015 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2015-2016 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Browser.
  *
@@ -43,8 +43,6 @@ import android.view.View;
 import android.view.inputmethod.InputMethodManager;
 import android.webkit.DownloadListener;
 import android.webkit.WebChromeClient;
-import android.webkit.WebResourceError;
-import android.webkit.WebResourceRequest;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 import android.widget.EditText;
@@ -61,8 +59,16 @@ public class Webview extends AppCompatActivity implements CreateHomeScreenShortc
     // favoriteIcon is public static so it can be accessed from CreateHomeScreenShortcut.
     public static Bitmap favoriteIcon;
 
+    // mainWebView is used in onCreate and onOptionsItemSelected.
+    private WebView mainWebView;
+    // formattedUrlString is used in onCreate, onOptionsItemSelected, onCreateHomeScreenShortcutCreate, and loadUrlFromTextBox.
     private String formattedUrlString;
+    // homepage is used in onCreate and onOptionsItemSelected.
     private String homepage = "https://www.duckduckgo.com/";
+    // enableJavaScript is used onCreate and onOptionsItemSelected.
+    private boolean enableJavaScript;
+    // actionBar is used in onCreate and onOptionsItemSelected.
+    private ActionBar actionBar;
 
     // Remove Android Studio's warning about the dangers of using SetJavaScriptEnabled.
     @SuppressLint("SetJavaScriptEnabled")
@@ -72,11 +78,12 @@ public class Webview extends AppCompatActivity implements CreateHomeScreenShortc
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_webview);
 
-        final WebView mainWebView = (WebView) findViewById(R.id.mainWebView);
         final FrameLayout fullScreenVideoFrameLayout = (FrameLayout) findViewById(R.id.fullScreenVideoFrameLayout);
         final Activity mainWebViewActivity = this;
 
-        final ActionBar actionBar = getSupportActionBar();
+        mainWebView = (WebView) findViewById(R.id.mainWebView);
+        actionBar = getSupportActionBar();
+
         if (actionBar != null) {
             // Remove the title from the action bar.
             actionBar.setDisplayShowTitleEnabled(false);
@@ -174,7 +181,9 @@ public class Webview extends AppCompatActivity implements CreateHomeScreenShortc
             // Enter full screen video
             @Override
             public void onShowCustomView(View view, CustomViewCallback callback) {
-                getSupportActionBar().hide();
+                if (getSupportActionBar() != null) {
+                    getSupportActionBar().hide();
+                }
 
                 fullScreenVideoFrameLayout.addView(view);
                 fullScreenVideoFrameLayout.setVisibility(View.VISIBLE);
@@ -204,7 +213,9 @@ public class Webview extends AppCompatActivity implements CreateHomeScreenShortc
 
             // Exit full screen video
             public void onHideCustomView() {
-                getSupportActionBar().show();
+                if (getSupportActionBar() != null) {
+                    getSupportActionBar().show();
+                }
 
                 mainWebView.setVisibility(View.VISIBLE);
 
@@ -213,6 +224,7 @@ public class Webview extends AppCompatActivity implements CreateHomeScreenShortc
             }
         });
 
+        // Allow the downloading of files.
         mainWebView.setDownloadListener(new DownloadListener() {
             // Launch the Android download manager when a link leads to a download.
             @Override
@@ -241,8 +253,13 @@ public class Webview extends AppCompatActivity implements CreateHomeScreenShortc
             mainWebView.getSettings().setDisplayZoomControls(false);
         }
 
-        // Enable JavaScript.
-        mainWebView.getSettings().setJavaScriptEnabled(true);
+        // Set JavaScript initial status.
+        enableJavaScript = true;
+        if (enableJavaScript) {
+            mainWebView.getSettings().setJavaScriptEnabled(true);
+        } else {
+            mainWebView.getSettings().setJavaScriptEnabled(false);
+        }
 
         // Enable DOM Storage.
         mainWebView.getSettings().setDomStorageEnabled(true);
@@ -269,35 +286,58 @@ public class Webview extends AppCompatActivity implements CreateHomeScreenShortc
     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);
+        MenuItem toggleJavaScriptMenuItem = menu.findItem(R.id.toggleJavaScript);
+
+        // Set the JavaScript menu item checkbox initial status.
+        if (enableJavaScript) {
+            toggleJavaScriptMenuItem.setChecked(true);
+        } else {
+            toggleJavaScriptMenuItem.setChecked(false);
+        }
+
         return true;
     }
 
-    // @TargetApi(11) turns off the errors regarding copy and paste, which are removed from view in menu_webview.xml for lower version of Android.
     @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")
     public boolean onOptionsItemSelected(MenuItem menuItem) {
         int menuItemId = menuItem.getItemId();
         ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
-        ActionBar actionBar = getSupportActionBar();
-        final WebView mainWebView = (WebView) findViewById(R.id.mainWebView);
 
         // Sets the commands that relate to the menu entries.
         switch (menuItemId) {
+            case R.id.toggleJavaScript:
+                if (enableJavaScript) {
+                    enableJavaScript = false;
+                    menuItem.setChecked(false);
+                    mainWebView.getSettings().setJavaScriptEnabled(false);
+                    mainWebView.loadUrl(formattedUrlString);
+                } else {
+                    enableJavaScript = true;
+                    menuItem.setChecked(true);
+                    mainWebView.getSettings().setJavaScriptEnabled(true);
+                    mainWebView.loadUrl(formattedUrlString);
+                }
+                return true;
+
             case R.id.home:
                 mainWebView.loadUrl(homepage);
-                break;
+                return true;
 
             case R.id.refresh:
                 mainWebView.loadUrl(formattedUrlString);
-                break;
+                return true;
 
             case R.id.back:
                 mainWebView.goBack();
-                break;
+                return true;
 
             case R.id.forward:
                 mainWebView.goForward();
-                break;
+                return true;
 
             case R.id.copyURL:
                 // Make sure that actionBar is not null.
@@ -305,7 +345,7 @@ public class Webview extends AppCompatActivity implements CreateHomeScreenShortc
                     EditText urlTextBox = (EditText) actionBar.getCustomView().findViewById(R.id.urlTextBox);
                     clipboard.setPrimaryClip(ClipData.newPlainText("URL", urlTextBox.getText()));
                 }
-                break;
+                return true;
 
             case R.id.pasteURL:
                 // Make sure that actionBar is not null.
@@ -319,7 +359,7 @@ public class Webview extends AppCompatActivity implements CreateHomeScreenShortc
                         e.printStackTrace();
                     }
                 }
-                break;
+                return true;
 
             case R.id.shareURL:
                 // Make sure that actionBar is not null.
@@ -331,7 +371,7 @@ public class Webview extends AppCompatActivity implements CreateHomeScreenShortc
                     shareIntent.setType("text/plain");
                     startActivity(Intent.createChooser(shareIntent, "Share URL"));
                 }
-                break;
+                return true;
 
             case R.id.addToHomescreen:
                 // Show the CreateHomeScreenShortcut AlertDialog and name this instance createShortcut.
@@ -339,7 +379,7 @@ public class Webview extends AppCompatActivity implements CreateHomeScreenShortc
                 shortcutDialog.show(getSupportFragmentManager(), "createShortcut");
 
                 //Everything else will be handled by CreateHomeScreenShortcut and the associated listeners below.
-                break;
+                return true;
 
             case R.id.downloads:
                 // Launch the system Download Manager.
@@ -349,17 +389,17 @@ public class Webview extends AppCompatActivity implements CreateHomeScreenShortc
                 downloadManangerIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 
                 startActivity(downloadManangerIntent);
-                break;
+                return true;
 
             case R.id.about:
                 // Show the AboutDialog AlertDialog and name this instance aboutDialog.
                 AppCompatDialogFragment aboutDialog = new AboutDialog();
                 aboutDialog.show(getSupportFragmentManager(), "aboutDialog");
+                return true;
 
-                break;
+            default:
+                return super.onOptionsItemSelected(menuItem);
         }
-
-        return super.onOptionsItemSelected(menuItem);
     }
 
     @Override
index 6287a8cfd9d48673b56ce7b413a434218bae1f37..dbe206b17eaae3eb3f1446410bc687df29462dc8 100644 (file)
     xmlns:tools="http://schemas.android.com/tools"
     tools:context=".Webview">
 
+    <item
+        android:id="@+id/toggleJavaScript"
+        android:title="@string/javaScript"
+        android:orderInCategory="1"
+        android:checkable="true"
+        app:showAsAction="never" />
+
     <item
         android:id="@+id/home"
         android:title="@string/home"
-        android:orderInCategory="10"
+        android:orderInCategory="2"
         android:icon="@drawable/ic_home_black_24dp"
         app:showAsAction="never" />
 
     <item
         android:id="@+id/refresh"
         android:title="@string/refresh"
-        android:orderInCategory="20"
+        android:orderInCategory="3"
         app:showAsAction="never" />
 
     <item
         android:id="@+id/back"
         android:title="@string/back"
-        android:orderInCategory="30"
+        android:orderInCategory="4"
         android:icon="@drawable/ic_back"
         app:showAsAction="never" />
 
     <item
         android:id="@+id/forward"
         android:title="@string/forward"
-        android:orderInCategory="40"
+        android:orderInCategory="5"
         android:icon="@drawable/ic_forward"
         app:showAsAction="never" />
 
@@ -53,7 +60,7 @@
     <item
         android:id="@+id/copyURL"
         android:title="@string/copy_URL"
-        android:orderInCategory="50"
+        android:orderInCategory="6"
         tools:targetApi="11"
         app:showAsAction="never" />
 
     <item
         android:id="@+id/pasteURL"
         android:title="@string/paste_URL"
-        android:orderInCategory="60"
+        android:orderInCategory="7"
         tools:targetApi="11"
         app:showAsAction="never" />
 
     <item
         android:id="@+id/shareURL"
         android:title="@string/share_URL"
-        android:orderInCategory="70"
+        android:orderInCategory="8"
         app:showAsAction="never" />
 
     <item
         android:id="@+id/addToHomescreen"
         android:title="@string/add_to_home_screen"
-        android:orderInCategory="80"
+        android:orderInCategory="9"
         app:showAsAction="never" />
 
     <item
         android:id="@+id/downloads"
         android:title="@string/downloads"
-        android:orderInCategory="90"
+        android:orderInCategory="10"
         app:showAsAction="never" />
 
     <item
         android:id="@+id/about"
         android:title="@string/about"
-        android:orderInCategory="100"
+        android:orderInCategory="11"
         app:showAsAction="never" />
 </menu>
index 2a3ee3760981058226796424a841266350d6be88..993c43d23915dbfaab3a529153bbcf6ea8386c95 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright 2015 Soren Stoutner <soren@stoutner.com>.
+  Copyright 2015-2016 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://privacybrowser.stoutner.com/>.
 
@@ -24,6 +24,7 @@
     <string name="favorite_icon">Favorite Icon</string>
 
     <!-- Menu. -->
+    <string name="javaScript">JavaScript</string>
     <string name="home">Home</string>
     <string name="refresh">Refresh</string>
     <string name="back">Back</string>