Allow specifying any font size. https://redmine.stoutner.com/issues/504 master
authorSoren Stoutner <soren@stoutner.com>
Fri, 22 Nov 2019 23:54:03 +0000 (16:54 -0700)
committerSoren Stoutner <soren@stoutner.com>
Fri, 22 Nov 2019 23:54:03 +0000 (16:54 -0700)
43 files changed:
.idea/dictionaries/soren.xml
app/build.gradle
app/src/main/java/com/stoutner/privacybrowser/activities/DomainsActivity.java
app/src/main/java/com/stoutner/privacybrowser/activities/LogcatActivity.java
app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java
app/src/main/java/com/stoutner/privacybrowser/activities/SettingsActivity.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/AddDomainDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/CreateBookmarkDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/CreateBookmarkFolderDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/DownloadFileDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/DownloadImageDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/DownloadLocationPermissionDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/EditBookmarkDatabaseViewDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/EditBookmarkDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/EditBookmarkFolderDatabaseViewDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/EditBookmarkFolderDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/FontSizeDialog.java [new file with mode: 0644]
app/src/main/java/com/stoutner/privacybrowser/dialogs/HttpAuthenticationDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/MoveToFolderDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/PinnedMismatchDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/SaveLogcatDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/SaveWebpageImageDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/StoragePermissionDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/UrlHistoryDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/ViewRequestDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/ViewSslCertificateDialog.java
app/src/main/java/com/stoutner/privacybrowser/fragments/DomainSettingsFragment.java
app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java
app/src/main/java/com/stoutner/privacybrowser/fragments/WebViewTabFragment.java
app/src/main/res/layout/create_bookmark_dialog.xml
app/src/main/res/layout/domain_settings_fragment.xml
app/src/main/res/layout/font_size_dialog.xml [new file with mode: 0644]
app/src/main/res/layout/http_authentication_dialog.xml
app/src/main/res/menu/webview_options_menu.xml
app/src/main/res/values-de/strings.xml
app/src/main/res/values-es/strings.xml
app/src/main/res/values-fr/strings.xml
app/src/main/res/values-it/strings.xml
app/src/main/res/values-ru/strings.xml
app/src/main/res/values-tr/strings.xml
app/src/main/res/values/strings.xml
app/src/main/res/xml/preferences.xml
build.gradle

index b3e3c4dfae0df38eb6929c7da49271c883ac7798..053898493850547bc4dbf8e5e511a58f0673a6ae 100644 (file)
@@ -41,6 +41,7 @@
       <w>daeef</w>
       <w>databaseview</w>
       <w>deeplinks</w>
+      <w>dereferenced</w>
       <w>didn</w>
       <w>displayimages</w>
       <w>displayorder</w>
index 15b6d70069e4ee64ea68a95880376c9e2c366a67..a7d278bb1ab6ab7f6fa4787cc981416ae3d79e6d 100644 (file)
 apply plugin: 'com.android.application'
 
 android {
-    compileSdkVersion 28
-    buildToolsVersion '28.0.3'
+    compileSdkVersion 29
+    buildToolsVersion '29.0.2'
 
     defaultConfig {
         minSdkVersion 19
-        targetSdkVersion 28
+        targetSdkVersion 29
         versionCode 46
         versionName "3.2"
     }
@@ -74,6 +74,7 @@ dependencies {
     implementation 'androidx.cardview:cardview:1.0.0'
     implementation 'androidx.coordinatorlayout:coordinatorlayout:1.0.0'
     implementation 'androidx.drawerlayout:drawerlayout:1.0.0'
+    implementation 'androidx.preference:preference:1.1.0'
     implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0'
     implementation 'androidx.viewpager:viewpager:1.0.0'
 
@@ -81,5 +82,5 @@ dependencies {
     implementation 'com.google.android.material:material:1.0.0'
 
     // Only compile Firebase ads for the free flavor.
-    freeImplementation 'com.google.firebase:firebase-ads:18.2.0'
+    freeImplementation 'com.google.firebase:firebase-ads:18.3.0'
 }
\ No newline at end of file
index 037ed592f8cf056977defb4d7963f225cf1a82f0..81727aacd6d3cf2312337a89b6054cc31046dee3 100644 (file)
@@ -41,6 +41,7 @@ import android.widget.Spinner;
 import android.widget.Switch;
 import android.widget.TextView;
 
+import androidx.annotation.NonNull;
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.widget.Toolbar;  // The AndroidX toolbar must be used until the minimum API is >= 21.
@@ -560,7 +561,7 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
     }
 
     @Override
-    protected void onSaveInstanceState(Bundle outState) {
+    protected void onSaveInstanceState(@NonNull Bundle outState) {
         // Store the current `DomainSettingsFragment` state in `outState`.
         if (findViewById(R.id.domain_settings_scrollview) != null) {  // `DomainSettingsFragment` is displayed.
             // Save any changes that have been made to the domain settings.
@@ -645,8 +646,13 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
             undoDeleteSnackbar.dismiss();
         }
 
-        // Get the new domain name String from the dialog fragment.
+        // Remove the incorrect lint warning below that the dialog might be null.
+        assert dialogFragment.getDialog() != null;
+
+        // Get a handle for the domain name edit text.
         EditText domainNameEditText = dialogFragment.getDialog().findViewById(R.id.domain_name_edittext);
+
+        // Get the domain name string.
         String domainNameString = domainNameEditText.getText().toString();
 
         // Create the domain and store the database ID in `currentDomainDatabaseId`.
@@ -693,6 +699,7 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
         Spinner userAgentSpinner = view.findViewById(R.id.user_agent_spinner);
         EditText customUserAgentEditText = view.findViewById(R.id.custom_user_agent_edittext);
         Spinner fontSizeSpinner = view.findViewById(R.id.font_size_spinner);
+        EditText customFontSizeEditText = view.findViewById(R.id.custom_font_size_edittext);
         Spinner swipeToRefreshSpinner = view.findViewById(R.id.swipe_to_refresh_spinner);
         Spinner nightModeSpinner = view.findViewById(R.id.night_mode_spinner);
         Spinner wideViewportSpinner = view.findViewById(R.id.wide_viewport_spinner);
@@ -716,8 +723,8 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
         boolean ultraList = ultraListSwitch.isChecked();
         boolean ultraPrivacy = ultraPrivacySwitch.isChecked();
         boolean blockAllThirdPartyRequests = blockAllThirdPartyRequestsSwitch.isChecked();
-        int userAgentPosition = userAgentSpinner.getSelectedItemPosition();
-        int fontSizePosition = fontSizeSpinner.getSelectedItemPosition();
+        int userAgentSwitchPosition = userAgentSpinner.getSelectedItemPosition();
+        int fontSizeSwitchPosition = fontSizeSpinner.getSelectedItemPosition();
         int swipeToRefreshInt = swipeToRefreshSpinner.getSelectedItemPosition();
         int nightModeInt = nightModeSpinner.getSelectedItemPosition();
         int wideViewportInt = wideViewportSpinner.getSelectedItemPosition();
@@ -729,7 +736,7 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
         String userAgentName;
 
         // Set the user agent name.
-        switch (userAgentPosition) {
+        switch (userAgentSwitchPosition) {
             case MainWebViewActivity.DOMAINS_SYSTEM_DEFAULT_USER_AGENT:
                 // Set the user agent name to be `System default user agent`.
                 userAgentName = resources.getString(R.string.system_default_user_agent);
@@ -745,11 +752,17 @@ public class DomainsActivity extends AppCompatActivity implements AddDomainDialo
                 String[] userAgentNameArray = resources.getStringArray(R.array.user_agent_names);
 
                 // Set the user agent name from the array.  The domain spinner has one more entry than the name array, so the position must be decremented.
-                userAgentName = userAgentNameArray[userAgentPosition - 1];
+                userAgentName = userAgentNameArray[userAgentSwitchPosition - 1];
         }
 
-        // Get the font size integer.
-        int fontSizeInt = Integer.parseInt(resources.getStringArray(R.array.domain_settings_font_size_entry_values)[fontSizePosition]);
+        // Initialize the font size integer.  `0` indicates the system default font size.
+        int fontSizeInt = 0;
+
+        // Use a custom font size if it is selected.
+        if (fontSizeSwitchPosition == 1) {  // A custom font size is specified.
+            // Get the custom font size from the edit text.
+            fontSizeInt = Integer.parseInt(customFontSizeEditText.getText().toString());
+        }
 
         // Save the domain settings.
         domainsDatabaseHelper.updateDomain(DomainsActivity.currentDomainDatabaseId, domainNameString, javaScript, firstPartyCookies, thirdPartyCookies, domStorage, formData, easyList, easyPrivacy,
index f270cd24db670e42caa0b6ec3eb136ff50bdb111..754874d8b5986de422c0c05d156f921e5cbabc4f 100644 (file)
@@ -28,6 +28,7 @@ import android.content.Intent;
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.media.MediaScannerConnection;
+import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.preference.PreferenceManager;
@@ -200,8 +201,14 @@ public class LogcatActivity extends AppCompatActivity implements SaveLogcatDialo
 
     @Override
     public void onSaveLogcat(DialogFragment dialogFragment) {
+        // Get a handle for the dialog fragment.
+        Dialog dialog = dialogFragment.getDialog();
+
+        // Remove the lint warning below that the dialog fragment might be null.
+        assert dialog != null;
+
         // Get a handle for the file name edit text.
-        EditText fileNameEditText = dialogFragment.getDialog().findViewById(R.id.file_name_edittext);
+        EditText fileNameEditText = dialog.findViewById(R.id.file_name_edittext);
 
         // Get the file path string.
         filePathString = fileNameEditText.getText().toString();
@@ -312,6 +319,9 @@ public class LogcatActivity extends AppCompatActivity implements SaveLogcatDialo
     // The activity result is called after browsing for a file in the save alert dialog.
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        // Run the default commands.
+        super.onActivityResult(requestCode, resultCode, data);
+
         // Don't do anything if the user pressed back from the file picker.
         if (resultCode == Activity.RESULT_OK) {
             // Get a handle for the save dialog fragment.
@@ -322,17 +332,26 @@ public class LogcatActivity extends AppCompatActivity implements SaveLogcatDialo
                 // Get a handle for the save dialog.
                 Dialog saveDialog = saveDialogFragment.getDialog();
 
+                // Remove the lint warning below that the save dialog might be null.
+                assert saveDialog != null;
+
                 // Get a handle for the file name edit text.
                 EditText fileNameEditText = saveDialog.findViewById(R.id.file_name_edittext);
 
                 // Instantiate the file name helper.
                 FileNameHelper fileNameHelper = new FileNameHelper();
 
-                // Convert the file name URI to a file name path.
-                String fileNamePath = fileNameHelper.convertUriToFileNamePath(data.getData());
+                // Get the file name URI from the intent.
+                Uri fileNameUri= data.getData();
+
+                // Process the file name URI if it is not null.
+                if (fileNameUri != null) {
+                    // Convert the file name URI to a file name path.
+                    String fileNamePath = fileNameHelper.convertUriToFileNamePath(fileNameUri);
 
-                // Set the file name path as the text of the file name edit text.
-                fileNameEditText.setText(fileNamePath);
+                    // Set the file name path as the text of the file name edit text.
+                    fileNameEditText.setText(fileNamePath);
+                }
             }
         }
     }
index f4c51bb6acabaf071e363f34658b6058866cc152..252609212a83251a57f041d7bd437fff1680d09b 100644 (file)
@@ -129,6 +129,7 @@ import com.stoutner.privacybrowser.dialogs.DownloadImageDialog;
 import com.stoutner.privacybrowser.dialogs.DownloadLocationPermissionDialog;
 import com.stoutner.privacybrowser.dialogs.EditBookmarkDialog;
 import com.stoutner.privacybrowser.dialogs.EditBookmarkFolderDialog;
+import com.stoutner.privacybrowser.dialogs.FontSizeDialog;
 import com.stoutner.privacybrowser.dialogs.HttpAuthenticationDialog;
 import com.stoutner.privacybrowser.dialogs.PinnedMismatchDialog;
 import com.stoutner.privacybrowser.dialogs.SaveWebpageImageDialog;
@@ -161,12 +162,13 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 
 // AppCompatActivity from android.support.v7.app.AppCompatActivity must be used to have access to the SupportActionBar until the minimum API is >= 21.
 public class MainWebViewActivity extends AppCompatActivity implements CreateBookmarkDialog.CreateBookmarkListener, CreateBookmarkFolderDialog.CreateBookmarkFolderListener,
         DownloadFileDialog.DownloadFileListener, DownloadImageDialog.DownloadImageListener, DownloadLocationPermissionDialog.DownloadLocationPermissionDialogListener, EditBookmarkDialog.EditBookmarkListener,
-        EditBookmarkFolderDialog.EditBookmarkFolderListener, NavigationView.OnNavigationItemSelectedListener, PinnedMismatchDialog.PinnedMismatchListener, PopulateBlocklists.PopulateBlocklistsListener, SaveWebpageImageDialog.SaveWebpageImageListener,
+        EditBookmarkFolderDialog.EditBookmarkFolderListener, FontSizeDialog.UpdateFontSizeListener, NavigationView.OnNavigationItemSelectedListener, PinnedMismatchDialog.PinnedMismatchListener, PopulateBlocklists.PopulateBlocklistsListener, SaveWebpageImageDialog.SaveWebpageImageListener,
         StoragePermissionDialog.StoragePermissionDialogListener, UrlHistoryDialog.NavigateHistoryListener, WebViewTabFragment.NewTabListener {
 
     // `orbotStatus` is public static so it can be accessed from `OrbotProxyHelper`.  It is also used in `onCreate()`, `onResume()`, and `applyProxyThroughOrbot()`.
@@ -815,14 +817,16 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
         File localStorageDirectory = new File (privateDataDirectoryString + "/app_webview/Local Storage/");
         int localStorageDirectoryNumberOfFiles = 0;
         if (localStorageDirectory.exists()) {
-            localStorageDirectoryNumberOfFiles = localStorageDirectory.list().length;
+            // `Objects.requireNonNull` removes a lint warning that `localStorageDirectory.list` might produce a null pointed exception if it is dereferenced.
+            localStorageDirectoryNumberOfFiles = Objects.requireNonNull(localStorageDirectory.list()).length;
         }
 
         // Get a count of the number of files in the IndexedDB directory.
         File indexedDBDirectory = new File (privateDataDirectoryString + "/app_webview/IndexedDB");
         int indexedDBDirectoryNumberOfFiles = 0;
         if (indexedDBDirectory.exists()) {
-            indexedDBDirectoryNumberOfFiles = indexedDBDirectory.list().length;
+            // `Objects.requireNonNull` removes a lint warning that `indexedDBDirectory.list` might produce a null pointed exception if it is dereferenced.
+            indexedDBDirectoryNumberOfFiles = Objects.requireNonNull(indexedDBDirectory.list()).length;
         }
 
         // Enable Clear DOM Storage if there is any.
@@ -872,62 +876,8 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
             menu.findItem(R.id.user_agent_custom).setChecked(true);
         }
 
-        // Instantiate the font size title and the selected font size menu item.
-        String fontSizeTitle;
-        MenuItem selectedFontSizeMenuItem;
-
-        // Prepare the font size title and current size menu item.
-        //noinspection DuplicateBranchesInSwitch
-        switch (fontSize) {
-            case 25:
-                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.twenty_five_percent);
-                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_twenty_five_percent);
-                break;
-
-            case 50:
-                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.fifty_percent);
-                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_fifty_percent);
-                break;
-
-            case 75:
-                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.seventy_five_percent);
-                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_seventy_five_percent);
-                break;
-
-            case 100:
-                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.one_hundred_percent);
-                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_one_hundred_percent);
-                break;
-
-            case 125:
-                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.one_hundred_twenty_five_percent);
-                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_one_hundred_twenty_five_percent);
-                break;
-
-            case 150:
-                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.one_hundred_fifty_percent);
-                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_one_hundred_fifty_percent);
-                break;
-
-            case 175:
-                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.one_hundred_seventy_five_percent);
-                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_one_hundred_seventy_five_percent);
-                break;
-
-            case 200:
-                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.two_hundred_percent);
-                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_two_hundred_percent);
-                break;
-
-            default:
-                fontSizeTitle = getString(R.string.font_size) + " - " + getString(R.string.one_hundred_percent);
-                selectedFontSizeMenuItem = menu.findItem(R.id.font_size_one_hundred_percent);
-                break;
-        }
-
-        // Set the font size title and select the current size menu item.
-        fontSizeMenuItem.setTitle(fontSizeTitle);
-        selectedFontSizeMenuItem.setChecked(true);
+        // Set the font size title.
+        fontSizeMenuItem.setTitle(getString(R.string.font_size) + " - " + fontSize + "%");
 
         // Run all the other default commands.
         super.onPrepareOptionsMenu(menu);
