Add an open option on download completion. https://redmine.stoutner.com/issues/533
authorSoren Stoutner <soren@stoutner.com>
Tue, 17 Mar 2020 05:08:51 +0000 (22:08 -0700)
committerSoren Stoutner <soren@stoutner.com>
Tue, 17 Mar 2020 05:08:51 +0000 (22:08 -0700)
25 files changed:
app/src/main/assets/de/guide_proxies_dark.html
app/src/main/assets/de/guide_proxies_light.html
app/src/main/assets/en/guide_proxies_dark.html
app/src/main/assets/en/guide_proxies_light.html
app/src/main/assets/es/guide_proxies_dark.html
app/src/main/assets/es/guide_proxies_light.html
app/src/main/assets/fr/guide_proxies_dark.html
app/src/main/assets/fr/guide_proxies_light.html
app/src/main/assets/it/guide_proxies_dark.html
app/src/main/assets/it/guide_proxies_light.html
app/src/main/assets/ru/guide_proxies_dark.html
app/src/main/assets/ru/guide_proxies_light.html
app/src/main/assets/shared_images/file_download_blue_dark.png [deleted file]
app/src/main/assets/shared_images/file_download_blue_light.png [deleted file]
app/src/main/assets/shared_images/vpn_mode.png [deleted file]
app/src/main/assets/tr/guide_proxies_dark.html
app/src/main/assets/tr/guide_proxies_light.html
app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java
app/src/main/java/com/stoutner/privacybrowser/asynctasks/GetUrlSize.java
app/src/main/java/com/stoutner/privacybrowser/asynctasks/SaveUrl.java
app/src/main/res/values-de/strings.xml
app/src/main/res/values-es/strings.xml
app/src/main/res/values-it/strings.xml
app/src/main/res/values-ru/strings.xml
app/src/main/res/values/strings.xml

index 5edfc551298838d5d6dad1737e473def8dde9d16..47f80d8104553adc6d89a8061353fbda2f141089 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2019 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2020 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
             ist die Übertragungsgeschwindigkeit bei der Nutzung von Proxies meist deutlich langsamer als bei direkten Internet-Verbindungen.</p>
 
         <img class="center" src="images/tor.png">
-
-
-        <h3><img class="title" src="../shared_images/file_download_blue_dark.png"> Herunterladen von Dateien mittels TOR</h3>
-
-        <p>Wenn Orbot im Proxy-Modus genutzt wird, wird zwar der Datenverkehr beim Internet-Surfen über den Proxy geleitet, nicht jedoch heruntergeladene Dateien.
-            Der Grund dafür ist, dass Privacy Browser für Datei-Downloads Androids eingebauten Download-Manager verwendet, der jedoch keine Proxy-Option bietet.
-            Benutzer, die Dateien via Orbot herunterladen wollen, sollten daher dessen VPN-Modus aktivieren. Aktuell existiert keine Möglichkeit, Dateien über I2P herunterzuladen.</p>
-
-        <img class="center" src="../shared_images/vpn_mode.png">
     </body>
 </html>
\ No newline at end of file
index 841554df5049c284fd18857067e4204328fa6892..1dc53edca4a4c0439b9e9036749354e707bcae00 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2019 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2020 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2019 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
             ist die Übertragungsgeschwindigkeit bei der Nutzung von Proxies meist deutlich langsamer als bei direkten Internet-Verbindungen.</p>
 
         <img class="center" src="images/tor.png">
-
-
-        <h3><img class="title" src="../shared_images/file_download_blue_light.png"> Herunterladen von Dateien mittels TOR</h3>
-
-        <p>Wenn Orbot im Proxy-Modus genutzt wird, wird zwar der Datenverkehr beim Internet-Surfen über den Proxy geleitet, nicht jedoch heruntergeladene Dateien.
-            Der Grund dafür ist, dass Privacy Browser für Datei-Downloads Androids eingebauten Download-Manager verwendet, der jedoch keine Proxy-Option bietet.
-            Benutzer, die Dateien via Orbot herunterladen wollen, sollten daher dessen VPN-Modus aktivieren. Aktuell existiert keine Möglichkeit, Dateien über I2P herunterzuladen.</p>
-
-        <img class="center" src="../shared_images/vpn_mode.png">
     </body>
 </html>
\ No newline at end of file
index a02c6e677f94b6ef52e9226f8eaa076d4f9301e2..1ba63a186dde7d4c0bca73030c775682419e726c 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2019 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2020 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
             Because traffic is being routed through several proxy nodes, using a layered proxy is often much slower than connecting directly to the internet.</p>
 
         <img class="center" src="images/tor.png">
-
-        <h3><img class="title" src="../shared_images/file_download_blue_dark.png"> Downloading Files Via Tor</h3>
-
-        <p>When Orbot is operating in proxy mode, browsing the internet using Privacy Browser will be routed through the proxy, but file downloads will not.
-            This is because Privacy Browser uses Android’s builtin download manager to download files, which doesn’t have a proxy option.
-            Users who want to download files via Orbot need to enable its VPN mode.  There is currently no way to download files through I2P.</p>
-
-        <img class="center" src="../shared_images/vpn_mode.png">
     </body>
 </html>
