From d73de413ff6568f09acafa835be1af3e3cd2cefe Mon Sep 17 00:00:00 2001
From: Soren Stoutner <soren@stoutner.com>
Date: Mon, 10 Sep 2018 21:24:00 -0700
Subject: [PATCH] Add user agent controls to the options menu. 
 https://redmine.stoutner.com/issues/305

---
 .idea/dictionaries/soren.xml                  |   1 +
 app/build.gradle                              |   2 +-
 .../activities/MainWebViewActivity.java       | 257 ++++++++++++++----
 .../main/res/menu/webview_options_menu.xml    | 113 +++++++-
 app/src/main/res/values-de/strings.xml        |  12 +
 app/src/main/res/values-es/strings.xml        |  12 +
 app/src/main/res/values-it/strings.xml        |  12 +
 app/src/main/res/values-ru/strings.xml        |  12 +
 app/src/main/res/values/strings.xml           |  12 +
 9 files changed, 364 insertions(+), 69 deletions(-)

diff --git a/.idea/dictionaries/soren.xml b/.idea/dictionaries/soren.xml
index 9a0b75ff..5bed1892 100644
--- a/.idea/dictionaries/soren.xml
+++ b/.idea/dictionaries/soren.xml
@@ -85,6 +85,7 @@
       <w>listview</w>
       <w>logins</w>
       <w>lossless</w>
+      <w>macos</w>
       <w>mailto</w>
       <w>materialdesignicons</w>
       <w>mimetype</w>
diff --git a/app/build.gradle b/app/build.gradle
index 8710e38d..25eacaff 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -71,7 +71,7 @@ android {
 
 dependencies {
     implementation fileTree(include: ['*.jar'], dir: 'libs')
-    implementation 'com.android.support:design:28.0.0-rc01'
+    implementation 'com.android.support:design:28.0.0-rc02'
 
     // Only compile Firebase ads for the free flavor.
     freeImplementation 'com.google.firebase:firebase-ads:15.0.1'
diff --git a/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java b/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java
index 076f4145..d9eed0c0 100644
--- a/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java
+++ b/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java
@@ -362,6 +362,12 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
     private boolean fanboysSocialBlockingListEnabled;
     private boolean ultraPrivacyEnabled;
 
+    // `webViewDefaultUserAgent` is used in `onCreate()` and `onPrepareOptionsMenu()`.
+    private String webViewDefaultUserAgent;
+
+    // `defaultCustomUserAgentString` is used in `onPrepareOptionsMenu()` and `applyDomainSettings()`.
+    private String defaultCustomUserAgentString;
+
     // `privacyBrowserRuntime` is used in `onCreate()`, `onOptionsItemSelected()`, and `applyAppSettings()`.
     private Runtime privacyBrowserRuntime;
 
@@ -1216,6 +1222,9 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
         saveFormDataEnabled = false;  // Form data can be removed once the minimum API >= 26.
         nightMode = false;
 
+        // Store the default user agent.
+        webViewDefaultUserAgent = mainWebView.getSettings().getUserAgentString();
+
         // Initialize the WebView title.
         webViewTitle = getString(R.string.no_title);
 
@@ -2103,6 +2112,38 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
         ultraPrivacyMenuItem.setTitle(ultraPrivacyBlockedRequests + " - " + getString(R.string.ultraprivacy));
         blockAllThirdParyRequestsMenuItem.setTitle(thirdPartyBlockedRequests + " - " + getString(R.string.block_all_third_party_requests));
 
+        // Get the current user agent.
+        String currentUserAgent = mainWebView.getSettings().getUserAgentString();
+
+        // Select the current user agent menu item.  A switch statement cannot be used because the user agents are not compile time constants.
+        if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[0])) {  // Privacy Browser.
+            menu.findItem(R.id.user_agent_privacy_browser).setChecked(true);
+        } else if (currentUserAgent.equals(webViewDefaultUserAgent)) {  // WebView Default.
+            menu.findItem(R.id.user_agent_webview_default).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[2])) {  // Firefox on Android.
+            menu.findItem(R.id.user_agent_firefox_on_android).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[3])) {  // Chrome on Android.
+            menu.findItem(R.id.user_agent_chrome_on_android).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[4])) {  // Safari on iOS.
+            menu.findItem(R.id.user_agent_safari_on_ios).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[5])) {  // Firefox on Linux.
+            menu.findItem(R.id.user_agent_firefox_on_linux).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[6])) {  // Chromium on Linux.
+            menu.findItem(R.id.user_agent_chromium_on_linux).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[7])) {  // Firefox on Windows.
+            menu.findItem(R.id.user_agent_firefox_on_windows).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[8])) {  // Chrome on Windows.
+            menu.findItem(R.id.user_agent_chrome_on_windows).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[9])) {  // Edge on Windows.
+            menu.findItem(R.id.user_agent_edge_on_windows).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[10])) {  // Internet Explorer on Windows.
+            menu.findItem(R.id.user_agent_internet_explorer_on_windows).setChecked(true);
+        } else if (currentUserAgent.equals(getResources().getStringArray(R.array.user_agent_data)[11])) {  // Safari on macOS.
+            menu.findItem(R.id.user_agent_safari_on_macos).setChecked(true);
+        } else {  // Custom user agent.
+            menu.findItem(R.id.user_agent_custom).setChecked(true);
+        }
+
         // Initialize font size variables.
         int fontSize = mainWebView.getSettings().getTextZoom();
         String fontSizeTitle;
@@ -2435,61 +2476,6 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
                         .show();
                 return true;
 
-            case R.id.font_size_twenty_five_percent:
-                mainWebView.getSettings().setTextZoom(25);
-                return true;
-
-            case R.id.font_size_fifty_percent:
-                mainWebView.getSettings().setTextZoom(50);
-                return true;
-
-            case R.id.font_size_seventy_five_percent:
-                mainWebView.getSettings().setTextZoom(75);
-                return true;
-
-            case R.id.font_size_one_hundred_percent:
-                mainWebView.getSettings().setTextZoom(100);
-                return true;
-
-            case R.id.font_size_one_hundred_twenty_five_percent:
-                mainWebView.getSettings().setTextZoom(125);
-                return true;
-
-            case R.id.font_size_one_hundred_fifty_percent:
-                mainWebView.getSettings().setTextZoom(150);
-                return true;
-
-            case R.id.font_size_one_hundred_seventy_five_percent:
-                mainWebView.getSettings().setTextZoom(175);
-                return true;
-
-            case R.id.font_size_two_hundred_percent:
-                mainWebView.getSettings().setTextZoom(200);
-                return true;
-
-            case R.id.swipe_to_refresh:
-                // Toggle swipe to refresh.
-                swipeRefreshLayout.setEnabled(!swipeRefreshLayout.isEnabled());
-                return true;
-
-            case R.id.display_images:
-                if (mainWebView.getSettings().getLoadsImagesAutomatically()) {  // Images are currently loaded automatically.
-                    mainWebView.getSettings().setLoadsImagesAutomatically(false);
-                    mainWebView.reload();
-                } else {  // Images are not currently loaded automatically.
-                    mainWebView.getSettings().setLoadsImagesAutomatically(true);
-                }
-
-                // Set `onTheFlyDisplayImagesSet`.
-                onTheFlyDisplayImagesSet = true;
-                return true;
-
-            case R.id.view_source:
-                // Launch the View Source activity.
-                Intent viewSourceIntent = new Intent(this, ViewSourceActivity.class);
-                startActivity(viewSourceIntent);
-                return true;
-
             case R.id.easylist:
                 // Toggle the EasyList status.
                 easyListEnabled = !easyListEnabled;
@@ -2560,6 +2546,165 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
                 mainWebView.reload();
                 return true;
 
+            case R.id.user_agent_privacy_browser:
+                // Update the user agent.
+                mainWebView.getSettings().setUserAgentString(getResources().getStringArray(R.array.user_agent_data)[0]);
+
+                // Reload the WebView.
+                mainWebView.reload();
+                return true;
+
+            case R.id.user_agent_webview_default:
+                // Update the user agent.
+                mainWebView.getSettings().setUserAgentString("");
+
+                // Reload the WebView.
+                mainWebView.reload();
+                return true;
+
+            case R.id.user_agent_firefox_on_android:
+                // Update the user agent.
+                mainWebView.getSettings().setUserAgentString(getResources().getStringArray(R.array.user_agent_data)[2]);
+
+                // Reload the WebView.
+                mainWebView.reload();
+                return true;
+
+            case R.id.user_agent_chrome_on_android:
+                // Update the user agent.
+                mainWebView.getSettings().setUserAgentString(getResources().getStringArray(R.array.user_agent_data)[3]);
+
+                // Reload the WebView.
+                mainWebView.reload();
+                return true;
+
+            case R.id.user_agent_safari_on_ios:
+                // Update the user agent.
+                mainWebView.getSettings().setUserAgentString(getResources().getStringArray(R.array.user_agent_data)[4]);
+
+                // Reload the WebView.
+                mainWebView.reload();
+                return true;
+
+            case R.id.user_agent_firefox_on_linux:
+                // Update the user agent.
+                mainWebView.getSettings().setUserAgentString(getResources().getStringArray(R.array.user_agent_data)[5]);
+
+                // Reload the WebView.
+                mainWebView.reload();
+                return true;
+
+            case R.id.user_agent_chromium_on_linux:
+                // Update the user agent.
+                mainWebView.getSettings().setUserAgentString(getResources().getStringArray(R.array.user_agent_data)[6]);
+
+                // Reload the WebView.
+                mainWebView.reload();
+                return true;
+
+            case R.id.user_agent_firefox_on_windows:
+                // Update the user agent.
+                mainWebView.getSettings().setUserAgentString(getResources().getStringArray(R.array.user_agent_data)[7]);
+
+                // Reload the WebView.
+                mainWebView.reload();
+                return true;
+
+            case R.id.user_agent_chrome_on_windows:
+                // Update the user agent.
+                mainWebView.getSettings().setUserAgentString(getResources().getStringArray(R.array.user_agent_data)[8]);
+
+                // Reload the WebView.
+                mainWebView.reload();
+                return true;
+
+            case R.id.user_agent_edge_on_windows:
+                // Update the user agent.
+                mainWebView.getSettings().setUserAgentString(getResources().getStringArray(R.array.user_agent_data)[9]);
+
+                // Reload the WebView.
+                mainWebView.reload();
+                return true;
+
+            case R.id.user_agent_internet_explorer_on_windows:
+                // Update the user agent.
+                mainWebView.getSettings().setUserAgentString(getResources().getStringArray(R.array.user_agent_data)[10]);
+
+                // Reload the WebView.
+                mainWebView.reload();
+                return true;
+
+            case R.id.user_agent_safari_on_macos:
+                // Update the user agent.
+                mainWebView.getSettings().setUserAgentString(getResources().getStringArray(R.array.user_agent_data)[11]);
+
+                // Reload the WebView.
+                mainWebView.reload();
+                return true;
+
+            case R.id.user_agent_custom:
+                // Update the user agent.
+                mainWebView.getSettings().setUserAgentString(defaultCustomUserAgentString);
+
+                // Reload the WebView.
+                mainWebView.reload();
+                return true;
+
+            case R.id.font_size_twenty_five_percent:
+                mainWebView.getSettings().setTextZoom(25);
+                return true;
+
+            case R.id.font_size_fifty_percent:
+                mainWebView.getSettings().setTextZoom(50);
+                return true;
+
+            case R.id.font_size_seventy_five_percent:
+                mainWebView.getSettings().setTextZoom(75);
+                return true;
+
+            case R.id.font_size_one_hundred_percent:
+                mainWebView.getSettings().setTextZoom(100);
+                return true;
+
+            case R.id.font_size_one_hundred_twenty_five_percent:
+                mainWebView.getSettings().setTextZoom(125);
+                return true;
+
+            case R.id.font_size_one_hundred_fifty_percent:
+                mainWebView.getSettings().setTextZoom(150);
+                return true;
+
+            case R.id.font_size_one_hundred_seventy_five_percent:
+                mainWebView.getSettings().setTextZoom(175);
+                return true;
+
+            case R.id.font_size_two_hundred_percent:
+                mainWebView.getSettings().setTextZoom(200);
+                return true;
+
+            case R.id.swipe_to_refresh:
+                // Toggle swipe to refresh.
+                swipeRefreshLayout.setEnabled(!swipeRefreshLayout.isEnabled());
+                return true;
+
+            case R.id.display_images:
+                if (mainWebView.getSettings().getLoadsImagesAutomatically()) {  // Images are currently loaded automatically.
+                    mainWebView.getSettings().setLoadsImagesAutomatically(false);
+                    mainWebView.reload();
+                } else {  // Images are not currently loaded automatically.
+                    mainWebView.getSettings().setLoadsImagesAutomatically(true);
+                }
+
+                // Set `onTheFlyDisplayImagesSet`.
+                onTheFlyDisplayImagesSet = true;
+                return true;
+
+            case R.id.view_source:
+                // Launch the View Source activity.
+                Intent viewSourceIntent = new Intent(this, ViewSourceActivity.class);
+                startActivity(viewSourceIntent);
+                return true;
+
             case R.id.share:
                 // Setup the share string.
                 String shareString = webViewTitle + " – " + urlTextBox.getText().toString();
@@ -3921,7 +4066,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
             // Store the general preference information.
             String defaultFontSizeString = sharedPreferences.getString("default_font_size", "100");
             String defaultUserAgentName = sharedPreferences.getString("user_agent", "Privacy Browser");
-            String defaultCustomUserAgentString = sharedPreferences.getString("custom_user_agent", "PrivacyBrowser/1.0");
+            defaultCustomUserAgentString = sharedPreferences.getString("custom_user_agent", "PrivacyBrowser/1.0");
             boolean defaultSwipeToRefresh = sharedPreferences.getBoolean("swipe_to_refresh", true);
             nightMode = sharedPreferences.getBoolean("night_mode", false);
 
diff --git a/app/src/main/res/menu/webview_options_menu.xml b/app/src/main/res/menu/webview_options_menu.xml
index 8bc8a9a6..5e1d19c9 100644
--- a/app/src/main/res/menu/webview_options_menu.xml
+++ b/app/src/main/res/menu/webview_options_menu.xml
@@ -149,10 +149,99 @@
         app:showAsAction="never" >
 
         <menu>
+            <item
+                android:id="@+id/user_agent"
+                android:title="@string/user_agent"
+                android:orderInCategory="910"
+                app:showAsAction="never" >
+
+                <menu>
+                    <group android:checkableBehavior ="single">
+                        <item
+                            android:id="@+id/user_agent_privacy_browser"
+                            android:title="@string/privacy_browser"
+                            android:orderInCategory="911"
+                            app:showAsAction="never" />
+
+                        <item
+                            android:id="@+id/user_agent_webview_default"
+                            android:title="@string/user_agent_webview_default"
+                            android:orderInCategory="912"
+                            app:showAsAction="never" />
+
+                        <item
+                            android:id="@+id/user_agent_firefox_on_android"
+                            android:title="@string/user_agent_firefox_on_android"
+                            android:orderInCategory="913"
+                            app:showAsAction="never" />
+
+                        <item
+                            android:id="@+id/user_agent_chrome_on_android"
+                            android:title="@string/user_agent_chrome_on_android"
+                            android:orderInCategory="914"
+                            app:showAsAction="never" />
+
+                        <item
+                            android:id="@+id/user_agent_safari_on_ios"
+                            android:title="@string/user_agent_safari_on_ios"
+                            android:orderInCategory="915"
+                            app:showAsAction="never" />
+
+                        <item
+                            android:id="@+id/user_agent_firefox_on_linux"
+                            android:title="@string/user_agent_firefox_on_linux"
+                            android:orderInCategory="916"
+                            app:showAsAction="never" />
+
+                        <item
+                            android:id="@+id/user_agent_chromium_on_linux"
+                            android:title="@string/user_agent_chromium_on_linux"
+                            android:orderInCategory="917"
+                            app:showAsAction="never" />
+
+                        <item
+                            android:id="@+id/user_agent_firefox_on_windows"
+                            android:title="@string/user_agent_firefox_on_windows"
+                            android:orderInCategory="918"
+                            app:showAsAction="never" />
+
+                        <item
+                            android:id="@+id/user_agent_chrome_on_windows"
+                            android:title="@string/user_agent_chrome_on_windows"
+                            android:orderInCategory="919"
+                            app:showAsAction="never" />
+
+                        <item
+                            android:id="@+id/user_agent_edge_on_windows"
+                            android:title="@string/user_agent_edge_on_windows"
+                            android:orderInCategory="920"
+                            app:showAsAction="never" />
+
+                        <item
+                            android:id="@+id/user_agent_internet_explorer_on_windows"
+                            android:title="@string/user_agent_internet_explorer_on_windows"
+                            android:orderInCategory="921"
+                            app:showAsAction="never" />
+
+                        <item
+                            android:id="@+id/user_agent_safari_on_macos"
+                            android:title="@string/user_agent_safari_on_macos"
+                            android:orderInCategory="922"
+                            app:showAsAction="never" />
+
+                        <item
+                            android:id="@+id/user_agent_custom"
+                            android:title="@string/user_agent_custom"
+                            android:orderInCategory="923"
+                            app:showAsAction="never" />
+                    </group>
+                </menu>
+            </item>
+
             <item
                 android:id="@+id/font_size"
                 android:title="@string/font_size"
-                android:orderInCategory="910"
+                android:orderInCategory="930"
                 app:showAsAction="never" >
 
                 <menu>
@@ -160,49 +249,49 @@
                         <item
                             android:id="@+id/font_size_twenty_five_percent"
                             android:title="@string/twenty_five_percent"
-                            android:orderInCategory="911"
+                            android:orderInCategory="931"
                             app:showAsAction="never" />
 
                         <item
                             android:id="@+id/font_size_fifty_percent"
                             android:title="@string/fifty_percent"
-                            android:orderInCategory="912"
+                            android:orderInCategory="932"
                             app:showAsAction="never" />
 
                         <item
                             android:id="@+id/font_size_seventy_five_percent"
                             android:title="@string/seventy_five_percent"
-                            android:orderInCategory="913"
+                            android:orderInCategory="933"
                             app:showAsAction="never" />
 
                         <item
                             android:id="@+id/font_size_one_hundred_percent"
                             android:title="@string/one_hundred_percent"
-                            android:orderInCategory="914"
+                            android:orderInCategory="934"
                             app:showAsAction="never" />
 
                         <item
                             android:id="@+id/font_size_one_hundred_twenty_five_percent"
                             android:title="@string/one_hundred_twenty_five_percent"
-                            android:orderInCategory="915"
+                            android:orderInCategory="935"
                             app:showAsAction="never" />
 
                         <item
                             android:id="@+id/font_size_one_hundred_fifty_percent"
                             android:title="@string/one_hundred_fifty_percent"
-                            android:orderInCategory="916"
+                            android:orderInCategory="936"
                             app:showAsAction="never" />
 
                         <item
                             android:id="@+id/font_size_one_hundred_seventy_five_percent"
                             android:title="@string/one_hundred_seventy_five_percent"
-                            android:orderInCategory="917"
+                            android:orderInCategory="937"
                             app:showAsAction="never" />
 
                         <item
                             android:id="@+id/font_size_two_hundred_percent"
                             android:title="@string/two_hundred_percent"
-                            android:orderInCategory="918"
+                            android:orderInCategory="938"
                             app:showAsAction="never" />
                     </group>
                 </menu>
@@ -211,21 +300,21 @@
             <item
                 android:id="@+id/swipe_to_refresh"
                 android:title="@string/swipe_to_refresh_options_menu"
-                android:orderInCategory="920"
+                android:orderInCategory="940"
                 android:checkable="true"
                 app:showAsAction="never" />
 
             <item
                 android:id="@+id/display_images"
                 android:title="@string/display_images"
-                android:orderInCategory="930"
+                android:orderInCategory="950"
                 android:checkable="true"
                 app:showAsAction="never" />
 
             <item
                 android:id="@+id/view_source"
                 android:title="@string/view_source"
-                android:orderInCategory="940"
+                android:orderInCategory="960"
                 app:showAsAction="never" />
         </menu>
     </item>
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 8a4ec357..bfc071c0 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -131,6 +131,18 @@
         <string name="clear_cookies">Cookies löschen</string>
         <string name="clear_dom_storage">DOM-Speicher löschen</string>
         <string name="clear_form_data">Formulardaten löschen</string>
+        <string name="user_agent_webview_default">WebView-Standard</string>
+        <string name="user_agent_firefox_on_android">Firefox auf Android</string>
+        <string name="user_agent_chrome_on_android">Chrome auf Android</string>
+        <string name="user_agent_safari_on_ios">Safari auf iOS</string>
+        <string name="user_agent_firefox_on_linux">Firefox auf Linux</string>
+        <string name="user_agent_chromium_on_linux">Chromium auf Linux</string>
+        <string name="user_agent_firefox_on_windows">Firefox auf Windows</string>
+        <string name="user_agent_chrome_on_windows">Chrome auf Windows</string>
+        <string name="user_agent_edge_on_windows">Edge auf Windows</string>
+        <string name="user_agent_internet_explorer_on_windows">Internet Explorer auf Windows</string>
+        <string name="user_agent_safari_on_macos">Safari auf macOS</string>
+        <string name="user_agent_custom">Eigener</string>
         <string name="font_size">Schriftgröße</string>
             <string name="twenty_five_percent">25%</string>
             <string name="fifty_percent">50%</string>
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 3a46aebf..8afa404e 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -134,6 +134,18 @@
     <string name="options_fanboys_social_blocking_list">Lista de bloqueo social de Fanboy</string>
     <string name="options_block_all_third_party_requests">Bloquear todas las solicitudes de terceros</string>
     <string name="layout">Diseño</string>
+        <string name="user_agent_webview_default">WebView por defecto</string>
+        <string name="user_agent_firefox_on_android">Firefox en Android</string>
+        <string name="user_agent_chrome_on_android">Chrome en Android</string>
+        <string name="user_agent_safari_on_ios">Safari en iOS</string>
+        <string name="user_agent_firefox_on_linux">Firefox en Linux</string>
+        <string name="user_agent_chromium_on_linux">Chromium en Linux</string>
+        <string name="user_agent_firefox_on_windows">Firefox en Windows</string>
+        <string name="user_agent_chrome_on_windows">Chrome en Windows</string>
+        <string name="user_agent_edge_on_windows">Edge en Windows</string>
+        <string name="user_agent_internet_explorer_on_windows">Internet Explorer en Windows</string>
+        <string name="user_agent_safari_on_macos">Safari en macOS</string>
+        <string name="user_agent_custom">Personalizado</string>
         <string name="font_size">Tamaño de fuente</string>
             <string name="twenty_five_percent">25%</string>
             <string name="fifty_percent">50%</string>
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 37b1f3ad..0d092c31 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -134,6 +134,18 @@
     <string name="options_fanboys_social_blocking_list">Fanboy’s social blocking list</string>
     <string name="options_block_all_third_party_requests">Blocca tutte le richieste di Terze Parti</string>
     <string name="layout">Layout</string>
+        <string name="user_agent_webview_default">WebView Default</string>
+        <string name="user_agent_firefox_on_android">Firefox su Android</string>
+        <string name="user_agent_chrome_on_android">Chrome su Android</string>
+        <string name="user_agent_safari_on_ios">Safari su iOS</string>
+        <string name="user_agent_firefox_on_linux">Firefox su Linux</string>
+        <string name="user_agent_chromium_on_linux">Chromium su Linux</string>
+        <string name="user_agent_firefox_on_windows">Firefox su Windows</string>
+        <string name="user_agent_chrome_on_windows">Chrome su Windows</string>
+        <string name="user_agent_edge_on_windows">Edge su Windows</string>
+        <string name="user_agent_internet_explorer_on_windows">Internet Explorer su Windows</string>
+        <string name="user_agent_safari_on_macos">Safari su macOS</string>
+        <string name="user_agent_custom">Personalizzato</string>
         <string name="font_size">Dimensione font</string>
             <string name="twenty_five_percent">25%</string>
             <string name="fifty_percent">50%</string>
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 9f0b3990..d753623c 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -135,6 +135,18 @@
     <string name="options_fanboys_social_blocking_list">Fanboy’s social blocking list</string>
     <string name="options_block_all_third_party_requests">Блокировать все сторонние запросы</string>
     <string name="layout">Внешний вид</string>
+        <string name="user_agent_webview_default">WebView по умолчанию</string>
+        <string name="user_agent_firefox_on_android">Firefox на Android</string>
+        <string name="user_agent_chrome_on_android">Chrome на Android</string>
+        <string name="user_agent_safari_on_ios">Safari на iOS</string>
+        <string name="user_agent_firefox_on_linux">Firefox на Linux</string>
+        <string name="user_agent_chromium_on_linux">Chromium на Linux</string>
+        <string name="user_agent_firefox_on_windows">Firefox на Windows</string>
+        <string name="user_agent_chrome_on_windows">Chrome на Windows</string>
+        <string name="user_agent_edge_on_windows">Edge на Windows</string>
+        <string name="user_agent_internet_explorer_on_windows">Internet Explorer на Windows</string>
+        <string name="user_agent_safari_on_macos">Safari на macOS</string>
+        <string name="user_agent_custom">Настраиваемый</string>
         <string name="font_size">Размер шрифта</string>
             <string name="twenty_five_percent">25%</string>
             <string name="fifty_percent">50%</string>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ce962578..f370ba3b 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -135,6 +135,18 @@
     <string name="options_fanboys_social_blocking_list">Fanboy’s Social Blocking List</string>
     <string name="options_block_all_third_party_requests">Block All Third-Party Requests</string>
     <string name="layout">Layout</string>
+        <string name="user_agent_webview_default">WebView Default</string>
+        <string name="user_agent_firefox_on_android">Firefox on Android</string>
+        <string name="user_agent_chrome_on_android">Chrome on Android</string>
+        <string name="user_agent_safari_on_ios">Safari on iOS</string>
+        <string name="user_agent_firefox_on_linux">Firefox on Linux</string>
+        <string name="user_agent_chromium_on_linux">Chromium on Linux</string>
+        <string name="user_agent_firefox_on_windows">Firefox on Windows</string>
+        <string name="user_agent_chrome_on_windows">Chrome on Windows</string>
+        <string name="user_agent_edge_on_windows">Edge on Windows</string>
+        <string name="user_agent_internet_explorer_on_windows">Internet Explorer on Windows</string>
+        <string name="user_agent_safari_on_macos">Safari on macOS</string>
+        <string name="user_agent_custom">Custom</string>
         <string name="font_size">Font Size</string>
             <string name="twenty_five_percent">25%</string>
             <string name="fifty_percent">50%</string>
-- 
2.47.2