]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/commitdiff
Double-tap for full screen viewing. Fixes https://redmine.stoutner.com/issues/46.
authorSoren Stoutner <soren@stoutner.com>
Thu, 24 Nov 2016 18:20:15 +0000 (11:20 -0700)
committerSoren Stoutner <soren@stoutner.com>
Thu, 24 Nov 2016 18:20:15 +0000 (11:20 -0700)
.idea/dictionaries/soren.xml
app/src/main/java/com/stoutner/privacybrowser/activities/MainWebView.java
app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java
app/src/main/res/layout/drawerlayout.xml [new file with mode: 0644]
app/src/main/res/layout/main_coordinatorlayout.xml [deleted file]
app/src/main/res/layout/main_webview.xml
app/src/main/res/values/colors.xml
app/src/main/res/values/strings.xml
app/src/main/res/values/styles.xml
app/src/main/res/xml/preferences.xml

index 4f40564b62b341b0fa15915077fc21fc597982e3..bb1c3a18112c3ee7b65237ebc3f3b46d05e0d6c4 100644 (file)
@@ -23,6 +23,7 @@
       <w>displayorder</w>
       <w>dname</w>
       <w>downloadfile</w>
+      <w>drawerlayout</w>
       <w>dwallach</w>
       <w>eadd</w>
       <w>edittext</w>
@@ -30,6 +31,7 @@
       <w>favoriteicon</w>
       <w>fbee</w>
       <w>firebase</w>
+      <w>framelayout</w>
       <w>gerlach</w>
       <w>intl</w>
       <w>isfolder</w>
index 500df319f019cf621552a7c95b3cc2e963bdfb2d..c7e987c116337b57012646976f690e2f43266160 100644 (file)
@@ -38,6 +38,7 @@ import android.preference.PreferenceManager;
 import android.print.PrintDocumentAdapter;
 import android.print.PrintManager;
 import android.support.annotation.NonNull;
+import android.support.design.widget.CoordinatorLayout;
 import android.support.design.widget.NavigationView;
 import android.support.design.widget.Snackbar;
 import android.support.v4.app.ActivityCompat;
@@ -54,10 +55,13 @@ import android.text.Editable;
 import android.text.TextWatcher;
 import android.util.Patterns;
 import android.view.ContextMenu;
+import android.view.GestureDetector;
 import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.MenuItem;
+import android.view.MotionEvent;
 import android.view.View;
+import android.view.WindowManager;
 import android.view.inputmethod.InputMethodManager;
 import android.webkit.CookieManager;
 import android.webkit.DownloadListener;
@@ -77,6 +81,7 @@ import android.widget.RelativeLayout;
 import android.widget.TextView;
 
 import com.stoutner.privacybrowser.BannerAd;
+import com.stoutner.privacybrowser.BuildConfig;
 import com.stoutner.privacybrowser.R;
 import com.stoutner.privacybrowser.helpers.OrbotProxyHelper;
 import com.stoutner.privacybrowser.dialogs.CreateHomeScreenShortcut;
@@ -113,6 +118,13 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
     public static SslCertificate sslCertificate;
 
 
+
+    // `drawerLayout` is used in `onCreate()`, `onNewIntent()`, and `onBackPressed()`.
+    private DrawerLayout drawerLayout;
+
+    // `rootCoordinatorLayout` is used in `onCreate()` and `applySettings()`.
+    private CoordinatorLayout rootCoordinatorLayout;
+
     // 'mainWebView' is used in `onCreate()`, `onOptionsItemSelected()`, `onNavigationItemSelected()`, `onRestart()`, `onCreateContextMenu()`, `findPreviousOnPage()`, `findNextOnPage()`, `closeFindOnPage()`, and `loadUrlFromTextBox()`.
     private WebView mainWebView;
 
@@ -153,15 +165,18 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
     // `javaScriptEnabledSearchURL` is used in `loadURLFromTextBox()` and `applySettings()`.
     private String javaScriptEnabledSearchURL;
 
