Use the public download directory. https://redmine.stoutner.com/issues/224
authorSoren Stoutner <soren@stoutner.com>
Thu, 5 Apr 2018 21:57:49 +0000 (14:57 -0700)
committerSoren Stoutner <soren@stoutner.com>
Thu, 5 Apr 2018 21:57:49 +0000 (14:57 -0700)
70 files changed:
.idea/codeStyles/Project.xml
app/build.gradle
app/src/free/assets/de/about_permissions_dark.html
app/src/free/assets/de/about_permissions_light.html
app/src/free/assets/de/about_privacy_policy_dark.html
app/src/free/assets/de/about_privacy_policy_light.html
app/src/free/assets/en/about_permissions_dark.html
app/src/free/assets/en/about_permissions_light.html
app/src/free/assets/en/about_privacy_policy_dark.html
app/src/free/assets/en/about_privacy_policy_light.html
app/src/free/assets/es/about_permissions_dark.html
app/src/free/assets/es/about_permissions_light.html
app/src/free/assets/es/about_privacy_policy_dark.html
app/src/free/assets/es/about_privacy_policy_light.html
app/src/free/assets/it/about_permissions_dark.html
app/src/free/assets/it/about_permissions_light.html
app/src/free/assets/it/about_privacy_policy_dark.html
app/src/free/assets/it/about_privacy_policy_light.html
app/src/free/assets/ru/about_permissions_dark.html [new file with mode: 0644]
app/src/free/assets/ru/about_permissions_light.html [new file with mode: 0644]
app/src/free/assets/ru/about_privacy_policy_dark.html [new file with mode: 0644]
app/src/free/assets/ru/about_privacy_policy_light.html [new file with mode: 0644]
app/src/free/res/values-de/strings.xml
app/src/free/res/values-es/strings.xml
app/src/free/res/values-ru/strings.xml [new file with mode: 0644]
app/src/main/AndroidManifest.xml
app/src/main/assets/de/about_contributors_dark.html
app/src/main/assets/de/about_contributors_light.html
app/src/main/assets/de/about_permissions_dark.html
app/src/main/assets/de/about_permissions_light.html
app/src/main/assets/en/about_contributors_dark.html
app/src/main/assets/en/about_contributors_light.html
app/src/main/assets/en/about_permissions_dark.html
app/src/main/assets/en/about_permissions_light.html
app/src/main/assets/es/about_contributors_dark.html
app/src/main/assets/es/about_contributors_light.html
app/src/main/assets/es/about_permissions_dark.html
app/src/main/assets/es/about_permissions_light.html
app/src/main/assets/it/about_contributors_dark.html
app/src/main/assets/it/about_contributors_light.html
app/src/main/assets/it/about_permissions_dark.html
app/src/main/assets/it/about_permissions_light.html
app/src/main/assets/it/about_privacy_policy_dark.html
app/src/main/assets/it/about_privacy_policy_light.html
app/src/main/assets/ru/about_contributors_dark.html
app/src/main/assets/ru/about_contributors_light.html
app/src/main/assets/ru/about_permissions_dark.html [new file with mode: 0644]
app/src/main/assets/ru/about_permissions_light.html [new file with mode: 0644]
app/src/main/assets/ru/about_privacy_policy_dark.html [new file with mode: 0644]
app/src/main/assets/ru/about_privacy_policy_light.html [new file with mode: 0644]
app/src/main/assets/ru/guide_domain_settings_dark.html [new file with mode: 0644]
app/src/main/assets/ru/guide_domain_settings_light.html [new file with mode: 0644]
app/src/main/assets/ru/images/bookmarks.png [new file with mode: 0644]
app/src/main/assets/ru/images/domain_settings.png [new file with mode: 0644]
app/src/main/assets/ru/images/green_url_bar.png [new file with mode: 0644]
app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java
app/src/main/java/com/stoutner/privacybrowser/dialogs/AboutViewSourceDialog.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 [new file with mode: 0644]
app/src/main/res/drawable/downloads.xml [deleted file]
app/src/main/res/drawable/downloads_dark.xml [new file with mode: 0644]
app/src/main/res/drawable/downloads_light.xml [new file with mode: 0644]
app/src/main/res/layout/about_tab_version.xml
app/src/main/res/menu/webview_navigation_menu.xml
app/src/main/res/values-de/strings.xml
app/src/main/res/values-es/strings.xml
app/src/main/res/values/strings.xml
build.gradle
gradle/wrapper/gradle-wrapper.properties

index ae45a4a8ad3b24a577b04525375563e3630bfeb9..92d6b7d5136305ee69e5a462c3a2eed5bcfa5d3b 100644 (file)
@@ -1,6 +1,6 @@
 <component name="ProjectCodeStyleConfiguration">
   <code_scheme name="Project" version="173">
-    <option name="RIGHT_MARGIN" value="100" />
+    <option name="RIGHT_MARGIN" value="210" />
     <AndroidXmlCodeStyleSettings>
       <option name="USE_CUSTOM_SETTINGS" value="true" />
     </AndroidXmlCodeStyleSettings>
index 55df3775d7ebb5e8ec12dce20bbd2dfaf0e544c6..82b2913a9023aa581df9698b70eea5f229da041c 100644 (file)
@@ -67,9 +67,10 @@ dependencies {
     implementation fileTree(include: ['*.jar'], dir: 'libs')
     implementation 'com.android.support:design:27.0.2'
     // Only compile `com.google.firebase:firebase-ads` for the free flavor.
-    freeImplementation 'com.google.firebase:firebase-ads:11.8.0'
+    freeImplementation 'com.google.firebase:firebase-ads:12.0.1'
 }
 
-// Google's documentation says the following line is required for `firebase-ads` but things work correctly without it.  I have no interest in applying the Google Mobile Services plugin in the standard flavor if I don't have to.
+// Google's documentation says the following line is required for `firebase-ads` but things work correctly without it.
+// I have no interest in applying the Google Mobile Services plugin in the standard flavor if I don't have to.
 // I suspect that in the free flavor `firebase-ads` applies it even when not specified.  <https://firebase.google.com/docs/admob/android/quick-start>.
 // apply plugin: 'com.google.gms.google-services'
\ No newline at end of file
index 936c228e9837ef987a5c1a8ce7adf79264de04ab..eee3a75b9217e9d0c6675107b5585d71380a6d92 100644 (file)
@@ -1,25 +1,22 @@
 <!--
-  Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
-  Diese Datei ist Teil von Privacy Browser <https://www.stoutner.com/privacy-browser>.
+  This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
-  Privacy Browser ist eine kostenlose Software: Sie können sie
-  unter den Bedingungen der GNU General Public License weiterverteilen
-  mit Berufung auf die veröffentlichte Fassung der Free Software
-  Foundation, entweder Version 3 der Lizenz oder (nach Ihrer
-  Möglichkeit) jede neuere Version.
+  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 wird in der Hoffnung vertrieben nützlich zu sein,
-  jedoch OHNE JEGLICHE GARANTIE; auch ohne die implizierte
-  Garantie auf MARKTGÄNGLICHKEIT oder BEREITSCHAFT FÜR
-  BESTIMMTE ANWENDUNGEN. Nutzen Sie die GNU General Public
-  License für mehr Details.
+  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.
 
-  Sie sollten eine Kopie der GNU General Public License zusammen mit
-  Privacy Browser erhalten haben. Wenn nicht, besuchen Sie
-  <http://www.gnu.org/licenses/>. -->
+  You should have received a copy of the GNU General Public License
+  along with Privacy Browser.  If not, see <http://www.gnu.org/licenses/>. -->
 
 <html>
     <head>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
         <p>Benötigt, um Verknüpfungen zu Websites auf Ihrer Startseite zu erstellen.</p>
 
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
+
         <br/>
         <hr/>
         <br/>
 
-        <p>In addition, Privacy Browser Free displays ads from Google's AdMob network using the Firebase backend. For the free flavor, Firebase adds the following permissions even though they are not listed in the manifest file.</p>
+        <p>In addition, Privacy Browser Free displays ads from Google’s AdMob network using the Firebase backend.
+            For the free flavor, Firebase adds the following permissions even though they are not listed in the manifest file.</p>
 
         <h3>View network connections</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_NETWORK_STATE">android.permission.ACCESS_NETWORK_STATE</a></p>
-        <p>Allows the ads to tell when you are connected to the internet and when you aren't (presumably so they don't try to reload an ad when you are disconnected). They can also tell if you are connected via Wi-Fi, 2G, 3G, 4G, etc.</p>
+        <p>Allows the ads to tell when you are connected to the internet and when you aren’t (presumably so they don’t try to reload an ad when you are disconnected).
+            They can also tell if you are connected via Wi-Fi, 2G, 3G, 4G, etc.</p>
 
         <h3>Prevent phone from sleeping</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WAKE_LOCK">android.permission.WAKE_LOCK</a></p>
-        <p>Allows the ads to keep the processor from sleeping and the screen from dimming, although in my testing I don't think the ads actually do this.</p>
+        <p>Allows the ads to keep the processor from sleeping and the screen from dimming, although in my testing I dont think the ads actually do this.</p>
 
         <h3>Receive data from Internet</h3>
         <p><a href="http://androidpermissions.com/permission/com.google.android.c2dm.permission.RECEIVE">com.google.android.c2dm.permission.RECEIVE</a></p>
index df00dc7b6594b4303013ecfcfdf641a29858d7a8..bcadf8b81b30f4a4498c64ac40331258f95e38cb 100644 (file)
@@ -1,25 +1,22 @@
 <!--
-  Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
-  Diese Datei ist Teil von Privacy Browser <https://www.stoutner.com/privacy-browser>.
+  This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
-  Privacy Browser ist eine kostenlose Software: Sie können sie
-  unter den Bedingungen der GNU General Public License weiterverteilen
-  mit Berufung auf die veröffentlichte Fassung der Free Software
-  Foundation, entweder Version 3 der Lizenz oder (nach Ihrer
-  Möglichkeit) jede neuere Version.
+  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 wird in der Hoffnung vertrieben nützlich zu sein,
-  jedoch OHNE JEGLICHE GARANTIE; auch ohne die implizierte
-  Garantie auf MARKTGÄNGLICHKEIT oder BEREITSCHAFT FÜR
-  BESTIMMTE ANWENDUNGEN. Nutzen Sie die GNU General Public
-  License für mehr Details.
+  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.
 
-  Sie sollten eine Kopie der GNU General Public License zusammen mit
-  Privacy Browser erhalten haben. Wenn nicht, besuchen Sie
-  <http://www.gnu.org/licenses/>. -->
+  You should have received a copy of the GNU General Public License
+  along with Privacy Browser.  If not, see <http://www.gnu.org/licenses/>. -->
 
 <html>
     <head>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
         <p>Benötigt, um Verknüpfungen zu Websites auf Ihrer Startseite zu erstellen.</p>
 
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
+
         <br/>
         <hr/>
         <br/>
 
-        <p>In addition, Privacy Browser Free displays ads from Google's AdMob network using the Firebase backend. For the free flavor, Firebase adds the following permissions even though they are not listed in the manifest file.</p>
+        <p>In addition, Privacy Browser Free displays ads from Google’s AdMob network using the Firebase backend.
+            For the free flavor, Firebase adds the following permissions even though they are not listed in the manifest file.</p>
 
         <h3>View network connections</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_NETWORK_STATE">android.permission.ACCESS_NETWORK_STATE</a></p>
-        <p>Allows the ads to tell when you are connected to the internet and when you aren't (presumably so they don't try to reload an ad when you are disconnected). They can also tell if you are connected via Wi-Fi, 2G, 3G, 4G, etc.</p>
+        <p>Allows the ads to tell when you are connected to the internet and when you aren’t (presumably so they don’t try to reload an ad when you are disconnected).
+            They can also tell if you are connected via Wi-Fi, 2G, 3G, 4G, etc.</p>
 
         <h3>Prevent phone from sleeping</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WAKE_LOCK">android.permission.WAKE_LOCK</a></p>
-        <p>Allows the ads to keep the processor from sleeping and the screen from dimming, although in my testing I don't think the ads actually do this.</p>
+        <p>Allows the ads to keep the processor from sleeping and the screen from dimming, although in my testing I dont think the ads actually do this.</p>
 
         <h3>Receive data from Internet</h3>
         <p><a href="http://androidpermissions.com/permission/com.google.android.c2dm.permission.RECEIVE">com.google.android.c2dm.permission.RECEIVE</a></p>
index 1d83fb9211e76d8d6811aa4f195a96964cf76fc4..4669723a37edea5a08c1f82680ba267c0db36156 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
 
 
         <h3>Use of Information</h3>
-        <p><strong class="red">Stoutner may use this information in any way that assists in the development of Privacy Browser, like troubleshooting bug reports or developing features, including sharing the information with a third party to assist in this process</strong>.
-            <strong class="blue">Stoutner will never sell this information nor transfer it to any third party that would use it for advertising or marketing</strong>.</p>
+        <p><strong class="blue">Stoutner may use this information to assist in the development of Privacy Browser and communicate the status of the project to users.</strong>
+            <strong class="red">Stoutner will never sell this information nor transfer it to any third party that would use it for advertising or marketing.</strong></p>
 
         <hr />
-        <p style="text-align: center;"><em>Revision 1.4, 20 April 2017</em></p>
+        <p style="text-align: center;"><em>Revision 1.5, 11 January 2018</em></p>
     </body>
 </html>
\ No newline at end of file
index f694afb3f49acba3cdaee9021f28013cd20c50e9..38b486cddd08172d346f50305c1e7d2d2f2f8b2d 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
 
 
         <h3>Use of Information</h3>
-        <p><strong class="red">Stoutner may use this information in any way that assists in the development of Privacy Browser, like troubleshooting bug reports or developing features, including sharing the information with a third party to assist in this process</strong>.
-            <strong class="blue">Stoutner will never sell this information nor transfer it to any third party that would use it for advertising or marketing</strong>.</p>
+        <p><strong class="blue">Stoutner may use this information to assist in the development of Privacy Browser and communicate the status of the project to users.</strong>
+            <strong class="red">Stoutner will never sell this information nor transfer it to any third party that would use it for advertising or marketing.</strong></p>
 
         <hr />
-        <p style="text-align: center;"><em>Revision 1.4, 20 April 2017</em></p>
+        <p style="text-align: center;"><em>Revision 1.5, 11 January 2018</em></p>
     </body>
 </html>
\ No newline at end of file
index b18aa2d6ec55cc91628e90a0400c1c84454fb244..b7d2034ffc5b19394baa1ae43439a28189248d9c 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
         <p>Required to add shortcuts for websites to the launcher desktop.</p>
 
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
+
         <br/>
         <hr/>
         <br/>
 
-        <p>In addition, Privacy Browser Free displays ads from Google's AdMob network using the Firebase backend. For the free flavor, Firebase adds the following permissions even though they are not listed in the manifest file.</p>
+        <p>In addition, Privacy Browser Free displays ads from Google’s AdMob network using the Firebase backend.
+            For the free flavor, Firebase adds the following permissions even though they are not listed in the manifest file.</p>
 
         <h3>View network connections</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_NETWORK_STATE">android.permission.ACCESS_NETWORK_STATE</a></p>
