Use FQDNs for some file names. https://redmine.stoutner.com/issues/680
authorSoren Stoutner <soren@stoutner.com>
Thu, 15 Apr 2021 23:08:16 +0000 (16:08 -0700)
committerSoren Stoutner <soren@stoutner.com>
Thu, 15 Apr 2021 23:08:16 +0000 (16:08 -0700)
18 files changed:
.idea/dictionaries/soren.xml
app/src/main/assets/pt-rBR/about_changelog.html
app/src/main/java/com/stoutner/privacybrowser/activities/AboutActivity.java
app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java
app/src/main/java/com/stoutner/privacybrowser/asynctasks/PrepareSaveDialog.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/SaveWebpageDialog.kt
app/src/main/java/com/stoutner/privacybrowser/fragments/AboutWebViewFragment.kt
app/src/main/java/com/stoutner/privacybrowser/fragments/GuideWebViewFragment.java
app/src/main/res/layout/bare_webview.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-pt-rBR/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
fastlane/metadata/android/pt-BR/changelogs/54.txt

index 037ced95eedeed98fb39681b346b5704b7cc2d7f..42467e85dca0fc8c0badb202207b118b9bf9d6c8 100644 (file)
       <w>amiunique</w>
       <w>amoled</w>
       <w>androidcentral</w>
+      <w>androidplatform</w>
       <w>androidversion</w>
       <w>anonymized</w>
       <w>apng</w>
+      <w>appassets</w>
       <w>appbarlayout</w>
       <w>aren</w>
       <w>autofill</w>
index f5a610f26adb91f3747e353b917864a3870d2b00..8659d706213e7646bcc0eddef93ca53cae902659 100644 (file)
@@ -1,7 +1,7 @@
 <!--
   Copyright © 2016-2021 Soren Stoutner <soren@stoutner.com>.
 
-  Translation 2020 Thiago Nazareno Conceição Silva de Jesus <mochileiro2006-trilhas@yahoo.com.br>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+  Translation 2020-2021 Thiago Nazareno Conceição Silva de Jesus <mochileiro2006-trilhas@yahoo.com.br>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
         <h3><a href="https://www.stoutner.com/privacy-browser-3-7/">3.7</a> (código da versão 54)</h3>
         <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowser.git;a=commitdiff;h=f3b9172adedd74f705ddc0beac80798ae84f2920">29 March 2021</a> - minimum API 19, target API 30</p>
         <ul>