+    // `hideSystemBarsOnFullscreen` is used in `onCreate()` and `applySettings()`.
+    private boolean hideSystemBarsOnFullscreen;
+
+    // `translucentNavigationBarOnFullscreen` is used in `onCreate()` and `applySettings()`.
+    private boolean translucentNavigationBarOnFullscreen;
+
     // `mainMenu` is used in `onCreateOptionsMenu()` and `updatePrivacyIcons()`.
     private Menu mainMenu;
 
     // `drawerToggle` is used in `onCreate()`, `onPostCreate()`, `onConfigurationChanged()`, `onNewIntent()`, and `onNavigationItemSelected()`.
     private ActionBarDrawerToggle drawerToggle;
 
-    // `drawerLayout` is used in `onCreate()`, `onNewIntent()`, and `onBackPressed()`.
-    private DrawerLayout drawerLayout;
-
     // `urlTextBox` is used in `onCreate()`, `onOptionsItemSelected()`, and `loadUrlFromTextBox()`.
     private EditText urlTextBox;
 
@@ -182,13 +197,13 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
     @SuppressLint("SetJavaScriptEnabled")
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setContentView(R.layout.main_coordinatorlayout);
+        setContentView(R.layout.drawerlayout);
 
         // Get a handle for `inputMethodManager`.
         inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
 
         // 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);
+        Toolbar supportAppBar = (Toolbar) findViewById(R.id.app_bar);
         setSupportActionBar(supportAppBar);
         appBar = getSupportActionBar();
 
@@ -221,15 +236,96 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
             }
         });
 
-        // Get handles for `fullScreenVideoFrameLayout`, `mainWebView`, and `find_on_page_edittext`.
-        final FrameLayout fullScreenVideoFrameLayout = (FrameLayout) findViewById(R.id.fullScreenVideoFrameLayout);
+        // Get handles for views that need to be accessed.
+        drawerLayout = (DrawerLayout) findViewById(R.id.drawerlayout);
+        rootCoordinatorLayout = (CoordinatorLayout) findViewById(R.id.root_coordinatorlayout);
         mainWebView = (WebView) findViewById(R.id.mainWebView);
         findOnPageEditText = (EditText) findViewById(R.id.find_on_page_edittext);
+        final FrameLayout fullScreenVideoFrameLayout = (FrameLayout) findViewById(R.id.full_screen_video_framelayout);
+
+        // Create a double-tap listener to toggle full-screen mode.
+        final GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
+            // Override `onDoubleTap()`.  All other events are handled using the default settings.
+            @Override
+            public boolean onDoubleTap(MotionEvent event) {
+                if (appBar.isShowing()) {  // If `appBar` is visible, switch to full screen mode.
+                    // Hide the `appBar`.
+                    appBar.hide();
+
+                    // Hide the `BannerAd` in the free flavor.
+                    if (BuildConfig.FLAVOR.contentEquals("free")) {
+                        BannerAd.hideAd(adView);
+                    }
+
+                    // Modify the system bars.
+                    if (hideSystemBarsOnFullscreen) {  // Hide everything.
+                        // Remove the translucent overlays.
+                        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+
+                        // Remove the translucent status bar overlay on the `Drawer Layout`, which is special and needs its own command.
+                        drawerLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
+
+                        /* SYSTEM_UI_FLAG_FULLSCREEN hides the status bar at the top of the screen.
+                         * SYSTEM_UI_FLAG_HIDE_NAVIGATION hides the navigation bar on the bottom or right of the screen.
+                         * SYSTEM_UI_FLAG_IMMERSIVE_STICKY makes the status and navigation bars translucent and automatically rehides them after they are shown.
+                         */
+                        rootCoordinatorLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+
+                        // Set `rootCoordinatorLayout` to fill the whole screen.
+                        rootCoordinatorLayout.setFitsSystemWindows(false);
+                    } else {  // Hide everything except the status and navigation bars.
+                        // Set `rootCoordinatorLayout` to fit under the status and navigation bars.
+                        rootCoordinatorLayout.setFitsSystemWindows(false);
+
+                        if (translucentNavigationBarOnFullscreen) {  // There is an Android Support Library bug that causes an ugly scrim to print on the `Drawer Layout` when the navigation bar is displayed on the right of the screen.
+                            // Set the navigation bar to be translucent.
+                            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
+                        }
+                    }
+                } else {  // Switch to normal viewing mode.
+                    // Show the `appBar`.
+                    appBar.show();
+
+                    // Show the `BannerAd` in the free flavor.
+                    if (BuildConfig.FLAVOR.contentEquals("free")) {
+                        // Reload the ad.  Because the screen may have rotated, we need to use `reloadAfterRotate`.
+                        BannerAd.reloadAfterRotate(adView, getApplicationContext(), getString(R.string.ad_id));
+
+                        // Reinitialize the `adView` variable, as the `View` will have been removed and re-added by `BannerAd.reloadAfterRotate()`.
+                        adView = findViewById(R.id.adView);
+                    }
+
+                    // Remove the translucent navigation bar flag if it is set.
+                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
+
+                    // Add the translucent status flag if it is unset.  This also resets `drawerLayout's` `View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN`.
+                    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+
+                    // Remove any `SYSTEM_UI` flags from `rootCoordinatorLayout`.
+                    rootCoordinatorLayout.setSystemUiVisibility(0);
+
+                    // Constrain `rootCoordinatorLayout` inside the status and navigation bars.
+                    rootCoordinatorLayout.setFitsSystemWindows(true);
+                }
+
+                // Consume the double-tap.
+                return true;
+            }
+        });
+
+        // Pass all touch events on `mainWebView` through `gestureDetector` to check for double-taps.
+        mainWebView.setOnTouchListener(new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                // Send the `event` to `gestureDetector`.
+                return gestureDetector.onTouchEvent(event);
+            }
+        });
 
         // Update `findOnPageCountTextView`.
         mainWebView.setFindListener(new WebView.FindListener() {
             // Get a handle for `findOnPageCountTextView`.
-            TextView findOnPageCountTextView = (TextView) findViewById(R.id.find_on_page_count_textview);
+            final TextView findOnPageCountTextView = (TextView) findViewById(R.id.find_on_page_count_textview);
 
             @Override
             public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches, boolean isDoneCounting) {
@@ -292,16 +388,14 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
             }
         });
 