-        <p>Allows the ads to tell when you are connected to the internet and when you aren't (presumably so they don't try to reload an ad when you are disconnected). They can also tell if you are connected via Wi-Fi, 2G, 3G, 4G, etc.</p>
+        <p>Allows the ads to tell when you are connected to the internet and when you aren’t (presumably so they don’t try to reload an ad when you are disconnected).
+            They can also tell if you are connected via Wi-Fi, 2G, 3G, 4G, etc.</p>
 
         <h3>Prevent phone from sleeping</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WAKE_LOCK">android.permission.WAKE_LOCK</a></p>
-        <p>Allows the ads to keep the processor from sleeping and the screen from dimming, although in my testing I don't think the ads actually do this.</p>
+        <p>Allows the ads to keep the processor from sleeping and the screen from dimming, although in my testing I dont think the ads actually do this.</p>
 
         <h3>Receive data from Internet</h3>
         <p><a href="http://androidpermissions.com/permission/com.google.android.c2dm.permission.RECEIVE">com.google.android.c2dm.permission.RECEIVE</a></p>
index e9211f5c93d281aa5e32dd6c7a749926873f56ac..f37408151d16f5a395e17263d61984c7cb206f98 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
         <p>Required to add shortcuts for websites to the launcher desktop.</p>
 
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
+
         <br/>
         <hr/>
         <br/>
 
-        <p>In addition, Privacy Browser Free displays ads from Google's AdMob network using the Firebase backend. For the free flavor, Firebase adds the following permissions even though they are not listed in the manifest file.</p>
+        <p>In addition, Privacy Browser Free displays ads from Google’s AdMob network using the Firebase backend.
+            For the free flavor, Firebase adds the following permissions even though they are not listed in the manifest file.</p>
 
         <h3>View network connections</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_NETWORK_STATE">android.permission.ACCESS_NETWORK_STATE</a></p>
-        <p>Allows the ads to tell when you are connected to the internet and when you aren't (presumably so they don't try to reload an ad when you are disconnected). They can also tell if you are connected via Wi-Fi, 2G, 3G, 4G, etc.</p>
+        <p>Allows the ads to tell when you are connected to the internet and when you aren’t (presumably so they don’t try to reload an ad when you are disconnected).
+            They can also tell if you are connected via Wi-Fi, 2G, 3G, 4G, etc.</p>
 
         <h3>Prevent phone from sleeping</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WAKE_LOCK">android.permission.WAKE_LOCK</a></p>
index ff7d7396a734c319e9829e7078e3171682984c6a..74339ee3935a650f5da6028dcaccd1a805104e7a 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
 
 
         <h3>Use of Information</h3>
-        <p><strong class="red">Stoutner may use this information in any way that assists in the development of Privacy Browser, like troubleshooting bug reports or developing features, including sharing the information with a third party to assist in this process</strong>.
-            <strong class="blue">Stoutner will never sell this information nor transfer it to any third party that would use it for advertising or marketing</strong>.</p>
+        <p><strong class="blue">Stoutner may use this information to assist in the development of Privacy Browser and communicate the status of the project to users.</strong>
+            <strong class="red">Stoutner will never sell this information nor transfer it to any third party that would use it for advertising or marketing.</strong></p>
 
         <hr />
-        <p style="text-align: center;"><em>Revision 1.4, 20 April 2017</em></p>
+        <p style="text-align: center;"><em>Revision 1.5, 11 January 2018</em></p>
     </body>
 </html>
\ No newline at end of file
index a099561657f4d75b6e6ff6924f9f7f7f2555dde7..64ecb384428c01a1e68a39d64ee21a753e871901 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
 
 
         <h3>Use of Information</h3>
-        <p><strong class="red">Stoutner may use this information in any way that assists in the development of Privacy Browser, like troubleshooting bug reports or developing features, including sharing the information with a third party to assist in this process</strong>.
-            <strong class="blue">Stoutner will never sell this information nor transfer it to any third party that would use it for advertising or marketing</strong>.</p>
+        <p><strong class="blue">Stoutner may use this information to assist in the development of Privacy Browser and communicate the status of the project to users.</strong>
+            <strong class="red">Stoutner will never sell this information nor transfer it to any third party that would use it for advertising or marketing.</strong></p>
 
         <hr />
-        <p style="text-align: center;"><em>Revision 1.4, 20 April 2017</em></p>
+        <p style="text-align: center;"><em>Revision 1.4, 11 January 2018</em></p>
     </body>
 </html>
\ No newline at end of file
index 3c6111b754676448018cdb5f3fdaeace9fb79aff..c2cdc83ff046d724532e03eeb59122935885bfa8 100644 (file)
@@ -1,22 +1,22 @@
 <!--
-  Copyright © 2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2017-2018 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2017 Jose A. León Becerra.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
-  Este archivo es parte de Navegador Privado (Privacy Browser) <https://www.stoutner.com/privacy-browser>.
+  This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
-  Navegador Privado (Privacy Browser) es software libre: puedes redistribuirlo y/o modificarlo
-  bajo los términos de la Licencia Pública General GNU, como se ha publicado por
-  la Fundación del Software Libre, tanto la versión 3 de la Licencia, o
-  (a su opción) cualquier versión posterior.
+  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.
 
-  Navegador Privado (Privacy Browser) es distribuído con la esperanza de que será útil,
-  pero SIN NINGUNA GARANTÍA; ni siquiera la garantía implícita de
-  MERCANTILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR.  Vea la
-  Licencia Pública General para más detalles.
+  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.
 
-  Usted debería haber recibido una copia de la Licencia Pública General GNU
-  junto con Navegador Privado (Privacy Browser).  Si no es así, vea <http://www.gnu.org/licenses/>. -->
+  You should have received a copy of the GNU General Public License
+  along with Privacy Browser.  If not, see <http://www.gnu.org/licenses/>. -->
 
 <html>
     <head>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
         <p>Requerido para añadir accesos directos de páginas web en el escritorio.</p>
 
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
+
         <br/>
         <hr/>
         <br/>
 
-        <p>Además, Navegador Privado Gratuito muestra anuncios de Google AdMob usando el proveedor Firebase. En el sabor gratuito, Firebase añade los siguientes permisos aunque no aparecen en el archivo de manifiesto.</p>
+        <p>Además, Navegador Privado Gratuito muestra anuncios de Google AdMob usando el proveedor Firebase.
+            En el sabor gratuito, Firebase añade los siguientes permisos aunque no aparecen en el archivo de manifiesto.</p>
 
         <h3>Ver conexiones de red</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_NETWORK_STATE">android.permission.ACCESS_NETWORK_STATE</a></p>
index 38aa8e93e33d9d5754c49a63ac2bbe9016d4dc0a..6d587edb84a9bf4951d5e2f19146b29616df8400 100644 (file)
@@ -1,22 +1,22 @@
 <!--
-  Copyright © 2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2017-2018 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2017 Jose A. León Becerra.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
-  Este archivo es parte de Navegador Privado (Privacy Browser) <https://www.stoutner.com/privacy-browser>.
+  This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
-  Navegador Privado (Privacy Browser) es software libre: puedes redistribuirlo y/o modificarlo
-  bajo los términos de la Licencia Pública General GNU, como se ha publicado por
-  la Fundación del Software Libre, tanto la versión 3 de la Licencia, o
-  (a su opción) cualquier versión posterior.
+  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.
 
-  Navegador Privado (Privacy Browser) es distribuído con la esperanza de que será útil,
-  pero SIN NINGUNA GARANTÍA; ni siquiera la garantía implícita de
-  MERCANTILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR.  Vea la
-  Licencia Pública General para más detalles.
+  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.
 
-  Usted debería haber recibido una copia de la Licencia Pública General GNU
-  junto con Navegador Privado (Privacy Browser).  Si no es así, vea <http://www.gnu.org/licenses/>. -->
+  You should have received a copy of the GNU General Public License
+  along with Privacy Browser.  If not, see <http://www.gnu.org/licenses/>. -->
 
 <html>
     <head>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
         <p>Requerido para añadir accesos directos de páginas web en el escritorio.</p>
 
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
+
         <br/>
         <hr/>
         <br/>
 
-        <p>Además, Navegador Privado Gratuito muestra anuncios de Google AdMob usando el proveedor Firebase. En el sabor gratuito, Firebase añade los siguientes permisos aunque no aparecen en el archivo de manifiesto.</p>
+        <p>Además, Navegador Privado Gratuito muestra anuncios de Google AdMob usando el proveedor Firebase.
+            En el sabor gratuito, Firebase añade los siguientes permisos aunque no aparecen en el archivo de manifiesto.</p>
 
         <h3>Ver conexiones de red</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_NETWORK_STATE">android.permission.ACCESS_NETWORK_STATE</a></p>
index 57b1b63e2aa179a1e088605938b0c1c7a9849998..ef2ed7952840e64905f6517e2406885516e42237 100644 (file)
@@ -1,22 +1,22 @@
 <!--
-  Copyright © 2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2017-2018 Soren Stoutner <soren@stoutner.com>.
 
-  Translation 2017 Jose A. León Becerra.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+  Translation 2017-2018 Jose A. León Becerra.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
-  Este archivo es parte de Navegador Privado (Privacy Browser) <https://www.stoutner.com/privacy-browser>.
+  This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
-  Navegador Privado (Privacy Browser) es software libre: puedes redistribuirlo y/o modificarlo
-  bajo los términos de la Licencia Pública General GNU, como se ha publicado por
-  la Fundación del Software Libre, tanto la versión 3 de la Licencia, o
-  (a su opción) cualquier versión posterior.
+  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.
 
-  Navegador Privado (Privacy Browser) es distribuído con la esperanza de que será útil,
-  pero SIN NINGUNA GARANTÍA; ni siquiera la garantía implícita de
-  MERCANTILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR.  Vea la
-  Licencia Pública General para más detalles.
+  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.
 
-  Usted debería haber recibido una copia de la Licencia Pública General GNU
-  junto con Navegador Privado (Privacy Browser).  Si no es así, vea <http://www.gnu.org/licenses/>. -->
+  You should have received a copy of the GNU General Public License
+  along with Privacy Browser.  If not, see <http://www.gnu.org/licenses/>. -->
 
 <html>
     <head>
         <p>Los usuarios pueden elegir enviar comunicaciones directas a Stoutner, como mensajes de correo electrónico y comentarios en <a href="https://www.stoutner.com/">stoutner.com</a>.</p>
 
         <h3>Uso de Información</h3>
-        <p><strong class="red">Stoutner puede usar esta información de cualquier forma que ayude en el desarrollo de Navegador Privado,
-            como solucionar problemas de informes de errores o en el desarrollo de características, incluyendo compartir la información con una tercera parte para ayudar en este proceso</strong>.
-            <strong class="blue">Stoutner nunca vendrá la información ni la transferirá a ninguna tercera parte que la pudiera usar para publicidad o marketing</strong>.</p>
+        <p><strong class="blue">Stoutner puede utilizar esta información para ayudar en el desarrollo de Navegador Privado y comunicar el estado del proyecto a los usuarios.</strong>
+            <strong class="red">Stoutner nunca vendrá la información ni la transferirá a ninguna tercera parte que la pudiera usar para publicidad o marketing.</strong></p>
 
         <hr />
-        <p style="text-align: center;"><em>Revisión 1.4, 20 de abril de 2017</em></p>
+        <p style="text-align: center;"><em>Revisión 1.5, 11 de enero de 2018</em></p>
     </body>
 </html>
\ No newline at end of file
index 16c02e745ffc290a0ceab977941e807cc6d91fb6..f840433da4294959afe432d87fb2e48a39fde79e 100644 (file)
@@ -1,22 +1,22 @@
 <!--
-  Copyright © 2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2017-2018 Soren Stoutner <soren@stoutner.com>.
 
-  Translation 2017 Jose A. León Becerra.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+  Translation 2017-2018 Jose A. León Becerra.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
-  Este archivo es parte de Navegador Privado (Privacy Browser) <https://www.stoutner.com/privacy-browser>.
+  This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
-  Navegador Privado (Privacy Browser) es software libre: puedes redistribuirlo y/o modificarlo
-  bajo los términos de la Licencia Pública General GNU, como se ha publicado por
-  la Fundación del Software Libre, tanto la versión 3 de la Licencia, o
-  (a su opción) cualquier versión posterior.
+  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.
 
-  Navegador Privado (Privacy Browser) es distribuído con la esperanza de que será útil,
-  pero SIN NINGUNA GARANTÍA; ni siquiera la garantía implícita de
-  MERCANTILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR.  Vea la
-  Licencia Pública General para más detalles.
+  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.
 
-  Usted debería haber recibido una copia de la Licencia Pública General GNU
-  junto con Navegador Privado (Privacy Browser).  Si no es así, vea <http://www.gnu.org/licenses/>. -->
+  You should have received a copy of the GNU General Public License
+  along with Privacy Browser.  If not, see <http://www.gnu.org/licenses/>. -->
 
 <html>
     <head>
         <p>Los usuarios pueden elegir enviar comunicaciones directas a Stoutner, como mensajes de correo electrónico y comentarios en <a href="https://www.stoutner.com/">stoutner.com</a>.</p>
 
         <h3>Uso de Información</h3>
-        <p><strong class="red">Stoutner puede usar esta información de cualquier forma que ayude en el desarrollo de Navegador Privado,
-            como solucionar problemas de informes de errores o en el desarrollo de características, incluyendo compartir la información con una tercera parte para ayudar en este proceso</strong>.
-            <strong class="blue">Stoutner nunca vendrá la información ni la transferirá a ninguna tercera parte que la pudiera usar para publicidad o marketing</strong>.</p>
+        <p><strong class="blue">Stoutner puede utilizar esta información para ayudar en el desarrollo de Navegador Privado y comunicar el estado del proyecto a los usuarios.</strong>
+            <strong class="red">Stoutner nunca vendrá la información ni la transferirá a ninguna tercera parte que la pudiera usar para publicidad o marketing.</strong></p>
 
         <hr />
-        <p style="text-align: center;"><em>Revisión 1.4, 20 de abril de 2017</em></p>
+        <p style="text-align: center;"><em>Revisión 1.5, 11 de enero de 2018</em></p>
     </body>
 </html>
\ No newline at end of file
index f7e415a0f77568eb70ba62514ca546953488eea2..6e70f779487044dc2910ed5d0e7f610d8a0b67f6 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2017-2018 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2017 Francesco Buratti.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
         <p>E' richiesto per poter creare collegamenti a siti web sulla schermata principale del dispositivo.</p>
 
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
+
         <br/>
         <hr/>
         <br/>
index d6b1ff84354519286b86fcdb56eff9dd946ed99e..856f45d3d832418191d59ba671f46225f3925e15 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2017-2018 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2017 Francesco Buratti.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
         <p>E' richiesto per poter creare collegamenti a siti web sulla schermata principale del dispositivo.</p>
 
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
+
         <br/>
         <hr/>
         <br/>
index b3054a88dc3f8cb7e595b569a10078ff5d13c237..cf43ba7bd8d43f847c64c6924c42274b21625028 100644 (file)
@@ -1,7 +1,7 @@
 <!--
-  Copyright © 2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
-  Translation 2017 Francesco Buratti.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+  Translation 2017-2018 Francesco Buratti.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
 
 
         <h3>Utilizzo delle informazioni</h3>
