<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>
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
<!--
- 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 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>
<!--
- 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 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>
<!--
- 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
<!--
- 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
<!--
- 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 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>
<!--
- 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>
<!--
- 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
<!--
- 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
<!--
- 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>
<!--
- 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>
<!--
- 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
<!--
- 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
<!--
- 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/>
<!--
- 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/>
<!--
- 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
<!--
- 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
--- /dev/null
+<!--
+ 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
--- /dev/null
+<!--
+ 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
--- /dev/null
+<!--
+ 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
--- /dev/null
+<!--
+ 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
<!--
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. -->
<?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>.
--- /dev/null
+<?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
<?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" />
<!-- 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"
<!-- `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"
Hendrik Knackstedt
<h3>Mitwirkende</h3>
+ Stefan Erhardt: German<br/>
Francesco Buratti: Italienisch<br/>
Jose A. León Becerra: Spanisch
Hendrik Knackstedt
<h3>Mitwirkende</h3>
+ Stefan Erhardt: German<br/>
Francesco Buratti: Italienisch<br/>
Jose A. León Becerra: Spanisch
<!--
- 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
<!--
- 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
Hendrik Knackstedt
<h3>Translators</h3>
+ Stefan Erhardt: German<br/>
Francesco Buratti: Italian<br/>
Jose A. León Becerra: Spanish
Hendrik Knackstedt
<h3>Translators</h3>
+ Stefan Erhardt: German<br/>
Francesco Buratti: Italian<br/>
Jose A. León Becerra: Spanish
<!--
- 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
<!--
- 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
Hendrik Knackstedt
<h3>Traductores</h3>
+ Stefan Erhardt: Alemán<br/>
Francesco Buratti: Italiano<br/>
Jose A. León Becerra: Español
Hendrik Knackstedt
<h3>Traductores</h3>
+ Stefan Erhardt: Alemán<br/>
Francesco Buratti: Italiano<br/>
Jose A. León Becerra: Español
<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
<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
Hendrik Knackstedt
<h3>Traduttori</h3>
+ Stefan Erhardt: Tedesco<br/>
Francesco Buratti: Italiano<br/>
Jose A. León Becerra: Spagnolo
Hendrik Knackstedt
<h3>Traduttori</h3>
+ Stefan Erhardt: Tedesco<br/>
Francesco Buratti: Italiano<br/>
Jose A. León Becerra: Spagnolo
<!--
- 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
<!--
- 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
<!--
- 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>.
<!--
- 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>.
Hendrik Knackstedt
<h3>Translators</h3>
+ Stefan Erhardt: German<br/>
Francesco Buratti: Italian<br/>
Jose A. León Becerra: Spanish
Hendrik Knackstedt
<h3>Translators</h3>
+ Stefan Erhardt: German<br/>
Francesco Buratti: Italian<br/>
Jose A. León Becerra: Spanish
--- /dev/null
+<!--
+ 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
--- /dev/null
+<!--
+ 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
--- /dev/null
+<!--
+ 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
--- /dev/null
+<!--
+ 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
--- /dev/null
+<!--
+ 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
--- /dev/null
+<!--
+ 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
package com.stoutner.privacybrowser.activities;
+import android.Manifest;
import android.annotation.SuppressLint;
import android.app.DialogFragment;
import android.app.DownloadManager;
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;
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;
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;
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;
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`,
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;
// `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) {
// 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.
super.onRestart();
// Apply the app settings if returning from the Settings activity..
- if (reapplyAppSettingsOnRestert) {
+ if (reapplyAppSettingsOnRestart) {
// Apply the app settings.
applyAppSettings();
}
// Reset the return from settings flag.
- reapplyAppSettingsOnRestert = false;
+ reapplyAppSettingsOnRestart = false;
}
// Apply the domain settings if returning from the Domains activity.
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;
// 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;
});
// 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;
});
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.
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.
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);
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.
bookmarksTitleTextView.setText(currentBookmarksFolder);
}
}
-}
+}
\ No newline at end of file
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;
/*
- * 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>.
*
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`.
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;
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");
// `@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();
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`.
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;
}
});
/*
- * 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>.
*
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;
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");
@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();
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);
});
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;
}
--- /dev/null
+/*
+ * 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
+++ /dev/null
-<!-- `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
--- /dev/null
+<!-- `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
--- /dev/null
+<!-- `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
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"
android:textStyle="bold"
android:textSize="22sp"
android:textColor="?attr/aboutTitle"
+ android:paddingTop="12dp"
android:layout_toEndOf="@id/about_version_icon" />
<TextView
<item
android:id="@+id/downloads"
android:title="@string/downloads"
- android:icon="@drawable/downloads"
+ android:icon="@drawable/downloads_light"
android:orderInCategory="50" />
<item
<!--
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>
<!-- 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>
<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>
/*
- * 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>.
*
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
-#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