@@ -1506,58 +1456,12 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
                 // Consume the event.
                 return true;
 
-            case R.id.font_size_twenty_five_percent:
-                // Set the font size.
-                currentWebView.getSettings().setTextZoom(25);
-
-                // Consume the event.
-                return true;
-
-            case R.id.font_size_fifty_percent:
-                // Set the font size.
-                currentWebView.getSettings().setTextZoom(50);
-
-                // Consume the event.
-                return true;
-
-            case R.id.font_size_seventy_five_percent:
-                // Set the font size.
-                currentWebView.getSettings().setTextZoom(75);
-
-                // Consume the event.
-                return true;
-
-            case R.id.font_size_one_hundred_percent:
-                // Set the font size.
-                currentWebView.getSettings().setTextZoom(100);
+            case R.id.font_size:
+                // Instantiate the font size dialog.
+                DialogFragment fontSizeDialogFragment = FontSizeDialog.displayDialog(currentWebView.getSettings().getTextZoom());
 
-                // Consume the event.
-                return true;
-
-            case R.id.font_size_one_hundred_twenty_five_percent:
-                // Set the font size.
-                currentWebView.getSettings().setTextZoom(125);
-
-                // Consume the event.
-                return true;
-
-            case R.id.font_size_one_hundred_fifty_percent:
-                // Set the font size.
-                currentWebView.getSettings().setTextZoom(150);
-
-                // Consume the event.
-                return true;
-
-            case R.id.font_size_one_hundred_seventy_five_percent:
-                // Set the font size.
-                currentWebView.getSettings().setTextZoom(175);
-
-                // Consume the event.
-                return true;
-
-            case R.id.font_size_two_hundred_percent:
-                // Set the font size.
-                currentWebView.getSettings().setTextZoom(200);
+                // Show the font size dialog.
+                fontSizeDialogFragment.show(getSupportFragmentManager(), getString(R.string.font_size));
 
                 // Consume the event.
                 return true;
@@ -3105,6 +3009,31 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
         inputMethodManager.hideSoftInputFromWindow(toolbar.getWindowToken(), 0);
     }
 