-        <p><strong class="red">Stoutner si riserva l'utilizzo di queste informazioni come supporto per lo sviluppo di Privacy Browser, ovvero per la correzione di bug o lo sviluppo di nuove funzionalità,
-            con la possibilità di condividerle con terze parti che forniscano assistenza per queste attività</strong>.
-            <strong class="blue">Stoutner non rivenderà o comunque non trasferirà mai nessuna informazione a terze parti che potrebbero utilizzarle a scopi pubblicitari o di marketing</strong>.</p>
+        <p><strong class="blue">Stoutner si riserva l'utilizzo di queste informazioni come supporto per lo sviluppo di Privacy Browser e per comunicazioni sullo stato del progetto verso gli utenti.</strong>
+            <strong class="red">Stoutner non rivenderà o comunque non trasferirà mai nessuna informazione a terze parti che potrebbero utilizzarle a scopi pubblicitari o di marketing.</strong></p>
 
         <hr />
-        <p style="text-align: center;"><em>Revisione 1.4, 20 April 2017</em></p>
+        <p style="text-align: center;"><em>Revisione 1.5, 11 Gennaio 2018</em></p>
     </body>
 </html>
\ No newline at end of file
index c25555b4147fa91da1eb39adf82e21a460043153..e5119cf8a3b4f751d0d08f1690dddb06f2a62659 100644 (file)
@@ -1,7 +1,7 @@
 <!--
-  Copyright © 2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
-  Translation 2017 Francesco Buratti.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+  Translation 2017-2018 Francesco Buratti.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
 
 
         <h3>Utilizzo delle informazioni</h3>
-        <p><strong class="red">Stoutner si riserva l'utilizzo di queste informazioni come supporto per lo sviluppo di Privacy Browser, ovvero per la correzione di bug o lo sviluppo di nuove funzionalità,
-            con la possibilità di condividerle con terze parti che forniscano assistenza per queste attività</strong>.
-            <strong class="blue">Stoutner non rivenderà o comunque non trasferirà mai nessuna informazione a terze parti che potrebbero utilizzarle a scopi pubblicitari o di marketing</strong>.</p>
+        <p><strong class="blue">Stoutner si riserva l'utilizzo di queste informazioni come supporto per lo sviluppo di Privacy Browser e per comunicazioni sullo stato del progetto verso gli utenti.</strong>
+            <strong class="red">Stoutner non rivenderà o comunque non trasferirà mai nessuna informazione a terze parti che potrebbero utilizzarle a scopi pubblicitari o di marketing.</strong></p>
 
         <hr />
-        <p style="text-align: center;"><em>Revisione 1.4, 20 April 2017</em></p>
+        <p style="text-align: center;"><em>Revisione 1.5, 11 Gennaio 2018</em></p>
     </body>
 </html>