-        // Create the navigation drawer.
-        drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
-        // `DrawerTitle` identifies the drawer in accessibility mode.
+        // `DrawerTitle` identifies the `DrawerLayout` 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);
+        final NavigationView navigationView = (NavigationView) findViewById(R.id.navigationview);
         navigationView.setNavigationItemSelectedListener(this);
 
-        // Get handles for `navigationMenu` and the back and forward menu items.  The menu is zero-based, so item 1 and 2 and the second and third items in the menu.
+        // Get handles for `navigationMenu` and the back and forward menu items.  The menu is zero-based, so items 1, 2, and 3 are the second, third, and fourth entries in the menu.
         final Menu navigationMenu = navigationView.getMenu();
         final MenuItem navigationBackMenuItem = navigationMenu.getItem(1);
         final MenuItem navigationForwardMenuItem = navigationMenu.getItem(2);
@@ -438,13 +532,15 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
                 mainWebView.setVisibility(View.GONE);
 
                 // Hide the ad if this is the free flavor.
-                BannerAd.hideAd(adView);
+                if (BuildConfig.FLAVOR.contentEquals("free")) {
+                    BannerAd.hideAd(adView);
+                }
 
-                /* SYSTEM_UI_FLAG_HIDE_NAVIGATION hides the navigation bars on the bottom or right of the screen.
-                 * SYSTEM_UI_FLAG_FULLSCREEN hides the status bar across the top of the screen.
-                 * SYSTEM_UI_FLAG_IMMERSIVE_STICKY makes the navigation and status bars ghosted overlays and automatically rehides them.
+                /* SYSTEM_UI_FLAG_FULLSCREEN hides the status bar at the top of the screen.
+                 * SYSTEM_UI_FLAG_HIDE_NAVIGATION hides the navigation bar on the bottom or right of the screen.
+                 * SYSTEM_UI_FLAG_IMMERSIVE_STICKY makes the status and navigation bars translucent and automatically rehides them after they are shown.
                  */
-                view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+                view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
             }
 
             // Exit full screen video
@@ -455,7 +551,9 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
                 mainWebView.setVisibility(View.VISIBLE);
 
                 // Show the ad if this is the free flavor.