-            <li>Redesign file access to work with <a href="https://redmine.stoutner.com/issues/546">scoped storage and the Storage Access Framework</a>.
-                This allows the target API to be bumped to 30 and removes the need for the dangerous READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE permissions.
-                Unfortunately, due to a bug in Android’s WebView, this also temporarily removes the ability to <a href="https://redmine.stoutner.com/issues/677">save a web archive</a>.</li>
-            <li>Update <a href="https://redmine.stoutner.com/issues/678">About > Permissions</a>.</li>
-            <li>Improve the descriptiveness of the <a href="https://redmine.stoutner.com/issues/676">save URL snackbar</a>.</li>
-            <li>Add <a href="https://redmine.stoutner.com/issues/568">Metager</a> to the list of search engines.</li>
-            <li>Fix <a href="https://redmine.stoutner.com/issues/674">I2P detection</a>.</li>
-            <li>Fix the alignment of <a href="https://redmine.stoutner.com/issues/228">icons and radio buttons</a> in the dialogs.</li>
-            <li>Update the URL bar when switching tabs <a href="https://redmine.stoutner.com/issues/654">even if it is being edited</a>.</li>
-            <li>Allow <a href="https://redmine.stoutner.com/issues/620">displaying of the password</a> in the HTTP authentication dialog.</li>
-            <li>Fix a <a href="https://redmine.stoutner.com/issues/645">number</a> <a href="https://redmine.stoutner.com/issues/646">of</a> <a href="https://redmine.stoutner.com/issues/651">rare</a>
-                <a href="https://redmine.stoutner.com/issues/663">crashes</a>.</li>
-            <li>Fix the hamburger icon <a href="https://redmine.stoutner.com/issues/616">turning into an arrow</a> if the drawer is open when the app is restarted.</li>
-            <li>Speed up the opening of the <a href="https://redmine.stoutner.com/issues/650">options menu</a>.</li>
-            <li>Updated Brazilian Portuguese translation provided by <a href="mailto:mochileiro2006-trilhas@yahoo.com.br">Thiago Nazareno Conceição Silva de Jesus</a>.</li>
+            <li>Remodele o acesso ao arquivo para funcionar com <a href="https://redmine.stoutner.com/issues/546">escopo de armazenamento definido e Estrutura de Acesso ao Armazenamento</a>.
+                Isso permite que a API de destino seja aumentada para 30 e remove a necessidade das perigosas permissões READ_EXTERNAL_STORAGE e WRITE_EXTERNAL_STORAGE.
+                Infelizmente, devido a um bug no WebView do Android, isso também remove temporariamente a capacidade de <a href="https://redmine.stoutner.com/issues/677">salvar um arquivo da web</a>.</li>
+            <li>Atualiza <a href="https://redmine.stoutner.com/issues/678">Sobre > Permissões</a>.</li>
+            <li>Melhora o texto da descrição da <a href="https://redmine.stoutner.com/issues/676">barra de salve URL</a>.</li>
+            <li>Adicione <a href="https://redmine.stoutner.com/issues/568">Metager</a> à lista de mecanismos de pesquisa.</li>
+            <li>Corrija a <a href="https://redmine.stoutner.com/issues/674">detecção I2P</a>.</li>
+            <li>Corrija o alinhamento de <a href="https://redmine.stoutner.com/issues/228">ícones e botões de opção</a> nas caixas de diálogo.</li>
+            <li>Atualize a barra de URL ao alternar entre as guias <a href="https://redmine.stoutner.com/issues/654">mesmo se estiver sendo editada</a>.</li>
+            <li>Permite <a href="https://redmine.stoutner.com/issues/620">a exibição da senha</a> na caixa de diálogo de autenticação HTTP.</li>
+            <li>Corrija um <a href="https://redmine.stoutner.com/issues/645">número</a> <a href="https://redmine.stoutner.com/issues/646">de</a> <a href="https://redmine.stoutner.com/issues/651">raro</a>
+                <a href="https://redmine.stoutner.com/issues/663">trava</a>.</li>
+            <li>Corrija o ícone de hambúrguer <a href="https://redmine.stoutner.com/issues/616">transformando-se em uma seta</a> se a gaveta for aberta quando o aplicativo for reiniciado.</li>
+            <li>Acelere a abertura do <a href="https://redmine.stoutner.com/issues/650">menu de opções</a>.</li>
+            <li>Tradução atualizada para o português do Brasil fornecida por <a href="mailto:mochileiro2006-trilhas@yahoo.com.br">Thiago Nazareno Conceição Silva de Jesus</a>.</li>
             <li>Tradução francesa atualizada fornecida por <a href="mailto:kevinliste@framalistes.org">Kévin L</a>.</li>
             <li>Tradução alemã atualizada fornecida por Bernhard G. Keller.</li>
             <li>Tradução italiana atualizada fornecida por Francesco Buratti.</li>
index 31e9c152f5d7e71338a5812d6fe13720d909cead..94801fb9b5579a091e0a88476daf4d027544db96 100644 (file)
@@ -64,7 +64,7 @@ public class AboutActivity extends AppCompatActivity implements SaveDialog.SaveL
         SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
 
         // Get the screenshot preference.