\ No newline at end of file
index 2184b520b635c5fcfc98c626c99122c3fc8b3711..8e3051194393164c0b2be64cc03052c9df8d3e4c 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2019 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2020 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
             Because traffic is being routed through several proxy nodes, using a layered proxy is often much slower than connecting directly to the internet.</p>
 
         <img class="center" src="images/tor.png">
-
-        <h3><img class="title" src="../shared_images/file_download_blue_light.png"> Downloading Files Via Tor</h3>
-
-        <p>When Orbot is operating in proxy mode, browsing the internet using Privacy Browser will be routed through the proxy, but file downloads will not.
-            This is because Privacy Browser uses Android’s builtin download manager to download files, which doesn’t have a proxy option.
-            Users who want to download files via Orbot need to enable its VPN mode.  There is currently no way to download files through I2P.</p>
-
-        <img class="center" src="../shared_images/vpn_mode.png">
     </body>
 </html>
\ No newline at end of file
index beef54d83831d0fd928128bf3b7c8199d8deeca0..ae8c1c4cb323230d25a9ebbf3c3617184f1cf69d 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2017-2019 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2017-2020 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2017,2019 Jose A. León.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
             Debido a que el tráfico está siendo enrutado a través de varios nodos proxy, usar un proxy en capas es a menudo mucho más lento que conectarse directamente a Internet.</p>
 
         <img class="center" src="images/tor.png">
-
-        <h3><img class="title" src="../shared_images/file_download_blue_dark.png"> Descarga de archivos a través de Tor</h3>
-
-        <p>Cuando Orbot funciona en modo proxy, la navegación por Internet mediante Navegador Privado se enrutará a través del proxy, pero no así las descargas de archivos.
-            Esto se debe a que Navegador Privado utiliza el administrador de descargas integrado de Android para descargar archivos, que no tiene una opción de proxy.
-            Los usuarios que deseen descargar archivos a través de Orbot necesitan habilitar su modo VPN. Actualmente no hay forma de descargar archivos a través de I2P.</p>
-
-        <img class="center" src="../shared_images/vpn_mode.png">
     </body>
 </html>
\ No newline at end of file
index df5f1bb6bd40165adba5bdb666d565e19cbe6ab5..8e22ae8439bcfc8efb7a8b27ec2d614a4e337366 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2017-2019 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2017-2020 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2017,2019 Jose A. León.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
             Debido a que el tráfico está siendo enrutado a través de varios nodos proxy, usar un proxy en capas es a menudo mucho más lento que conectarse directamente a Internet.</p>
 
         <img class="center" src="images/tor.png">
-
-        <h3><img class="title" src="../shared_images/file_download_blue_light.png"> Descarga de archivos a través de Tor</h3>
-
-        <p>Cuando Orbot funciona en modo proxy, la navegación por Internet mediante Navegador Privado se enrutará a través del proxy, pero no así las descargas de archivos.
-            Esto se debe a que Navegador Privado utiliza el administrador de descargas integrado de Android para descargar archivos, que no tiene una opción de proxy.
-            Los usuarios que deseen descargar archivos a través de Orbot necesitan habilitar su modo VPN. Actualmente no hay forma de descargar archivos a través de I2P.</p>
-
-        <img class="center" src="../shared_images/vpn_mode.png">
     </body>
 </html>
\ No newline at end of file
index 29384c5e3302f802afd532a27bde83dd5da17779..d6ebf5748147b26c9c429e33aae9f526d75b18f9 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2019 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2020 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2019 Kévin LE FLOHIC <kevinliste@framalistes.org>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
@@ -33,6 +33,7 @@
             Des proxys comme TOR (The Onion Router) et I2P (The Invisible Internet Project) sont utiles pour protéger la confidentialité des gouvernements malveillants (qui espionnent le trafic en transit)
             mais pas de méga sociétés (qui intègrent du code malveillant sur les serveurs Web).</p>
 
+
         <h3><img class="title" src="../shared_images/language_blue_dark.png"> Gouvernements Malicieux</h3>
 
         <p>Les gouvernements malveillants espionnent souvent leurs citoyens pour punir la dissidence ou les activités liées aux droits de l'homme.
@@ -47,6 +48,7 @@
             et les utilisateurs pourraient être punis parce que les gouvernements supposent qu'ils font quelque chose qui est interdit.
             Ainsi, les proxies peuvent être utiles, mais elles ne sont pas une panacée.</p>
 
+
         <h3><img class="title" src="../shared_images/language_blue_dark.png"> Méga entreprises</h3>
 
         <p>Lorsqu'un utilisateur se connecte à un serveur Web, celui-ci peut voir l'adresse IP de l'utilisateur.
             Étant donné que le trafic est acheminé via plusieurs nœuds proxy, l'utilisation d'un proxy en couches est souvent beaucoup plus lente que la connexion directe à Internet.</p>
 
         <img class="center" src="images/tor.png">
