From 743982f883eab347e4029f8a3be760f780b14da1 Mon Sep 17 00:00:00 2001 From: Soren Stoutner Date: Thu, 22 Dec 2016 13:25:50 -0700 Subject: [PATCH] Ad a preference to disable full screen browsing mode. Fixes https://redmine.stoutner.com/issues/75. --- app/build.gradle | 2 +- .../activities/MainWebView.java | 102 ++++++++++-------- .../fragments/SettingsFragment.java | 33 +++++- app/src/main/res/values-es/strings.xml | 4 +- app/src/main/res/values/strings.xml | 4 +- app/src/main/res/xml/preferences.xml | 10 +- 6 files changed, 99 insertions(+), 56 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b827a842..d7cc4b88 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,6 +64,6 @@ dependencies { freeCompile 'com.google.firebase:firebase-ads:9.8.0' } -// Google's documentation says the following line is required for `firebase-ads` but things work correctly without it. I have no interest in applying this Google Mobile Services plugin in the standard flavor if I don't have to. +// Google's documentation says the following line is required for `firebase-ads` but things work correctly without it. I have no interest in applying the Google Mobile Services plugin in the standard flavor if I don't have to. // I suspect that in the free flavor `firebase-ads` applies it even when not specified. https://firebase.google.com/docs/admob/android/quick-start // apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebView.java b/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebView.java index 8e06fc8b..e5296732 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebView.java +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebView.java @@ -173,6 +173,9 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN // `javaScriptEnabledSearchURL` is used in `loadURLFromTextBox()` and `applySettings()`. private String javaScriptEnabledSearchURL; + // `fullScreenBrowsingModeEnabled` is used in `onCreate()` and `applySettings()`. + private boolean fullScreenBrowsingModeEnabled; + // `hideSystemBarsOnFullscreen` is used in `onCreate()` and `applySettings()`. private boolean hideSystemBarsOnFullscreen; @@ -253,68 +256,72 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN // 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); - } + if (fullScreenBrowsingModeEnabled) { // Only process the double-tap if full screen browsing mode is enabled. + 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); + // 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); + // 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); + 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 a scrim to print on the right side of 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(); - // 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); + // 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)); - if (translucentNavigationBarOnFullscreen) { // There is an Android Support Library bug that causes a scrim to print on the right side of 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); + // Reinitialize the `adView` variable, as the `View` will have been removed and re-added by `BannerAd.reloadAfterRotate()`. + adView = findViewById(R.id.adView); } - } - } 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); - // 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); - // 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); - // Remove any `SYSTEM_UI` flags from `rootCoordinatorLayout`. - rootCoordinatorLayout.setSystemUiVisibility(0); + // Constrain `rootCoordinatorLayout` inside the status and navigation bars. + rootCoordinatorLayout.setFitsSystemWindows(true); + } - // Constrain `rootCoordinatorLayout` inside the status and navigation bars. - rootCoordinatorLayout.setFitsSystemWindows(true); + // Consume the double-tap. + return true; + } else { // Do not consume the double-tap because full screen browsing mode is disabled. + return false; } - - // Consume the double-tap. - return true; } }); @@ -600,7 +607,7 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN // Replace the header that `WebView` creates for `X-Requested-With` with a null value. The default value is the application ID (com.stoutner.privacybrowser.standard). customHeaders.put("X-Requested-With", ""); - // Initialize the default preference values the first time the program is run. + // Initialize the default preference values the first time the program is run. `this` is the context. `false` keeps this command from resetting any current preferences back to default. PreferenceManager.setDefaultValues(this, R.xml.preferences, false); // Apply the settings from the shared preferences. @@ -1628,6 +1635,7 @@ 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); + fullScreenBrowsingModeEnabled = sharedPreferences.getBoolean("enable_full_screen_browsing_mode", false); hideSystemBarsOnFullscreen = sharedPreferences.getBoolean("hide_system_bars", false); translucentNavigationBarOnFullscreen = sharedPreferences.getBoolean("translucent_navigation_bar", true); diff --git a/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java b/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java index 535b647a..95ca66b7 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java +++ b/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java @@ -119,6 +119,20 @@ public class SettingsFragment extends PreferenceFragment { javaScriptEnabledSearchCustomURLPreference.setEnabled(javaScriptEnabledSearchString.equals("Custom URL")); + // Enable the full screen options if full screen browsing mode is enabled. + final Preference hideSystemBarsPreference = findPreference("hide_system_bars"); + final Preference translucentNavigationBarPreference = findPreference("translucent_navigation_bar"); + final boolean fullScreenBrowsingModeEnabled = savedPreferences.getBoolean("enable_full_screen_browsing_mode", false); + if (!fullScreenBrowsingModeEnabled) { + // Disable the full screen options. + hideSystemBarsPreference.setEnabled(false); + translucentNavigationBarPreference.setEnabled(false); + } else { + // Disable `transparent_navigation_bar` if `hide_system_bars` is `true`. + translucentNavigationBarPreference.setEnabled(!savedPreferences.getBoolean("hide_system_bars", false)); + } + + // Set the homepage URL as the summary text for the `Homepage` preference when the preference screen is loaded. The default is `https://www.duckduckgo.com`. final Preference homepagePreference = findPreference("homepage"); homepagePreference.setSummary(savedPreferences.getString("homepage", "https://www.duckduckgo.com")); @@ -128,10 +142,6 @@ 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() { @@ -216,6 +226,21 @@ public class SettingsFragment extends PreferenceFragment { javaScriptEnabledSearchCustomURLPreference.setSummary(sharedPreferences.getString("javascript_enabled_search_custom_url", "")); break; + case "enable_full_screen_browsing_mode": + boolean newFullScreenBrowsingModeEnabled = sharedPreferences.getBoolean("enable_full_screen_browsing_mode", false); + if (newFullScreenBrowsingModeEnabled) { + // Enable `hideSystemBarsPreference`. + hideSystemBarsPreference.setEnabled(true); + + // Only enable `transparent_navigation_bar` if `hide_system_bars` is `false`. + translucentNavigationBarPreference.setEnabled(!sharedPreferences.getBoolean("hide_system_bars", false)); + } else { + // Disable the full screen options. + hideSystemBarsPreference.setEnabled(false); + translucentNavigationBarPreference.setEnabled(false); + } + break; + case "homepage": // Set the new homepage URL as the summary text for the Homepage preference. The default is `https://www.duckduckgo.com`. homepagePreference.setSummary(sharedPreferences.getString("homepage", "https://www.duckduckgo.com")); diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ed468d91..ae2a53c6 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -244,7 +244,9 @@ URL personalizado de búsquedas de JavaScript habilitado URL personalizado - Pantalla Completa + Pantalla Completa + Habilitar pantalla completa + Doble toque para pantalla completa. Esconder las barras del systema Esconder las barras de estado y de navegación en el modo de pantalla completa. Barra de navegación translúcida diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 085d36aa..c46c6e2e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -281,7 +281,9 @@ JavaScript-enabled search custom URL Custom URL - Full Screen + Full Screen + Enable full screen browsing mode + Double-tap to toggle full screen browsing mode. Hide system bars Hide the status and navigation bars in full screen mode. Translucent navigation bar diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 8ed81b84..cdda87e7 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -113,8 +113,14 @@ + android:key="full_screen" + android:title="@string/full_screen"> + +