-        boolean allowScreenshots = sharedPreferences.getBoolean("allow_screenshots", false);
+        boolean allowScreenshots = sharedPreferences.getBoolean(getString(R.string.allow_screenshots_key), false);
 
         // Disable screenshots if not allowed.
         if (!allowScreenshots) {
index b5e3c53479a4b0924109fbc4521c4529cea6dcb4..800b3b044b5c618c3a96e4376c2bbea784e700c5 100644 (file)
@@ -95,7 +95,6 @@ import android.widget.RelativeLayout;
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.app.ActionBarDrawerToggle;
 import androidx.appcompat.app.AppCompatActivity;
@@ -1762,8 +1761,8 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
             // Consume the event.
             return true;
         } else if (menuItemId == R.id.save_archive) {
-            // Instantiate the save dialog.  TODO.  Replace the hard coded file name.
-            DialogFragment saveArchiveFragment = SaveWebpageDialog.saveWebpage(SaveWebpageDialog.SAVE_ARCHIVE, null, null, "Webpage.mht", null,
+            // Instantiate the save dialog.
+            DialogFragment saveArchiveFragment = SaveWebpageDialog.saveWebpage(SaveWebpageDialog.SAVE_ARCHIVE, currentWebView.getCurrentUrl(), null, null, null,
                     false);
 
             // Show the save dialog.  It must be named `save_dialog` so that the file picker can update the file name.
@@ -1772,7 +1771,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
             return true;
         } else if (menuItemId == R.id.save_image) {  // Save image.
             // Instantiate the save dialog.
-            DialogFragment saveImageFragment = SaveWebpageDialog.saveWebpage(SaveWebpageDialog.SAVE_IMAGE, null, null, getString(R.string.webpage_png), null,
+            DialogFragment saveImageFragment = SaveWebpageDialog.saveWebpage(SaveWebpageDialog.SAVE_IMAGE, currentWebView.getCurrentUrl(), null, null, null,
                     false);
 
             // Show the save dialog.  It must be named `save_dialog` so that the file picker can update the file name.
@@ -3062,7 +3061,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
     }
 
     @Override
-    public void onSaveWebpage(int saveType, @Nullable String originalUrlString, DialogFragment dialogFragment) {
+    public void onSaveWebpage(int saveType, @NonNull String originalUrlString, DialogFragment dialogFragment) {
         // Get the dialog.
         Dialog dialog = dialogFragment.getDialog();
 
@@ -3085,7 +3084,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
                 String saveWebpageUrl;
 
                 // Store the URL.
-                if ((originalUrlString != null) && originalUrlString.startsWith("data:")) {
+                if (originalUrlString.startsWith("data:")) {
                     // Save the original URL.
                     saveWebpageUrl = originalUrlString;
                 } else {
@@ -3128,7 +3127,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
                                 temporaryMhtFileInputStream.close();
 
                                 // Display a snackbar.
-                                Snackbar.make(currentWebView, getString(R.string.file_saved) + "  " + saveWebpageFilePath, Snackbar.LENGTH_SHORT).show();
+                                Snackbar.make(currentWebView, getString(R.string.file_saved) + "  " + currentWebView.getCurrentUrl(), Snackbar.LENGTH_SHORT).show();
                             } catch (Exception exception) {
                                 // Display a snackbar with the exception.
                                 Snackbar.make(currentWebView, getString(R.string.error_saving_file) + "  " + exception.toString(), Snackbar.LENGTH_INDEFINITE).show();
index d858f1cba98127b34aefd1cbbf4410afb64410a1..a7d44954a6dcb2539957dc23159f1f835b63d031 100644 (file)
@@ -199,7 +199,7 @@ public class PrepareSaveDialog extends AsyncTask<String, Void, String[]> {
         }
 
         // Prevent the dialog from displaying if the app window is not visible.
-        // The asynctask continues to function even when the app is paused.  Attempting to display a dialog in that state leads to a crash.
+        // The async task continues to function even when the app is paused.  Attempting to display a dialog in that state leads to a crash.
         while (!activity.getWindow().isActive()) {
             try {
                 // The window is not active.  Wait 1 second.
index 782526d0f761ed94adc7877978f2717c5aa404a1..d3420f3072432c4bf41fffc607135eb9c038cdd3 100644 (file)
@@ -25,6 +25,7 @@ import android.content.Context
 import android.content.DialogInterface
 import android.content.Intent
 import android.content.res.Configuration
+import android.net.Uri
 import android.os.AsyncTask
 import android.os.Bundle
 import android.text.Editable
@@ -63,7 +64,7 @@ class SaveWebpageDialog : DialogFragment() {
 
     // The public interface is used to send information back to the parent activity.
     interface SaveWebpageListener {
-        fun onSaveWebpage(saveType: Int, originalUrlString: String?, dialogFragment: DialogFragment)
+        fun onSaveWebpage(saveType: Int, originalUrlString: String, dialogFragment: DialogFragment)
     }
 
     override fun onAttach(context: Context) {
@@ -82,7 +83,7 @@ class SaveWebpageDialog : DialogFragment() {
 
         // `@JvmStatic` will no longer be required once all the code has transitioned to Kotlin.
         @JvmStatic
-        fun saveWebpage(saveType: Int, urlString: String?, fileSizeString: String?, fileNameString: String, userAgentString: String?, cookiesEnabled: Boolean): SaveWebpageDialog {
+        fun saveWebpage(saveType: Int, urlString: String, fileSizeString: String?, fileNameString: String?, userAgentString: String?, cookiesEnabled: Boolean): SaveWebpageDialog {
             // Create an arguments bundle.
             val argumentsBundle = Bundle()
 
@@ -110,9 +111,9 @@ class SaveWebpageDialog : DialogFragment() {
     override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
         // Get the arguments from the bundle.
         val saveType = requireArguments().getInt(SAVE_TYPE)
-        val originalUrlString = requireArguments().getString(URL_STRING)
+        val originalUrlString = requireArguments().getString(URL_STRING)!!
         val fileSizeString = requireArguments().getString(FILE_SIZE_STRING)
-        val fileNameString = requireArguments().getString(FILE_NAME_STRING)!!
+        var fileNameString = requireArguments().getString(FILE_NAME_STRING)
         val userAgentString = requireArguments().getString(USER_AGENT_STRING)
         val cookiesEnabled = requireArguments().getBoolean(COOKIES_ENABLED)
 
@@ -122,7 +123,7 @@ class SaveWebpageDialog : DialogFragment() {
         // Get the current theme status.
         val currentThemeStatus = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
 
-        // Set the title and icon according to the save type.
+        // Configure the dialog according to the save type.
         when (saveType) {
             SAVE_URL -> {
                 // Set the title.
@@ -146,6 +147,12 @@ class SaveWebpageDialog : DialogFragment() {
                 } else {
                     dialogBuilder.setIcon(R.drawable.dom_storage_cleared_night)
                 }
+
+                // Convert the URL to a URI.
+                val uri = Uri.parse(originalUrlString)
+
+                // Build a file name string based on the host from the URI.
+                fileNameString = uri.host + ".mht"
             }
 
             SAVE_IMAGE -> {
@@ -158,6 +165,12 @@ class SaveWebpageDialog : DialogFragment() {
                 } else {
                     dialogBuilder.setIcon(R.drawable.images_enabled_night)
                 }
+
+                // Convert the URL to a URI.
+                val uri = Uri.parse(originalUrlString)
+
+                // Build a file name string based on the host from the URI.
+                fileNameString = uri.host + ".png"
             }
         }
 
@@ -204,7 +217,7 @@ class SaveWebpageDialog : DialogFragment() {
         // Modify the layout based on the save type.
         if (saveType == SAVE_URL) {  // A URL is being saved.
             // Populate the URL edit text according to the type.  This must be done before the text change listener is created below so that the file size isn't requested again.
-            if (originalUrlString!!.startsWith("data:")) {  // The URL contains the entire data of an image.
+            if (originalUrlString.startsWith("data:")) {  // The URL contains the entire data of an image.
                 // Get a substring of the data URL with the first 100 characters.  Otherwise, the user interface will freeze while trying to layout the edit text.
                 val urlSubstring = originalUrlString.substring(0, 100) + "…"
 
index 2d450bc863c3074cc0921ee174c17b86a079be04..3d36c05737e53598cdf48dac99c1415282b90974 100644 (file)
@@ -103,7 +103,8 @@ class AboutWebViewFragment : Fragment() {
             }
 
             override fun shouldInterceptRequest(webView: WebView, url: String): WebResourceResponse? {
-                // Have the WebView asset loader process the request.  This allows the loading of SVG files, which otherwise is prevented by the CORS policy.
+                // Have the WebView asset loader process the request.
+                // This allows using the `appassets.androidplatform.net` URL, which handles the loading of SVG files, which otherwise is prevented by the CORS policy.
                 return webViewAssetLoader.shouldInterceptRequest(Uri.parse(url))
             }
         }
index 0b0bc15741aab693f4424e50c49863da6a83deea..3e1019ac930c615e9c9b731de683d236b14a8a20 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2016-2020 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2016-2021 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
  *
@@ -117,7 +117,8 @@ public class GuideWebViewFragment extends Fragment {
 
             @Override
             public WebResourceResponse shouldInterceptRequest(WebView webView, String url) {
-                // Have the WebView asset loader process the request.  This allows loading of SVG files, which otherwise is prevented by the CORS policy.
+                // Have the WebView asset loader process the request.
+                // This allows using the `appassets.androidplatform.net` URL, which handles the loading of SVG files, which otherwise is prevented by the CORS policy.
                 return webViewAssetLoader.shouldInterceptRequest(Uri.parse(url));
             }
         });
index 1ec3fb52449ca5643f5a0baa0401d2dd2dfe07b7..811ceff0cddddd718006b9688788acec7be9bb11 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <!--
-  Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2017,2021 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
@@ -22,5 +22,5 @@
 <WebView
     android:id="@+id/bare_webview"
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent" />
\ No newline at end of file
+    android:layout_height="match_parent"
+    android:layout_width="match_parent" />
\ No newline at end of file
index 1214821586cd461dbe69963057dd38904a08c51e..69479eef5715f40ef061f689e56b8a6256d15840 100644 (file)
     <string name="save_image">Grafik speichern</string>
     <string name="save_logcat">Logcat speichern</string>
     <string name="file_name">Dateiname</string>
-    <string name="webpage_png">Webseite.png</string>
     <string name="privacy_browser_logcat_txt">Privacy Browser Logcat.txt</string>
     <string name="privacy_browser_version_txt">Privacy Browser Version.txt</string>
     <string name="privacy_browser_version_png">Privacy Browser Version.png</string>
index 9698f3b89746fb80eb7776ba2edd91a47b01fcec..d6de2211bdde4bd1649ae6bb9495ce6c171bf4be 100644 (file)
     <string name="save_image">Guardar imagen</string>
     <string name="save_logcat">Guardar logcat</string>
     <string name="file_name">Nombre de archivo</string>
-    <string name="webpage_png">PaginaWeb.png</string>
     <string name="privacy_browser_logcat_txt">Navegador Privado Logcat.txt</string>
     <string name="privacy_browser_version_txt">Versión de Navegador Privado.txt</string>
     <string name="privacy_browser_version_png">Versiótoutnern de Navegador Privado.png</string>
index 388f6109250c4a857d7e434f62c907556ac75376..fd3ac1d3868ae342c9923c416aa059e6463e93c5 100644 (file)
     <string name="save_image">Sauvegarder en tant qu\'image</string>
     <string name="save_logcat">Sauvegarder le journal système</string>
     <string name="file_name">Nom du fichier</string>
-    <string name="webpage_png">PageWeb.png</string>
     <string name="privacy_browser_logcat_txt">Privacy Browser Logcat.txt</string>
     <string name="privacy_browser_version_txt">Privacy Browser Version.txt</string>
     <string name="privacy_browser_version_png">Privacy Browser Version.png</string>
index d825deb973c46f940c2067d46d95e774ff657e15..de01192de9d11c1e0bcecc1617d915900f0ddd6e 100644 (file)
     <string name="save_image">Salva Immagine</string>
     <string name="save_logcat">Salva il log</string>
     <string name="file_name">Nome File</string>
-    <string name="webpage_png">PaginaWeb.png</string>
     <string name="privacy_browser_logcat_txt">Privacy Browser Logcat.txt</string>
     <string name="privacy_browser_version_txt">Versione di Privacy Browser.txt</string>
     <string name="privacy_browser_version_png">Versione di Privacy Browser.png</string>
index 7d2d37cef1d5748dda72014ee44e4efb670e065f..b384a6c20924c97b523beeae0c544a1288bf12b7 100644 (file)
     <string name="save_image">Salvar Imagem</string>
     <string name="save_logcat">Salvar logcat</string>
     <string name="file_name">Nome do Arquivo</string>
-    <string name="webpage_png">Pagina_Web.png</string>
     <string name="privacy_browser_logcat_txt">Privacy Browser Logcat.txt</string>
     <string name="privacy_browser_version_txt">Privacy Browser Versão.txt</string>
     <string name="privacy_browser_version_png">Privacy Browser Versão.png</string>
index b4544da92074c5cba361b449c78e49333c9ba4fb..c95de4740605405ce9eb3fdcda5da84ba4d40a23 100644 (file)
     <string name="save_image">Сохранить изображение</string>
     <string name="save_logcat">Сохранить logcat</string>
     <string name="file_name">Имя файла</string>
-    <string name="webpage_png">Webpage.png</string>
     <string name="privacy_browser_logcat_txt">Privacy Browser Logcat.txt</string>
     <string name="privacy_browser_version_txt">Версия Privacy Browser.txt</string>
     <string name="privacy_browser_version_png">Версия Privacy Browser.png</string>
index 0ce063232e0841cd568c037b3114f9726ff3605f..acf1af0811880a34aeba16ffa4a359f69dc6dde9 100644 (file)
     <string name="save_image">Resmi kaydet</string>
     <string name="save_logcat">Logcat kaydet</string>
     <string name="file_name">Dosya adı</string>
-    <string name="webpage_png">Websayfası.png</string>
     <string name="unknown_size">Bilinmeyen boyut</string>
     <string name="privacy_browser_logcat_txt">Privacy Browser Logcat.txt</string>
 
index a8345b5d186628a08e6798e6e230d308e7a766bf..aa55b9ad4710008514c4d06cd6eba9795771ce77 100644 (file)
     <string name="save_image">Save Image</string>
     <string name="save_logcat">Save Logcat</string>
     <string name="file_name">File name</string>
-    <string name="webpage_png">Webpage.png</string>
     <string name="privacy_browser_logcat_txt">Privacy Browser Logcat.txt</string>
     <string name="privacy_browser_version_txt">Privacy Browser Version.txt</string>
     <string name="privacy_browser_version_png">Privacy Browser Version.png</string>
index b97addb9ad3a59667150082d3066caf6d3a85556..cb46cd8f8b3fce2ee06d3e1ef29beef42c253d47 100644 (file)
@@ -1,15 +1,15 @@
-• Redesign file access to work with scoped storage and the Storage Access Framework. This allows the target API to be bumped to 30 and removes the need for the dangerous READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE permissions. Unfortunately, due to a bug in Android’s WebView, this also temporarily removes the ability to save a web archive.
-• Update About > Permissions.
-• Improve the descriptiveness of the save URL snackbar.
-• Add Metager to the list of search engines.
-• Fix I2P detection.
-• Fix the alignment of icons and radio buttons in the dialogs.
-• Update the URL bar when switching tabs even if it is being edited.
-• Allow displaying of the password in the HTTP authentication dialog.
-• Fix a number of rare crashes.
-• Fix the hamburger icon turning into an arrow if the drawer is open when the app is restarted.
-• Speed up the opening of the options menu.
-• Updated Brazilian Portuguese translation provided by Thiago Nazareno Conceição Silva de Jesus.
+• Remodele o acesso ao arquivo para funcionar com escopo de armazenamento definido e Estrutura de Acesso ao Armazenamento. Isso permite que a API de destino seja aumentada para 30 e remove a necessidade das perigosas permissões READ_EXTERNAL_STORAGE e WRITE_EXTERNAL_STORAGE. Infelizmente, devido a um bug no WebView do Android, isso também remove temporariamente a capacidade de salvar um arquivo da web.
+• Atualiza Sobre > Permissões.
+• Melhora o texto da descrição da barra de salve URL.
+• Adicione Metager à lista de mecanismos de pesquisa.
+• Corrija a detecção I2P.
+• Corrija o alinhamento de ícones e botões de opção nas caixas de diálogo.
+• Atualize a barra de URL ao alternar entre as guias mesmo se estiver sendo editada.
+• Permite a exibição da senha na caixa de diálogo de autenticação HTTP.
+• Corrija um número de raro trava.
+• Corrija o ícone de hambúrguer transformando-se em uma seta se a gaveta for aberta quando o aplicativo for reiniciado.
+• Acelere a abertura do menu de opções.
+• Tradução atualizada para o português do Brasil fornecida por Thiago Nazareno Conceição Silva de Jesus.
 • Tradução francesa atualizada fornecida por Kévin L.
 • Tradução alemã atualizada fornecida por Bernhard G. Keller.
 • Tradução italiana atualizada fornecida por Francesco Buratti.