-
-        <h3><img class="title" src="../shared_images/file_download_blue_dark.png"> Téléchargement de fichiers via Tor</h3>
-
-        <p>Lorsque Orbot fonctionne en mode proxy, la navigation sur Internet à l'aide de Privacy Browser sera acheminée via le proxy, mais pas les téléchargements de fichiers.
-            En effet, Privacy Browser utilise le gestionnaire de téléchargement intégré d'Android pour télécharger des fichiers, qui ne dispose pas d'une option proxy.
-            Les utilisateurs qui souhaitent télécharger des fichiers via Orbot doivent activer son mode VPN. Il n'existe actuellement aucun moyen de télécharger des fichiers via I2P.</p>
-
-        <img class="center" src="../shared_images/vpn_mode.png">
     </body>
 </html>
\ No newline at end of file
index 07db812be4992be78e8aab988c356f8bd106e4f3..011d91c927c4d4e36b9e3dfc1ec3da7121461e90 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2019 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2020 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2019 Kévin LE FLOHIC <kevinliste@framalistes.org>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
@@ -33,6 +33,7 @@
             Des proxys comme TOR (The Onion Router) et I2P (The Invisible Internet Project) sont utiles pour protéger la confidentialité des gouvernements malveillants (qui espionnent le trafic en transit)
             mais pas de méga sociétés (qui intègrent du code malveillant sur les serveurs Web).</p>
 
+
         <h3><img class="title" src="../shared_images/language_blue_light.png"> Gouvernements Malicieux</h3>
 
         <p>Les gouvernements malveillants espionnent souvent leurs citoyens pour punir la dissidence ou les activités liées aux droits de l'homme.
@@ -47,6 +48,7 @@
             et les utilisateurs pourraient être punis parce que les gouvernements supposent qu'ils font quelque chose qui est interdit.
             Ainsi, les proxies peuvent être utiles, mais elles ne sont pas une panacée.</p>
 
+
         <h3><img class="title" src="../shared_images/language_blue_light.png"> Méga entreprises</h3>
 
         <p>Lorsqu'un utilisateur se connecte à un serveur Web, celui-ci peut voir l'adresse IP de l'utilisateur.
             Étant donné que le trafic est acheminé via plusieurs nœuds proxy, l'utilisation d'un proxy en couches est souvent beaucoup plus lente que la connexion directe à Internet.</p>
 
         <img class="center" src="images/tor.png">
-
-        <h3><img class="title" src="../shared_images/file_download_blue_light.png"> Téléchargement de fichiers via Tor</h3>
-
-        <p>Lorsque Orbot fonctionne en mode proxy, la navigation sur Internet à l'aide de Privacy Browser sera acheminée via le proxy, mais pas les téléchargements de fichiers.
-            En effet, Privacy Browser utilise le gestionnaire de téléchargement intégré d'Android pour télécharger des fichiers, qui ne dispose pas d'une option proxy.
-            Les utilisateurs qui souhaitent télécharger des fichiers via Orbot doivent activer son mode VPN. Il n'existe actuellement aucun moyen de télécharger des fichiers via I2P.</p>
-
-        <img class="center" src="../shared_images/vpn_mode.png">
     </body>
 </html>
\ No newline at end of file
index a2d68bf4832efbf4d9f79b17e1da9e4f722c606a..6a475bc5b4497964cbc4db345460ce92ea0c485a 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2017-2019 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2017-2020 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2017,2019 Francesco Buratti.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
             Dal momento che il traffico è instradato attraverso diversi nodi proxy, l'utilizzo di un proxy a strati è spesso molto più lento di una connessione diretta a internet.</p>
 
         <img class="center" src="images/tor.png">
-
-        <h3><img class="title" src="../shared_images/file_download_blue_dark.png"> Download di File con Tor</h3>
-
-        <p>Quando Orbot sta funzionando in modalità proxy, la navigazione su internet con Privacy Browser è instradata attraverso il proxy, ma il download di file no.
-            Questo perchè Privacy Browser utilizza il download manager nativo di Android per lo scaricamento dei file, e questo non ha l'opzione proxy.
-            Gli utenti che vogliono scaricare i file via Orbot devono quindi abilitare la sua modalità VPN.  Attualmente non c'è ancora la possibilità di scaricare file con I2P.</p>
-
-        <img class="center" src="../shared_images/vpn_mode.png">
     </body>
 </html>
\ No newline at end of file
index 3719b015736a3381493f5d79c112ec34a67042ed..dbf3cfa616f6db4f0b4febca4866b4cd1234be0b 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2017-2019 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2017-2020 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2017,2019 Francesco Buratti.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
             Dal momento che il traffico è instradato attraverso diversi nodi proxy, l'utilizzo di un proxy a strati è spesso molto più lento di una connessione diretta a internet.</p>
 
         <img class="center" src="images/tor.png">