\ No newline at end of file
diff --git a/app/src/free/assets/ru/about_permissions_dark.html b/app/src/free/assets/ru/about_permissions_dark.html
new file mode 100644 (file)
index 0000000..3fb56fb
--- /dev/null
@@ -0,0 +1,64 @@
+<!--
+  Copyright © 2016-2018 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/>. -->
+
+<html>
+    <head>
+        <meta charset="UTF-8">
+
+        <link rel="stylesheet" href="../en/css/dark_theme.css">
+    </head>
+
+    <body>
+        <h3>Have full network access</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INTERNET">android.permission.INTERNET</a></p>
+        <p>Required for the WebView to access the internet. Without this permission, Privacy Browser would be “No Browser: Protecting Your Privacy by Staying Completely Off the Internet”.</p>
+
+        <h3>Install shortcuts</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
+        <p>Required to add shortcuts for websites to the launcher desktop.</p>
+
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
+
+        <br/>
+        <hr/>
+        <br/>
+
+        <p>In addition, Privacy Browser Free displays ads from Google’s AdMob network using the Firebase backend.
+            For the free flavor, Firebase adds the following permissions even though they are not listed in the manifest file.</p>
+
+        <h3>View network connections</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_NETWORK_STATE">android.permission.ACCESS_NETWORK_STATE</a></p>
+        <p>Allows the ads to tell when you are connected to the internet and when you aren’t (presumably so they don’t try to reload an ad when you are disconnected).
+            They can also tell if you are connected via Wi-Fi, 2G, 3G, 4G, etc.</p>
+
+        <h3>Prevent phone from sleeping</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WAKE_LOCK">android.permission.WAKE_LOCK</a></p>
+        <p>Allows the ads to keep the processor from sleeping and the screen from dimming, although in my testing I don’t think the ads actually do this.</p>
+
+        <h3>Receive data from Internet</h3>
+        <p><a href="http://androidpermissions.com/permission/com.google.android.c2dm.permission.RECEIVE">com.google.android.c2dm.permission.RECEIVE</a></p>
+        <p>Allows Google to send information directly to the AdView without having to receive a request first (cloud-to-device messaging).</p>
+
+        <h3>Receive data from Internet</h3>
+        <p><a href="https://developers.google.com/cloud-messaging/android/client">com.stoutner.privacybrowser.free.permission.C2D_MESSAGE</a></p>
+        <p>Secures the cloud-to-device messages so that only Privacy Browser Free can receive them.</p>
+    </body>
+</html>
\ No newline at end of file
diff --git a/app/src/free/assets/ru/about_permissions_light.html b/app/src/free/assets/ru/about_permissions_light.html
new file mode 100644 (file)
index 0000000..6b2f853
--- /dev/null
@@ -0,0 +1,64 @@
+<!--
+  Copyright © 2016-2018 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/>. -->
+
+<html>
+    <head>
+        <meta charset="UTF-8">
+
+        <link rel="stylesheet" href="../en/css/light_theme.css">
+    </head>
+
+    <body>
+        <h3>Have full network access</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INTERNET">android.permission.INTERNET</a></p>
+        <p>Required for the WebView to access the internet. Without this permission, Privacy Browser would be “No Browser: Protecting Your Privacy by Staying Completely Off the Internet”.</p>
+
+        <h3>Install shortcuts</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
+        <p>Required to add shortcuts for websites to the launcher desktop.</p>
+
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
+
+        <br/>
+        <hr/>
+        <br/>
+
+        <p>In addition, Privacy Browser Free displays ads from Google’s AdMob network using the Firebase backend.
+            For the free flavor, Firebase adds the following permissions even though they are not listed in the manifest file.</p>
+
+        <h3>View network connections</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_NETWORK_STATE">android.permission.ACCESS_NETWORK_STATE</a></p>
+        <p>Allows the ads to tell when you are connected to the internet and when you aren’t (presumably so they don’t try to reload an ad when you are disconnected).
+            They can also tell if you are connected via Wi-Fi, 2G, 3G, 4G, etc.</p>
+
+        <h3>Prevent phone from sleeping</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WAKE_LOCK">android.permission.WAKE_LOCK</a></p>
+        <p>Allows the ads to keep the processor from sleeping and the screen from dimming, although in my testing I don't think the ads actually do this.</p>
+
+        <h3>Receive data from Internet</h3>
+        <p><a href="http://androidpermissions.com/permission/com.google.android.c2dm.permission.RECEIVE">com.google.android.c2dm.permission.RECEIVE</a></p>
+        <p>Allows Google to send information directly to the AdView without having to receive a request first (cloud-to-device messaging).</p>
+
+        <h3>Receive data from Internet</h3>
+        <p><a href="https://developers.google.com/cloud-messaging/android/client">com.stoutner.privacybrowser.free.permission.C2D_MESSAGE</a></p>
+        <p>Secures the cloud-to-device messages so that only Privacy Browser Free can receive them.</p>
+    </body>
+</html>
\ No newline at end of file
diff --git a/app/src/free/assets/ru/about_privacy_policy_dark.html b/app/src/free/assets/ru/about_privacy_policy_dark.html
new file mode 100644 (file)
index 0000000..4669723
--- /dev/null
@@ -0,0 +1,103 @@
+<!--
+  Copyright © 2016-2018 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/>. -->
+
+<html>
+    <head>
+        <meta charset="UTF-8">
+
+        <link rel="stylesheet" href="../en/css/dark_theme.css">
+    </head>
+
+    <body>
+        <h3>Privacy Browser Free</h3>
+        <p><strong class="red">Privacy Browser Free does not collect any user information</strong>.</p>
+
+
+        <h3>Google Play</h3>
+        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
+            Google provides <em>anonymized summary installation information</em> to developers, including the number of installs organized by the following categories.</p>
+        <ul>
+            <li><item>Android version</item> (eg. Android 7.1)</li>
+            <li><item>Device</item> (eg. Samsung Galaxy S6 [zeroflte])</li>
+            <li><item>Tablets</item> (eg. Tablets 10" and above)</li>
+            <li><item>Country</item> (eg. United States)</li>
+            <li><item>Language</item> (eg. English [United States])</li>
+            <li><item>App version</item> (eg. 14)</li>
+            <li><item>Carrier</item> (eg. T-Mobile - US)</li>
+        </ul>
+
+
+        <h3>Google Play Ratings</h3>
+        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
+            Google provides developers with <em>anonymized summaries</em> of the following information related to user ratings.</p>
+        <ul>
+            <li><item>Country</item> (eg. United States)</li>
+            <li><item>Language</item> (eg. English)</li>
+            <li><item>App version</item> (eg. 14)</li>
+            <li><item>Android version</item> (eg. Android 7.1)</li>
+            <li><item>Device</item> (eg. Google Nexus 5X [bullhead])</li>
+            <li><item>Tablets</item> (eg. Tablets 10" and above)</li>
+        </ul>
+
+
+        <h3>Google Play Reviews</h3>
+        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
+            In addition to the name of the reviewer, the rating, and the text of the review (which are all available publicly), Google provides some or all of the following information to the developer.</p>
+        <ul>
+            <li><item>Version code</item> (eg. 7)</li>
+            <li><item>Version name</item> (eg. 1.6)</li>
+            <li><item>Android version</item> (eg. Android 5.1)</li>
+            <li><item>Device</item> (eg. Galaxy S6 Edge+ [zenlte])</li>
+            <li><item>Manufacturer</item> (eg. Samsung)</li>
+            <li><item>Device type</item> (eg. Phone)</li>
+            <li><item>CPU make</item> (eg. Samsung)</li>
+            <li><item>CPU model</item> (eg. Exynos 7420)</li>
+            <li><item>Screen density</item> (eg. 560 dpi)</li>
+            <li><item>Screen size</item> (eg. 2560 x 1440)</li>
+            <li><item>RAM</item> (eg. 4096 MB)</li>
+            <li><item>Native platform</item> (eg. armeabi-v7a,armeabi,arm64v8a)</li>
+            <li><item>OpenGL ES version</item> (eg. 3.1)</li>
+            <li><item>Device language</item> (eg. English)</li>
+        </ul>
+
+
+        <h3>Advertisements</h3>
+        <p>Privacy Browser Free displays a banner ad across the bottom of the screen using Google's AdMob network, which has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
+            Note that unless you have <a href="http://www.techrepublic.com/article/pro-tip-how-to-opt-out-of-interest-based-ads-on-your-android-phone/">opted out of interest-based ads</a>,
+            the advertiser will receive a copy of your unique device advertising ID, which allows them to track your device across apps.
+            AdMob reports <em>anonymized summaries</em> of the following information to developers.</p>
+        <ul>
+            <li><item>Total impressions</item></li>
+            <li><item>Total clicks</item></li>
+            <li><item>Platforms</item> (eg. high-end mobile devices, tablets)</li>
+            <li><item>Activity by country</item></li>
+        </ul>
+
+
+        <h3>Direct Communications</h3>
+        <p>Users may choose to send direct communications to Stoutner, like email messages and comments on <a href="https://www.stoutner.com/">stoutner.com</a>.</p>
+
+
+        <h3>Use of Information</h3>
+        <p><strong class="blue">Stoutner may use this information to assist in the development of Privacy Browser and communicate the status of the project to users.</strong>
+            <strong class="red">Stoutner will never sell this information nor transfer it to any third party that would use it for advertising or marketing.</strong></p>
+
+        <hr />
+        <p style="text-align: center;"><em>Revision 1.5, 11 January 2018</em></p>
+    </body>
+</html>
\ No newline at end of file
diff --git a/app/src/free/assets/ru/about_privacy_policy_light.html b/app/src/free/assets/ru/about_privacy_policy_light.html
new file mode 100644 (file)
index 0000000..38b486c
--- /dev/null
@@ -0,0 +1,103 @@
+<!--
+  Copyright © 2016-2018 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/>. -->
+
+<html>
+    <head>
+        <meta charset="UTF-8">
+
+        <link rel="stylesheet" href="../en/css/light_theme.css">
+    </head>
+
+    <body>
+        <h3>Privacy Browser Free</h3>
+        <p><strong class="red">Privacy Browser Free does not collect any user information</strong>.</p>
+
+
+        <h3>Google Play</h3>
+        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
+            Google provides <em>anonymized summary installation information</em> to developers, including the number of installs organized by the following categories.</p>
+        <ul>
+            <li><item>Android version</item> (eg. Android 7.1)</li>
+            <li><item>Device</item> (eg. Samsung Galaxy S6 [zeroflte])</li>
+            <li><item>Tablets</item> (eg. Tablets 10" and above)</li>
+            <li><item>Country</item> (eg. United States)</li>
+            <li><item>Language</item> (eg. English [United States])</li>
+            <li><item>App version</item> (eg. 14)</li>
+            <li><item>Carrier</item> (eg. T-Mobile - US)</li>
+        </ul>
+
+
+        <h3>Google Play Ratings</h3>
+        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
+            Google provides developers with <em>anonymized summaries</em> of the following information related to user ratings.</p>
+        <ul>
+            <li><item>Country</item> (eg. United States)</li>
+            <li><item>Language</item> (eg. English)</li>
+            <li><item>App version</item> (eg. 14)</li>
+            <li><item>Android version</item> (eg. Android 7.1)</li>
+            <li><item>Device</item> (eg. Google Nexus 5X [bullhead])</li>
+            <li><item>Tablets</item> (eg. Tablets 10" and above)</li>
+        </ul>
+
+
+        <h3>Google Play Reviews</h3>
+        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
+            In addition to the name of the reviewer, the rating, and the text of the review (which are all available publicly), Google provides some or all of the following information to the developer.</p>
+        <ul>
+            <li><item>Version code</item> (eg. 7)</li>
+            <li><item>Version name</item> (eg. 1.6)</li>
+            <li><item>Android version</item> (eg. Android 5.1)</li>
+            <li><item>Device</item> (eg. Galaxy S6 Edge+ [zenlte])</li>
+            <li><item>Manufacturer</item> (eg. Samsung)</li>
+            <li><item>Device type</item> (eg. Phone)</li>
+            <li><item>CPU make</item> (eg. Samsung)</li>
+            <li><item>CPU model</item> (eg. Exynos 7420)</li>
+            <li><item>Screen density</item> (eg. 560 dpi)</li>
+            <li><item>Screen size</item> (eg. 2560 x 1440)</li>
+            <li><item>RAM</item> (eg. 4096 MB)</li>
+            <li><item>Native platform</item> (eg. armeabi-v7a,armeabi,arm64v8a)</li>
+            <li><item>OpenGL ES version</item> (eg. 3.1)</li>
+            <li><item>Device language</item> (eg. English)</li>
+        </ul>
+
+
+        <h3>Advertisements</h3>
+        <p>Privacy Browser Free displays a banner ad across the bottom of the screen using Google's AdMob network, which has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
+            Note that unless you have <a href="http://www.techrepublic.com/article/pro-tip-how-to-opt-out-of-interest-based-ads-on-your-android-phone/">opted out of interest-based ads</a>,
+            the advertiser will receive a copy of your unique device advertising ID, which allows them to track your device across apps.
+            AdMob reports <em>anonymized summaries</em> of the following information to developers.</p>
+        <ul>
+            <li><item>Total impressions</item></li>
+            <li><item>Total clicks</item></li>
+            <li><item>Platforms</item> (eg. high-end mobile devices, tablets)</li>
+            <li><item>Activity by country</item></li>
+        </ul>
+
+
+        <h3>Direct Communications</h3>
+        <p>Users may choose to send direct communications to Stoutner, like email messages and comments on <a href="https://www.stoutner.com/">stoutner.com</a>.</p>
+
+
+        <h3>Use of Information</h3>
+        <p><strong class="blue">Stoutner may use this information to assist in the development of Privacy Browser and communicate the status of the project to users.</strong>
+            <strong class="red">Stoutner will never sell this information nor transfer it to any third party that would use it for advertising or marketing.</strong></p>
+
+        <hr />
+        <p style="text-align: center;"><em>Revision 1.5, 11 January 2018</em></p>
+    </body>
+</html>
\ No newline at end of file
index df0c9029b5fca950dd78a7c153d07952260fb93a..abf7c81d1b9d806044f668313822abdde42ee765 100644 (file)
@@ -3,25 +3,20 @@
 <!--
   Copyright © 2015-2017 Soren Stoutner <soren@stoutner.com>.
 
-  Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+  This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
-  Diese Datei ist Teil von 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 ist eine kostenlose Software: Sie können sie
-  unter den Bedingungen der GNU General Public License weiterverteilen
-  mit Berufung auf die veröffentlichte Fassung der Free Software
-  Foundation, entweder Version 3 der Lizenz oder (nach Ihrer
-  Möglichkeit) jede neuere 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.
 
-  Privacy Browser wird in der Hoffnung vertrieben nützlich zu sein,
-  jedoch OHNE JEGLICHE GARANTIE; auch ohne die implizierte
-  Garantie auf MARKTGÄNGLICHKEIT oder BEREITSCHAFT FÜR
-  BESTIMMTE ANWENDUNGEN. Nutzen Sie die GNU General Public
-  License für mehr Details.
-
-  Sie sollten eine Kopie der GNU General Public License zusammen mit
-  Privacy Browser erhalten haben. Wenn nicht, besuchen Sie
-  <http://www.gnu.org/licenses/>. -->
+  You should have received a copy of the GNU General Public License
+  along with Privacy Browser.  If not, see <http://www.gnu.org/licenses/>. -->
 
 <resources>
     <!-- Activities. -->
index f720d8e5157eb7772086e0959c12b4108bac84dd..c8d59a6a97613bd38a45d079daabb9682a413483 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <!--
-  Copyright © 2016 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2015-2017 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2017 Jose A. León Becerra <emails@joseleon.me>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
diff --git a/app/src/free/res/values-ru/strings.xml b/app/src/free/res/values-ru/strings.xml
new file mode 100644 (file)
index 0000000..abf7c81
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  Copyright © 2015-2017 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/>. -->
+
+<resources>
+    <!-- Activities. -->
+    <string name="privacy_browser">Privacy Browser Free</string>
+</resources>
\ No newline at end of file
index f2950bd5a051d1ab7c980d178cff5c2c41f195c3..8f6a8a50839ac19e5fb9a9d55fcbba8e79e41d85 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <!--
-  Copyright © 2015-2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2015-2018 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
     <!-- Required to load websites. -->
     <uses-permission android:name="android.permission.INTERNET" />
 
-    <!-- Required to create homescreen shortcuts. -->
+    <!-- Required to create home screen shortcuts. -->
     <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
 
+    <!-- Required to save files to the public download folder. -->
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
 
     <!-- Support Chromebooks that don't have a touch screen. -->
     <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
@@ -54,8 +57,9 @@
 
         <!-- The theme has to be defined here or an ugly title bar is displayed when the app launches.
              `android:configChanges="orientation|screenSize"` makes the activity not reload when the orientation changes, which preserves scroll location in the WebView.
-             `android:launchMode="singleTask"` makes the app launch in a new task instead of inside the task of the program that sends it an intent.  It also makes it reuse an existing Privacy Browser activity if available instead of launching a new one.
-             `android:persistableMode="persistNever"` removes Privacy Browser from the recents screen on a device reboot.
+             `android:launchMode="singleTask"` makes the app launch in a new task instead of inside the task of the program that sends it an intent.
+             It also makes it reuse an existing Privacy Browser activity if available instead of launching a new one.
+             `android:persistableMode="persistNever"` removes Privacy Browser from the recent apps list on a device reboot.
              `tools:ignore="unusedAttribute"` removes the lint warning that `persistableMode` does not apply to API < 21. -->
         <activity
             android:name=".activities.MainWebViewActivity"
@@ -84,7 +88,7 @@
 
 
         <!-- `android:configChanges="orientation|screenSize"` makes the activity not reload when the orientation changes.
-             `android:persistableMode="persistNever"` removes Privacy Browser from the recents screen on a device reboot.
+             `android:persistableMode="persistNever"` removes Privacy Browser from the recent apps list on a device reboot.
              `tools:ignore="unusedAttribute"` removes the lint warning that `persistableMode` does not apply to API < 21. -->
         <activity
             android:name=".activities.BookmarksActivity"
             tools:ignore="UnusedAttribute" />
 
         <!-- `android:configChanges="orientation|screenSize"` makes the activity not reload when the orientation changes.
-             `android:persistableMode="persistNever"` removes Privacy Browser from the recents screen on a device reboot.
+             `android:persistableMode="persistNever"` removes Privacy Browser from the recent apps list on a device reboot.
              `tools:ignore="unusedAttribute"` removes the lint warning that `persistableMode` does not apply to API < 21. -->
         <activity
             android:name=".activities.BookmarksDatabaseViewActivity"
             tools:ignore="UnusedAttribute" />
 
         <!-- `android:configChanges="orientation|screenSize"` makes the activity not reload when the orientation changes.
-             `android:persistableMode="persistNever"` removes Privacy Browser from the recents screen on a device reboot.
+             `android:persistableMode="persistNever"` removes Privacy Browser from the recent apps list on a device reboot.
              `tools:ignore="unusedAttribute"` removes the lint warning that `persistableMode` does not apply to API < 21. -->
         <activity
             android:name=".activities.SettingsActivity"
             tools:ignore="UnusedAttribute" />
 
         <!-- `android:windowSoftInputMode="stateAlwaysHidden"` keeps the keyboard from displaying when the screen is rotated and after the `AddDomainDialog` is dismissed.
-             `android:persistableMode="persistNever"` removes Privacy Browser from the recents screen on a device reboot.
+             `android:persistableMode="persistNever"` removes Privacy Browser from the recent apps list on a device reboot.
              `tools:ignore="unusedAttribute"` removes the lint warning that `persistableMode` does not apply to API < 21. -->
         <activity
             android:name=".activities.DomainsActivity"
             tools:ignore="UnusedAttribute" />
 
         <!-- `android:configChanges="orientation|screenSize"` makes the activity not reload when the orientation changes.
-             `android:persistableMode="persistNever"` removes Privacy Browser from the recents screen on a device reboot.
+             `android:persistableMode="persistNever"` removes Privacy Browser from the recent apps list on a device reboot.
              `tools:ignore="unusedAttribute"` removes the lint warning that `persistableMode` does not apply to API < 21. -->
         <activity
             android:name=".activities.GuideActivity"
             tools:ignore="UnusedAttribute" />
 
         <!-- `android:configChanges="orientation|screenSize"` makes the activity not reload when the orientation changes.
-             `android:persistableMode="persistNever"` removes Privacy Browser from the recents screen on a device reboot.
+             `android:persistableMode="persistNever"` removes Privacy Browser from the recent apps list on a device reboot.
              `tools:ignore="unusedAttribute"` removes the lint warning that `persistableMode` does not apply to API < 21. -->
         <activity
             android:name=".activities.AboutActivity"
             tools:ignore="UnusedAttribute" />
 
         <!-- `android:configChanges="orientation|screenSize"` makes the activity not reload when the orientation changes.
-             `android:persistableMode="persistNever"` removes Privacy Browser from the recents screen on a device reboot.
+             `android:persistableMode="persistNever"` removes Privacy Browser from the recent apps list on a device reboot.
              `tools:ignore="unusedAttribute"` removes the lint warning that `persistableMode` does not apply to API < 21. -->
         <activity
             android:name=".activities.ViewSourceActivity"
index 1cfe3264c05f053cda5ea090ceece15e3f8807b5..05cf1b707bef15fcc718d3687f04291a400ffcd4 100644 (file)
@@ -34,6 +34,7 @@
         Hendrik Knackstedt
 
         <h3>Mitwirkende</h3>
+        Stefan Erhardt: German<br/>
         Francesco Buratti: Italienisch<br/>
         Jose A. León Becerra: Spanisch
 
index 6a58bb91e70e8bc1e407039d85296870b5a0edfe..d4872c6296ec7ce31d2298aad20229d6e4e6a332 100644 (file)
@@ -34,6 +34,7 @@
         Hendrik Knackstedt
 
         <h3>Mitwirkende</h3>
+        Stefan Erhardt: German<br/>
         Francesco Buratti: Italienisch<br/>
         Jose A. León Becerra: Spanisch
 
index 899594317950ed5893b2c565a93b77c181ee9bfd..b6d84e7dc775d07aa158c0fdb1c6bfc59b7f63bc 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
 
     <body>
         <h3>Voller Netzwerkzugriff</h3>
-
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INTERNET">android.permission.INTERNET</a></p>
-
         <p>Benötigt, damit WebView das Internet nutzen kann. Ohne diese Berechtigung wäre Privacy Browser “Kein Browser: Schützt Ihre Privatsphäre durch Fernbleiben von jeglicher Konnektivität”.</p>
 
-
         <h3>Verknüpfungen installieren</h3>
-
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
-
         <p>Benötigt, um Verknüpfungen zu Websites auf Ihrer Startseite zu erstellen.</p>
+
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
     </body>
 </html>
\ No newline at end of file
index 3b83a9153694a5f5184d58a480ee857361c92f57..6bf4cd552e4919c17b3fafc160d45e599255e621 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
 
     <body>
         <h3>Voller Netzwerkzugriff</h3>
-
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INTERNET">android.permission.INTERNET</a></p>
-
         <p>Benötigt, damit WebView das Internet nutzen kann. Ohne diese Berechtigung wäre Privacy Browser “Kein Browser: Schützt Ihre Privatsphäre durch Fernbleiben von jeglicher Konnektivität”.</p>
 
-
         <h3>Verknüpfungen installieren</h3>
-
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
-
         <p>Benötigt, um Verknüpfungen zu Websites auf Ihrer Startseite zu erstellen.</p>
+
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
     </body>
 </html>
\ No newline at end of file
index ae5b65b1cc1e8a0161eaea1152fcee33c1c83c70..8b7b0d063f1546e942ffc5321dd26590755b52be 100644 (file)
@@ -32,6 +32,7 @@
         Hendrik Knackstedt
 
         <h3>Translators</h3>
+        Stefan Erhardt: German<br/>
         Francesco Buratti: Italian<br/>
         Jose A. León Becerra: Spanish
 
index 38663dece9430b7508bdbc9d5a56c5c39152005c..14684398d5f1fc14dd6f8af8465abde9243e9822 100644 (file)
@@ -32,6 +32,7 @@
         Hendrik Knackstedt
 
         <h3>Translators</h3>
+        Stefan Erhardt: German<br/>
         Francesco Buratti: Italian<br/>
         Jose A. León Becerra: Spanish
 
index cfb25a21d7ebfd5184775d9948a03569406dc438..8bebb8ba74ccf9886c7709bcd92e3db34a343a2b 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
 
     <body>
         <h3>Have full network access</h3>
-
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INTERNET">android.permission.INTERNET</a></p>
-
         <p>Required for the WebView to access the internet. Without this permission, Privacy Browser would be “No Browser: Protecting Your Privacy by Staying Completely Off the Internet”.</p>
 
-
         <h3>Install shortcuts</h3>
-
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
-
         <p>Required to add shortcuts for websites to the launcher desktop.</p>
+
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
     </body>
 </html>
\ No newline at end of file
index c05048bba62074dfc167a6d0fe1f1758121a4df8..5bbc6fe11a6063d9cc7908014243d61e369d439b 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
 
     <body>
         <h3>Have full network access</h3>
-
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INTERNET">android.permission.INTERNET</a></p>
-
         <p>Required for the WebView to access the internet. Without this permission, Privacy Browser would be “No Browser: Protecting Your Privacy by Staying Completely Off the Internet”.</p>
 
-
         <h3>Install shortcuts</h3>
-
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
-
         <p>Required to add shortcuts for websites to the launcher desktop.</p>
+
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
     </body>
 </html>
\ No newline at end of file
index 70d573c4b27581aa15eec788aba9d85c13bf9c4c..eb6fc9846c666337acd1fae39e0a69f5803970b4 100644 (file)
@@ -32,6 +32,7 @@
         Hendrik Knackstedt
 
         <h3>Traductores</h3>
+        Stefan Erhardt: Alemán<br/>
         Francesco Buratti: Italiano<br/>
         Jose A. León Becerra: Español
 
index 35258ff2aa738e116d59c07b565f5926bebe9f2e..e5303e70e7c57a612c285f2151d152d6d8c1060b 100644 (file)
@@ -32,6 +32,7 @@
         Hendrik Knackstedt
 
         <h3>Traductores</h3>
+        Stefan Erhardt: Alemán<br/>
         Francesco Buratti: Italiano<br/>
         Jose A. León Becerra: Español
 
index 20e27a1ef3fd1b22dbbbb4f7da361c5a7d832fce..dd48c7e1059093a831dce1a2603bdfcb85fe3da0 100644 (file)
         <h3>Instalar accesos directos</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
         <p>Requerido para añadir accesos directos de páginas web en el escritorio.</p>
+
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
     </body>
 </html>
\ No newline at end of file
index a6734a1d7c6445667baf28da2e7bf2573923f482..18548836b9a7268f995309b87c59bcb341d25fd7 100644 (file)
         <h3>Instalar accesos directos</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
         <p>Requerido para añadir accesos directos de páginas web en el escritorio.</p>
+
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
     </body>
 </html>
\ No newline at end of file
index d76e217882b9d1b141e508cb5352996895588e02..7cb33082e61f92ab521d5d985b852411fd0d5182 100644 (file)
@@ -34,6 +34,7 @@
         Hendrik Knackstedt
 
         <h3>Traduttori</h3>
+        Stefan Erhardt: Tedesco<br/>
         Francesco Buratti: Italiano<br/>
         Jose A. León Becerra: Spagnolo
 
index b61a583a01f0deb392f238409c0f6fe7b8692bc7..b5432cb0b58c7db63b72c2da161faa3383ce9d32 100644 (file)
@@ -34,6 +34,7 @@
         Hendrik Knackstedt
 
         <h3>Traduttori</h3>
+        Stefan Erhardt: Tedesco<br/>
         Francesco Buratti: Italiano<br/>
         Jose A. León Becerra: Spagnolo
 
index 2f0387fb20a37045687f69d5f95137121f1be8bc..26dc88236e2c0e6d2b81dd3c9696e1b23c30bd5b 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2017-2018 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2017 Francesco Buratti.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
         <h3>Creazione di collegamenti</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
         <p>E' richiesto per poter creare collegamenti a siti web sulla schermata principale del dispositivo.</p>
+
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
     </body>
 </html>
\ No newline at end of file
index bd303aaac0e3e64978f152abcd8a91d06b2b25f9..67d3ecf18dc1038a8365e50d0eb37fd7f08f6f3e 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2017 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2017-2018 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2017 Francesco Buratti.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
         <h3>Creazione di collegamenti</h3>
         <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
         <p>E' richiesto per poter creare collegamenti a siti web sulla schermata principale del dispositivo.</p>
+
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
     </body>
 </html>
\ No newline at end of file
index 372d277062c837753de7da371a618488b0c61d50..fb1f3585f47eb85ee70316fac0fae5cd575e50b1 100644 (file)
@@ -1,7 +1,7 @@
 <!--
-  Copyright © 2017-2018 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
-  Translation 2017 Francesco Buratti.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+  Translation 2017-2018 Francesco Buratti.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
index aca6756f58d058dece456034568316246a76dbbe..21dc557866246e0248fde8c523eec38745cbdd1d 100644 (file)
@@ -1,7 +1,7 @@
 <!--
-  Copyright © 2017-2018 Soren Stoutner <soren@stoutner.com>.
+  Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
-  Translation 2017 Francesco Buratti.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+  Translation 2017-2018 Francesco Buratti.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
 
index e0c31b7d4ca4f3986991cf284412e2d6839c25f3..82b6bd08fb38ec3871fa837db41eccbfcf12343f 100644 (file)
@@ -32,6 +32,7 @@
         Hendrik Knackstedt
 
         <h3>Translators</h3>
+        Stefan Erhardt: German<br/>
         Francesco Buratti: Italian<br/>
         Jose A. León Becerra: Spanish
 
index 612f4f2383ab8f5cbbdd6ff8b5907e365d245336..55b321111d2f21b38395b03797de3aee94dc6255 100644 (file)
@@ -32,6 +32,7 @@
         Hendrik Knackstedt
 
         <h3>Translators</h3>
+        Stefan Erhardt: German<br/>
         Francesco Buratti: Italian<br/>
         Jose A. León Becerra: Spanish
 
diff --git a/app/src/main/assets/ru/about_permissions_dark.html b/app/src/main/assets/ru/about_permissions_dark.html
new file mode 100644 (file)
index 0000000..36e8e9e
--- /dev/null
@@ -0,0 +1,40 @@
+<!--
+  Copyright © 2016-2018 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/>. -->
+
+<html>
+    <head>
+        <meta charset="UTF-8">
+
+        <link rel="stylesheet" href="../en/css/dark_theme.css">
+    </head>
+
+    <body>
+        <h3>Have full network access</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INTERNET">android.permission.INTERNET</a></p>
+        <p>Required for the WebView to access the internet. Without this permission, Privacy Browser would be “No Browser: Protecting Your Privacy by Staying Completely Off the Internet”.</p>
+
+        <h3>Install shortcuts</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
+        <p>Required to add shortcuts for websites to the launcher desktop.</p>
+
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
+    </body>
+</html>
\ No newline at end of file
diff --git a/app/src/main/assets/ru/about_permissions_light.html b/app/src/main/assets/ru/about_permissions_light.html
new file mode 100644 (file)
index 0000000..9403ab3
--- /dev/null
@@ -0,0 +1,40 @@
+<!--
+  Copyright © 2016-2018 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/>. -->
+
+<html>
+    <head>
+        <meta charset="UTF-8">
+
+        <link rel="stylesheet" href="../en/css/light_theme.css">
+    </head>
+
+    <body>
+        <h3>Have full network access</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INTERNET">android.permission.INTERNET</a></p>
+        <p>Required for the WebView to access the internet. Without this permission, Privacy Browser would be “No Browser: Protecting Your Privacy by Staying Completely Off the Internet”.</p>
+
+        <h3>Install shortcuts</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#INSTALL_SHORTCUT">com.android.launcher.permission.INSTALL_SHORTCUT</a></p>
+        <p>Required to add shortcuts for websites to the launcher desktop.</p>
+
+        <h3>Write storage</h3>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE"> android.permission.WRITE_EXTERNAL_STORAGE</a></p>
+        <p>Required to download files to the public download folder.
+            On Android Marshmallow (API 23) and newer, if this permission is denied Privacy Browser will store downloads in the app’s download folder instead.</p>
+    </body>
+</html>
\ No newline at end of file
diff --git a/app/src/main/assets/ru/about_privacy_policy_dark.html b/app/src/main/assets/ru/about_privacy_policy_dark.html
new file mode 100644 (file)
index 0000000..b2c8692
--- /dev/null
@@ -0,0 +1,90 @@
+<!--
+  Copyright © 2016-2018 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/>. -->
+
+<html>
+    <head>
+        <meta charset="UTF-8">
+
+        <link rel="stylesheet" href="../en/css/dark_theme.css">
+    </head>
+
+    <body>
+        <h3>Privacy Browser</h3>
+        <p><strong class="red">Privacy Browser does not collect any user information.</strong></p>
+
+
+        <h3>Google Play</h3>
+        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
+            Google provides <em>anonymized summary installation information</em> to developers, including the number of installs organized by the following categories.</p>
+        <ul>
+            <li><item>Android version</item> (eg. Android 7.1)</li>
+            <li><item>Device</item> (eg. Samsung Galaxy S6 [zeroflte])</li>
+            <li><item>Tablets</item> (eg. Tablets 10" and above)</li>
+            <li><item>Country</item> (eg. United States)</li>
+            <li><item>Language</item> (eg. English [United States])</li>
+            <li><item>App version</item> (eg. 14)</li>
+            <li><item>Carrier</item> (eg. T-Mobile - US)</li>
+        </ul>
+
+
+        <h3>Google Play Ratings</h3>
+        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
+            Google provides developers with <em>anonymized summaries</em> of the following information related to user ratings.</p>
+        <ul>
+            <li><item>Country</item> (eg. United States)</li>
+            <li><item>Language</item> (eg. English)</li>
+            <li><item>App version</item> (eg. 14)</li>
+            <li><item>Android version</item> (eg. Android 7.1)</li>
+            <li><item>Device</item> (eg. Google Nexus 5X [bullhead])</li>
+            <li><item>Tablets</item> (eg. Tablets 10" and above)</li>
+        </ul>
+
+
+        <h3>Google Play Reviews</h3>
+        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
+            In addition to the name of the reviewer, the rating, and the text of the review (which are all available publicly), Google provides some or all of the following information to the developer.</p>
+        <ul>
+            <li><item>Version code</item> (eg. 7)</li>
+            <li><item>Version name</item> (eg. 1.6)</li>
+            <li><item>Android version</item> (eg. Android 5.1)</li>
+            <li><item>Device</item> (eg. Galaxy S6 Edge+ [zenlte])</li>
+            <li><item>Manufacturer</item> (eg. Samsung)</li>
+            <li><item>Device type</item> (eg. Phone)</li>
+            <li><item>CPU make</item> (eg. Samsung)</li>
+            <li><item>CPU model</item> (eg. Exynos 7420)</li>
+            <li><item>Screen density</item> (eg. 560 dpi)</li>
+            <li><item>Screen size</item> (eg. 2560 x 1440)</li>
+            <li><item>RAM</item> (eg. 4096 MB)</li>
+            <li><item>Native platform</item> (eg. armeabi-v7a,armeabi,arm64v8a)</li>
+            <li><item>OpenGL ES version</item> (eg. 3.1)</li>
+            <li><item>Device language</item> (eg. English)</li>
+        </ul>
+
+
+        <h3>Direct Communications</h3>
+        <p>Users may choose to send direct communications to Stoutner, like email messages and comments on <a href="https://www.stoutner.com/">stoutner.com</a>.</p>
+
+
+        <h3>Use of Information</h3>
+        <p><strong class="blue">Stoutner may use this information to assist in the development of Privacy Browser and communicate the status of the project to users.</strong>
+            <strong class="red">Stoutner will never sell this information nor transfer it to any third party that would use it for advertising or marketing.</strong></p>
+
+        <hr />
+        <p style="text-align: center;"><em>Revision 1.5, 11 January 2018</em></p>
+    </body>
+</html>
\ No newline at end of file
diff --git a/app/src/main/assets/ru/about_privacy_policy_light.html b/app/src/main/assets/ru/about_privacy_policy_light.html
new file mode 100644 (file)
index 0000000..58e7ec1
--- /dev/null
@@ -0,0 +1,90 @@
+<!--
+  Copyright © 2016-2018 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/>. -->
+
+<html>
+    <head>
+        <meta charset="UTF-8">
+
+        <link rel="stylesheet" href="../en/css/light_theme.css">
+    </head>
+
+    <body>
+        <h3>Privacy Browser</h3>
+        <p><strong class="red">Privacy Browser does not collect any user information.</strong></p>
+
+
+        <h3>Google Play</h3>
+        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
+            Google provides <em>anonymized summary installation information</em> to developers, including the number of installs organized by the following categories.</p>
+        <ul>
+            <li><item>Android version</item> (eg. Android 7.1)</li>
+            <li><item>Device</item> (eg. Samsung Galaxy S6 [zeroflte])</li>
+            <li><item>Tablets</item> (eg. Tablets 10" and above)</li>
+            <li><item>Country</item> (eg. United States)</li>
+            <li><item>Language</item> (eg. English [United States])</li>
+            <li><item>App version</item> (eg. 14)</li>
+            <li><item>Carrier</item> (eg. T-Mobile - US)</li>
+        </ul>
+
+
+        <h3>Google Play Ratings</h3>
+        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
+            Google provides developers with <em>anonymized summaries</em> of the following information related to user ratings.</p>
+        <ul>
+            <li><item>Country</item> (eg. United States)</li>
+            <li><item>Language</item> (eg. English)</li>
+            <li><item>App version</item> (eg. 14)</li>
+            <li><item>Android version</item> (eg. Android 7.1)</li>
+            <li><item>Device</item> (eg. Google Nexus 5X [bullhead])</li>
+            <li><item>Tablets</item> (eg. Tablets 10" and above)</li>
+        </ul>
+
+
+        <h3>Google Play Reviews</h3>
+        <p>Google Play has its <a href="https://www.google.com/intl/en/policies/privacy/">own privacy policy</a>.
+            In addition to the name of the reviewer, the rating, and the text of the review (which are all available publicly), Google provides some or all of the following information to the developer.</p>
+        <ul>
+            <li><item>Version code</item> (eg. 7)</li>
+            <li><item>Version name</item> (eg. 1.6)</li>
+            <li><item>Android version</item> (eg. Android 5.1)</li>
+            <li><item>Device</item> (eg. Galaxy S6 Edge+ [zenlte])</li>
+            <li><item>Manufacturer</item> (eg. Samsung)</li>
+            <li><item>Device type</item> (eg. Phone)</li>
+            <li><item>CPU make</item> (eg. Samsung)</li>
+            <li><item>CPU model</item> (eg. Exynos 7420)</li>
+            <li><item>Screen density</item> (eg. 560 dpi)</li>
+            <li><item>Screen size</item> (eg. 2560 x 1440)</li>
+            <li><item>RAM</item> (eg. 4096 MB)</li>
+            <li><item>Native platform</item> (eg. armeabi-v7a,armeabi,arm64v8a)</li>
+            <li><item>OpenGL ES version</item> (eg. 3.1)</li>
+            <li><item>Device language</item> (eg. English)</li>
+        </ul>
+
+
+        <h3>Direct Communications</h3>
+        <p>Users may choose to send direct communications to Stoutner, like email messages and comments on <a href="https://www.stoutner.com/">stoutner.com</a>.</p>
+
+
+        <h3>Use of Information</h3>
+        <p><strong class="blue">Stoutner may use this information to assist in the development of Privacy Browser and communicate the status of the project to users.</strong>
+            <strong class="red">Stoutner will never sell this information nor transfer it to any third party that would use it for advertising or marketing.</strong></p>
+
+        <hr />
+        <p style="text-align: center;"><em>Revision 1.5, 11 January 2018</em></p>
+    </body>
+</html>
\ No newline at end of file
diff --git a/app/src/main/assets/ru/guide_domain_settings_dark.html b/app/src/main/assets/ru/guide_domain_settings_dark.html
new file mode 100644 (file)
index 0000000..a8e4060
--- /dev/null
@@ -0,0 +1,39 @@
+<!--
+  Copyright © 2017-2018 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/>. -->
+
+<html>
+    <head>
+        <meta charset="UTF-8">
+
+        <link rel="stylesheet" href="../en/css/dark_theme.css">
+    </head>
+
+    <body>
+        <h3><img class="title" src="../en/images/ic_dns_blue_dark.png"> Secure Web Browsing</h3>
+
+        <p>Privacy Browser’s default is to browse with JavaScript, cookies, and DOM storage disabled.
+            However, some websites legitimately need these features enabled to function correctly.
+            Domain settings can automatically turn on a specified set of features when visiting a designated domain.</p>
+
+        <p><img class="center" src="images/domain_settings.png"></p>
+
+        <p>When visiting a domain that has domain settings specified, the background of the URL text box is green.</p>
+
+        <p><img class="center" src="images/green_url_bar.png"></p>
+    </body>
+</html>
\ No newline at end of file
diff --git a/app/src/main/assets/ru/guide_domain_settings_light.html b/app/src/main/assets/ru/guide_domain_settings_light.html
new file mode 100644 (file)
index 0000000..f9d229e
--- /dev/null
@@ -0,0 +1,39 @@
+<!--
+  Copyright © 2017-2018 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/>. -->
+
+<html>
+    <head>
+        <meta charset="UTF-8">
+
+        <link rel="stylesheet" href="../en/css/light_theme.css">
+    </head>
+
+    <body>
+        <h3><img class="title" src="../en/images/ic_dns_blue_light.png"> Secure Web Browsing</h3>
+
+        <p>Privacy Browser’s default is to browse with JavaScript, cookies, and DOM storage disabled.
+            However, some websites legitimately need these features enabled to function correctly.
+            Domain settings can automatically turn on a specified set of features when visiting a designated domain.</p>
+
+        <p><img class="center" src="images/domain_settings.png"></p>
+
+        <p>When visiting a domain that has domain settings specified, the background of the URL text box is green.</p>
+
+        <p><img class="center" src="images/green_url_bar.png"></p>
+    </body>
+</html>
\ No newline at end of file
diff --git a/app/src/main/assets/ru/images/bookmarks.png b/app/src/main/assets/ru/images/bookmarks.png
new file mode 100644 (file)
index 0000000..dfbc7f2
Binary files /dev/null and b/app/src/main/assets/ru/images/bookmarks.png differ
diff --git a/app/src/main/assets/ru/images/domain_settings.png b/app/src/main/assets/ru/images/domain_settings.png
new file mode 100644 (file)
index 0000000..d8fb3b9
Binary files /dev/null and b/app/src/main/assets/ru/images/domain_settings.png differ
diff --git a/app/src/main/assets/ru/images/green_url_bar.png b/app/src/main/assets/ru/images/green_url_bar.png
new file mode 100644 (file)
index 0000000..8997caa
Binary files /dev/null and b/app/src/main/assets/ru/images/green_url_bar.png differ
index c4715ec5a0fb4ae144dcf1c0c6a5f24e86956f32..76542cb8d3ebc0d6020ac9ebcf1ec376cffc049f 100644 (file)
@@ -21,6 +21,7 @@
 
 package com.stoutner.privacybrowser.activities;
 
+import android.Manifest;
 import android.annotation.SuppressLint;
 import android.app.DialogFragment;
 import android.app.DownloadManager;
@@ -31,6 +32,7 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
 import android.content.res.Configuration;
 import android.database.Cursor;
 import android.graphics.Bitmap;
@@ -43,6 +45,7 @@ import android.net.http.SslCertificate;
 import android.net.http.SslError;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Environment;
 import android.os.Handler;
 import android.preference.PreferenceManager;
 import android.print.PrintDocumentAdapter;
@@ -52,6 +55,7 @@ import android.support.design.widget.CoordinatorLayout;
 import android.support.design.widget.FloatingActionButton;
 import android.support.design.widget.NavigationView;
 import android.support.design.widget.Snackbar;
+import android.support.v4.app.ActivityCompat;
 import android.support.v4.content.ContextCompat;
 // `ShortcutInfoCompat`, `ShortcutManagerCompat`, and `IconCompat` can be switched to the non-compat version once API >= 26.
 import android.support.v4.content.pm.ShortcutInfoCompat;
@@ -109,6 +113,7 @@ import com.stoutner.privacybrowser.dialogs.CreateBookmarkDialog;
 import com.stoutner.privacybrowser.dialogs.CreateBookmarkFolderDialog;
 import com.stoutner.privacybrowser.dialogs.CreateHomeScreenShortcutDialog;
 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.HttpAuthenticationDialog;
@@ -139,12 +144,12 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-// We need to use AppCompatActivity from android.support.v7.app.AppCompatActivity to have access to the SupportActionBar until the minimum API is >= 21.
+// 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 AddDomainDialog.AddDomainListener, CreateBookmarkDialog.CreateBookmarkListener,
         CreateBookmarkFolderDialog.CreateBookmarkFolderListener, CreateHomeScreenShortcutDialog.CreateHomeScreenSchortcutListener, DownloadFileDialog.DownloadFileListener,
-        DownloadImageDialog.DownloadImageListener, EditBookmarkDialog.EditBookmarkListener, EditBookmarkFolderDialog.EditBookmarkFolderListener, HttpAuthenticationDialog.HttpAuthenticationListener,
-        NavigationView.OnNavigationItemSelectedListener, PinnedSslCertificateMismatchDialog.PinnedSslCertificateMismatchListener, SslCertificateErrorDialog.SslCertificateErrorListener,
-        UrlHistoryDialog.UrlHistoryListener {
+        DownloadImageDialog.DownloadImageListener, DownloadLocationPermissionDialog.DownloadLocationPermissionDialogListener, EditBookmarkDialog.EditBookmarkListener,
+        EditBookmarkFolderDialog.EditBookmarkFolderListener, HttpAuthenticationDialog.HttpAuthenticationListener, NavigationView.OnNavigationItemSelectedListener,
+        PinnedSslCertificateMismatchDialog.PinnedSslCertificateMismatchListener, SslCertificateErrorDialog.SslCertificateErrorListener, UrlHistoryDialog.UrlHistoryListener {
 
     // `darkTheme` is public static so it can be accessed from `AboutActivity`, `GuideActivity`, `AddDomainDialog`, `SettingsActivity`, `DomainsActivity`, `DomainsListFragment`, `BookmarksActivity`,
     // `BookmarksDatabaseViewActivity`, `CreateBookmarkDialog`, `CreateBookmarkFolderDialog`, `DownloadFileDialog`, `DownloadImageDialog`, `EditBookmarkDialog`, `EditBookmarkFolderDialog`,
@@ -302,7 +307,7 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
     private boolean reapplyDomainSettingsOnRestart;
 
     // `reapplyAppSettingsOnRestart` is used in `onNavigationItemSelected()` and `onRestart()`.
-    private boolean reapplyAppSettingsOnRestert;
+    private boolean reapplyAppSettingsOnRestart;
 
     // `currentDomainName` is used in `onCreate()`, `onOptionsItemSelected()`, `onNavigationItemSelected()`, `onAddDomain()`, and `applyDomainSettings()`.
     private String currentDomainName;
@@ -390,9 +395,22 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
     // `oldFolderNameString` is used in `onCreate()` and `onSaveEditBookmarkFolder()`.
     private String oldFolderNameString;
 
+    // The download strings are used in `onCreate()` and `onRequestPermissionResult()`.
+    private String downloadUrl;
+    private String downloadContentDisposition;
+    private long downloadContentLength;
+
+    // `downloadImageUrl` is used in `onCreateContextMenu()` and `onRequestPermissionResult()`.
+    private String downloadImageUrl;
+
+    // The request codes are used in `onCreate()`, `onCreateContextMenu()`, `onCloseDownloadLocationPermissionDialog()`, and `onRequestPermissionResult()`.
+    private final int DOWNLOAD_FILE_REQUEST_CODE = 1;
+    private final int DOWNLOAD_IMAGE_REQUEST_CODE = 2;
+
     @Override
     // Remove Android Studio's warning about the dangers of using SetJavaScriptEnabled.  The whole premise of Privacy Browser is built around an understanding of these dangers.
-    @SuppressLint({"SetJavaScriptEnabled"})
+    // Also, remove the warning about needing to override `performClick()` when using an `OnTouchListener` with `WebView`.
+    @SuppressLint({"SetJavaScriptEnabled", "ClickableViewAccessibility"})
     // Remove Android Studio's warning about deprecations.  We have to use the deprecated `getColor()` until API >= 23.
     @SuppressWarnings("deprecation")
     protected void onCreate(Bundle savedInstanceState) {
@@ -941,9 +959,33 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
 
         // Allow the downloading of files.
         mainWebView.setDownloadListener((String url, String userAgent, String contentDisposition, String mimetype, long contentLength) -> {
-            // Show the `DownloadFileDialog` `AlertDialog` and name this instance `@string/download`.
-            AppCompatDialogFragment downloadFileDialogFragment = DownloadFileDialog.fromUrl(url, contentDisposition, contentLength);
-            downloadFileDialogFragment.show(getSupportFragmentManager(), getString(R.string.download));
+            // Check to see if the WRITE_EXTERNAL_STORAGE permission has already been granted.
+            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {
+                // The WRITE_EXTERNAL_STORAGE permission needs to be requested.
+
+                // Store the variables for future use by `onRequestPermissionsResult()`.
+                downloadUrl = url;
+                downloadContentDisposition = contentDisposition;
+                downloadContentLength = contentLength;
+
+                // Show a dialog if the user has previously denied the permission.
+                if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {  // Show a dialog explaining the request first.
+                    // Get a handle for the download location permission alert dialog and set the download type to DOWNLOAD_FILE.
+                    DialogFragment downloadLocationPermissionDialogFragment = DownloadLocationPermissionDialog.downloadType(DownloadLocationPermissionDialog.DOWNLOAD_FILE);
+
+                    // Show the download location permission alert dialog.  The permission will be requested when the the dialog is closed.
+                    downloadLocationPermissionDialogFragment.show(getFragmentManager(), getString(R.string.download_location));
+                } else {  // Show the permission request directly.
+                    // Request the permission.  The download dialog will be launched by `onRequestPermissionResult()`.
+                    ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, DOWNLOAD_FILE_REQUEST_CODE);
+                }
+            } else {  // The WRITE_EXTERNAL_STORAGE permission has already been granted.
+                // Get a handle for the download file alert dialog.
+                AppCompatDialogFragment downloadFileDialogFragment = DownloadFileDialog.fromUrl(url, contentDisposition, contentLength);
+
+                // Show the download file alert dialog.
+                downloadFileDialogFragment.show(getSupportFragmentManager(), getString(R.string.download));
+            }
         });
 
         // Allow pinch to zoom.
@@ -1360,7 +1402,7 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
         super.onRestart();
 
         // Apply the app settings if returning from the Settings activity..
-        if (reapplyAppSettingsOnRestert) {
+        if (reapplyAppSettingsOnRestart) {
             // Apply the app settings.
             applyAppSettings();
 
@@ -1374,7 +1416,7 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
             }
 
             // Reset the return from settings flag.
-            reapplyAppSettingsOnRestert = false;
+            reapplyAppSettingsOnRestart = false;
         }
 
         // Apply the domain settings if returning from the Domains activity.
@@ -2033,7 +2075,7 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
 
             case R.id.settings:
                 // Set the flag to reapply app settings on restart when returning from Settings.
-                reapplyAppSettingsOnRestert = true;
+                reapplyAppSettingsOnRestart = true;
 
                 // Set the flag to reapply the domain settings on restart when returning from Settings.
                 reapplyDomainSettingsOnRestart = true;
@@ -2302,9 +2344,31 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
 
                 // Add a `Download Image` entry.
                 menu.add(R.string.download_image).setOnMenuItemClickListener((MenuItem item) -> {
-                    // Show the `DownloadImageDialog` `AlertDialog` and name this instance `@string/download`.
-                    AppCompatDialogFragment downloadImageDialogFragment = DownloadImageDialog.imageUrl(imageUrl);
-                    downloadImageDialogFragment.show(getSupportFragmentManager(), getString(R.string.download));
+                    // Check to see if the WRITE_EXTERNAL_STORAGE permission has already been granted.
+                    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {
+                        // The WRITE_EXTERNAL_STORAGE permission needs to be requested.
+
+                        // Store the image URL for use by `onRequestPermissionResult()`.
+                        downloadImageUrl = imageUrl;
+
+                        // Show a dialog if the user has previously denied the permission.
+                        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {  // Show a dialog explaining the request first.
+                            // Get a handle for the download location permission alert dialog and set the download type to DOWNLOAD_IMAGE.
+                            DialogFragment downloadLocationPermissionDialogFragment = DownloadLocationPermissionDialog.downloadType(DownloadLocationPermissionDialog.DOWNLOAD_IMAGE);
+
+                            // Show the download location permission alert dialog.  The permission will be requested when the dialog is closed.
+                            downloadLocationPermissionDialogFragment.show(getFragmentManager(), getString(R.string.download_location));
+                        } else {  // Show the permission request directly.
+                            // Request the permission.  The download dialog will be launched by `onRequestPermissionResult().
+                            ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, DOWNLOAD_IMAGE_REQUEST_CODE);
+                        }
+                    } else {  // The WRITE_EXTERNAL_STORAGE permission has already been granted.
+                        // Get a handle for the download image alert dialog.
+                        AppCompatDialogFragment downloadImageDialogFragment = DownloadImageDialog.imageUrl(imageUrl);
+
+                        // Show the download image alert dialog.
+                        downloadImageDialogFragment.show(getSupportFragmentManager(), getString(R.string.download));
+                    }
                     return false;
                 });
 
@@ -2339,9 +2403,31 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
 
                 // Add a `Download Image` entry.
                 menu.add(R.string.download_image).setOnMenuItemClickListener((MenuItem item) -> {
-                    // Show the `DownloadImageDialog` `AlertDialog` and name this instance `@string/download`.
-                    AppCompatDialogFragment downloadImageDialogFragment = DownloadImageDialog.imageUrl(imageUrl);
-                    downloadImageDialogFragment.show(getSupportFragmentManager(), getString(R.string.download));
+                    // Check to see if the WRITE_EXTERNAL_STORAGE permission has already been granted.
+                    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {
+                        // The WRITE_EXTERNAL_STORAGE permission needs to be requested.
+
+                        // Store the image URL for use by `onRequestPermissionResult()`.
+                        downloadImageUrl = imageUrl;
+
+                        // Show a dialog if the user has previously denied the permission.
+                        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {  // Show a dialog explaining the request first.
+                            // Get a handle for the download location permission alert dialog and set the download type to DOWNLOAD_IMAGE.
+                            DialogFragment downloadLocationPermissionDialogFragment = DownloadLocationPermissionDialog.downloadType(DownloadLocationPermissionDialog.DOWNLOAD_IMAGE);
+
+                            // Show the download location permission alert dialog.  The permission will be requested when the dialog is closed.
+                            downloadLocationPermissionDialogFragment.show(getFragmentManager(), getString(R.string.download_location));
+                        } else {  // Show the permission request directly.
+                            // Request the permission.  The download dialog will be launched by `onRequestPermissionResult().
+                            ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, DOWNLOAD_IMAGE_REQUEST_CODE);
+                        }
+                    } else {  // The WRITE_EXTERNAL_STORAGE permission has already been granted.
+                        // Get a handle for the download image alert dialog.
+                        AppCompatDialogFragment downloadImageDialogFragment = DownloadImageDialog.imageUrl(imageUrl);
+
+                        // Show the download image alert dialog.
+                        downloadImageDialogFragment.show(getSupportFragmentManager(), getString(R.string.download));
+                    }
                     return false;
                 });
 
@@ -2490,6 +2576,58 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
         ShortcutManagerCompat.requestPinShortcut(this, shortcutInfoBuilder.build(), null);
     }
 
+    @Override
+    public void onCloseDownloadLocationPermissionDialog(int downloadType) {
+        switch (downloadType) {
+            case DownloadLocationPermissionDialog.DOWNLOAD_FILE:
+                // Request the WRITE_EXTERNAL_STORAGE permission with a file request code.
+                ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, DOWNLOAD_FILE_REQUEST_CODE);
+                break;
+
+            case DownloadLocationPermissionDialog.DOWNLOAD_IMAGE:
+                // Request the WRITE_EXTERNAL_STORAGE permission with an image request code.
+                ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, DOWNLOAD_IMAGE_REQUEST_CODE);
+                break;
+        }
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
+        switch (requestCode) {
+            case DOWNLOAD_FILE_REQUEST_CODE:
+                // Show the download file alert dialog.  When the dialog closes, the correct command will be used based on the permission status.
+                AppCompatDialogFragment downloadFileDialogFragment = DownloadFileDialog.fromUrl(downloadUrl, downloadContentDisposition, downloadContentLength);
+
+                // On API 23, displaying the fragment must be delayed or the app will crash.
+                if (Build.VERSION.SDK_INT == 23) {
+                    new Handler().postDelayed(() -> downloadFileDialogFragment.show(getSupportFragmentManager(), getString(R.string.download)), 500);
+                } else {
+                    downloadFileDialogFragment.show(getSupportFragmentManager(), getString(R.string.download));
+                }
+
+                // Reset the download variables.
+                downloadUrl = "";
+                downloadContentDisposition = "";
+                downloadContentLength = 0;
+                break;
+
+            case DOWNLOAD_IMAGE_REQUEST_CODE:
+                // Show the download image alert dialog.  When the dialog closes, the correct command will be used based on the permission status.
+                AppCompatDialogFragment downloadImageDialogFragment = DownloadImageDialog.imageUrl(downloadImageUrl);
+
+                // On API 23, displaying the fragment must be delayed or the app will crash.
+                if (Build.VERSION.SDK_INT == 23) {
+                    new Handler().postDelayed(() -> downloadImageDialogFragment.show(getSupportFragmentManager(), getString(R.string.download)), 500);
+                } else {
+                    downloadImageDialogFragment.show(getSupportFragmentManager(), getString(R.string.download));
+                }
+
+                // Reset the image URL variable.
+                downloadImageUrl = "";
+                break;
+        }
+    }
+
     @Override
     public void onDownloadImage(AppCompatDialogFragment dialogFragment, String imageUrl) {
         // Download the image if it has an HTTP or HTTPS URI.
@@ -2510,15 +2648,17 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
                 downloadRequest.addRequestHeader("Cookie", cookies);
             }
 
-            // Get the file name from `dialogFragment`.
+            // Get the file name from the dialog fragment.
             EditText downloadImageNameEditText = dialogFragment.getDialog().findViewById(R.id.download_image_name);
             String imageName = downloadImageNameEditText.getText().toString();
 
-            // Once we have `WRITE_EXTERNAL_STORAGE` permissions we can use `setDestinationInExternalPublicDir`.
-            if (Build.VERSION.SDK_INT >= 23) { // If API >= 23, set the download save in the the `DIRECTORY_DOWNLOADS` using `imageName`.
-                downloadRequest.setDestinationInExternalFilesDir(this, "/", imageName);
-            } else { // Only set the title using `imageName`.
-                downloadRequest.setTitle(imageName);
+            // Specify the download location.
+            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {  // External write permission granted.
+                // Download to the public download directory.
+                downloadRequest.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, imageName);
+            } else {  // External write permission denied.
+                // Download to the app's external download directory.
+                downloadRequest.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, imageName);
             }
 
             // Allow `MediaScanner` to index the download if it is a media file.
@@ -2544,7 +2684,6 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
     public void onDownloadFile(AppCompatDialogFragment dialogFragment, String downloadUrl) {
         // Download the file if it has an HTTP or HTTPS URI.
         if (downloadUrl.startsWith("http")) {
-
             // Get a handle for the system `DOWNLOAD_SERVICE`.
             DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
 
@@ -2561,15 +2700,17 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
                 downloadRequest.addRequestHeader("Cookie", cookies);
             }
 
-            // Get the file name from `dialogFragment`.
+            // Get the file name from the dialog fragment.
             EditText downloadFileNameEditText = dialogFragment.getDialog().findViewById(R.id.download_file_name);
             String fileName = downloadFileNameEditText.getText().toString();
 
-            // Once we have `WRITE_EXTERNAL_STORAGE` permissions we can use `setDestinationInExternalPublicDir`.
-            if (Build.VERSION.SDK_INT >= 23) { // If API >= 23, set the download location to `/sdcard/Android/data/com.stoutner.privacybrowser.standard/files` named `fileName`.
-                downloadRequest.setDestinationInExternalFilesDir(this, "/", fileName);
-            } else { // Only set the title using `fileName`.
-                downloadRequest.setTitle(fileName);
+            // Specify the download location.
+            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {  // External write permission granted.
+                // Download to the public download directory.
+                downloadRequest.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
+            } else {  // External write permission denied.
+                // Download to the app's external download directory.
+                downloadRequest.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, fileName);
             }
 
             // Allow `MediaScanner` to index the download if it is a media file.
@@ -3471,4 +3612,4 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
             bookmarksTitleTextView.setText(currentBookmarksFolder);
         }
     }
-}
+}
\ No newline at end of file
index 4cd4e7fe3972f57a5d5ffc42bef066c895e5f075..618406c20be0e74922bde980c8247f6b1190ff43 100644 (file)
@@ -28,6 +28,7 @@ import com.stoutner.privacybrowser.R;
 import com.stoutner.privacybrowser.activities.MainWebViewActivity;
 
 public class AboutViewSourceDialog extends DialogFragment {
+    @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
         // Use a builder to create the alert dialog.
         AlertDialog.Builder dialogBuilder;
index a496eb2075810042569d126019e307b644d59f29..cbf08390254a854a4023c234e402117e279dfeff 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
  *
@@ -48,9 +48,10 @@ public class DownloadFileDialog extends AppCompatDialogFragment {
     private String fileSize;
 
     public static DownloadFileDialog fromUrl(String urlString, String contentDisposition, long contentLength) {
-        // Create `argumentsBundle`.
+        // Create an arguments bundle.
         Bundle argumentsBundle = new Bundle();
 
+        // Create a variable for the file name string.
         String fileNameString;
 
         // Parse `filename` from `contentDisposition`.
@@ -65,12 +66,12 @@ public class DownloadFileDialog extends AppCompatDialogFragment {
             fileNameString = downloadUri.getLastPathSegment();
         }
 
-        // Store the variables in the `Bundle`.
+        // Store the variables in the bundle.
         argumentsBundle.putString("URL", urlString);
         argumentsBundle.putString("File_Name", fileNameString);
         argumentsBundle.putLong("File_Size", contentLength);
 
-        // Add `argumentsBundle` to this instance of `DownloadFileDialog`.
+        // Add the arguments bundle to this instance of `DownloadFileDialog`.
         DownloadFileDialog thisDownloadFileDialog = new DownloadFileDialog();
         thisDownloadFileDialog.setArguments(argumentsBundle);
         return thisDownloadFileDialog;
@@ -80,6 +81,9 @@ public class DownloadFileDialog extends AppCompatDialogFragment {
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        // Remove the warning below that `getArguments()` might be null.
+        assert getArguments() != null;
+
         // Store the strings in the local class variables.
         downloadUrl = getArguments().getString("URL");
         downloadFileName = getArguments().getString("File_Name");
@@ -120,6 +124,9 @@ public class DownloadFileDialog extends AppCompatDialogFragment {
     // `@SuppressLing("InflateParams")` removes the warning about using `null` as the parent view group when inflating the `AlertDialog`.
     @SuppressLint("InflateParams")
     public Dialog onCreateDialog(Bundle savedInstanceState) {
+        // Remove the warning below that `getActivity()` might be null;
+        assert getActivity() != null;
+
         // Get the activity's layout inflater.
         LayoutInflater layoutInflater = getActivity().getLayoutInflater();
 
@@ -140,20 +147,14 @@ public class DownloadFileDialog extends AppCompatDialogFragment {
         dialogBuilder.setView(layoutInflater.inflate(R.layout.download_file_dialog, null));
 
         // Set an `onClick()` listener on the negative button.
-        dialogBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
-            @Override
-            public void onClick(DialogInterface dialog, int which) {
-                // Do nothing if `Cancel` is clicked.  The `Dialog` will automatically close.
-            }
+        dialogBuilder.setNegativeButton(R.string.cancel, (DialogInterface dialog, int which) -> {
+            // Do nothing if `Cancel` is clicked.  The `Dialog` will automatically close.
         });
 
         // Set an `onClick()` listener on the positive button
-        dialogBuilder.setPositiveButton(R.string.download, new DialogInterface.OnClickListener() {
-            @Override
-            public void onClick(DialogInterface dialog, int which) {
-                // trigger `onDownloadFile()` and return the `DialogFragment` and the download URL to the parent activity.
-                downloadFileListener.onDownloadFile(DownloadFileDialog.this, downloadUrl);
-            }
+        dialogBuilder.setPositiveButton(R.string.download, (DialogInterface dialog, int which) -> {
+            // trigger `onDownloadFile()` and return the `DialogFragment` and the download URL to the parent activity.
+            downloadFileListener.onDownloadFile(DownloadFileDialog.this, downloadUrl);
         });
 
         // Create an `AlertDialog` from the `AlertDialog.Builder`.
@@ -169,28 +170,27 @@ public class DownloadFileDialog extends AppCompatDialogFragment {
         alertDialog.show();
 
         // Set the text for `downloadFileSizeTextView`.
-        TextView downloadFileSizeTextView = (TextView) alertDialog.findViewById(R.id.download_file_size);
+        TextView downloadFileSizeTextView = alertDialog.findViewById(R.id.download_file_size);
         downloadFileSizeTextView.setText(fileSize);
 
         // Set the text for `downloadFileNameTextView`.
-        EditText downloadFileNameTextView = (EditText) alertDialog.findViewById(R.id.download_file_name);
+        EditText downloadFileNameTextView = alertDialog.findViewById(R.id.download_file_name);
         downloadFileNameTextView.setText(downloadFileName);
 
         // Allow the `enter` key on the keyboard to save the file from `downloadFileNameTextView`.
-        downloadFileNameTextView.setOnKeyListener(new View.OnKeyListener() {
-            @Override
-            public boolean onKey (View v, int keyCode, KeyEvent event) {
-                // If the event is an `ACTION_DOWN` on the `enter` key, initiate the download.
-                if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
-                    // trigger `onDownloadFile()` and return the `DialogFragment` and the URL to the parent activity.
-                    downloadFileListener.onDownloadFile(DownloadFileDialog.this, downloadUrl);
-                    // Manually dismiss `alertDialog`.
-                    alertDialog.dismiss();
-                    // Consume the event.
-                    return true;
-                } else {  // If any other key was pressed, do not consume the event.
-                    return false;
-                }
+        downloadFileNameTextView.setOnKeyListener((View v, int keyCode, KeyEvent event) -> {
+            // If the event is an `ACTION_DOWN` on the `enter` key, initiate the download.
+            if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
+                // trigger `onDownloadFile()` and return the `DialogFragment` and the URL to the parent activity.
+                downloadFileListener.onDownloadFile(DownloadFileDialog.this, downloadUrl);
+
+                // 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;
             }
         });
 
index c6bcb6fbd5cfba16f2064dc3e0fd4199c66758ab..4568607ddd45a6172a1d3196af01902ffa4ae245 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
  *
@@ -46,19 +46,21 @@ public class DownloadImageDialog extends AppCompatDialogFragment {
     private String imageFileName;
 
     public static DownloadImageDialog imageUrl(String imageUrlString) {
-        // Create `argumentsBundle`.
+        // Create an arguments bundle.
         Bundle argumentsBundle = new Bundle();
 
+        // Create a variable for the image name string.
         String imageNameString;
 
+        // Extract the image name string from the image URL.
         Uri imageUri = Uri.parse(imageUrlString);
         imageNameString = imageUri.getLastPathSegment();
 
-        // Store the variables in the `Bundle`.
+        // Store the variables in the bundle.
         argumentsBundle.putString("URL", imageUrlString);
         argumentsBundle.putString("Image_Name", imageNameString);
 
-        // Add `argumentsBundle` to this instance of `DownloadFileDialog`.
+        // Add the arguments bundle to this instance of `DownloadFileDialog`.
         DownloadImageDialog thisDownloadFileDialog = new DownloadImageDialog();
         thisDownloadFileDialog.setArguments(argumentsBundle);
         return thisDownloadFileDialog;
@@ -68,6 +70,9 @@ public class DownloadImageDialog extends AppCompatDialogFragment {
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        // Remove the warning below that `getArguments()` might be null.
+        assert getArguments() != null;
+
         // Store the strings in the local class variables.
         imageUrl = getArguments().getString("URL");
         imageFileName = getArguments().getString("Image_Name");
@@ -97,6 +102,9 @@ public class DownloadImageDialog extends AppCompatDialogFragment {
     @Override
     @NonNull
     public Dialog onCreateDialog(Bundle savedInstanceState) {
+        // Remove the warning below that `.getActivity()` might be null.
+        assert getActivity() != null;
+
         // Get the activity's layout inflater.
         LayoutInflater layoutInflater = getActivity().getLayoutInflater();
 
@@ -117,20 +125,14 @@ public class DownloadImageDialog extends AppCompatDialogFragment {
         dialogBuilder.setView(layoutInflater.inflate(R.layout.download_image_dialog, null));
 
         // Set an `onClick()` listener on the negative button.
-        dialogBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
-            @Override
-            public void onClick(DialogInterface dialog, int which) {
-                // Do nothing if `Cancel` is clicked.
-            }
+        dialogBuilder.setNegativeButton(R.string.cancel, (DialogInterface dialog, int which) -> {
+            // Do nothing if `Cancel` is clicked.
         });
 
         // Set an `onClick()` listener on the positive button
-        dialogBuilder.setPositiveButton(R.string.download, new DialogInterface.OnClickListener() {
-            @Override
-            public void onClick(DialogInterface dialog, int which) {
-                // trigger `onDownloadFile()` and return the `DialogFragment` and the download URL to the parent activity.
-                downloadImageListener.onDownloadImage(DownloadImageDialog.this, imageUrl);
-            }
+        dialogBuilder.setPositiveButton(R.string.download, (DialogInterface dialog, int which) -> {
+            // trigger `onDownloadFile()` and return the `DialogFragment` and the download URL to the parent activity.
+            downloadImageListener.onDownloadImage(DownloadImageDialog.this, imageUrl);
         });
 
 
@@ -147,28 +149,26 @@ public class DownloadImageDialog extends AppCompatDialogFragment {
         alertDialog.show();
 
         // Set the text for `downloadImageNameTextView`.
-        EditText downloadImageNameTextView = (EditText) alertDialog.findViewById(R.id.download_image_name);
+        EditText downloadImageNameTextView = alertDialog.findViewById(R.id.download_image_name);
         downloadImageNameTextView.setText(imageFileName);
 
         // Allow the `enter` key on the keyboard to save the file from `downloadImageNameTextView`.
-        downloadImageNameTextView.setOnKeyListener(new View.OnKeyListener() {
-            @Override
-            public boolean onKey (View v, int keyCode, KeyEvent event) {
-                // If the event is an `ACTION_DOWN` on the `enter` key, initiate the download.
-                if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
-                    // trigger `onDownloadImage()` and return the `DialogFragment` and the URL to the parent activity.
-                    downloadImageListener.onDownloadImage(DownloadImageDialog.this, imageUrl);
-                    // Manually dismiss `alertDialog`.
-                    alertDialog.dismiss();
-                    // Consume the event.
-                    return true;
-                } else {  // If any other key was pressed, do not consume the event.
-                    return false;
-                }
+        downloadImageNameTextView.setOnKeyListener((View v, int keyCode, KeyEvent event) -> {
+            // If the event is an `ACTION_DOWN` on the `enter` key, initiate the download.
+            if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
+                // trigger `onDownloadImage()` and return the `DialogFragment` and the URL to the parent activity.
+                downloadImageListener.onDownloadImage(DownloadImageDialog.this, imageUrl);
+
+                // 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;
             }
         });
 
-
         // `onCreateDialog` requires the return of an `AlertDialog`.
         return alertDialog;
     }
diff --git a/app/src/main/java/com/stoutner/privacybrowser/dialogs/DownloadLocationPermissionDialog.java b/app/src/main/java/com/stoutner/privacybrowser/dialogs/DownloadLocationPermissionDialog.java
new file mode 100644 (file)
index 0000000..0ad43d1
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * Copyright © 2018 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.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+
+import com.stoutner.privacybrowser.R;
+import com.stoutner.privacybrowser.activities.MainWebViewActivity;
+
+public class DownloadLocationPermissionDialog extends DialogFragment {
+    public static final int DOWNLOAD_FILE = 1;
+    public static final int DOWNLOAD_IMAGE = 2;
+
+    private int downloadType;
+
+    public static DownloadLocationPermissionDialog downloadType(int type) {
+        // Create an arguments bundle.
+        Bundle argumentsBundle = new Bundle();
+
+        // Store the download type in the bundle.
+        argumentsBundle.putInt("Download_Type", type);
+
+        // Add the arguments bundle to this instance of `DownloadLocationPermissionDialog`.
+        DownloadLocationPermissionDialog thisDownloadLocationPermissionDialog = new DownloadLocationPermissionDialog();
+        thisDownloadLocationPermissionDialog.setArguments(argumentsBundle);
+        return thisDownloadLocationPermissionDialog;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Store the download type in the local class variable.
+        downloadType = getArguments().getInt("Download_Type");
+    }
+
+    // The public interface is used to send information back to the parent activity.
+    public interface DownloadLocationPermissionDialogListener {
+        void onCloseDownloadLocationPermissionDialog(int downloadType);
+    }
+
+    // `downloadLocationPermissionDialogListener` is used in `onAttach()` and `onCreateDialog()`.
+    private DownloadLocationPermissionDialogListener downloadLocationPermissionDialogListener;
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+
+        // Check to make sure the parent activity implements the listener.
+        try {
+            downloadLocationPermissionDialogListener = (DownloadLocationPermissionDialogListener) context;
+        } catch (ClassCastException exception) {
+            throw new ClassCastException(context.toString() + " must implement DownloadLocationPermissionDialogListener.");
+        }
+    }
+
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        // Use a builder to create the alert dialog.
+        AlertDialog.Builder dialogBuilder;
+
+        // Set the style and the icon according to the theme.
+        if (MainWebViewActivity.darkTheme) {
+            dialogBuilder = new AlertDialog.Builder(getActivity(), R.style.PrivacyBrowserAlertDialogDark);
+            dialogBuilder.setIcon(R.drawable.downloads_dark);
+        } else {
+            dialogBuilder = new AlertDialog.Builder(getActivity(), R.style.PrivacyBrowserAlertDialogLight);
+            dialogBuilder.setIcon(R.drawable.downloads_light);
+        }
+
+        // Set an `onClick` listener on the negative button.  Using `null` as the listener closes the dialog without doing anything else.
+        dialogBuilder.setNegativeButton(R.string.ok, (DialogInterface dialog, int which) -> {
+            // Inform the parent activity that the dialog was closed.
+            downloadLocationPermissionDialogListener.onCloseDownloadLocationPermissionDialog(downloadType);
+        });
+
+        // Set the title.
+        dialogBuilder.setTitle(R.string.download_location);
+
+        // Set the text.
+        dialogBuilder.setMessage(R.string.download_location_message);
+
+        // `onCreateDialog` requires the return of an `AlertDialog`.
+        return dialogBuilder.create();
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/downloads.xml b/app/src/main/res/drawable/downloads.xml
deleted file mode 100644 (file)
index f4b6ec2..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<!-- `downloads.xml` comes from the Android Material icon set, where it is called `ic_file_download`.  It is released under the Apache License 2.0. -->
-<vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportHeight="24.0"
-    android:viewportWidth="24.0" >
-
-    <!-- We have to use a hard coded color until API >= 21.  Then we can use `@color`. -->
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M19,9h-4V3H9v6H5l7,7 7,-7zM5,18v2h14v-2H5z" />
-</vector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/downloads_dark.xml b/app/src/main/res/drawable/downloads_dark.xml
new file mode 100644 (file)
index 0000000..60ef58d
--- /dev/null
@@ -0,0 +1,13 @@
+<!-- `downloads_dark.xml` comes from the Android Material icon set, where it is called `ic_file_download`.  It is released under the Apache License 2.0. -->
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="24dp"
+    android:width="24dp"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0" >
+
+    <!-- The hard coded color must be used until API >= 21.  Then `@color` may be used. -->
+    <path
+        android:fillColor="#FFE0E0E0"
+        android:pathData="M19,9h-4V3H9v6H5l7,7 7,-7zM5,18v2h14v-2H5z" />
+</vector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/downloads_light.xml b/app/src/main/res/drawable/downloads_light.xml
new file mode 100644 (file)
index 0000000..41e2e1f
--- /dev/null
@@ -0,0 +1,13 @@
+<!-- `downloads_light.xml` comes from the Android Material icon set, where it is called `ic_file_download`.  It is released under the Apache License 2.0. -->
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="24dp"
+    android:width="24dp"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0" >
+
+    <!-- The hard coded color must be used until API >= 21.  Then `@color` may be used. -->
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M19,9h-4V3H9v6H5l7,7 7,-7zM5,18v2h14v-2H5z" />
+</vector>
\ No newline at end of file
index 444187eedf4cd6936572519dd4f417119862fabb..221781dd5fac54a9bf9f040ce7630b87ad5c8d4f 100644 (file)
             android:layout_width="match_parent"
             android:layout_height="wrap_content" >
 
-            <!-- `tools:ignore="ContentDescription"` suppresses the lint warning about supplying a content description for the `ImageView`,
-                 which isn't needed in this case because the `ImageView` is only decorative. -->
+            <!--`tools:ignore="RtlSymmetry"` suppressed the lint warning about adding `android:paddingStart`, which wouldn't work with this layout.
+                `tools:ignore="ContentDescription"` suppresses the lint warning about supplying a content description for the `ImageView`,
+                which isn't needed in this case because the `ImageView` is only decorative. -->
             <ImageView
                 android:id="@+id/about_version_icon"
                 android:layout_height="wrap_content"
                 android:layout_width="wrap_content"
                 android:src="@mipmap/privacy_browser"
                 android:paddingTop="10dp"
-                tools:ignore="ContentDescription" />
+                android:paddingEnd="5dp"
+                tools:ignore="RtlSymmetry,ContentDescription" />
 
             <TextView
                 android:id="@+id/about_version_privacy_browser_textview"
@@ -55,6 +57,7 @@
                 android:textStyle="bold"
                 android:textSize="22sp"
                 android:textColor="?attr/aboutTitle"
+                android:paddingTop="12dp"
                 android:layout_toEndOf="@id/about_version_icon" />
 
             <TextView
index eb30116cd4b0287f9ff7a29663fa83533bf9a0fa..fbab73912431d3bfac4f1cfc741e70a785ee8c6a 100644 (file)
@@ -51,7 +51,7 @@
         <item
             android:id="@+id/downloads"
             android:title="@string/downloads"
-            android:icon="@drawable/downloads"
+            android:icon="@drawable/downloads_light"
             android:orderInCategory="50" />
 
         <item
index c1be01a8c9e4ea363ea5614ee75a684092fe00eb..e72b0d551311066a181a2a320d0a15c1484a85bf 100644 (file)
@@ -3,6 +3,8 @@
 <!--
   Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
 
+  Translation 2018 Stefan Erhardt.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+
   Translation 2016 Aaron Gerlach <aaron@gerlach.com>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
     <string name="response_body">Antwortinhalt</string>
     <string name="error_body">Fehler</string>
     <string name="about_view_source">Über Quelltext</string>
-    <string name="about_view_source_message">Weil Androids WebView keine Quelltext-Informationen zur Verfügung stellt, muss eine separate a separate Serveranfrage mit system tools gestellt werden, die die hier dargestellten Daten erhält.
-        Deshalb können Unterschiede zwischen diesen Daten und der mit Webview dargestellten Webseite auftreten. Es ist geplant, mit Version 4.x eine eigene Engine einzuführen, die diese Einschränkungen umgeht.</string>
+    <string name="about_view_source_message">Weil Androids WebView keine Quelltext-Informationen zur Verfügung stellt, muss eine separate a separate Serveranfrage mit system tools gestellt werden,
+        die die hier dargestellten Daten erhält. Deshalb können Unterschiede zwischen diesen Daten und der mit Webview dargestellten Webseite auftreten.
+        Es ist geplant, mit Version 4.x eine eigene Engine einzuführen, die diese Einschränkungen umgeht.</string>
 
     <!-- Create Home Screen Shortcut Alert Dialog. -->
     <string name="create_shortcut">Verknüpfung erstellen</string>
         <string name="javascript_preference">JavaScript standardmäßig aktivieren</string>
         <string name="javascript_preference_summary">JavaScript ermöglicht es Websites, Programme (Scripts) auf Ihrem Gerät auszuführen.</string>
         <string name="first_party_cookies_preference">Erstanbieter-Cookies standardmäßig aktivieren</string>
-        <string name="first_party_cookies_preference_summary">Auf Geräten mit älterer Android-Version als Lollipop (Version 5.0) wird zusammen mit dieser auch die Option für Drittanbieter-Cookies aktiviert.</string>
+        <string name="first_party_cookies_preference_summary">Auf Geräten mit älterer Android-Version als Lollipop (Version 5.0)
+            wird zusammen mit dieser auch die Option für Drittanbieter-Cookies aktiviert.</string>
         <string name="third_party_cookies_preference">Drittanbieter-Cookies standardmäßig aktivieren</string>
         <string name="third_party_cookies_summary">Diese Option benötigt Android Lollipop (Version 5.0) oder höher. Sie hat keine Auswirkungen, wenn Erstanbieter-Cookies deaktiviert sind.</string>
         <string name="dom_storage_preference">DOM-Speicher standardmäßig aktivieren</string>
index ae0e54b927d0b9e88554a46517dabcb01c50cf46..7af5f39399df6838f3c5e82fda7b5c9963e6d938 100644 (file)
@@ -61,7 +61,8 @@
     <!-- View SSL Certificate. -->
     <string name="view_ssl_certificate">Ver certificado SSL</string>
     <string name="unencrypted_website">Web sin cifrar</string>
-    <string name="no_ssl_certificate">La comunicación con esta página web no está cifrada. Esto permite a terceras partes interceptar información, rastrear su navegación e inyectar contenido malicioso.</string>
+    <string name="no_ssl_certificate">La comunicación con esta página web no está cifrada.
+        Esto permite a terceras partes interceptar información, rastrear su navegación e inyectar contenido malicioso.</string>
     <string name="ssl_certificate">Certificado SSL</string>
     <string name="close">Cerrar</string>
     <string name="domain">Dominio</string>
     <string name="response_body">Cuerpo de respuesta</string>
     <string name="error_body">Cuerpo del error</string>
     <string name="about_view_source">Acerca de ver la fuente</string>
-    <string name="about_view_source_message">Debido a que WebView de Android no expone la información fuente, se hizo una solicitud por separado utilizando las herramientas del sistema para recopilar la información mostrada en esta actividad.
-        Puede haber algunas diferencias entre estos datos y los utilizados por WebView en la actividad principal. Esta limitación se eliminará en la serie 4.x con el lanzamiento de Privacy WebView.</string>
+    <string name="about_view_source_message">Debido a que WebView de Android no expone la información fuente,
+        se hizo una solicitud por separado utilizando las herramientas del sistema para recopilar la información mostrada en esta actividad.
+        Puede haber algunas diferencias entre estos datos y los utilizados por WebView en la actividad principal.
+        Esta limitación se eliminará en la serie 4.x con el lanzamiento de Privacy WebView.</string>
 
     <!-- Create Home Screen Shortcut Alert Dialog. -->
     <string name="create_shortcut">Crear acceso directo</string>
         <string name="javascript_preference">Habilitar Javascript por defecto</string>
         <string name="javascript_preference_summary">Javascript permite a las webs ejecutar programas (scripts) en el dispositivo.</string>
         <string name="first_party_cookies_preference">Habilitar cookies de primera parte por defecto</string>
-        <string name="first_party_cookies_preference_summary">Dispositivos con versiones de Android más antiguas que Lollipop (versión 5.0) también habilitarán las cookies de terceras partes con este ajuste.</string>
+        <string name="first_party_cookies_preference_summary">Dispositivos con versiones de Android más antiguas que Lollipop (versión 5.0)
+            también habilitarán las cookies de terceras partes con este ajuste.</string>
         <string name="third_party_cookies_preference">Habilar cookies de terceras partes por defecto</string>
         <string name="third_party_cookies_summary">Este ajuste requiere Android Lollipop (versión 5.0) o mayor.  No tiene efecto si las cookies de primera parte están deshabilitadas.</string>
         <string name="dom_storage_preference">Habilitar almacenamiento DOM por defecto</string>
         <string name="full_screen_browsing_mode">Navegación de pantalla completa</string>
         <string name="full_screen_browsing_mode_summary">Doble toque para alternar a modo de navegación de pantalla completa.</string>
         <string name="hide_system_bars">Esconder barras del systema</string>
-        <string name="hide_system_bars_summary">Esconder las barras de estado y de navegación en el modo de navegación a pantalla completa.  Esto no funciona bien si el teclado es mostrado durante el modo de navegación a pantalla completa.</string>
+        <string name="hide_system_bars_summary">Esconder las barras de estado y de navegación en el modo de navegación a pantalla completa.
+            Esto no funciona bien si el teclado es mostrado durante el modo de navegación a pantalla completa.</string>
         <string name="translucent_navigation_bar">Barra de navegación translúcida</string>
         <string name="translucent_navigation_bar_summary">Hacer la barra de navegación translúcida en el modo de navegación a pantalla completa.</string>
     <string name="clear_everything">Borrar todo</string>
-        <string name="clear_everything_summary">Borra cookies, almacenamiento DOM, datos de formulario y la caché de  WebView.  A continuación borra manualmente los directorios “app_webview” y “cache”.</string>
+        <string name="clear_everything_summary">Borra cookies, almacenamiento DOM, datos de formulario y la caché de  WebView.
+            A continuación borra manualmente los directorios “app_webview” y “cache”.</string>
         <string name="clear_cookies_preference">Borrar cookies</string>
         <string name="clear_cookies_summary">Borra las cookies de primera y terceras partes.</string>
         <string name="clear_dom_storage_preference">Borrar almacenamiento DOM</string>
index 6cd21075d912caa212097c6da6f8e22c5d7d4317..16d85aef8aec2c966f0d66586a7ef722a160d075 100644 (file)
     <string name="response_body">Response Body</string>
     <string name="error_body">Error Body</string>
     <string name="about_view_source">About View Source</string>
-    <string name="about_view_source_message">Because Android’s WebView does not expose the source information, a separate request was made using system tools to gather the information displayed in this activity.
+    <string name="about_view_source_message">Because Android’s WebView does not expose the source information,
+        a separate request was made using system tools to gather the information displayed in this activity.
         There may be some differences between this data and that used by the WebView in the main activity. This limitation will be removed in the 4.x series with the release of Privacy WebView.</string>
 
     <!-- Create Home Screen Shortcut Alert Dialog. -->
         <string name="full_screen_browsing_mode">Full screen browsing mode</string>
         <string name="full_screen_browsing_mode_summary">Double-tap to toggle full screen browsing mode.</string>
         <string name="hide_system_bars">Hide system bars</string>
-        <string name="hide_system_bars_summary">Hide the status and navigation bars in full screen browsing mode. This doesn’t work well if the keyboard is displayed during full screen browsing mode.</string>
+        <string name="hide_system_bars_summary">Hide the status and navigation bars in full screen browsing mode.
+            This doesn’t work well if the keyboard is displayed during full screen browsing mode.</string>
         <string name="translucent_navigation_bar">Translucent navigation bar</string>
         <string name="translucent_navigation_bar_summary">Make the navigation bar translucent in full screen browsing mode.</string>
     <string name="clear_everything">Clear everything</string>
         <string name="display_webpage_images">Display webpage images</string>
         <string name="display_webpage_images_summary">Disable to conserve bandwidth.</string>
 
+    <!-- Download Location -->
+        <string name="download_location">Download Location</string>
+        <string name="download_location_message">Privacy Browser needs the storage permission to use the public download directory. If it is denied, the app’s download directory will be used instead.</string>
+        <string name="ok">OK</string>
+
     <!-- Orbot. -->
     <string name="orbot_proxy_not_installed">Orbot proxy will not work unless Orbot is installed.</string>
     <string name="waiting_for_orbot">Waiting for Orbot to connect...</string>
index 92a4d859b828894889b0e5478d7d4b1e36d3e72d..dae8ddbc6aaa90abd36c70396881084a172652ed 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
  *
@@ -25,7 +25,7 @@ buildscript {
         google()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.0.1'
+        classpath 'com.android.tools.build:gradle:3.1.0'
 
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files
index 7900fee993423ad151c2f03891f61be730b3f9e6..7e874e1cba4df6861a1b89cdd5cb3fe55f38c6af 100644 (file)
@@ -1,6 +1,6 @@
-#Wed Nov 01 01:37:59 MST 2017
+#Mon Mar 26 23:47:31 MST 2018
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip