Add preference for customizing the user agent.
authorSoren Stoutner <soren@stoutner.com>
Wed, 11 May 2016 22:00:54 +0000 (15:00 -0700)
committerSoren Stoutner <soren@stoutner.com>
Wed, 11 May 2016 22:00:54 +0000 (15:00 -0700)
app/src/main/AndroidManifest.xml
app/src/main/java/com/stoutner/privacybrowser/MainWebViewActivity.java
app/src/main/java/com/stoutner/privacybrowser/SettingsFragment.java
app/src/main/res/values/strings.xml
app/src/main/res/xml/preferences.xml

index 7271863d1463da5260f46037ef4e8ac0e62f4622..d137b34b8f139e4e4f3776b3f116cd165065329c 100644 (file)
@@ -38,7 +38,7 @@
         android:allowBackup="false"
         android:fullBackupContent="false" >
 
-        <!-- android:configChanges="orientation|screenSize" makes the app not reload when the orientation changes, which preserves scroll location in the WebView. -->
+        <!-- android:configChanges="orientation|screenSize" makes the activity not reload when the orientation changes, which preserves scroll location in the WebView. -->
         <!-- android:launchMode="singleTask" makes the app launch in a new task instead of inside the task of the program that sends it an intent.
             It also makes it reuse an existing Privacy Browser activity if available instead of launching a new one. -->
         <!-- android:persistableMode="persistNever" removes Privacy Browser from the recents screen on a device reboot. -->
         </activity>
 
         <!-- android:persistableMode="persistNever" removes Privacy Browser from the recents screen on a device reboot. -->
+        <!-- android:configChanges="orientation|screenSize" makes the activity not reload when the orientation changes.  -->
         <activity
             android:name=".SettingsActivity"
             android:label="@string/privacy_browser_settings"
             android:parentActivityName=".MainWebViewActivity"
+            android:configChanges="orientation|screenSize"
             android:persistableMode="persistNever" >
 
             <!-- android.support.PARENT_ACTIVITY is necessary for API <= 15. -->
index 78624a8ad3f30d19bb7f9a6f694bf985f64c4740..2333900212aa7638cfce68acfe87aeeffe48cbc9 100644 (file)
@@ -343,6 +343,24 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation
         domStorageEnabled = savedPreferences.getBoolean("dom_storage_enabled", false);
         mainWebView.getSettings().setDomStorageEnabled(domStorageEnabled);
 
+        // Set the user agent initial status.
+        String userAgentString = savedPreferences.getString("user_agent", "Default user agent");
+        switch (userAgentString) {
+            case "Default user agent":
+                // Do nothing.
+                break;
+
+            case "Custom user agent":
+                // Set the custom user agent on mainWebView,  The default is "PrivacyBrowser/1.0".
+                mainWebView.getSettings().setUserAgentString(savedPreferences.getString("custom_user_agent", "PrivacyBrowser/1.0"));
+                break;
+
+            default:
+                // Set the selected user agent on mainWebView.  The default is "PrivacyBrowser/1.0".
+                mainWebView.getSettings().setUserAgentString(savedPreferences.getString("user_agent", "PrivacyBrowser/1.0"));
+                break;
+        }
+
         // Set the initial status for the search URLs.
         javaScriptDisabledSearchURL = savedPreferences.getString("javascript_disabled_search", "https://duckduckgo.com/html/?q=");
         javaScriptDisabledSearchCustomURL = savedPreferences.getString("javascript_disabled_search_custom_url", "");
@@ -618,8 +636,10 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation
 
             case R.id.refresh:
                 mainWebView.reload();
+                return true;
 
             default:
+                // Don't consume the event.
                 return super.onOptionsItemSelected(menuItem);
         }
     }
index f52397b19abfb69df19d64d22f9b139fa9f3c135..95b838aa4644398273690018987e10b1deedf562 100644 (file)
@@ -40,6 +40,22 @@ public class SettingsFragment extends PreferenceFragment {
         savedPreferences = getPreferenceScreen().getSharedPreferences();
 
 
+        // Set the current user-agent as the summary text for the "user_agent" preference when the preference screen is loaded.
+        final Preference userAgentPreference = findPreference("user_agent");
+        // Get the user agent text from the webview (which changes based on the version of Android and WebView installed) if we are using the default.
+        if (savedPreferences.getString("user_agent", "Default user agent").equals("Default user agent")) {
+            // Once API >= 17 we can use getDefaultUserAgent() instead of getUserAgentString().
+            userAgentPreference.setSummary(MainWebViewActivity.mainWebView.getSettings().getUserAgentString());
+        } else { // Display the user-agent from the preference as the summary text.
+            userAgentPreference.setSummary(savedPreferences.getString("user_agent", "Default user agent"));
+        }
+
+        // Set the summary text for "custom_user_agent" (the default is "PrivacyBrowser/1.0") and enable it if "user_agent" it set to "Custom user agent".
+        final Preference customUserAgent = findPreference("custom_user_agent");
+        customUserAgent.setSummary(savedPreferences.getString("custom_user_agent", "PrivacyBrowser/1.0"));
+        customUserAgent.setEnabled(userAgentPreference.getSummary().equals("Custom user agent"));
+
+
         // Set the JavaScript-disabled search URL as the summary text for the JavaScript-disabled search preference when the preference screen is loaded.
         // The default is "https://duckduckgo.com/html/?q=".
         final Preference javaScriptDisabledSearchPreference = findPreference("javascript_disabled_search");
@@ -60,6 +76,7 @@ public class SettingsFragment extends PreferenceFragment {
         javaScriptEnabledSearchCustomURLPreference.setSummary(savedPreferences.getString("javascript_enabled_search_custom_url", ""));
         javaScriptEnabledSearchCustomURLPreference.setEnabled(javaScriptEnabledSearchPreference.getSummary().equals("Custom URL"));
 
+
         // 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"));
@@ -94,7 +111,7 @@ public class SettingsFragment extends PreferenceFragment {
                                 toggleJavaScript.setIcon(R.drawable.privacy_mode);
                             }
                         }
-                        return;
+                        break;
 
                     case "first_party_cookies_enabled":
                         // Set firstPartyCookiesEnabled to the new state.  The default is false.
@@ -118,7 +135,7 @@ public class SettingsFragment extends PreferenceFragment {
                                 toggleJavaScript.setIcon(R.drawable.privacy_mode);
                             }
                         }
-                        return;
+                        break;
 
                     case "third_party_cookies_enabled":
                         // Set thirdPartyCookiesEnabled to the new state.  The default is false.
@@ -133,7 +150,7 @@ public class SettingsFragment extends PreferenceFragment {
                             MainWebViewActivity.cookieManager.setAcceptThirdPartyCookies(MainWebViewActivity.mainWebView, MainWebViewActivity.thirdPartyCookiesEnabled);
                             MainWebViewActivity.mainWebView.reload();
                         }
-                        return;
+                        break;
 
                     case "dom_storage_enabled":
                         // Set domStorageEnabled to the new state.  The default is false.
@@ -157,7 +174,43 @@ public class SettingsFragment extends PreferenceFragment {
                                 toggleJavaScript.setIcon(R.drawable.privacy_mode);
                             }
                         }
-                        return;
+                        break;
+
+                    case "user_agent":
+                        String userAgentString = sharedPreferences.getString("user_agent", "Default user agent");
+
+                        switch (userAgentString) {
+                            case "Default user agent":
+                                // Set the default user agent on mainWebView, display the user agent as the summary text for userAgentPreference, and disable customUserAgent.
+                                // Once API >= 17 we can use getDefaultUserAgent().  For now, setUserAgentString("") sets the WebView's default user agent.
+                                MainWebViewActivity.mainWebView.getSettings().setUserAgentString("");
+                                userAgentPreference.setSummary(MainWebViewActivity.mainWebView.getSettings().getUserAgentString());
+                                customUserAgent.setEnabled(false);
+                                break;
+
+                            case "Custom user agent":
+                                // Set the custom user agent on mainWebView, display "Custom user agent" as the summary text for userAgentPreference, and enable customUserAgent.
+                                MainWebViewActivity.mainWebView.getSettings().setUserAgentString(sharedPreferences.getString("custom_user_agent", "PrivacyBrowser/1.0"));
+                                userAgentPreference.setSummary("Custom user agent");
+                                customUserAgent.setEnabled(true);
+                                break;
+
+                            default:
+                                // Set the user agent on mainWebView, display the user agent as the summary text for userAgentPreference, and disable customUserAgent.
+                                MainWebViewActivity.mainWebView.getSettings().setUserAgentString(sharedPreferences.getString("user_agent", "PrivacyBrowser/1.0"));
+                                userAgentPreference.setSummary(MainWebViewActivity.mainWebView.getSettings().getUserAgentString());
+                                customUserAgent.setEnabled(false);
+                                break;
+                        }
+                        break;
+
+                    case "custom_user_agent":
+                        // Set the new custom user agent as the summary text for "custom_user_agent".  The default is "PrivacyBrowser/1.0".
+                        customUserAgent.setSummary(sharedPreferences.getString("custom_user_agent", "PrivacyBrowser/1.0"));
+
+                        // Update mainWebView's user agent.  The default is "PrivacyBrowser/1.0".
+                        MainWebViewActivity.mainWebView.getSettings().setUserAgentString(sharedPreferences.getString("user_agent", "PrivacyBrowser/1.0"));
+                        break;
 
                     case "javascript_disabled_search":
                         // Set the new search URL as the summary text for the JavaScript-disabled search preference.  The default is "https://duckduckgo.com/html/?q=".
@@ -168,7 +221,7 @@ public class SettingsFragment extends PreferenceFragment {
 
                         // Update the javaScriptDisabledSearchURL variable.  The default is "https://duckduckgo.com/html/?q=".
                         MainWebViewActivity.javaScriptDisabledSearchURL = sharedPreferences.getString("javascript_disabled_search", "https://duckduckgo.com/html/?q=");
-                        return;
+                        break;
 
                     case "javascript_disabled_search_custom_url":
                         // Set the new custom search URL as the summary text for "javascript_disabled_search_custom_url".  The default is "".
@@ -176,6 +229,7 @@ public class SettingsFragment extends PreferenceFragment {
 
                         // Update javaScriptDisabledSearchCustomURL.  The default is "".
                         MainWebViewActivity.javaScriptDisabledSearchCustomURL = sharedPreferences.getString("javascript_disabled_search_custom_url", "");
+                        break;
 
                     case "javascript_enabled_search":
                         // Set the new search URL as the summary text for the JavaScript-enabled search preference.  The default is "https://duckduckgo.com/?q=".
@@ -186,7 +240,7 @@ public class SettingsFragment extends PreferenceFragment {
 
                         // Update the javaScriptEnabledSearchURL variable.  The default is "https://duckduckgo.com/?q=".
                         MainWebViewActivity.javaScriptEnabledSearchURL = sharedPreferences.getString("javascript_enabled_search", "https://duckduckgo.com/?q=");
-                        return;
+                        break;
 
                     case "javascript_enabled_search_custom_url":
                         // Set the new custom search URL as the summary text for "javascript_enabled_search_custom_url".  The default is "".
@@ -194,6 +248,7 @@ public class SettingsFragment extends PreferenceFragment {
 
                         // Update javaScriptEnabledSearchCustomURL.  The default is "".
                         MainWebViewActivity.javaScriptEnabledSearchCustomURL = sharedPreferences.getString("javascript_enabled_search_custom_url", "");
+                        break;
 
                     case "homepage":
                         // Set the new homepage URL as the summary text for the Homepage preference.  The default is "https://www.duckduckgo.com".
@@ -201,7 +256,7 @@ public class SettingsFragment extends PreferenceFragment {
 
                         // Update the homepage variable.  The default is "https://www.duckduckgo.com".
                         MainWebViewActivity.homepage = sharedPreferences.getString("homepage", "https://www.duckduckgo.com");
-                        return;
+                        break;
 
                     case "swipe_to_refresh_enabled":
                         // Set swipeToRefreshEnabled to the new state.  The default is true.
@@ -209,10 +264,11 @@ public class SettingsFragment extends PreferenceFragment {
 
                         // Update swipeRefreshLayout to match the new state.
                         MainWebViewActivity.swipeToRefresh.setEnabled(MainWebViewActivity.swipeToRefreshEnabled);
-                        return;
+                        break;
 
-                    // If no match, do nothing.
                     default:
+                        // If no match, do nothing.
+                        break;
                 }
             }
         };
index 69cc2ff7b15e2d0ac025e81599839c03535fcd41..931175fc1b396ab60f545525121fa63274f11554 100644 (file)
     <string name="dom_storage_preference">Enable DOM storage by default</string>
     <string name="dom_storage_preference_summary">Document Object Management storage, also called web storage, is an enhanced form of cookies
         that allows websites to store larger and more complex types of information, like pictures, on your device.</string>
+    <string name="user_agent">User agent</string>
+    <string-array name="user_agent_entries">
+        <item>WebView Default</item>
+        <item>Privacy Browser 1.0</item>
+        <item>Firefox 46 on Android 6.0.1</item>
+        <item>Chrome 50 on Android 6.0.1</item>
+        <item>Firefox 46 on Linux</item>
+        <item>Chromium 50 on Linux</item>
+        <item>Konqueror 4.14 on Linux</item>
+        <item>Firefox 46 on Windows 10</item>
+        <item>Chrome 50 on Windows 10</item>
+        <item>Internet Explorer 11 on Windows 10</item>
+        <item>Edge 13 on Windows 10</item>
+        <item>Custom</item>
+    </string-array>
+    <string-array name="user_agent_entry_values">
+        <item>Default user agent</item>
+        <item>PrivacyBrowser/1.0</item>
+        <item>Mozilla/5.0 (Android 6.0.1; Mobile; rv:46.0) Gecko/46.0 Firefox/46.0</item>
+        <item>Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MHC19Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.89 Mobile Safari/537.36</item>
+        <item>Mozilla/5.0 (X11; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0</item>
+        <item>Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36</item>
+        <item>Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.21 (KHTML, like Gecko) konqueror/4.14.14 Safari/537.21</item>
+        <item>Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0</item>
+        <item>Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36</item>
+        <item>Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko</item>
+        <item>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586</item>
+        <item>Custom user agent</item>
+    </string-array>
+    <string name="custom_user_agent">Custom user agent</string>
     <string name="search">Search</string>
     <string name="javascript_disabled_search">JavaScript-disabled search</string>
     <string-array name="javascript_disabled_search_entries">
index a44f999ad7f3e366c31a963a440cbb65f742963d..813c1ca2c6f6cb4a169e182d29c8a8e26ddb3c08 100644 (file)
             android:title="@string/dom_storage_preference"
             android:summary="@string/dom_storage_preference_summary"
             android:defaultValue="false" />
+
+        <ListPreference
+            android:key="user_agent"
+            android:title="@string/user_agent"
+            android:entries="@array/user_agent_entries"
+            android:entryValues="@array/user_agent_entry_values"
+            android:defaultValue="" />
+
+        // Android doesn't let EditTextPreferences have more than one line, but I include singleLine="false" in case they ever wisen up.
+        <EditTextPreference
+            android:key="custom_user_agent"
+            android:title="@string/custom_user_agent"
+            android:defaultValue="PrivacyBrowser/1.0"
+            android:inputType="textUri"
+            android:singleLine="false"/>
     </PreferenceCategory>
 
     <PreferenceCategory