-
-        <h3><img class="title" src="../shared_images/file_download_blue_light.png"> Download di File con Tor</h3>
-
-        <p>Quando Orbot sta funzionando in modalità proxy, la navigazione su internet con Privacy Browser è instradata attraverso il proxy, ma il download di file no.
-            Questo perchè Privacy Browser utilizza il download manager nativo di Android per lo scaricamento dei file, e questo non ha l'opzione proxy.
-            Gli utenti che vogliono scaricare i file via Orbot devono quindi abilitare la sua modalità VPN.  Attualmente non c'è ancora la possibilità di scaricare file con I2P.</p>
-
-        <img class="center" src="../shared_images/vpn_mode.png">
     </body>
 </html>
\ No newline at end of file
index 170952635317e2f57c3ed05b5e9c2afb02f8d45f..f362adbc55ab8ada9aada55cc6d6aaf8ee9abb73 100644 (file)
             Поскольку трафик маршрутизируется через несколько прокси-узлов, использование многоуровневого прокси зачастую требует гораздо больше времени, чем прямое подключение к интернету.</p>
 
         <img class="center" src="images/tor.png">
-
-        <h3><img class="title" src="../shared_images/file_download_blue_dark.png"> Загрузка файлов через сеть Tor</h3>
-
-        <p>Когда Orbot работает в режиме прокси, навигация по интернету с помощью Privacy Browser будет проходить через прокси, а загрузка файлов - нет.
-            Это связано с тем, что Privacy Browser использует встроенный менеджер загрузок Android, в котором отсутствует опция проксирования.
-            Пользователи, которые хотят загружать файлы через Orbot, должны включить режим VPN. В настоящее время нет возможности загружать файлы через I2P.</p>
-
-        <img class="center" src="../shared_images/vpn_mode.png">
     </body>
 </html>
\ No newline at end of file
index 7d1fb9dde7cdc7d510f83524eb117d510d2abc4d..9210ea4b8e2c0296eb6ddf5e8525882450bea6d5 100644 (file)
             Поскольку трафик маршрутизируется через несколько прокси-узлов, использование многоуровневого прокси зачастую требует гораздо больше времени, чем прямое подключение к интернету.</p>
 
         <img class="center" src="images/tor.png">
-
-        <h3><img class="title" src="../shared_images/file_download_blue_light.png"> Загрузка файлов через сеть Tor</h3>
-
-        <p>Когда Orbot работает в режиме прокси, навигация по интернету с помощью Privacy Browser будет проходить через прокси, а загрузка файлов - нет.
-            Это связано с тем, что Privacy Browser использует встроенный менеджер загрузок Android, в котором отсутствует опция проксирования.
-            Пользователи, которые хотят загружать файлы через Orbot, должны включить режим VPN. В настоящее время нет возможности загружать файлы через I2P.</p>
-
-        <img class="center" src="../shared_images/vpn_mode.png">
     </body>
 </html>
\ No newline at end of file
diff --git a/app/src/main/assets/shared_images/file_download_blue_dark.png b/app/src/main/assets/shared_images/file_download_blue_dark.png
deleted file mode 100644 (file)
index fcb040d..0000000
Binary files a/app/src/main/assets/shared_images/file_download_blue_dark.png and /dev/null differ
diff --git a/app/src/main/assets/shared_images/file_download_blue_light.png b/app/src/main/assets/shared_images/file_download_blue_light.png
deleted file mode 100644 (file)
index 7bb650b..0000000
Binary files a/app/src/main/assets/shared_images/file_download_blue_light.png and /dev/null differ
diff --git a/app/src/main/assets/shared_images/vpn_mode.png b/app/src/main/assets/shared_images/vpn_mode.png
deleted file mode 100644 (file)
index 48d0887..0000000
Binary files a/app/src/main/assets/shared_images/vpn_mode.png and /dev/null differ
index 49d5b898a2f5002a2f38b7b7348ffd1603cdb0ac..0eaf5fb6170a42f7a612a45014c4ad46183c6a85 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2019 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2020 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
             Because traffic is being routed through several proxy nodes, using a layered proxy is often much slower than connecting directly to the internet.</p>
 
         <img class="center" src="images/tor.png">
-
-        <h3><img class="title" src="../shared_images/file_download_blue_dark.png"> Tor ile Dosya İndirme</h3>
-
-        <p>When Orbot is operating in proxy mode, browsing the internet using Privacy Browser will be routed through the proxy, but file downloads will not.
-            This is because Privacy Browser uses Android’s builtin download manager to download files, which doesn’t have a proxy option.
-            Users who want to download files via Orbot need to enable its VPN mode.  There is currently no way to download files through I2P.</p>
-
-        <img class="center" src="../shared_images/vpn_mode.png">
     </body>
 </html>
\ No newline at end of file
index d7205739199290d64d2e00a19052b7ae381247b1..fb9bac1b82c2f65e43951cff907771d3c9196cdd 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2019 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2020 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
             Because traffic is being routed through several proxy nodes, using a layered proxy is often much slower than connecting directly to the internet.</p>
 
         <img class="center" src="images/tor.png">
-
-        <h3><img class="title" src="../shared_images/file_download_blue_light.png"> Tor ile Dosya İndirme</h3>
-
-        <p>When Orbot is operating in proxy mode, browsing the internet using Privacy Browser will be routed through the proxy, but file downloads will not.
-            This is because Privacy Browser uses Android’s builtin download manager to download files, which doesn’t have a proxy option.
-            Users who want to download files via Orbot need to enable its VPN mode.  There is currently no way to download files through I2P.</p>
-
-        <img class="center" src="../shared_images/vpn_mode.png">
     </body>
 </html>
\ No newline at end of file
index c8f8789a69105e2590d5465816142ef96d89a88c..63c606cdbb3303ea89dc8c4f3190042f24bb67dd 100644 (file)
@@ -3117,63 +3117,66 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
 
     @Override
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
-        switch (requestCode) {
-            case PERMISSION_OPEN_REQUEST_CODE:
-                // Check to see if the storage permission was granted.  If the dialog was canceled the grant results will be empty.
-                if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {  // The storage permission was granted.
-                    // Load the file.
-                    currentWebView.loadUrl("file://" + openFilePath);
-                } else {  // The storage permission was not granted.
-                    // Display an error snackbar.
-                    Snackbar.make(currentWebView, getString(R.string.cannot_use_location), Snackbar.LENGTH_LONG).show();
-                }
+        //Only process the results if they exist (this method is triggered when a dialog is presented the first time for an app, but no grant results are included).
+        if (grantResults.length > 0) {
+            switch (requestCode) {
+                case PERMISSION_OPEN_REQUEST_CODE:
+                    // Check to see if the storage permission was granted.  If the dialog was canceled the grant results will be empty.
+                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {  // The storage permission was granted.
+                        // Load the file.
+                        currentWebView.loadUrl("file://" + openFilePath);
+                    } else {  // The storage permission was not granted.
+                        // Display an error snackbar.
+                        Snackbar.make(currentWebView, getString(R.string.cannot_use_location), Snackbar.LENGTH_LONG).show();
+                    }
 
-                // Reset the open file path.
-                openFilePath = "";
-                break;
+                    // Reset the open file path.
+                    openFilePath = "";
+                    break;
 
-            case PERMISSION_SAVE_URL_REQUEST_CODE:
-                // Check to see if the storage permission was granted.  If the dialog was canceled the grant results will be empty.
-                if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {  // The storage permission was granted.
-                    // Save the raw URL.
-                    new SaveUrl(this, this, saveWebpageFilePath, currentWebView.getSettings().getUserAgentString(), currentWebView.getAcceptFirstPartyCookies()).execute(saveWebpageUrl);
-                } else {  // The storage permission was not granted.
-                    // Display an error snackbar.
-                    Snackbar.make(currentWebView, getString(R.string.cannot_use_location), Snackbar.LENGTH_LONG).show();
-                }
+                case PERMISSION_SAVE_URL_REQUEST_CODE:
+                    // Check to see if the storage permission was granted.  If the dialog was canceled the grant results will be empty.
+                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {  // The storage permission was granted.
+                        // Save the raw URL.
+                        new SaveUrl(this, this, saveWebpageFilePath, currentWebView.getSettings().getUserAgentString(), currentWebView.getAcceptFirstPartyCookies()).execute(saveWebpageUrl);
+                    } else {  // The storage permission was not granted.
+                        // Display an error snackbar.
+                        Snackbar.make(currentWebView, getString(R.string.cannot_use_location), Snackbar.LENGTH_LONG).show();
+                    }
 
-                // Reset the save strings.
-                saveWebpageUrl = "";
-                saveWebpageFilePath = "";
-                break;
+                    // Reset the save strings.
+                    saveWebpageUrl = "";
+                    saveWebpageFilePath = "";
+                    break;
 
-            case PERMISSION_SAVE_AS_ARCHIVE_REQUEST_CODE:
-                // Check to see if the storage permission was granted.  If the dialog was canceled the grant results will be empty.
-                if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {  // The storage permission was granted.
-                    // Save the webpage archive.
-                    currentWebView.saveWebArchive(saveWebpageFilePath);
-                } else {  // The storage permission was not granted.
-                    // Display an error snackbar.
-                    Snackbar.make(currentWebView, getString(R.string.cannot_use_location), Snackbar.LENGTH_LONG).show();
-                }
+                case PERMISSION_SAVE_AS_ARCHIVE_REQUEST_CODE:
+                    // Check to see if the storage permission was granted.  If the dialog was canceled the grant results will be empty.
+                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {  // The storage permission was granted.
+                        // Save the webpage archive.
+                        currentWebView.saveWebArchive(saveWebpageFilePath);
+                    } else {  // The storage permission was not granted.
+                        // Display an error snackbar.
+                        Snackbar.make(currentWebView, getString(R.string.cannot_use_location), Snackbar.LENGTH_LONG).show();
+                    }
 
-                // Reset the save webpage file path.
-                saveWebpageFilePath = "";
-                break;
+                    // Reset the save webpage file path.
+                    saveWebpageFilePath = "";
+                    break;
 
-            case PERMISSION_SAVE_AS_IMAGE_REQUEST_CODE:
-                // Check to see if the storage permission was granted.  If the dialog was canceled the grant results will be empty.
-                if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {  // The storage permission was granted.
-                    // Save the webpage image.
-                    new SaveWebpageImage(this, currentWebView).execute(saveWebpageFilePath);
-                } else {  // The storage permission was not granted.
-                    // Display an error snackbar.
-                    Snackbar.make(currentWebView, getString(R.string.cannot_use_location), Snackbar.LENGTH_LONG).show();
-                }
+                case PERMISSION_SAVE_AS_IMAGE_REQUEST_CODE:
+                    // Check to see if the storage permission was granted.  If the dialog was canceled the grant results will be empty.
+                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {  // The storage permission was granted.
+                        // Save the webpage image.
+                        new SaveWebpageImage(this, currentWebView).execute(saveWebpageFilePath);
+                    } else {  // The storage permission was not granted.
+                        // Display an error snackbar.
+                        Snackbar.make(currentWebView, getString(R.string.cannot_use_location), Snackbar.LENGTH_LONG).show();
+                    }
 
-                // Reset the save webpage file path.
-                saveWebpageFilePath = "";
-                break;
+                    // Reset the save webpage file path.
+                    saveWebpageFilePath = "";
+                    break;
+            }
         }
     }
 
@@ -4610,7 +4613,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
     }
 
     private void openWithApp(String url) {
-        // Create the open with intent with `ACTION_VIEW`.
+        // Create an open with app intent with `ACTION_VIEW`.
         Intent openWithAppIntent = new Intent(Intent.ACTION_VIEW);
 
         // Set the URI but not the MIME type.  This should open all available apps.
@@ -4619,17 +4622,18 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
         // Flag the intent to open in a new task.
         openWithAppIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 
+        // Try the intent.
         try {
             // Show the chooser.
             startActivity(openWithAppIntent);
-        } catch (ActivityNotFoundException exception) {
+        } catch (ActivityNotFoundException exception) {  // There are no apps available to open the URL.
             // Show a snackbar with the error.
             Snackbar.make(currentWebView, getString(R.string.error) + "  " + exception, Snackbar.LENGTH_INDEFINITE).show();
         }
     }
 
     private void openWithBrowser(String url) {
-        // Create the open with intent with `ACTION_VIEW`.
+        // Create an open with browser intent with `ACTION_VIEW`.
         Intent openWithBrowserIntent = new Intent(Intent.ACTION_VIEW);
 
         // Set the URI and the MIME type.  `"text/html"` should load browser options.
@@ -4638,10 +4642,11 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
         // Flag the intent to open in a new task.
         openWithBrowserIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 
+        // Try the intent.
         try {
             // Show the chooser.
             startActivity(openWithBrowserIntent);
-        } catch (ActivityNotFoundException exception) {
+        } catch (ActivityNotFoundException exception) {  // There are no browsers available to open the URL.
             // Show a snackbar with the error.
             Snackbar.make(currentWebView, getString(R.string.error) + "  " + exception, Snackbar.LENGTH_INDEFINITE).show();
         }
index fa4d3742ac046c0a5f19035d45002ed2b1bac84a..b34f62e885937bf33ab2d81c2669ce0e29ed9a8f 100644 (file)
@@ -124,7 +124,7 @@ public class GetUrlSize extends AsyncTask<String, Void, String> {
                 // Check the response code.
                 if (responseCode >= 400) {  // The response code is an error message.
                     // Set the formatted file size to indicate a bad URL.
-                    formattedFileSize = context.getString(R.string.bad_url);
+                    formattedFileSize = context.getString(R.string.invalid_url);
                 } else {  // The response code is not an error message.
                     // Get the content length header.
                     String contentLengthString = httpURLConnection.getHeaderField("Content-Length");
@@ -147,7 +147,7 @@ public class GetUrlSize extends AsyncTask<String, Void, String> {
             }
         } catch (IOException exception) {
             // Set the formatted file size to indicate a bad URL.
-            formattedFileSize = context.getString(R.string.bad_url);
+            formattedFileSize = context.getString(R.string.invalid_url);
         }
 
         // Return the formatted file size string.
index def7babd913b4032787ff5e1c9777d46bce7c329..3d63545983e7c9b4b679ba61599e880810ce90af 100644 (file)
 package com.stoutner.privacybrowser.asynctasks;
 
 import android.app.Activity;
+import android.content.ActivityNotFoundException;
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
 import android.os.AsyncTask;
+import android.os.Build;
+import android.view.View;
 import android.webkit.CookieManager;
 
+import androidx.core.content.FileProvider;
+
 import com.google.android.material.snackbar.Snackbar;
 import com.stoutner.privacybrowser.R;
 import com.stoutner.privacybrowser.helpers.ProxyHelper;
@@ -84,7 +89,7 @@ public class SaveUrl extends AsyncTask<String, Long, String> {
         NoSwipeViewPager noSwipeViewPager = activity.findViewById(R.id.webviewpager);
 
         // Create a saving file snackbar.
-        savingFileSnackbar = Snackbar.make(noSwipeViewPager, activity.getString(R.string.saving_file) + " " + filePathString, Snackbar.LENGTH_INDEFINITE);
+        savingFileSnackbar = Snackbar.make(noSwipeViewPager, activity.getString(R.string.saving_file) + "  0% - " + filePathString, Snackbar.LENGTH_INDEFINITE);
 
         // Display the saving file snackbar.
         savingFileSnackbar.show();
@@ -92,7 +97,7 @@ public class SaveUrl extends AsyncTask<String, Long, String> {
 
     @Override
     protected String doInBackground(String... urlToSave) {
-        // Get a handle for the context and activity.
+        // Get handles for the context and activity.
         Context context = contextWeakReference.get();
         Activity activity = activityWeakReference.get();
 
@@ -248,17 +253,18 @@ public class SaveUrl extends AsyncTask<String, Long, String> {
             String formattedNumberOfBytesDownloaded = NumberFormat.getInstance().format(numberOfBytesDownloaded);
 
             // Update the snackbar.
-            savingFileSnackbar.setText(activity.getString(R.string.saving_file) + ":  " + formattedNumberOfBytesDownloaded + " " + activity.getString(R.string.bytes) + " - " + filePathString);
+            savingFileSnackbar.setText(activity.getString(R.string.saving_file) + "  " + formattedNumberOfBytesDownloaded + " " + activity.getString(R.string.bytes) + " - " + filePathString);
         } else {  // There is a download percentage.
             // Update the snackbar.
-            savingFileSnackbar.setText(activity.getString(R.string.saving_file) + ":  " + downloadPercentage[0] + "% - " + filePathString);
+            savingFileSnackbar.setText(activity.getString(R.string.saving_file) + "  " + downloadPercentage[0] + "% - " + filePathString);
         }
     }
 
     // `onPostExecute()` operates on the UI thread.
     @Override
     protected void onPostExecute(String saveDisposition) {
-        // Get a handle for the activity.
+        // Get handles for the context and activity.
+        Context context = contextWeakReference.get();
         Activity activity = activityWeakReference.get();
 
         // Abort if the activity is gone.
@@ -274,8 +280,39 @@ public class SaveUrl extends AsyncTask<String, Long, String> {
 
         // Display a save disposition snackbar.
         if (saveDisposition.equals(SUCCESS)) {
-            Snackbar.make(noSwipeViewPager, R.string.file_saved, Snackbar.LENGTH_SHORT).show();
+            // Create a file saved snackbar.
+            Snackbar fileSavedSnackbar = Snackbar.make(noSwipeViewPager, activity.getString(R.string.file_saved) + "  " + filePathString, Snackbar.LENGTH_LONG);
+
+            // Add an open action if the file is not an APK on API >= 26 (that scenario requires the REQUEST_INSTALL_PACKAGES permission).
+            if (!(Build.VERSION.SDK_INT >= 26 && filePathString.endsWith(".apk"))) {
+                fileSavedSnackbar.setAction(R.string.open, (View v) -> {
+                    // Get a file for the file path string.
+                    File file = new File(filePathString);
+
+                    // Create an open intent with `ACTION_VIEW`.
+                    Intent openIntent = new Intent(Intent.ACTION_VIEW);
+
+                    // Set the URI but not the MIME type.  This should open all available apps.
+                    openIntent.setData(FileProvider.getUriForFile(context, activity.getString(R.string.file_provider), file));
+
+                    // Allow the app to read the file URI.
+                    openIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+
+                    // Try the intent.
+                    try {
+                        // Show the chooser.
+                        activity.startActivity(openIntent);
+                    } catch (ActivityNotFoundException exception) {  // There are no apps available to open the URL.
+                        // Show a snackbar with the error.
+                        Snackbar.make(noSwipeViewPager, activity.getString(R.string.error) + "  " + exception, Snackbar.LENGTH_INDEFINITE).show();
+                    }
+                });
+            }
+
+            // Show the file saved snackbar.
+            fileSavedSnackbar.show();
         } else {
+            // Display the file saving error.
             Snackbar.make(noSwipeViewPager, activity.getString(R.string.error_saving_file) + "  " + saveDisposition, Snackbar.LENGTH_INDEFINITE).show();
         }
     }
index 78e1cad4eea945f634ff395ba57eabf45a67b306..1cb4588bf6a6b09588cbeb9bf65478a098dac9bc 100644 (file)
         <string name="print">Drucken</string>
             <string name="privacy_browser_web_page">Privacy Browser-Website</string>
         <string name="save">Speichern</string>
+            <string name="save_url">URL speichern</string>
             <string name="save_as_archive">Als Archiv speichern</string>
             <string name="save_as_image">Als Grafik speichern</string>
         <string name="view_source">Quelltext anzeigen</string>
     <string name="save_image">Grafik speichern</string>
     <string name="webpage_mht">Webseite.mht</string>
     <string name="webpage_png">Webseite.png</string>
+    <string name="file">Datei</string>
+    <string name="bytes">Bytes</string>
     <string name="unknown_size">Unbekannte Größe</string>
+    <string name="invalid_url">Ungültige URL</string>
     <string name="ok">OK</string>
+    <string name="saving_file">Speichere Datei:</string>
     <string name="saving_image">Speichere Grafik…</string>
+    <string name="file_saved">Datei gespeichert:</string>
     <string name="image_saved">Grafik gespeichert.</string>
+    <string name="error_saving_file">Fehler beim Speichern der Datei:</string>
     <string name="error_saving_image">Fehler beim Speichern der Grafik:</string>
 
     <!-- View Source. -->
index 1d7bd26586c37a5b45f30b3f0e7fcd2095dba99a..088dd6173bd8a39178bf43a8f7c849cf32af9fda 100644 (file)
         <string name="print">Imprimir</string>
             <string name="privacy_browser_web_page">Página web de Navegador Privado</string>
         <string name="save">Guardar</string>
+            <string name="save_url">Guardar URL</string>
             <string name="save_as_archive">Guardar como archivo</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="save_image">Guardar imagen</string>
     <string name="webpage_mht">PaginaWeb.mht</string>
     <string name="webpage_png">PaginaWeb.png</string>
+    <string name="file">Archivo</string>
+    <string name="bytes">bytes</string>
     <string name="unknown_size">Tamaño desconocido</string>
+    <string name="invalid_url">URL inválida</string>
     <string name="ok">OK</string>
+    <string name="saving_file">Guardando archivo:</string>
     <string name="saving_image">Guardando imagen…</string>
+    <string name="file_saved">Archivo guardado:</string>
     <string name="image_saved">Imagen guardada.</string>
+    <string name="error_saving_file">Error guardando archivo:</string>
     <string name="error_saving_image">Error guardando imagen:</string>
 
     <!-- View Source. -->
index 1170c8d23a3e61655a7f09635984f92851068a78..45e6df92dd10cecb6fc53962e0e24071bc50fc2c 100644 (file)
         <string name="print">Stampa</string>
             <string name="privacy_browser_web_page">Pagina web di Privacy Browser</string>
         <string name="save">Salva</string>
+            <string name="save_url">Salva URL</string>
             <string name="save_as_archive">Salva come Archivio</string>
             <string name="save_as_image">Salva come Immagine</string>
         <string name="add_to_home_screen">Aggiungi collegamento</string>
     <string name="save_image">Salva Immagine</string>
     <string name="webpage_mht">PaginaWeb.mht</string>
     <string name="webpage_png">PaginaWeb.png</string>
+    <string name="file">File</string>
+    <string name="bytes">byte</string>
     <string name="unknown_size">Dimensione sconosciuta</string>
+    <string name="invalid_url">URL non valida</string>
     <string name="ok">OK</string>
+    <string name="saving_file">Salvataggio file:</string>
     <string name="saving_image">Salvataggio immagine…</string>
+    <string name="file_saved">File salvato:</string>
     <string name="image_saved">Immagine salvata.</string>
+    <string name="error_saving_file">Errore salvataggio file:</string>
     <string name="error_saving_image">Errore nel salvare l\'immagine:</string>
 
     <!-- View Source. -->
index 3e45aa4c9278e3503f8e4501fd8e3d8193c02231..b3aeea430ab5093c66e2416c9118c5ae72b91c1d 100644 (file)
         <string name="print">Печать</string>
             <string name="privacy_browser_web_page">Privacy Browser веб-страница</string>
         <string name="save">Сохранить</string>
+            <string name="save_url">Сохранить URL</string>
             <string name="save_as_archive">Сохранить как архив</string>
             <string name="save_as_image">Сохранить как изображение</string>
         <string name="add_to_home_screen">Добавить на главный экран</string>
     <string name="save_image">Сохранить изображение</string>
     <string name="webpage_mht">Webpage.mht</string>
     <string name="webpage_png">Webpage.png</string>
+    <string name="file">Файл</string>
+    <string name="bytes">байтов</string>
     <string name="unknown_size">неизвестный размер</string>
+    <string name="invalid_url">неправильный URL</string>
     <string name="ok">OK</string>
+    <string name="saving_file">Сохранение файла:</string>
     <string name="saving_image">Сохранение изображения…</string>
+    <string name="file_saved">Файл сохранен:</string>
     <string name="image_saved">Изображение сохранено.</string>
+    <string name="error_saving_file">Ошибка сохранения файла:</string>
     <string name="error_saving_image">Ошибка сохранения изображения:</string>
 
     <!-- View Source. -->
index cd9045dc5f22dead161dd06e6c5f3d4b88758a6f..a6b43d71e67ff238932054cdb750a29023253d65 100644 (file)
     <string name="file">File</string>
     <string name="bytes">bytes</string>
     <string name="unknown_size">unknown size</string>
-    <string name="bad_url">bad URL</string>
+    <string name="invalid_url">invalid URL</string>
     <string name="ok">OK</string>
-    <string name="saving_file">Saving file</string>
+    <string name="saving_file">Saving file:</string>
     <string name="saving_image">Saving image…</string>
-    <string name="file_saved">File saved.</string>
+    <string name="file_saved">File saved:</string>
     <string name="image_saved">Image saved.</string>
     <string name="error_saving_file">Error saving file:</string>
     <string name="error_saving_image">Error saving image:</string>