-                BannerAd.showAd(adView);
+                if (BuildConfig.FLAVOR.contentEquals("free")) {
+                    BannerAd.showAd(adView);
+                }
 
                 // Hide the fullScreenVideoFrameLayout.
                 fullScreenVideoFrameLayout.removeAllViews();
@@ -859,7 +957,7 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
 
             case R.id.find_on_page:
                 // Hide the URL app bar.
-                Toolbar appBarToolbar = (Toolbar) findViewById(R.id.appBar);
+                Toolbar appBarToolbar = (Toolbar) findViewById(R.id.app_bar);
                 appBarToolbar.setVisibility(View.GONE);
 
                 // Show the Find on Page `RelativeLayout`.
@@ -1055,11 +1153,17 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
     public void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
 
-        // Reload the ad if this is the free flavor.
-        BannerAd.reloadAfterRotate(adView, getApplicationContext(), getString(R.string.ad_id));
+        // Handle the `adView` for the free version.
+        if (BuildConfig.FLAVOR.contentEquals("free")) {
+            // Reload the add if we are not in full screen mode.
+            if (adView.isShown()) {
+                // Reload the ad.
+                BannerAd.reloadAfterRotate(adView, getApplicationContext(), getString(R.string.ad_id));
 
-        // Reinitialize the adView variable, as the View will have been removed and re-added in the free flavor by BannerAd.reloadAfterRotate().
-        adView = findViewById(R.id.adView);
+                // Reinitialize the `adView` variable, as the `View` will have been removed and re-added by `BannerAd.reloadAfterRotate()`.
+                adView = findViewById(R.id.adView);
+            }
+        }
 
         // `invalidateOptionsMenu` should recalculate the number of action buttons from the menu to display on the app bar, but it doesn't because of the this bug:  https://code.google.com/p/android/issues/detail?id=20493#c8
         // ActivityCompat.invalidateOptionsMenu(this);
@@ -1327,10 +1431,14 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
     public void onPause() {
         // Pause `mainWebView`.
         mainWebView.onPause();
+
+        // Stop all JavaScript.
         mainWebView.pauseTimers();
 
-        // We need to pause the adView or it will continue to consume resources in the background on the free flavor.
-        BannerAd.pauseAd(adView);
+        // Pause the adView or it will continue to consume resources in the background on the free flavor.
+        if (BuildConfig.FLAVOR.contentEquals("free")) {
+            BannerAd.pauseAd(adView);
+        }
 
         super.onPause();
     }
@@ -1339,12 +1447,16 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
     public void onResume() {
         super.onResume();
 
-        // Resume `mainWebView`.
+        // Resume JavaScript (if enabled).
         mainWebView.resumeTimers();
+
+        // Resume `mainWebView`.
         mainWebView.onResume();
 
-        // We need to resume the adView for the free flavor.
-        BannerAd.resumeAd(adView);
+        // Resume the adView for the free flavor.
+        if (BuildConfig.FLAVOR.contentEquals("free")) {
+            BannerAd.resumeAd(adView);
+        }
     }
 
     @Override
@@ -1429,7 +1541,7 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
         findOnPageLinearLayout.setVisibility(View.GONE);
 
         // Show the URL app bar.
-        Toolbar appBarToolbar = (Toolbar) findViewById(R.id.appBar);
+        Toolbar appBarToolbar = (Toolbar) findViewById(R.id.app_bar);
         appBarToolbar.setVisibility(View.VISIBLE);
 
         // Hide the keyboard so we can see the webpage.  `0` indicates no additional flags.
@@ -1452,6 +1564,8 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
         swipeToRefreshEnabled = sharedPreferences.getBoolean("swipe_to_refresh_enabled", false);
         boolean doNotTrackEnabled = sharedPreferences.getBoolean("do_not_track", true);
         boolean proxyThroughOrbot = sharedPreferences.getBoolean("proxy_through_orbot", false);