+    @Override
+    public void onApplyNewFontSize(DialogFragment dialogFragment) {
+        // Get the dialog.
+        Dialog dialog = dialogFragment.getDialog();
+
+        // Remove the incorrect lint warning below tha the dialog might be null.
+        assert dialog != null;
+
+        // Get a handle for the font size edit text.
+        EditText fontSizeEditText = dialog.findViewById(R.id.font_size_edittext);
+
+        // Initialize the new font size variable with the current font size.
+        int newFontSize = currentWebView.getSettings().getTextZoom();
+
+        // Get the font size from the edit text.
+        try {
+            newFontSize = Integer.valueOf(fontSizeEditText.getText().toString());
+        } catch (Exception exception) {
+            // If the edit text does not contain a valid font size do nothing.
+        }
+
+        // Apply the new font size.
+        currentWebView.getSettings().setTextZoom(newFontSize);
+    }
+
     @Override
     public void onSaveWebpageImage(DialogFragment dialogFragment) {
         // Get the dialog.
@@ -3370,7 +3299,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
                 orbotStatus = intent.getStringExtra("org.torproject.android.intent.extra.STATUS");
 
                 // If Privacy Browser is waiting on Orbot, load the website now that Orbot is connected.
-                if (orbotStatus.equals("ON") && waitingForOrbot) {
+                if ((orbotStatus != null) && orbotStatus.equals("ON") && waitingForOrbot) {
                     // Reset the waiting for Orbot status.
                     waitingForOrbot = false;
 
@@ -4043,10 +3972,16 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
                 }
 
                 // Apply the font size.
-                if (fontSize == 0) {  // Apply the default font size.
-                    nestedScrollWebView.getSettings().setTextZoom(Integer.valueOf(defaultFontSizeString));
-                } else {  // Apply the specified font size.
-                    nestedScrollWebView.getSettings().setTextZoom(fontSize);
+                try {  // Try the specified font size to see if it is valid.
+                    if (fontSize == 0) {  // Apply the default font size.
+                            // Try to set the font size from the value in the app settings.
+                            nestedScrollWebView.getSettings().setTextZoom(Integer.valueOf(defaultFontSizeString));
+                    } else {  // Apply the font size from domain settings.
+                        nestedScrollWebView.getSettings().setTextZoom(fontSize);
+                    }
+                } catch (Exception exception) {  // The specified font size is invalid
+                    // Set the font size to be 100%
+                    nestedScrollWebView.getSettings().setTextZoom(100);
                 }
 
                 // Set the user agent.
@@ -4182,9 +4117,17 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
                     nestedScrollWebView.getSettings().setJavaScriptEnabled(defaultJavaScriptEnabled);
                 }
 
-                // Apply the default settings.
+                // Apply the default first-party cookie setting.
                 cookieManager.setAcceptCookie(nestedScrollWebView.getAcceptFirstPartyCookies());
-                nestedScrollWebView.getSettings().setTextZoom(Integer.valueOf(defaultFontSizeString));
+
+                // Apply the default font size setting.
+                try {
+                    // Try to set the font size from the value in the app settings.
+                    nestedScrollWebView.getSettings().setTextZoom(Integer.valueOf(defaultFontSizeString));
+                } catch (Exception exception) {
+                    // If the app settings value is invalid, set the font size to 100%.
+                    nestedScrollWebView.getSettings().setTextZoom(100);
+                }
 
                 // Apply the form data setting if the API < 26.
                 if (Build.VERSION.SDK_INT < 26) {
index 8409912b96ff59d0a8e994d3680a8eacd0ad9183..7119b0f7958be10c507b322524388ae265ca3620 100644 (file)
@@ -55,6 +55,6 @@ public class SettingsActivity extends AppCompatActivity {
         super.onCreate(savedInstanceState);
 
         // Display the settings fragment.
-        getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
+        getSupportFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
     }
 }
\ No newline at end of file
index 39a92c67568ec06709377aa5d91d4f02b9c03539..87c336df1956dca016923a11ead759f0dbf337a9 100644 (file)
@@ -53,7 +53,7 @@ public class AddDomainDialog extends DialogFragment {
     private AddDomainListener addDomainListener;
 
     @Override
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         // Run the default commands.
         super.onAttach(context);
 
index 69ab1ecc5900628c8f605366350f8274f29c44ee..4da0f14eb73c0e13094dd17c1a42c01e1161840f 100644 (file)
@@ -52,7 +52,7 @@ public class CreateBookmarkDialog extends DialogFragment {
     // The create bookmark listener is initialized in `onAttach()` and used in `onCreateDialog()`.
     private CreateBookmarkListener createBookmarkListener;
 
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         // Run the default commands.
         super.onAttach(context);
 
index b198a888fd40daafea989926b2b67c738aaa5e92..2b012683da722179600aa7833002c1c404d5eb3a 100644 (file)
@@ -34,6 +34,7 @@ import android.text.Editable;
 import android.text.TextWatcher;
 import android.view.KeyEvent;
 import android.view.View;
+import android.view.Window;
 import android.view.WindowManager;
 import android.widget.Button;
 import android.widget.EditText;
@@ -56,7 +57,7 @@ public class CreateBookmarkFolderDialog extends DialogFragment {
     // `createBookmarkFolderListener` is used in `onAttach()` and `onCreateDialog`.
     private CreateBookmarkFolderListener createBookmarkFolderListener;
 
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         super.onAttach(context);
 
         // Get a handle for `createBookmarkFolderListener` from the launching context.
@@ -150,14 +151,20 @@ public class CreateBookmarkFolderDialog extends DialogFragment {
         // Create an alert dialog from the `AlertDialog.Builder`.
         final AlertDialog alertDialog = dialogBuilder.create();
 
-        // Remove the warning below that `getWindow()` might be null.
-        assert alertDialog.getWindow() != null;
+        // Get the alert dialog window.
+        Window dialogWindow = alertDialog.getWindow();
+
+        // Remove the incorrect lint warning below that the dialog window might be null.
+        assert dialogWindow != null;
 
         // Disable screenshots if not allowed.
         if (!allowScreenshots) {
             alertDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
         }
 
+        // Display the keyboard.
+        dialogWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+
         // The alert dialog must be shown before items in the alert dialog can be modified.
         alertDialog.show();
 
@@ -197,14 +204,16 @@ public class CreateBookmarkFolderDialog extends DialogFragment {
             }
         });
 
-        // Allow the enter key on the keyboard to create the folder from `create_folder_name_edittext`.
-        folderNameEditText.setOnKeyListener((View v, int keyCode, KeyEvent event) -> {
-            // If the event is a key-down on the `enter` key, select the `PositiveButton` `Create`.
-            if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER) && createButton.isEnabled()) {  // The enter key was pressed and the create button is enabled.
-                // Trigger `createBookmarkFolderListener` and return the `DialogFragment` to the parent activity.
+        // Set the enter key on the keyboard to create the folder from the edit text.
+        folderNameEditText.setOnKeyListener((View view, int keyCode, KeyEvent keyEvent) -> {
+            // If the key event is a key-down on the `enter` key create the bookmark folder.
+            if ((keyEvent.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER) && createButton.isEnabled()) {  // The enter key was pressed and the create button is enabled.
+                // Trigger the create bookmark folder listener and return the dialog fragment to the parent activity.
                 createBookmarkFolderListener.onCreateBookmarkFolder(this, favoriteIconBitmap);
-                // Manually dismiss the `AlertDialog`.
+
+                // Manually dismiss the alert dialog.
                 alertDialog.dismiss();
+
                 // Consume the event.
                 return true;
             } else {  // If any other key was pressed, or if the create button is currently disabled, do not consume the event.
index eb2b0ebf827cdbf7678e15529fd131a59667c585..6ce84771d091e0de9ab067d16953bb7d6fd17532 100644 (file)
@@ -51,7 +51,7 @@ public class DownloadFileDialog extends DialogFragment {
     }
 
     @Override
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         // Run the default commands.
         super.onAttach(context);
 
index f200d95aefabf2ae33292110b87044cf40fdbd8e..9c1afe67e91bb7f96f3cb69b56b66cbfd0c21c58 100644 (file)
@@ -49,7 +49,7 @@ public class DownloadImageDialog extends DialogFragment {
 
     // Check to make sure tha the parent activity implements the listener.
     @Override
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         // Run the default commands.
         super.onAttach(context);
 
index de9dd77ff8554f3e3d219661c11f0ef0a831cfe7..a8ebd73e2560d699341093a62fb230425b5f1d03 100644 (file)
@@ -47,7 +47,7 @@ public class DownloadLocationPermissionDialog extends DialogFragment {
     }
 
     @Override
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         // Run the default commands.
         super.onAttach(context);
 
index 656e0d5746939b5d4f7e8fb6836ee6a95462eec5..b19c206377c96b0eea5aa045e0181dbfdffa5091 100644 (file)
@@ -70,7 +70,7 @@ public class EditBookmarkDatabaseViewDialog extends DialogFragment {
     }
 
     @Override
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         // Run the default commands.
         super.onAttach(context);
 
index 0b6cd716b311d1ca59091dbc14fb9aefdad6d5fb..adf6d44e39946801f741f205436f889efd1b49f5 100644 (file)
@@ -58,7 +58,7 @@ public class EditBookmarkDialog extends DialogFragment {
         void onSaveBookmark(DialogFragment dialogFragment, int selectedBookmarkDatabaseId, Bitmap favoriteIconBitmap);
     }
 
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         // Run the default commands.
         super.onAttach(context);
 
index 1b7c3d70849b499158fdb2281a2ec3e18da7a736..6f481a081eaa690006e6c6aa84baf1f1b8aeec81 100644 (file)
@@ -71,7 +71,7 @@ public class EditBookmarkFolderDatabaseViewDialog extends DialogFragment {
         void onSaveBookmarkFolder(DialogFragment dialogFragment, int selectedFolderDatabaseId, Bitmap favoriteIconBitmap);
     }
 
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         // Run the default commands.
         super.onAttach(context);
 
index 19f9db9096fc6878daccafa1c6c089d006587b04..230abd3491614d4e6395d60615370f5eb28bfb51 100644 (file)
@@ -58,7 +58,7 @@ public class EditBookmarkFolderDialog extends DialogFragment {
         void onSaveBookmarkFolder(DialogFragment dialogFragment, int selectedFolderDatabaseId, Bitmap favoriteIconBitmap);
     }
 
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         // Run the default commands.
         super.onAttach(context);
 
diff --git a/app/src/main/java/com/stoutner/privacybrowser/dialogs/FontSizeDialog.java b/app/src/main/java/com/stoutner/privacybrowser/dialogs/FontSizeDialog.java
new file mode 100644 (file)
index 0000000..2349189
--- /dev/null
@@ -0,0 +1,182 @@
+/*
+ * Copyright © 2019 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/>.
+ */
+
+package com.stoutner.privacybrowser.dialogs;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.EditText;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.DialogFragment;
+import androidx.preference.PreferenceManager;
+
+import com.stoutner.privacybrowser.R;
+
+public class FontSizeDialog extends DialogFragment {
+    // Define the update font size listener.
+    private UpdateFontSizeListener updateFontSizeListener;
+
+    // The public interface is used to send information back to the parent activity.
+    public interface UpdateFontSizeListener {
+        void onApplyNewFontSize(DialogFragment dialogFragment);
+    }
+
+    @Override
+    public void onAttach(@NonNull Context context) {
+        // Run the default commands.
+        super.onAttach(context);
+
+        // Get a handle for the update font size listener from the launching context.
+        updateFontSizeListener = (UpdateFontSizeListener) context;
+    }
+
+    public static FontSizeDialog displayDialog(int fontSize) {
+        // Create an arguments bundle.
+        Bundle argumentsBundle = new Bundle();
+
+        // Store the font size in the bundle.
+        argumentsBundle.putInt("font_size", fontSize);
+
+        // Create a new instance of the dialog.
+        FontSizeDialog fontSizeDialog = new FontSizeDialog();
+
+        // Add the bundle to the dialog.
+        fontSizeDialog.setArguments(argumentsBundle);
+
+        // Return the new dialog.
+        return fontSizeDialog;
+    }
+
+    // `@SuppressLing("InflateParams")` removes the warning about using null as the parent view group when inflating the alert dialog.
+    @SuppressLint("InflateParams")
+    @Override
+    @NonNull
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        // Get a handle for the activity and the context.
+        Activity activity = getActivity();
+        Context context = getContext();
+
+        // Remove the incorrect lint warnings below that the activity and context might be null.
+        assert activity != null;
+        assert context != null;
+
+        // Use a builder to create the alert dialog.
+        AlertDialog.Builder dialogBuilder;
+
+        // Get the arguments.
+        Bundle arguments = getArguments();
+
+        // Remove the incorrect lint warning below that `getInt()` might be null.
+        assert arguments != null;
+
+        // Get the current font size.
+        int currentFontSize = arguments.getInt("font_size");
+
+        // Get a handle for the shared preferences.
+        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
+
+        // Get the screenshot and theme preferences.
+        boolean darkTheme = sharedPreferences.getBoolean("dark_theme", false);
+        boolean allowScreenshots = sharedPreferences.getBoolean("allow_screenshots", false);
+
+        // Set the style and icon according to the theme.
+        if (darkTheme) {
+            dialogBuilder = new AlertDialog.Builder(activity, R.style.PrivacyBrowserAlertDialogDark);
+            dialogBuilder.setIcon(R.drawable.font_size_dark);
+        } else {
+            dialogBuilder = new AlertDialog.Builder(activity, R.style.PrivacyBrowserAlertDialogLight);
+            dialogBuilder.setIcon(R.drawable.font_size_light);
+        }
+
+        // Set the title.
+        dialogBuilder.setTitle(R.string.font_size);
+
+        // Set the view.  The parent view is null because it will be assigned by the alert dialog.
+        dialogBuilder.setView(activity.getLayoutInflater().inflate(R.layout.font_size_dialog, null));
+
+        // Set the close button listener.  Using `null` as the listener closes the dialog without doing anything else.
+        dialogBuilder.setNegativeButton(R.string.close, null);
+
+        // Set the apply button listener.
+        dialogBuilder.setPositiveButton(R.string.apply, (DialogInterface dialog, int which) -> {
+            // Return the dialog fragment to the parent activity.
+            updateFontSizeListener.onApplyNewFontSize(this);
+        });
+
+        // Create an alert dialog from the builder.
+        AlertDialog alertDialog = dialogBuilder.create();
+
+        // Get the alert dialog window.
+        Window dialogWindow = alertDialog.getWindow();
+
+        // Remove the incorrect lint warning below that the dialog window might be null.
+        assert dialogWindow != null;
+
+        // Disable screenshots if not allowed.
+        if (!allowScreenshots) {
+            dialogWindow.addFlags(WindowManager.LayoutParams.FLAG_SECURE);
+        }
+
+        // Display the keyboard.
+        dialogWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+
+        // The alert dialog must be shown before items in the layout can be modified.
+        alertDialog.show();
+
+        // Get a handle for the font size edit text.
+        EditText fontSizeEditText = alertDialog.findViewById(R.id.font_size_edittext);
+
+        // Display the current font size.
+        fontSizeEditText.setText(String.valueOf(currentFontSize));
+
+        // Request focus on the font size edit text.
+        fontSizeEditText.requestFocus();
+
+        // Set the enter key on the keyboard to update the font size.
+        fontSizeEditText.setOnKeyListener((View view, int keyCode, KeyEvent keyEvent) -> {
+            // If the key event is a key-down on the `enter` key apply the new font size.
+            if ((keyEvent.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {  // The enter key was pressed.
+                // Trigger the update font size listener and return the dialog fragment to the parent activity.
+                updateFontSizeListener.onApplyNewFontSize((this));
+
+                // Manually dismiss the alert dialog.
+                alertDialog.dismiss();
+
+                //Consume the event.
+                return true;
+            } else {  // If any other key was pressed do not consume the event.
+                return false;
+            }
+        });
+
+        // Return the alert dialog.
+        return alertDialog;
+    }
+}
index 7ee7dd0136261da6e4b6be383cfc6be59220caeb..4b68108987b22d62484d5ac0627c882c4832869a 100644 (file)
@@ -32,6 +32,7 @@ import android.text.style.ForegroundColorSpan;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.Window;
 import android.view.WindowManager;
 import android.webkit.HttpAuthHandler;
 import android.widget.EditText;
@@ -161,16 +162,19 @@ public class HttpAuthenticationDialog extends DialogFragment{
         // Create an alert dialog from the alert dialog builder.
         final AlertDialog alertDialog = dialogBuilder.create();
 
-        // Remove the warning below that `getWindow()` might be null.
-        assert alertDialog.getWindow() != null;
+        // Get the alert dialog window.
+        Window dialogWindow = alertDialog.getWindow();
+
+        // Remove the incorrect lint warning below that the dialog window might be null.
+        assert dialogWindow != null;
 
         // Disable screenshots if not allowed.
         if (!allowScreenshots) {
             alertDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
         }
 
-        // Show the keyboard when the alert dialog is displayed on the screen.
-        alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+        // Display the keyboard.
+        dialogWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
 
         // The alert dialog needs to be shown before the contents can be modified.
         alertDialog.show();
index 55f29d6381be777e4cb16cdaa719a2eb51d92404..cf944c04a8ce381f85542f17e6186c1576fb2974 100644 (file)
@@ -66,7 +66,7 @@ public class MoveToFolderDialog extends DialogFragment {
         void onMoveToFolder(DialogFragment dialogFragment);
     }
 
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         // Run the default commands.
         super.onAttach(context);
 
index 9694c0ac4d9db578ee0e122eeb5775071339bc83..675f1e8a95712ca8029d02ec356b71545ac105f7 100644 (file)
@@ -77,7 +77,7 @@ public class PinnedMismatchDialog extends DialogFragment {
     private Date currentSslEndDate;
 
     @Override
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         // Run the default commands.
         super.onAttach(context);
 
index 8178a8f20e999d02eda778e8c0499d16f0d13a2d..b49958ebe7a8f898d1973fc747b3167c20e4c08d 100644 (file)
@@ -58,7 +58,7 @@ public class SaveLogcatDialog extends DialogFragment {
     }
 
     @Override
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         // Run the default commands.
         super.onAttach(context);
 
index 11127d924a389ce50fbd7e37d8e284bdcd27de9b..a9277d9ca540d68cab988c72248862b3ebe5ab9b 100644 (file)
@@ -32,7 +32,6 @@ import android.content.pm.PackageManager;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Environment;
-import android.preference.PreferenceManager;
 import android.provider.DocumentsContract;
 import android.text.Editable;
 import android.text.TextWatcher;
@@ -45,6 +44,7 @@ import android.widget.TextView;
 import androidx.annotation.NonNull;
 import androidx.core.content.ContextCompat;
 import androidx.fragment.app.DialogFragment;
+import androidx.preference.PreferenceManager;
 
 import com.stoutner.privacybrowser.R;
 import com.stoutner.privacybrowser.activities.MainWebViewActivity;
@@ -59,7 +59,7 @@ public class SaveWebpageImageDialog extends DialogFragment {
     }
 
     @Override
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         // Run the default commands.
         super.onAttach(context);
 
@@ -72,8 +72,16 @@ public class SaveWebpageImageDialog extends DialogFragment {
     @Override
     @NonNull
     public Dialog onCreateDialog(Bundle savedInstanceState) {
+        // Get a handle for the activity and the context.
+        Activity activity = getActivity();
+        Context context = getContext();
+
+        // Remove the incorrect lint warnings below that the activity and context might be null.
+        assert activity != null;
+        assert context != null;
+
         // Get a handle for the shared preferences.
-        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
+        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
 
         // Get the screenshot and theme preferences.
         boolean darkTheme = sharedPreferences.getBoolean("dark_theme", false);
@@ -82,36 +90,23 @@ public class SaveWebpageImageDialog extends DialogFragment {
         // Use an alert dialog builder to create the alert dialog.
         AlertDialog.Builder dialogBuilder;
 
-        // Get a handle for the activity.
-        Activity activity  = getActivity();
-
-        // Remove the incorrect lint warning below that the activity might be null.
-        assert activity != null;
-
-        // Set the style according to the theme.
+        // Set the style and icon according to the theme.
         if (darkTheme) {
             dialogBuilder = new AlertDialog.Builder(activity, R.style.PrivacyBrowserAlertDialogDark);
+            dialogBuilder.setIcon(R.drawable.images_enabled_dark);
         } else {
             dialogBuilder = new AlertDialog.Builder(activity, R.style.PrivacyBrowserAlertDialogLight);
+            dialogBuilder.setIcon(R.drawable.images_enabled_light);
         }
 
         // Set the title.
         dialogBuilder.setTitle(R.string.save_image);
 
-        // Set the icon according to the theme.
-        if (darkTheme) {
-            dialogBuilder.setIcon(R.drawable.images_enabled_dark);
-        } else {
-            dialogBuilder.setIcon(R.drawable.images_enabled_light);
-        }
-
         // Set the view.  The parent view is null because it will be assigned by the alert dialog.
         dialogBuilder.setView(activity.getLayoutInflater().inflate(R.layout.save_dialog, null));
 
-        // Set the cancel button listener.
-        dialogBuilder.setNegativeButton(R.string.cancel, (DialogInterface dialog, int which) -> {
-            // Do nothing.  The alert dialog will close automatically.
-        });
+        // Set the cancel button listener.  Using `null` as the listener closes the dialog without doing anything else.
+        dialogBuilder.setNegativeButton(R.string.cancel, null);
 
         // Set the save button listener.
         dialogBuilder.setPositiveButton(R.string.save, (DialogInterface dialog, int which) -> {
@@ -122,7 +117,7 @@ public class SaveWebpageImageDialog extends DialogFragment {
         // Create an alert dialog from the builder.
         AlertDialog alertDialog = dialogBuilder.create();
 
-        // Remove the incorrect lint warning below that `getWindows()` might be null.
+        // Remove the incorrect lint warning below that `getWindow()` might be null.
         assert alertDialog.getWindow() != null;
 
         // Disable screenshots if not allowed.
@@ -142,12 +137,6 @@ public class SaveWebpageImageDialog extends DialogFragment {
         // Create a string for the default file path.
         String defaultFilePath;
 
-        // Get a handle for the context.
-        Context context = getContext();
-
-        // Remove the incorrect lint warning that context might be null.
-        assert context != null;
-
         // Set the default file path according to the storage permission state.
         if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {  // The storage permission has been granted.
             // Set the default file path to use the external public directory.
index e7440130c8c40ab2087caaf3b380501d70fa0160..198eb509703ed9ee9d859238d0c58bafeafe10ab 100644 (file)
@@ -43,7 +43,7 @@ public class StoragePermissionDialog extends DialogFragment {
     }
 
     @Override
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         // Run the default commands.
         super.onAttach(context);
 
index 8aba719bafbb3c71c6a6fef1b2c101fc73c9d60f..298da3b956c2ad95b650cdffe312bcba7e53b8c2 100644 (file)
@@ -61,7 +61,7 @@ public class UrlHistoryDialog extends DialogFragment{
     private NavigateHistoryListener navigateHistoryListener;
 
     @Override
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         // Run the default commands.
         super.onAttach(context);
 
index e4c2bbc74808edc89ef35a35c93157df8176ef0c..5b7566f6bd7d9b14eea706e361cb3af45442f0c5 100644 (file)
@@ -46,10 +46,10 @@ public class ViewRequestDialog extends DialogFragment {
         void onNext(int id);
     }
 
-    // `viewRequestListener` is used in `onAttach()` and `onCreateDialog()`.
+    // The view request listener is used in `onAttach()` and `onCreateDialog()`.
     private ViewRequestListener viewRequestListener;
 
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         // Run the default commands.
         super.onAttach(context);
 
index a24dedd1021a15da9fb07508f12fbdcd9920ea00..b88ef7666453932546f93e7a51461ae82a26f578 100644 (file)
 package com.stoutner.privacybrowser.dialogs;
 
 import android.annotation.SuppressLint;
+import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
+import android.content.Context;
 import android.content.SharedPreferences;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.net.http.SslCertificate;
 import android.os.Bundle;
-import android.preference.PreferenceManager;
 import android.text.SpannableStringBuilder;
 import android.text.Spanned;
 import android.text.style.ForegroundColorSpan;
@@ -39,6 +40,7 @@ import android.widget.TextView;
 
 import androidx.annotation.NonNull;
 import androidx.fragment.app.DialogFragment;  // The AndroidX dialog fragment must be used or an error is produced on API <=22.
+import androidx.preference.PreferenceManager;
 
 import com.stoutner.privacybrowser.activities.MainWebViewActivity;
 import com.stoutner.privacybrowser.R;
@@ -69,18 +71,24 @@ public class ViewSslCertificateDialog extends DialogFragment {
         return viewSslCertificateDialog;
     }
 
+    @Override
     @NonNull
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        // Remove the incorrect lint warning below that the activity might be null.
-        assert getActivity() != null;
+        // Get a handle for the activity and the context.
+        Activity activity = getActivity();
+        Context context = getContext();
+
+        // Remove the incorrect lint warnings below that the activity and context might be null.
+        assert activity != null;
+        assert context != null;
 
         // Get the activity's layout inflater.
-        LayoutInflater layoutInflater = getActivity().getLayoutInflater();
+        LayoutInflater layoutInflater = activity.getLayoutInflater();
 
         // Get the arguments.
         Bundle arguments = getArguments();
 
-        // Remove the incorrect lint warning below that `getArguments().getLong()` might be null.
+        // Remove the incorrect lint warning below that `getLong()` might be null.
         assert arguments != null;
 
         // Get the current position of this WebView fragment.
@@ -98,11 +106,12 @@ public class ViewSslCertificateDialog extends DialogFragment {
         // Get a handle for the current WebView.
         NestedScrollWebView nestedScrollWebView = fragmentView.findViewById(R.id.nestedscroll_webview);
 
+
         // Use a builder to create the alert dialog.
         AlertDialog.Builder dialogBuilder;
 
         // Get a handle for the shared preferences.
-        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
+        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
 
         // Get the screenshot and theme preferences.
         boolean darkTheme = sharedPreferences.getBoolean("dark_theme", false);
@@ -110,9 +119,9 @@ public class ViewSslCertificateDialog extends DialogFragment {
 
         // Set the style according to the theme.
         if (darkTheme) {
-            dialogBuilder = new AlertDialog.Builder(getActivity(), R.style.PrivacyBrowserAlertDialogDark);
+            dialogBuilder = new AlertDialog.Builder(activity, R.style.PrivacyBrowserAlertDialogDark);
         } else {
-            dialogBuilder = new AlertDialog.Builder(getActivity(), R.style.PrivacyBrowserAlertDialogLight);
+            dialogBuilder = new AlertDialog.Builder(activity, R.style.PrivacyBrowserAlertDialogLight);
         }
 
         // Create a drawable version of the favorite icon.
@@ -121,7 +130,7 @@ public class ViewSslCertificateDialog extends DialogFragment {
         // Set the icon.
         dialogBuilder.setIcon(favoriteIconDrawable);
 
-        // Set a listener on the negative button.  Using `null` as the listener closes the dialog without doing anything else.
+        // Set the close button listener.  Using `null` as the listener closes the dialog without doing anything else.
         dialogBuilder.setNegativeButton(R.string.close, null);
 
         // Get the SSL certificate.
@@ -222,17 +231,15 @@ public class ViewSslCertificateDialog extends DialogFragment {
             SpannableStringBuilder endDateStringBuilder = new SpannableStringBuilder(endDateLabel + DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.LONG).format(endDate));
 
             // Create a red foreground color span.  The deprecated `getColor` must be used until the minimum API >= 23.
-            @SuppressWarnings("deprecation") ForegroundColorSpan redColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.red_a700));
+            ForegroundColorSpan redColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.red_a700));
 
             // Create a blue foreground color span.
             ForegroundColorSpan blueColorSpan;
 
             // Set the blue color span according to the theme.  The deprecated `getColor()` must be used until the minimum API >= 23.
             if (darkTheme) {
-                //noinspection deprecation
                 blueColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.blue_400));
             } else {
-                //noinspection deprecation
                 blueColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.blue_700));
             }
 
index 4007dbf097899f54cf8087adbd893d59c431c0f7..8517b6f6256a9ee23e1f3f3c37ec697d14797ce0 100644 (file)
@@ -136,7 +136,8 @@ public class DomainSettingsFragment extends Fragment {
         TextView userAgentTextView = domainSettingsView.findViewById(R.id.user_agent_textview);
         EditText customUserAgentEditText = domainSettingsView.findViewById(R.id.custom_user_agent_edittext);
         Spinner fontSizeSpinner = domainSettingsView.findViewById(R.id.font_size_spinner);
-        TextView fontSizeTextView = domainSettingsView.findViewById(R.id.font_size_textview);
+        TextView defaultFontSizeTextView = domainSettingsView.findViewById(R.id.default_font_size_textview);
+        EditText customFontSizeEditText = domainSettingsView.findViewById(R.id.custom_font_size_edittext);
         ImageView swipeToRefreshImageView = domainSettingsView.findViewById(R.id.swipe_to_refresh_imageview);
         Spinner swipeToRefreshSpinner = domainSettingsView.findViewById(R.id.swipe_to_refresh_spinner);
         TextView swipeToRefreshTextView = domainSettingsView.findViewById(R.id.swipe_to_refresh_textview);
@@ -244,8 +245,7 @@ public class DomainSettingsFragment extends Fragment {
 
         // Create array adapters for the spinners.
         ArrayAdapter<CharSequence> translatedUserAgentArrayAdapter = ArrayAdapter.createFromResource(context, R.array.translated_domain_settings_user_agent_names, R.layout.spinner_item);
-        ArrayAdapter<CharSequence> fontSizeArrayAdapter = ArrayAdapter.createFromResource(context, R.array.domain_settings_font_size_entries, R.layout.spinner_item);
-        ArrayAdapter<CharSequence> fontSizeEntryValuesArrayAdapter = ArrayAdapter.createFromResource(context, R.array.domain_settings_font_size_entry_values, R.layout.spinner_item);
+        ArrayAdapter<CharSequence> fontSizeArrayAdapter = ArrayAdapter.createFromResource(context, R.array.font_size_array, R.layout.spinner_item);
         ArrayAdapter<CharSequence> swipeToRefreshArrayAdapter = ArrayAdapter.createFromResource(context, R.array.swipe_to_refresh_array, R.layout.spinner_item);
         ArrayAdapter<CharSequence> nightModeArrayAdapter = ArrayAdapter.createFromResource(context, R.array.night_mode_array, R.layout.spinner_item);
         ArrayAdapter<CharSequence> wideViewportArrayAdapter = ArrayAdapter.createFromResource(context, R.array.wide_viewport_array, R.layout.spinner_item);
@@ -761,23 +761,41 @@ public class DomainSettingsFragment extends Fragment {
             userAgentSpinner.performClick();
         });
 
-        // Set the selected font size.
-        int fontSizeArrayPosition = fontSizeEntryValuesArrayAdapter.getPosition(String.valueOf(fontSizeInt));
-        fontSizeSpinner.setSelection(fontSizeArrayPosition);
+        // Display the font size settings.
+        if (fontSizeInt == 0) {  // `0` is the code for system default font size.
+            // Set the font size to the system default
+            fontSizeSpinner.setSelection(0);
 
-        // Set the default font size text.
-        int defaultFontSizeArrayPosition = fontSizeEntryValuesArrayAdapter.getPosition(defaultFontSizeString);
-        fontSizeTextView.setText(fontSizeArrayAdapter.getItem(defaultFontSizeArrayPosition));
+            // Show the default font size text view.
+            defaultFontSizeTextView.setVisibility(View.VISIBLE);
 
-        // Set the display options for the font size TextView.
-        if (fontSizeArrayPosition == 0) {  // System default font size is selected.  Display `fontSizeTextView`.
-            fontSizeTextView.setVisibility(View.VISIBLE);
-        } else {  // A custom font size is specified.  Hide `fontSizeTextView`.
-            fontSizeTextView.setVisibility(View.GONE);
+            // Hide the custom font size edit text.
+            customFontSizeEditText.setVisibility(View.GONE);
+
+            // Set the default font size as the text of the custom font size edit text.  This way, if the user switches to custom it will already be populated.
+            customFontSizeEditText.setText(defaultFontSizeString);
+        } else {  // A custom font size is selected.
+            // Set the spinner to the custom font size.
+            fontSizeSpinner.setSelection(1);
+
+            // Hide the default font size text view.
+            defaultFontSizeTextView.setVisibility(View.GONE);
+
+            // Show the custom font size edit text.
+            customFontSizeEditText.setVisibility(View.GONE);
+
+            // Set the custom font size.
+            customFontSizeEditText.setText(String.valueOf(fontSizeInt));
         }
 
-        // Open the font size spinner when the TextView is clicked.
-        fontSizeTextView.setOnClickListener((View v) -> {
+        // Initialize the default font size percentage string.
+        String defaultFontSizePercentageString = defaultFontSizeString + "%";
+
+        // Set the default font size text in the text view.
+        defaultFontSizeTextView.setText(defaultFontSizePercentageString);
+
+        // Open the font size spinner when the text view is clicked.
+        defaultFontSizeTextView.setOnClickListener((View v) -> {
             // Open the user agent spinner.
             fontSizeSpinner.performClick();
         });
@@ -1662,11 +1680,19 @@ public class DomainSettingsFragment extends Fragment {
         fontSizeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
             @Override
             public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-                // Update the display options for `fontSizeTextView`.
-                if (position == 0) {  // System default font size has been selected.  Display `fontSizeTextView`.
-                    fontSizeTextView.setVisibility(View.VISIBLE);
-                } else {  // A custom font size has been selected.  Hide `fontSizeTextView`.
-                    fontSizeTextView.setVisibility(View.GONE);
+                // Update the font size display options.
+                if (position == 0) {  // The system default font size has been selected.
+                    // Show the default font size text view.
+                    defaultFontSizeTextView.setVisibility(View.VISIBLE);
+
+                    // Hide the custom font size edit text.
+                    customFontSizeEditText.setVisibility(View.GONE);
+                } else {  // A custom font size has been selected.
+                    // Hide the default font size text view.
+                    defaultFontSizeTextView.setVisibility(View.GONE);
+
+                    // Show the custom font size edit text.
+                    customFontSizeEditText.setVisibility(View.VISIBLE);
                 }
             }
 
index 1746f71875778ec41465bef8299080995a9b6de1..2ffcd187da0e9bfc08eaae8bd6486eb0de41c795 100644 (file)
 package com.stoutner.privacybrowser.fragments;
 
 import android.annotation.SuppressLint;
+import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
-import android.preference.Preference;
-import android.preference.PreferenceCategory;
-import android.preference.PreferenceFragment;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.webkit.WebView;
 import android.widget.ArrayAdapter;
 
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceFragmentCompat;
+
 import com.stoutner.privacybrowser.R;
 import com.stoutner.privacybrowser.activities.MainWebViewActivity;
 
-public class SettingsFragment extends PreferenceFragment {
+public class SettingsFragment extends PreferenceFragmentCompat {
+    // Define the class variables.
     private SharedPreferences.OnSharedPreferenceChangeListener preferencesListener;
     private SharedPreferences savedPreferences;
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        // Run the default commands.
-        super.onCreate(savedInstanceState);
-
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
         // Load the preferences from the XML file.
-        addPreferencesFromResource(R.xml.preferences);
+        setPreferencesFromResource(R.xml.preferences, rootKey);
+
+        // Get a handle for the activity.
+        Activity activity = getActivity();
+
+        // Remove the lint warning below that `getApplicationContext()` might produce a null pointer exception.
+        assert activity != null;
 
         // Get a handle for the context.
-        Context context = getActivity().getApplicationContext();
+        Context context = activity.getApplicationContext();
 
         // Initialize savedPreferences.
         savedPreferences = getPreferenceScreen().getSharedPreferences();
@@ -101,6 +107,52 @@ public class SettingsFragment extends PreferenceFragment {
         Preference wideViewportPreference = findPreference("wide_viewport");
         Preference displayWebpageImagesPreference = findPreference("display_webpage_images");
 
+        // Remove the lint warnings below that the preferences might be null.
+        assert javaScriptPreference != null;
+        assert firstPartyCookiesPreference != null;
+        assert thirdPartyCookiesPreference != null;
+        assert domStoragePreference != null;
+        assert formDataPreference != null;
+        assert userAgentPreference != null;
+        assert customUserAgentPreference != null;
+        assert incognitoModePreference != null;
+        assert doNotTrackPreference != null;
+        assert allowScreenshotsPreference != null;
+        assert easyListPreference != null;
+        assert easyPrivacyPreference != null;
+        assert fanboyAnnoyanceListPreference != null;
+        assert fanboySocialBlockingListPreference != null;
+        assert ultraListPreference != null;
+        assert ultraPrivacyPreference != null;
+        assert blockAllThirdPartyRequestsPreference != null;
+        assert googleAnalyticsPreference != null;
+        assert facebookClickIdsPreference != null;
+        assert twitterAmpRedirectsPreference != null;
+        assert proxyThroughOrbotPreference != null;
+        assert torHomepagePreference != null;
+        assert torSearchPreference != null;
+        assert torSearchCustomURLPreference != null;
+        assert searchPreference != null;
+        assert searchCustomURLPreference != null;
+        assert fullScreenBrowsingModePreference != null;
+        assert hideAppBarPreference != null;
+        assert clearEverythingPreference != null;
+        assert clearCookiesPreference != null;
+        assert clearDomStoragePreference != null;
+        assert clearFormDataPreference != null;
+        assert clearCachePreference != null;
+        assert homepagePreference != null;
+        assert fontSizePreference != null;
+        assert openIntentsInNewTabPreference != null;
+        assert swipeToRefreshPreference != null;
+        assert scrollAppBarPreference != null;
+        assert displayAdditionalAppBarIconsPreference != null;
+        assert downloadWithExternalAppPreference != null;
+        assert darkThemePreference != null;
+        assert nightModePreference != null;
+        assert wideViewportPreference != null;
+        assert displayWebpageImagesPreference != null;
+
         // Set dependencies.
         torHomepagePreference.setDependency("proxy_through_orbot");
         torSearchPreference.setDependency("proxy_through_orbot");
@@ -131,8 +183,12 @@ public class SettingsFragment extends PreferenceFragment {
         // Remove the form data preferences if the API is >= 26 as they no longer do anything.
         if (Build.VERSION.SDK_INT >= 26) {
             // Get the categories.
-            PreferenceCategory privacyCategory = (PreferenceCategory) findPreference("privacy");
-            PreferenceCategory clearAndExitCategory = (PreferenceCategory) findPreference("clear_and_exit");
+            PreferenceCategory privacyCategory = findPreference("privacy");
+            PreferenceCategory clearAndExitCategory = findPreference("clear_and_exit");
+
+            // Remove the lint warnings below that the preference categories might be null.
+            assert privacyCategory != null;
+            assert clearAndExitCategory != null;
 
             // Remove the form data preferences.
             privacyCategory.removePreference(formDataPreference);
@@ -229,7 +285,7 @@ public class SettingsFragment extends PreferenceFragment {
         homepagePreference.setSummary(savedPreferences.getString("homepage", getString(R.string.homepage_default_value)));
 
         // Set the font size as the summary text for the preference.
-        fontSizePreference.setSummary(savedPreferences.getString("font_size", getString(R.string.font_size_default_value)) + "%%");
+        fontSizePreference.setSummary(savedPreferences.getString("font_size", getString(R.string.font_size_default_value)) + "%");
 
         // Disable the JavaScript preference if Night Mode is enabled.  JavaScript will be enabled for all web pages.
         javaScriptPreference.setEnabled(!nightMode);
@@ -1574,7 +1630,7 @@ public class SettingsFragment extends PreferenceFragment {
 
                 case "font_size":
                     // Update the font size summary text.
-                    fontSizePreference.setSummary(sharedPreferences.getString("font_size", getString(R.string.font_size_default_value)) + "%%");
+                    fontSizePreference.setSummary(sharedPreferences.getString("font_size", getString(R.string.font_size_default_value)) + "%");
                     break;
 
                 case "open_intents_in_new_tab":
index 413910dc465f0238e7bba7c794979ff84ff6dfb1..91866a3e397e72dacc945d318806ce98fc5c5744 100644 (file)
@@ -47,7 +47,7 @@ public class WebViewTabFragment extends Fragment {
     private NewTabListener newTabListener;
 
     @Override
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         // Run the default commands.
         super.onAttach(context);
 
index 84dad7ec185f62372c064947758a27596233dd05..0ac593e6df9f315630b0f1a5b2c3832d9f33ab4a 100644 (file)
@@ -64,7 +64,8 @@
                 android:layout_width="match_parent"
                 android:hint="@string/bookmark_url"
                 android:imeOptions="actionGo"
-                android:inputType="textUri" />
+                android:inputType="textUri"
+                android:selectAllOnFocus="true" />
         </com.google.android.material.textfield.TextInputLayout>
     </LinearLayout>
 </ScrollView>
\ No newline at end of file
index 8c28398c907e8a674aae8b8550bc32748b564628..30cbf0663aa4fad71eb5c0c481c1adcb9da3d6af 100644 (file)
                 android:layout_marginEnd="60dp"
                 android:inputType="textUri"
                 android:hint="@string/custom_user_agent"
-                android:importantForAutofill="no"
-                tools:targetApi="26" />
+                android:importantForAutofill="no" />
         </LinearLayout>
 
         <!-- Font Size. -->
             </LinearLayout>
 
             <TextView
-                android:id="@+id/font_size_textview"
+                android:id="@+id/default_font_size_textview"
                 android:layout_height="match_parent"
                 android:layout_width="match_parent"
                 android:layout_marginStart="45dp"
                 android:layout_marginEnd="36dp"
                 android:textSize="13sp" />
 
+            <EditText
+                android:id="@+id/custom_font_size_edittext"
+                android:layout_height="wrap_content"
+                android:layout_width="match_parent"
+                android:layout_marginStart="40dp"
+                android:layout_marginEnd="60dp"
+                android:inputType="number"
+                android:hint="@string/font_size"
+                android:importantForAutofill="no" />
         </LinearLayout>
 
         <!-- Swipe to Refresh. -->
diff --git a/app/src/main/res/layout/font_size_dialog.xml b/app/src/main/res/layout/font_size_dialog.xml
new file mode 100644 (file)
index 0000000..2063e19
--- /dev/null
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  Copyright © 2019 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/>. -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_height="wrap_content"
+    android:layout_width="match_parent"
+    android:orientation="horizontal" >
+
+    <EditText
+        android:id="@+id/font_size_edittext"
+        android:layout_height="wrap_content"
+        android:layout_width="match_parent"
+        android:layout_marginStart="10dp"
+        android:layout_marginEnd="10dp"
+        android:hint="@string/font_size"
+        android:importantForAutofill="no"
+        android:inputType="number"
+        android:selectAllOnFocus="true" >
+    </EditText>
+</LinearLayout>
\ No newline at end of file
index 52e543d11cba808af4b783f410426f2579e10f0b..be1d878867ee20992bf6b56b7bda39858dd66baf 100644 (file)
@@ -36,7 +36,7 @@
             android:layout_width="wrap_content"
             android:layout_marginTop="12dp"
             android:layout_gravity="center_horizontal"
-            android:textSize="24sp"
+            android:textSize="26sp"
             android:textStyle="bold" />
 
         <TextView
@@ -46,7 +46,9 @@
             android:layout_marginTop="6dp"
             android:layout_marginBottom="6dp"
             android:layout_marginStart="4dp"
-            android:layout_marginEnd="4dp" />
+            android:layout_marginEnd="4dp"
+            android:textSize="16sp"
+            android:textColor="?android:textColorPrimary" />
 
         <!-- The `TextInputLayout` makes the `android:hint` float above the `EditText`. -->
         <com.google.android.material.textfield.TextInputLayout
index 78f0ea3390f761ff925b6bf92eca5dd434413074..f3d810545ea653efec1662d41dab56a029f79b26 100644 (file)
                 </menu>
             </item>
 
-            <item
-                android:id="@+id/font_size"
-                android:title="@string/font_size"
-                android:orderInCategory="930"
-                app:showAsAction="never" >
-
-                <menu>
-                    <group android:checkableBehavior="single">
-                        <item
-                            android:id="@+id/font_size_twenty_five_percent"
-                            android:title="@string/twenty_five_percent"
-                            android:orderInCategory="931"
-                            app:showAsAction="never" />
-
-                        <item
-                            android:id="@+id/font_size_fifty_percent"
-                            android:title="@string/fifty_percent"
-                            android:orderInCategory="932"
-                            app:showAsAction="never" />
-
-                        <item
-                            android:id="@+id/font_size_seventy_five_percent"
-                            android:title="@string/seventy_five_percent"
-                            android:orderInCategory="933"
-                            app:showAsAction="never" />
-
-                        <item
-                            android:id="@+id/font_size_one_hundred_percent"
-                            android:title="@string/one_hundred_percent"
-                            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="935"
-                            app:showAsAction="never" />
-
-                        <item
-                            android:id="@+id/font_size_one_hundred_fifty_percent"
-                            android:title="@string/one_hundred_fifty_percent"
-                            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="937"
-                            app:showAsAction="never" />
-
-                        <item
-                            android:id="@+id/font_size_two_hundred_percent"
-                            android:title="@string/two_hundred_percent"
-                            android:orderInCategory="938"
-                            app:showAsAction="never" />
-                    </group>
-                </menu>
-            </item>
-
             <item
                 android:id="@+id/swipe_to_refresh"
                 android:title="@string/swipe_to_refresh_options_menu"
-                android:orderInCategory="940"
+                android:orderInCategory="930"
                 android:checkable="true"
                 app:showAsAction="never" />
 
             <item
                 android:id="@+id/wide_viewport"
                 android:title="@string/wide_viewport"
-                android:orderInCategory="950"
+                android:orderInCategory="940"
                 android:checkable="true"
                 app:showAsAction="never" />
 
             <item
                 android:id="@+id/display_images"
                 android:title="@string/display_images"
-                android:orderInCategory="960"
+                android:orderInCategory="950"
                 android:checkable="true"
                 app:showAsAction="never" />
 
             <item
                 android:id="@+id/night_mode"
                 android:title="@string/options_night_mode"
-                android:orderInCategory="970"
+                android:orderInCategory="960"
                 android:checkable="true"
                 app:showAsAction="never" />
 
+            <item
+                android:id="@+id/font_size"
+                android:title="@string/font_size"
+                android:orderInCategory="970"
+                app:showAsAction="never" >
+            </item>
+
             <item
                 android:id="@+id/find_on_page"
                 android:title="@string/find_on_page"
index 5e7b42030c3c218895aa4e29db1056e11f03ab6d..f4bb825537321360e45f620078752c1ff9d9dcbb 100644 (file)
             <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>
-            <string name="seventy_five_percent">75%</string>
-            <string name="one_hundred_percent">100%</string>
-            <string name="one_hundred_twenty_five_percent">125%</string>
-            <string name="one_hundred_fifty_percent">150%</string>
-            <string name="one_hundred_seventy_five_percent">175%</string>
-            <string name="two_hundred_percent">200%</string>
         <string name="swipe_to_refresh_options_menu">Herunterziehen zum aktualisieren</string>
         <string name="wide_viewport">Breiter Anzeigebereich</string>
         <string name="display_images">Bilder anzeigen</string>
         <string name="options_night_mode">Nacht-Modus</string>
+        <string name="font_size">Schriftgröße</string>
         <string name="find_on_page">Auf Seite finden</string>
         <string name="print">Drucken</string>
             <string name="privacy_browser_web_page">Privacy Browser-Website</string>
 
     <!-- Context Menus. -->
     <string name="open_in_new_tab">In neuem Tab öffnen</string>
+    <string name="open_in_background">Im Hintergrund öffnen</string>
     <string name="open_image_in_new_tab">Grafik in neuem Tab öffnen</string>
     <string name="copy_url">URL kopieren</string>
     <string name="download_url">Download URL</string>
     <string name="domain_name">Domainname</string>
     <string name="domain_deleted">Domain gelöscht</string>
     <string name="domain_name_instructions">*. kann als Wildcard-Subdomain verwendet werden (z.B. *.stoutner.com)</string>
+    <string-array name="font_size_array">
+        <item>Standardeinstellung</item>
+        <item>Custom font size</item>
+    </string-array>
     <string-array name="swipe_to_refresh_array">
         <item>Standardeinstellung</item>
         <item>Herunterziehen zum aktualisieren aktiviert</item>
     <string name="file_location">Datei-Ordner</string>
     <string name="browse">durchsuchen</string>
     <string name="export">exportieren</string>
-    <string name="import_button">importieren</string>  <!-- `import` is a reserved word and cannot be used as the name -->
+    <string name="import_button">importieren</string>  <!-- `import` is a reserved word and cannot be used as the name. -->
     <string name="decrypt">entschlüsseln</string>
     <string name="export_successful">Export erfolgreich.</string>
     <string name="export_failed">Export fehlgeschlagen:</string>
     <string name="cannot_use_location">Dieser Ordner kann nicht genutzt werden, da die Speicher-Berechtigung nicht erteilt wurde.</string>
 
     <!-- Logcat. -->
-    <string name="copy">kopieren</string>
+    <string name="copy_string">kopieren</string>  <!-- `copy` is a reserved word and should not be used as the name. -->
     <string name="logcat_copied">Logcat kopiert.</string>
     <string name="clear">leeren</string>
     <string name="save_logcat">Logcat speichern</string>
     <string name="general">Allgemein</string>
         <string name="homepage">Startseite</string>
         <string name="font_size_preference">Schriftgröße</string>
-        <string-array name="font_size_entries">
-            <item>25%</item>
-            <item>50%</item>
-            <item>75%</item>
-            <item>100%</item>
-            <item>125%</item>
-            <item>150%</item>
-            <item>175%</item>
-            <item>200%</item>
-        </string-array>
-            <string-array name="domain_settings_font_size_entries">
-                <item>Standardeinstellung</item>
-                <item>25%</item>
-                <item>50%</item>
-                <item>75%</item>
-                <item>100%</item>
-                <item>125%</item>
-                <item>150%</item>
-                <item>175%</item>
-                <item>200%</item>
-            </string-array>
         <string name="open_intents_in_new_tab">Intents in neuem Tab öffnen</string>
         <string name="open_intents_in_new_tab_summary">Intents sind Links, die von anderen Apps übergeben werden.</string>
         <string name="swipe_to_refresh">Herunterziehen zum Aktualisieren</string>
index d22da9e086bdfc7963bfb991618e0d875a389930..c45b247754b43c99cec6d48ccc40a02a420ed213 100644 (file)
             <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>
-            <string name="seventy_five_percent">75%</string>
-            <string name="one_hundred_percent">100%</string>
-            <string name="one_hundred_twenty_five_percent">125%</string>
-            <string name="one_hundred_fifty_percent">150%</string>
-            <string name="one_hundred_seventy_five_percent">175%</string>
-            <string name="two_hundred_percent">200%</string>
         <string name="swipe_to_refresh_options_menu">Deslizar para actualizar</string>
         <string name="wide_viewport">Vista amplia</string>
         <string name="display_images">Mostrar imágenes</string>
+        <string name="options_night_mode">Modo noche</string>
+        <string name="font_size">Tamaño de fuente</string>
+        <string name="find_on_page">Buscar en página</string>
         <string name="print">Imprimir</string>
             <string name="privacy_browser_web_page">Página web de Navegador Privado</string>
         <string name="save_as_image">Guardar como imagen</string>
         <string name="add_to_home_screen">Añadir a la ventana de inicio</string>
-        <string name="options_night_mode">Modo noche</string>
-    <string name="find_on_page">Buscar en página</string>
         <string name="view_source">Ver la fuente</string>
     <string name="share">Compartir</string>
         <string name="share_url">Compartir URL</string>
 
     <!-- Context Menus. -->
     <string name="open_in_new_tab">Abrir en nueva pestaña</string>
+    <string name="open_in_background">Abrir en segundo plano</string>
     <string name="open_image_in_new_tab">Abrir imagen en nueva pestaña</string>
     <string name="copy_url">Copiar URL</string>
     <string name="download_url">Descargar URL</string>
     <string name="domain_name">Nombre de dominio</string>
     <string name="domain_deleted">Dominio borrado</string>
     <string name="domain_name_instructions">*. puede ser añadido a un dominio para incluir todos los subdominios (p.ej. *.stoutner.com)</string>
+    <string-array name="font_size_array">
+        <item>Por defecto del sistema</item>
+        <item>Custom font size</item>
+    </string-array>
     <string-array name="swipe_to_refresh_array">
         <item>Por defecto del sistema</item>
         <item>Deslizar para actualizar habilitado</item>
     <string name="file_location">Ubicación del archivo</string>
     <string name="browse">Navegar</string>
     <string name="export">Exportar</string>
-    <string name="import_button">Importar</string>  <!-- `import` is a reserved word and cannot be used as the name -->
+    <string name="import_button">Importar</string>  <!-- `import` is a reserved word and cannot be used as the name. -->
     <string name="decrypt">Descifrar</string>
     <string name="export_successful">Exportación exitosa.</string>
     <string name="export_failed">Exportación fallida:</string>
     <string name="cannot_use_location">Esta ubicación no se puede utilizar porque no se ha concedido el permiso de almacenamiento.</string>
 
     <!-- Logcat. -->
-    <string name="copy">Copiar</string>
+    <string name="copy_string">Copiar</string>  <!-- `copy` is a reserved word and should not be used as the name. -->
     <string name="logcat_copied">Logcat copiado.</string>
     <string name="clear">Borrar</string>
     <string name="save_logcat">Guardar logcat</string>
     <string name="general">General</string>
         <string name="homepage">Página de inicio</string>
         <string name="font_size_preference">Tamaño de fuente</string>
-        <string-array name="font_size_entries">
-            <item>25%</item>
-            <item>50%</item>
-            <item>75%</item>
-            <item>100%</item>
-            <item>125%</item>
-            <item>150%</item>
-            <item>175%</item>
-            <item>200%</item>
-        </string-array>
-            <string-array name="domain_settings_font_size_entries">
-                <item>Por defecto del sistema</item>
-                <item>25%</item>
-                <item>50%</item>
-                <item>75%</item>
-                <item>100%</item>
-                <item>125%</item>
-                <item>150%</item>
-                <item>175%</item>
-                <item>200%</item>
-            </string-array>
         <string name="open_intents_in_new_tab">Abrir contenido en nueva pestaña</string>
         <string name="open_intents_in_new_tab_summary">Los contenidos son enlaces enviados desde otras apps.</string>
         <string name="swipe_to_refresh">Deslizar para actualizar</string>
index d100a56b1290a8cf7ebd2d39438709f2c00974ec..bfae370c0a1158a1eafb5d971311d53a2485377b 100644 (file)
             <string name="user_agent_internet_explorer_on_windows">Internet Explorer sous Windows</string>
             <string name="user_agent_safari_on_macos">Safari sous macOS</string>
             <string name="user_agent_custom">Personnalisé</string>
-        <string name="font_size">Police</string>
-            <string name="twenty_five_percent">25%</string>
-            <string name="fifty_percent">50%</string>
-            <string name="seventy_five_percent">75%</string>
-            <string name="one_hundred_percent">100%</string>
-            <string name="one_hundred_twenty_five_percent">125%</string>
-            <string name="one_hundred_fifty_percent">150%</string>
-            <string name="one_hundred_seventy_five_percent">175%</string>
-            <string name="two_hundred_percent">200%</string>
         <string name="swipe_to_refresh_options_menu">Glisser pour actualiser</string>
         <string name="wide_viewport">Fenêtre large</string>
         <string name="display_images">Afficher les images</string>
         <string name="options_night_mode">Mode nuit</string>
+        <string name="font_size">Police</string>
         <string name="find_on_page">Chercher sur la page</string>
         <string name="print">Imprimer</string>
             <string name="privacy_browser_web_page">Site Web de Privacy Browser</string>
 
     <!-- Context Menus. -->
     <string name="open_in_new_tab">Ouvrir dans un nouvel onglet</string>
+    <string name="open_in_background">Ouvrir en arrière-plan</string>
     <string name="open_image_in_new_tab">Ouvrir l\'image dans un nouvel onglet</string>
     <string name="copy_url">Copier l\'URL</string>
     <string name="download_url">Télécharger la cible</string>
     <string name="domain_name">Nom de demaine</string>
     <string name="domain_deleted">Domaine supprimé</string>
     <string name="domain_name_instructions">Faire précéder par *. pour inclure l\'ensemble des sous-domaines (ex. *.stoutner.com)</string>
+    <string-array name="font_size_array">
+        <item>Réglages systèmes</item>
+        <item>Custom font size</item>
+    </string-array>
     <string-array name="swipe_to_refresh_array">
         <item>Réglages systèmes</item>
         <item>Glisser pour actualiser activé</item>
     <string name="file_location">Emplacement du fichier</string>
     <string name="browse">Parcourir</string>
     <string name="export">Exporter</string>
-    <string name="import_button">Importer</string>  <!-- `import` is a reserved word and cannot be used as the name -->
+    <string name="import_button">Importer</string>  <!-- `import` is a reserved word and cannot be used as the name. -->
     <string name="decrypt">Déchiffrer</string>
     <string name="export_successful">Export effectué.</string>
     <string name="export_failed">L\'export a échoué :</string>
     <string name="cannot_use_location">Ce dossier ne peut pas être utilisé car les droits d\'accès au stockage n\'ont pas été autorisés.</string>
 
     <!-- Logcat. -->
-    <string name="copy">Copie</string>
+    <string name="copy_string">Copie</string>  <!-- `copy` is a reserved word and should not be used as the name. -->
     <string name="logcat_copied">Journal système copié.</string>
     <string name="clear">Vider</string>
     <string name="save_logcat">Sauvegarder le journal système</string>
     <string name="general">General</string>
         <string name="homepage">Page d\'accueil</string>
         <string name="font_size_preference">Zoom</string>
-        <string-array name="font_size_entries">
-            <item>25%</item>
-            <item>50%</item>
-            <item>75%</item>
-            <item>100%</item>
-            <item>125%</item>
-            <item>150%</item>
-            <item>175%</item>
-            <item>200%</item>
-        </string-array>
-            <string-array name="domain_settings_font_size_entries">
-                <item>Par défaut</item>
-                <item>25%</item>
-                <item>50%</item>
-                <item>75%</item>
-                <item>100%</item>
-                <item>125%</item>
-                <item>150%</item>
-                <item>175%</item>
-                <item>200%</item>
-            </string-array>
         <string name="open_intents_in_new_tab">Intentions dans un nouvel onglet</string>
         <string name="open_intents_in_new_tab_summary">Les intentions sont des liens envoyés à partir d\'autres applications.</string>
         <string name="swipe_to_refresh">Glisser pour rafraîchir</string>
index 6aea732c32d7659422a1f4b2df978a997d7c49ab..a07d6f318057b2abd39483508c32cdd54452f477 100644 (file)
             <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>
-            <string name="seventy_five_percent">75%</string>
-            <string name="one_hundred_percent">100%</string>
-            <string name="one_hundred_twenty_five_percent">125%</string>
-            <string name="one_hundred_fifty_percent">150%</string>
-            <string name="one_hundred_seventy_five_percent">175%</string>
-            <string name="two_hundred_percent">200%</string>
         <string name="swipe_to_refresh_options_menu">Swipe per aggiornare</string>
         <string name="wide_viewport">Finestra grande</string>
         <string name="display_images">Mostra immagini</string>
         <string name="options_night_mode">Modalità Notte</string>
+        <string name="font_size">Dimensione font</string>
         <string name="find_on_page">Cerca nella pagina</string>
         <string name="print">Stampa</string>
             <string name="privacy_browser_web_page">Pagina web di Privacy Browser</string>
 
     <!-- Context Menus. -->
     <string name="open_in_new_tab">Apri in una nuova Scheda</string>
+    <string name="open_in_background">Apri in Background</string>
     <string name="open_image_in_new_tab">Apri l\'immagine in una nuova scheda</string>
     <string name="copy_url">Copia URL</string>
     <string name="download_url">Scarica URL</string>
     <string name="domain_name">Nome del Dominio</string>
     <string name="domain_deleted">Dominio Eliminato</string>
     <string name="domain_name_instructions">è possibile anteporre *. a un dominio per includere tutti i sottodomini (es. *.stoutner.com)</string>
+    <string-array name="font_size_array">
+        <item>Impostazioni di default</item>
+        <item>Custom font size</item>
+    </string-array>
     <string-array name="swipe_to_refresh_array">
         <item>Impostazioni di default</item>
         <item>Swipe per aggiornare abilitato</item>
     <string name="file_location">Posizione del File</string>
     <string name="browse">Sfoglia</string>
     <string name="export">Esporta</string>
-    <string name="import_button">Importa</string>  <!-- `import` is a reserved word and cannot be used as the name -->
+    <string name="import_button">Importa</string>  <!-- `import` is a reserved word and cannot be used as the name. -->
     <string name="decrypt">Decripta</string>
     <string name="export_successful">Esportazione riuscita</string>
     <string name="export_failed">Esportazione fallita:</string>
     <string name="cannot_use_location">Questa posizione non può essere utilizzata perché non è stato concesso il permesso di scrittura in memoria.</string>
 
     <!-- Logcat. -->
-    <string name="copy">Copia</string>
+    <string name="copy_string">Copia</string>  <!-- `copy` is a reserved word and should not be used as the name. -->
     <string name="logcat_copied">Logcat copiato.</string>
     <string name="clear">Cancella</string>
     <string name="save_logcat">Salva il log</string>
     <string name="general">Generale</string>
         <string name="homepage">Homepage</string>
         <string name="font_size_preference">Dimensione font</string>
-        <string-array name="font_size_entries">
-            <item>25%</item>
-            <item>50%</item>
-            <item>75%</item>
-            <item>100%</item>
-            <item>125%</item>
-            <item>150%</item>
-            <item>175%</item>
-            <item>200%</item>
-        </string-array>
-            <string-array name="domain_settings_font_size_entries">
-                <item>Impostazioni di default</item>
-                <item>25%</item>
-                <item>50%</item>
-                <item>75%</item>
-                <item>100%</item>
-                <item>125%</item>
-                <item>150%</item>
-                <item>175%</item>
-                <item>200%</item>
-            </string-array>
         <string name="open_intents_in_new_tab">Apri gli intenti in una nuova scheda</string>
         <string name="open_intents_in_new_tab_summary">Gli intenti sono link inviati da altre app.</string>
         <string name="swipe_to_refresh">Swipe per aggiornare</string>
index 810e6475269a8ee43a9efeaf670b2d32779eb38f..018a3c7f37faafd5e9cc32d0f1335387195d461f 100644 (file)
             <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>
-            <string name="seventy_five_percent">75%</string>
-            <string name="one_hundred_percent">100%</string>
-            <string name="one_hundred_twenty_five_percent">125%</string>
-            <string name="one_hundred_fifty_percent">150%</string>
-            <string name="one_hundred_seventy_five_percent">175%</string>
-            <string name="two_hundred_percent">200%</string>
         <string name="swipe_to_refresh_options_menu">Потянуть для обновления</string>
         <string name="wide_viewport">Широкий вид просмотра</string>
         <string name="display_images">Показывать изображения</string>
         <string name="options_night_mode">Ночной режим</string>
+        <string name="font_size">Размер шрифта</string>
         <string name="find_on_page">Найти на странице</string>
         <string name="print">Печать</string>
             <string name="privacy_browser_web_page">Privacy Browser веб-страница</string>
 
     <!-- Context Menus. -->
     <string name="open_in_new_tab">Открыть в новой вкладке</string>
+    <string name="open_in_background">Открыть в фоне</string>
     <string name="open_image_in_new_tab">Открыть изображение в новой вкладке</string>
     <string name="copy_url">Копировать URL</string>
     <string name="download_url">Загрузить URL</string>
     <string name="domain_name">Имя домена</string>
     <string name="domain_deleted">Домен удален</string>
     <string name="domain_name_instructions">добавьте *. для включения всех поддоменов (напр. *.stoutner.com)</string>
+    <string-array name="font_size_array">
+        <item>Настройки по умолчанию</item>
+        <item>Custom font size</item>
+    </string-array>
     <string-array name="swipe_to_refresh_array">
         <item>Настройки по умолчанию</item>
         <item>Потянуть для обновления - включено</item>
     <string name="file_location">Расположение файла</string>
     <string name="browse">Обзор</string>
     <string name="export">Экспорт</string>
-    <string name="import_button">Импорт</string>  <!-- `import` is a reserved word and cannot be used as the name -->
+    <string name="import_button">Импорт</string>  <!-- `import` is a reserved word and cannot be used as the name. -->
     <string name="decrypt">Расшифровать</string>
     <string name="export_successful">Экспорт выполнен.</string>
     <string name="export_failed">Сбой при экспорте:</string>
     <string name="cannot_use_location">Это расположение использовано быть не может, поскольку разрешение на хранение предоставлено не было.</string>
 
     <!-- Logcat. -->
-    <string name="copy">Копировать</string>
+    <string name="copy_string">Копировать</string>  <!-- `copy` is a reserved word and should not be used as the name. -->
     <string name="logcat_copied">Logcat скопирован.</string>
     <string name="clear">Очистить</string>
     <string name="save_logcat">Сохранить logcat</string>
     <string name="general">Общее</string>
         <string name="homepage">Домашняя страница</string>
         <string name="font_size_preference">Размер шрифта</string>
-        <string-array name="font_size_entries">
-            <item>25%</item>
-            <item>50%</item>
-            <item>75%</item>
-            <item>100%</item>
-            <item>125%</item>
-            <item>150%</item>
-            <item>175%</item>
-            <item>200%</item>
-        </string-array>
-            <string-array name="domain_settings_font_size_entries">
-                <item>Настройки по умолчанию</item>
-                <item>25%</item>
-                <item>50%</item>
-                <item>75%</item>
-                <item>100%</item>
-                <item>125%</item>
-                <item>150%</item>
-                <item>175%</item>
-                <item>200%</item>
-            </string-array>
         <string name="open_intents_in_new_tab">Открывать цели в новой вкладке</string>
         <string name="open_intents_in_new_tab_summary">Цели - это ссылки, отправленные из других приложений.</string>
         <string name="swipe_to_refresh">Потянуть для обновления</string>
index 50b7656298da7cf994c1dc50437e5c5e8f2f7414..21806ca18f9d9035cae28f36ce8448365e2034eb 100644 (file)
             <string name="user_agent_internet_explorer_on_windows">İnternet Explorer - Windows</string>
             <string name="user_agent_safari_on_macos">Safari - macOS</string>
             <string name="user_agent_custom">Özel</string>
-        <string name="font_size">Yazı Tipi Boyutu</string>
-            <string name="twenty_five_percent">%25</string>
-            <string name="fifty_percent">%50</string>
-            <string name="seventy_five_percent">%75</string>
-            <string name="one_hundred_percent">%100</string>
-            <string name="one_hundred_twenty_five_percent">%125</string>
-            <string name="one_hundred_fifty_percent">%150</string>
-            <string name="one_hundred_seventy_five_percent">%175</string>
-            <string name="two_hundred_percent">%200</string>
         <string name="swipe_to_refresh_options_menu">Yenilemek için kaydır</string>
         <string name="wide_viewport">Geniş ekran</string>
         <string name="display_images">Resimleri göster</string>
         <string name="options_night_mode">Gece modu</string>
+        <string name="font_size">Yazı Tipi Boyutu</string>
         <string name="find_on_page">Sayfada bul</string>
         <string name="print">Yazdır</string>
             <string name="privacy_browser_web_page">Privacy Browser Web Sayfası</string>
     <string name="domain_name">Domain adı</string>
     <string name="domain_deleted">Domain silinmiş</string>
     <string name="domain_name_instructions">*. tüm altdomainleri içeren bir domainin başına getirilebilir (örn. *.stoutner.com)</string>
+    <string-array name="font_size_array">
+        <item>Sistem varsayılanı</item>
+        <item>Custom font size</item>
+    </string-array>
     <string-array name="swipe_to_refresh_array">
         <item>Sistem varsayılanı</item>
         <item>Yenilemek için kaydır etkin</item>
     <string name="file_location">Dosya Konumu</string>
     <string name="browse">Gözat</string>
     <string name="export">Dışarı aktar</string>
-    <string name="import_button">İçeri aktar</string>  <!-- `import` is a reserved word and cannot be used as the name -->
+    <string name="import_button">İçeri aktar</string>  <!-- `import` is a reserved word and cannot be used as the name. -->
     <string name="decrypt">Şifre çöz (Decrypt)</string>
     <string name="export_successful">Dışa aktarım başarılı</string>
     <string name="export_failed">Dışa aktarım başarısız:</string>
     <string name="cannot_use_location">Depolama izni verilmediği için bu konum kullanılamaz.</string>
 
     <!-- Logcat. -->
-    <string name="copy">Kopyala</string>
+    <string name="copy_string">Kopyala</string>  <!-- `copy` is a reserved word and should not be used as the name. -->
     <string name="logcat_copied">Logcat kopyalandı.</string>
     <string name="clear">Temizle</string>
     <string name="save_logcat">Logcat kaydet</string>
     <string name="general">Genel</string>
         <string name="homepage">Ana Sayfa</string>
         <string name="font_size_preference">Yazı tipi boyutu</string>
-        <string-array name="font_size_entries">
-            <item>%25</item>
-            <item>%50</item>
-            <item>%75</item>
-            <item>%100</item>
-            <item>%125</item>
-            <item>%150</item>
-            <item>%175</item>
-            <item>%200</item>
-        </string-array>
-            <string-array name="domain_settings_font_size_entries">
-                <item>Sistem varsayılanı</item>
-                <item>%25</item>
-                <item>%50</item>
-                <item>%75</item>
-                <item>%100</item>
-                <item>%125</item>
-                <item>%150</item>
-                <item>%175</item>
-                <item>%200</item>
-            </string-array>
         <string name="open_intents_in_new_tab">Intent\'leri yeni sekmede aç</string>
         <string name="open_intents_in_new_tab_summary">Intent\'ler diğer uygulamalardan gönderilen linklerdir.</string>
         <string name="swipe_to_refresh">Yenilemek için kaydır</string>
index 744a5a4ae2cae0cca83aa9035f708726cf87c22f..58ebf52c8d4817822131c96abf0de762eb32f112 100644 (file)
@@ -57,6 +57,7 @@
     <string name="new_tab">New tab</string>
     <string name="loading">Loading…</string>
     <string name="error">Error:</string>
+    <string name="apply">Apply</string>
 
     <!-- Loading Blocklists. -->
     <string name="loading_easylist">Loading EasyList</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>
-            <string name="seventy_five_percent">75%</string>
-            <string name="one_hundred_percent">100%</string>
-            <string name="one_hundred_twenty_five_percent">125%</string>
-            <string name="one_hundred_fifty_percent">150%</string>
-            <string name="one_hundred_seventy_five_percent">175%</string>
-            <string name="two_hundred_percent">200%</string>
         <string name="swipe_to_refresh_options_menu">Swipe to Refresh</string>
         <string name="wide_viewport">Wide Viewport</string>
         <string name="display_images">Display Images</string>
         <string name="options_night_mode">Night Mode</string>
+        <string name="font_size">Font Size</string>
         <string name="find_on_page">Find on Page</string>
         <string name="print">Print</string>
             <string name="privacy_browser_web_page">Privacy Browser Web Page</string>
     <string name="domain_name">Domain name</string>
     <string name="domain_deleted">Domain deleted</string>
     <string name="domain_name_instructions">*. may be prepended to a domain to include all subdomains (eg. *.stoutner.com)</string>
+    <string-array name="font_size_array">
+        <item>System default</item>
+        <item>Custom font size</item>
+    </string-array>
     <string-array name="swipe_to_refresh_array">
         <item>System default</item>
         <item>Swipe to refresh enabled</item>
     <string name="file_location">File Location</string>
     <string name="browse">Browse</string>
     <string name="export">Export</string>
-    <string name="import_button">Import</string>  <!-- `import` is a reserved word and cannot be used as the name -->
+    <string name="import_button">Import</string>  <!-- `import` is a reserved word and cannot be used as the name. -->
     <string name="decrypt">Decrypt</string>
     <string name="export_successful">Export successful.</string>
     <string name="export_failed">Export failed:</string>
     <string name="cannot_use_location">This location cannot be used because the storage permission has not been granted.</string>
 
     <!-- Logcat. -->
-    <string name="copy">Copy</string>
+    <string name="copy_string">Copy</string>  <!-- `copy` is a reserved word and should not be used as the name. -->
     <string name="logcat_copied">Logcat copied.</string>
     <string name="clear">Clear</string>
     <string name="save_logcat">Save logcat</string>
     <string name="general">General</string>
         <string name="homepage">Homepage</string>
         <string name="font_size_preference">Font size</string>
-        <string-array name="font_size_entries">
-            <item>25%</item>
-            <item>50%</item>
-            <item>75%</item>
-            <item>100%</item>
-            <item>125%</item>
-            <item>150%</item>
-            <item>175%</item>
-            <item>200%</item>
-        </string-array>
-        <string-array name="font_size_entry_values" translatable="false">  <!-- None of the items in this `string-array` should be translated. -->
-            <item>25</item>
-            <item>50</item>
-            <item>75</item>
-            <item>100</item>
-            <item>125</item>
-            <item>150</item>
-            <item>175</item>
-            <item>200</item>
-        </string-array>
-            <string-array name="domain_settings_font_size_entries">
-                <item>System default</item>
-                <item>25%</item>
-                <item>50%</item>
-                <item>75%</item>
-                <item>100%</item>
-                <item>125%</item>
-                <item>150%</item>
-                <item>175%</item>
-                <item>200%</item>
-            </string-array>
-            <string-array name="domain_settings_font_size_entry_values" translatable="false">  <!-- None of the items in this `string-array` should be translated. -->
-                <item>0</item>
-                <item>25</item>
-                <item>50</item>
-                <item>75</item>
-                <item>100</item>
-                <item>125</item>
-                <item>150</item>
-                <item>175</item>
-                <item>200</item>
-            </string-array>
         <string name="open_intents_in_new_tab">Open intents in new tab</string>
         <string name="open_intents_in_new_tab_summary">Intents are links sent from other apps.</string>
         <string name="swipe_to_refresh">Swipe to refresh</string>
index 4c266c273d7f67f350299df1cfb01976d18682f8..500fcb86658e2e43c55fa1623beee1c848d1b651 100644 (file)
             android:entryValues="@array/tor_search_entry_values"
             android:defaultValue="@string/tor_search_default_value" />
 
+        <!-- `android:inputType` currently doesn't work with AndroidX. -->
         <EditTextPreference
             android:key="tor_search_custom_url"
             android:title="@string/tor_search_custom_url"
             android:inputType="textUri"
             android:icon="?attr/homepageIcon" />
 
-        <ListPreference
+        <!-- `android:inputType="number"` currently doesn't work with AndroidX. -->
+        <EditTextPreference
             android:key="font_size"
             android:title="@string/font_size_preference"
-            android:entries="@array/font_size_entries"
-            android:entryValues="@array/font_size_entry_values"
             android:defaultValue="@string/font_size_default_value"
+            android:inputType="number"
             android:icon="?attr/fontSizeIcon" />
 
         <SwitchPreference
index 9d59235cefd51c17fc87a74b8678001084d91e82..f5dea9581f6b5436e301b6d1048c348230871953 100644 (file)
@@ -25,7 +25,7 @@ buildscript {
         google()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.5.1'
+        classpath 'com.android.tools.build:gradle:3.5.2'
 
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files