+        hideSystemBarsOnFullscreen = sharedPreferences.getBoolean("hide_system_bars", false);
+        translucentNavigationBarOnFullscreen = sharedPreferences.getBoolean("translucent_navigation_bar", true);
 
         // Because they can be modified on-the-fly by the user, these default settings are only applied when the program first runs.
         if (javaScriptEnabled == null) {  // If `javaScriptEnabled` is null the program is just starting.
@@ -1525,6 +1639,37 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
         } else {  // Reset the proxy to default.  The host is `""` and the port is `"0"`.
             OrbotProxyHelper.setProxy(getApplicationContext(), this, "", "0");
         }
+
+        // If we are in full screen mode update the `SYSTEM_UI` flags.
+        if (!appBar.isShowing()) {
+            if (hideSystemBarsOnFullscreen) {  // Hide everything.
+                // Remove the translucent navigation setting if it is currently flagged.
+                getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
+
+                // Remove the translucent status bar overlay.
+                getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+
+                // Remove the translucent status bar overlay on the `Drawer Layout`, which is special and needs its own command.
+                drawerLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
+
+                /* SYSTEM_UI_FLAG_FULLSCREEN hides the status bar at the top of the screen.
+                 * SYSTEM_UI_FLAG_HIDE_NAVIGATION hides the navigation bar on the bottom or right of the screen.
+                 * SYSTEM_UI_FLAG_IMMERSIVE_STICKY makes the status and navigation bars translucent and automatically rehides them after they are shown.
+                 */
+                rootCoordinatorLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+            } else {  // Hide everything except the status and navigation bars.
+                // Add the translucent status flag if it is unset.
+                getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+
+                if (translucentNavigationBarOnFullscreen) {
+                    // Set the navigation bar to be translucent.
+                    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
+                } else {
+                    // Set the navigation bar to be black.
+                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
+                }
+            }
+        }
     }
 
     private void updatePrivacyIcons(boolean runInvalidateOptionsMenu) {
index 2149df504d7b0ebffa4dcd90d1fe8bca0346f675..f1706184e8d6a1760347dc6f80a83e6f04c24ce9 100644 (file)
@@ -128,6 +128,10 @@ public class SettingsFragment extends PreferenceFragment {
         String defaultFontSizeString = savedPreferences.getString("default_font_size", "100");
         defaultFontSizePreference.setSummary(defaultFontSizeString + "%%");
 
+        // Disable `transparent_navigation_bar` if `hide_system_bars` is enabled.
+        final Preference translucentNavigationBarPreference = findPreference("translucent_navigation_bar");
+        translucentNavigationBarPreference.setEnabled(!savedPreferences.getBoolean("hide_system_bars", false));
+
 
         // Listen for preference changes.
         preferencesListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@@ -223,6 +227,12 @@ public class SettingsFragment extends PreferenceFragment {
 
                         // Update the summary text of `default_font_size`.
                         defaultFontSizePreference.setSummary(newDefaultFontSizeString + "%%");
+                        break;
+
+                    case "hide_system_bars":
+                        // Enable `translucentNavigationBarPreference` if `hide_system_bars` is disabled.
+                        translucentNavigationBarPreference.setEnabled(!sharedPreferences.getBoolean("hide_system_bars", false));
+                        break;
 
                     default:
                         // If no match, do nothing.
diff --git a/app/src/main/res/layout/drawerlayout.xml b/app/src/main/res/layout/drawerlayout.xml
new file mode 100644 (file)
index 0000000..903a724
--- /dev/null
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  Copyright 2015-2016 Soren Stoutner <soren@stoutner.com>.
+
+  This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>>.
+
+  Privacy Browser is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  Privacy Browser is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with Privacy Browser.  If not, see <http://www.gnu.org/licenses/>. -->
+
+<android.support.v4.widget.DrawerLayout
+    android:id="@+id/drawerlayout"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_height="match_parent"
+    android:layout_width="match_parent" >
+
+    <!-- android:fitsSystemWindows="true" moves rootCoordinatorLayout below the system status bar.
+        When it is specified the theme should include <item name="android:windowTranslucentStatus">true</item>.
+        Setting the layout root to be focusableInTouchMode prevents urlTextBox from stealing focus on launch and opening the keyboard. -->
+    <android.support.design.widget.CoordinatorLayout
+        android:id="@+id/root_coordinatorlayout"
+        xmlns:tools="http://schemas.android.com/tools"
+        tools:context="com.stoutner.privacybrowser.activities.MainWebView"
+        android:layout_height="match_parent"
+        android:layout_width="match_parent"
+        android:fitsSystemWindows="true"
+        android:focusable="true"
+        android:focusableInTouchMode="true" >
+
+        <!-- The purpose of the LinearLayout is to place the included main_webview below appBarLayout. -->
+        <LinearLayout
+            android:layout_height="match_parent"
+            android:layout_width="match_parent"
+            android:orientation="vertical" >
+
+            <android.support.design.widget.AppBarLayout
+                android:id="@+id/app_bar_layout"
+                android:layout_height="wrap_content"
+                android:layout_width="match_parent"
+                android:theme="@style/AppBarOverlay" >
+
+                <!-- The `FrameLayout` allows `appBar` and `find_on_page_app_bar` to occupy the same space. -->
+                <FrameLayout
+                    android:layout_height="wrap_content"
+                    android:layout_width="match_parent" >
+
+                    <android.support.v7.widget.Toolbar
+                        android:id="@+id/app_bar"
+                        android:layout_height="wrap_content"
+                        android:layout_width="match_parent"
+                        android:background="@color/grey_100"
+                        app:popupTheme="@style/LightPopupOverlay" />
+
+                    <include layout="@layout/find_on_page_app_bar" />
+                </FrameLayout>
+            </android.support.design.widget.AppBarLayout>
+
+            <include layout="@layout/main_webview" />
+        </LinearLayout>
+    </android.support.design.widget.CoordinatorLayout>
+
+    <!-- `fullScreenVideoFrameLayout` is used to display full screen videos.  It is initially `android:visibility="gone"` to hide it from view.
+        The `FrameLayout` needs to be before the `NavigationView` or touches on the navigation drawer will not work after exiting full screen video using the back button.-->
+    <FrameLayout
+        android:id="@+id/full_screen_video_framelayout"
+        android:layout_height="match_parent"
+        android:layout_width="match_parent"
+        android:visibility="gone"
+        android:background="@color/black" />
+
+    <!-- The navigation drawer. -->
+    <android.support.design.widget.NavigationView
+        android:id="@+id/navigationview"
+        android:layout_height="match_parent"
+        android:layout_width="wrap_content"
+        android:layout_gravity="start"
+        app:headerLayout="@layout/navigation_header"
+        app:menu="@menu/webview_navigation_menu"
+        app:itemIconTint="@color/blue_800" />
+</android.support.v4.widget.DrawerLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/main_coordinatorlayout.xml b/app/src/main/res/layout/main_coordinatorlayout.xml
deleted file mode 100644 (file)
index 5a502e8..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
-  Copyright 2015-2016 Soren Stoutner <soren@stoutner.com>.
-
-  This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>>.
-
-  Privacy Browser is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  Privacy Browser is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with Privacy Browser.  If not, see <http://www.gnu.org/licenses/>. -->
-
-<android.support.v4.widget.DrawerLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/drawerLayout"
-    android:layout_height="match_parent"
-    android:layout_width="match_parent">
-
-    <!-- android:fitsSystemWindows="true" moves rootCoordinatorLayout below the system status bar.
-        When it is specified the theme should include <item name="android:windowTranslucentStatus">true</item>.
-        Setting the layout root to be focusableInTouchMode prevents urlTextBox from stealing focus on launch and opening the keyboard. -->
-    <android.support.design.widget.CoordinatorLayout
-        android:id="@+id/rootCoordinatorLayout"
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:app="http://schemas.android.com/apk/res-auto"
-        xmlns:tools="http://schemas.android.com/tools"
-        tools:context="com.stoutner.privacybrowser.activities.MainWebView"
-        android:layout_height="match_parent"
-        android:layout_width="match_parent"
-        android:fitsSystemWindows="true"
-        android:focusable="true"
-        android:focusableInTouchMode="true" >
-
-        <!-- The purpose of the LinearLayout is to place the included main_webview below appBarLayout. -->
-        <LinearLayout
-            android:layout_height="match_parent"
-            android:layout_width="match_parent"
-            android:orientation="vertical" >
-
-            <android.support.design.widget.AppBarLayout
-                android:id="@+id/appBarLayout"
-                android:layout_height="wrap_content"
-                android:layout_width="match_parent"
-                android:theme="@style/AppBarOverlay" >
-
-                <!-- The `FrameLayout` allows `appBar` and `find_on_page_app_bar` to occupy the same space. -->
-                <FrameLayout
-                    android:layout_height="wrap_content"
-                    android:layout_width="match_parent" >
-
-                    <android.support.v7.widget.Toolbar
-                        android:id="@+id/appBar"
-                        android:layout_height="wrap_content"
-                        android:layout_width="match_parent"
-                        android:background="@color/grey_100"
-                        app:popupTheme="@style/LightPopupOverlay" />
-
-                    <include layout="@layout/find_on_page_app_bar" />
-                </FrameLayout>
-            </android.support.design.widget.AppBarLayout>
-
-            <include layout="@layout/main_webview" />
-        </LinearLayout>
-    </android.support.design.widget.CoordinatorLayout>
-
-    <!-- `fullScreenVideoFrameLayout` is used to display full screen videos.  It is initially `android:visibility="gone"` to hide it from view.
-        The `FrameLayout` needs to be before the `NavigationView` or touches on the navigation drawer will not work after exiting full screen video using the back button.-->
-    <FrameLayout
-        android:id="@+id/fullScreenVideoFrameLayout"
-        android:layout_height="match_parent"
-        android:layout_width="match_parent"
-        android:visibility="gone"
-        android:background="@color/black" />
-
-    <!-- The navigation drawer. -->
-    <android.support.design.widget.NavigationView
-        android:id="@+id/navigationView"
-        android:layout_height="match_parent"
-        android:layout_width="wrap_content"
-        android:layout_gravity="start"
-        app:headerLayout="@layout/navigation_header"
-        app:menu="@menu/webview_navigation_menu"
-        app:itemIconTint="@color/blue_800" />
-</android.support.v4.widget.DrawerLayout>
\ No newline at end of file
index c826d26652e0837ea6ac12abab52ebc41aa236cc..d2feac92d025469cfde7c9665409cc0601091900 100644 (file)
@@ -18,8 +18,7 @@
   You should have received a copy of the GNU General Public License
   along with Privacy Browser.  If not, see <http://www.gnu.org/licenses/>. -->
 
-<!-- android:layout_martinTop="?attr/actionBarSize" moves the RelativeLayout below the appBarLayout, which otherwise would cover the top of mainWebView.
-  android:layout_weight="1" sets the RelativeLayout to fill the rest of the screen because it is encapsulated in a LinearLayout with android:orientation="vertical". -->
+<!-- android:layout_weight="1" sets the RelativeLayout to fill the rest of the screen because it is encapsulated in a LinearLayout with android:orientation="vertical". -->
 <RelativeLayout
     android:id="@+id/mainWebViewRelativeLayout"
     xmlns:android="http://schemas.android.com/apk/res/android"
@@ -28,7 +27,7 @@
     android:layout_height="0dp"
     android:layout_weight="1"
     tools:context="com.stoutner.privacybrowser.activities.MainWebView"
-    tools:showIn="@layout/main_coordinatorlayout" >
+    tools:showIn="@layout/drawerlayout" >
 
     <!-- This `TextView` has an id of `adView` so that the ad commands (which do nothing in the standard flavor) don't produce errors. -->
     <TextView
index f72cc34db90678a6d92534a0a205e9fac946c462..b9c02cc40e896195a2095e77187322d009e7bd17 100644 (file)
@@ -20,6 +20,8 @@
 
 <!-- These color resources are hardcoded for vector drawables.  Once the minimum API is >= 22 we can remove the hardcoded colors and reference these entries. -->
 <resources>
+    <color name="transparent_black">#66000000</color>
+
     <color name="black">#FF000000</color>
 
     <color name="blue_50">#FFE3F2FD</color>
index 9af909e2a8b6e51ba8c8026305e279191af6ae78..95e989931f15526b0da035960394ed5e05b44436 100644 (file)
         </string-array>
         <string name="javascript_enabled_search_custom_url">JavaScript-enabled search custom URL</string>
         <string name="custom_url">Custom URL</string>
+    <string name="fullscreen">Full Screen</string>
+        <string name="hide_system_bars">Hide system bars</string>
+        <string name="hide_system_bars_summary">Hide the status and navigation bars in full screen mode.</string>
+        <string name="translucent_navigation_bar">Translucent navigation bar</string>
+        <string name="translucent_navigation_bar_summary">Make the navigation bar translucent in full screen mode.</string>
     <string name="general">General</string>
         <string name="homepage_preference">Homepage</string>
         <string name="default_font_size">Default font size</string>
index 74364f582950d315a008fe9cc0850d137f732ca8..4c8acdfd8e312af59a3a49fcae0151bb490b4181 100644 (file)
@@ -19,7 +19,7 @@
   along with Privacy Browser.  If not, see <http://www.gnu.org/licenses/>. -->
 
 <resources>
-    <!-- `android:windowTranslucentStatus` makes the system status bar transparent.
+    <!-- `android:windowTranslucentStatus` makes the system status bar translucent.
         When it is specified the root layout should include android:fitsSystemWindows="true". -->
     <style name="PrivacyBrowser" parent="Theme.AppCompat.Light.NoActionBar">
         <item name="android:windowTranslucentStatus">true</item>
index f3915b2cf332c8861c5ab4c9c68a3bd68e24c4f5..88ec2f5f029ff7a8472aa97b0263e0c0e4247570 100644 (file)
@@ -60,8 +60,7 @@
             android:entryValues="@array/user_agent_entry_values"
             android:defaultValue="Default user agent" />
 
-        <!-- android:inputType="textVisiblePassword" sets the keyboard to have a dedicated number row.
-          android:imeOptions="flagNoExtractUi" is not set because with the dedicated number row there often isn't room to see the EditText in landscape orientation. -->
+        <!-- android:inputType="textVisiblePassword" sets the keyboard to have a dedicated number row.-->
         <EditTextPreference
             android:key="custom_user_agent"
             android:title="@string/custom_user_agent"
@@ -93,9 +92,6 @@
             android:entryValues="@array/javascript_disabled_search_entry_values"
             android:defaultValue="https://duckduckgo.com/html/?q=" />
 
-        <!-- android:imeOptions="flagNoExtractUi" is not set because with the the length of the title of the dialog box
-          there often isn't enough space to see the EditText in landscape orientation.
-          android:singleLine="true" is not specified because it is the EditTextPreference default. -->
         <EditTextPreference
             android:key="javascript_disabled_search_custom_url"
             android:title="@string/javascript_disabled_search_custom_url"
             android:entryValues="@array/javascript_enabled_search_entry_values"
             android:defaultValue="https://duckduckgo.com/?q=" />
 
-        <!-- android:imeOptions="flagNoExtractUi" is not set because with the the length of the title of the dialog box
-          there often isn't enough space to see the EditText in landscape orientation.
-          android:singleLine="true" is not specified because it is the EditTextPreference default. -->
         <EditTextPreference
             android:key="javascript_enabled_search_custom_url"
             android:title="@string/javascript_enabled_search_custom_url"
             android:inputType="textUri" />
     </PreferenceCategory>
 
+    <PreferenceCategory
+        android:key="fullscreen"
+        android:title="@string/fullscreen">
+
+        <SwitchPreference
+            android:key="hide_system_bars"
+            android:title="@string/hide_system_bars"
+            android:summary="@string/hide_system_bars_summary"
+            android:defaultValue="false" />
+
+        <SwitchPreference
+            android:key="translucent_navigation_bar"
+            android:title="@string/translucent_navigation_bar"
+            android:summary="@string/translucent_navigation_bar_summary"
+            android:defaultValue="true" />
+    </PreferenceCategory>
+
     <PreferenceCategory
         android:key="general"
         android:title="@string/general" >
 
-        <!-- android:imeOptions="flagNoExtractUi" is not set because in special character mode there often isn't enough space to see the EditText in landscape orientation.
-          android:singleLine="true" is not specified because it is the EditTextPreference default. -->
         <EditTextPreference
             android:key="homepage"
             android:title="@string/homepage_preference"