Request Orbot to connect on every restart. https://redmine.stoutner.com/issues/262
authorSoren Stoutner <soren@stoutner.com>
Tue, 8 May 2018 21:31:10 +0000 (14:31 -0700)
committerSoren Stoutner <soren@stoutner.com>
Tue, 8 May 2018 21:31:10 +0000 (14:31 -0700)
app/src/free/assets/de/about_permissions_dark.html
app/src/free/assets/de/about_permissions_light.html
app/src/main/assets/de/about_permissions_dark.html
app/src/main/assets/de/about_permissions_light.html
app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java
app/src/main/java/com/stoutner/privacybrowser/helpers/OrbotProxyHelper.java
app/src/main/res/values-de/strings.xml
app/src/main/res/values-es/strings.xml
app/src/main/res/values-ru/strings.xml

index 32b9700..e71e703 100644 (file)
         <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>
+        <h3>Schreibrechte im Dateisystem</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>
+        <p>Benötigt, um Dateien im öffentlichen Download-Ordner abzuspeichern.
+            In Android Marshmallow (API 23) und neuer werden Downloads im Downdload-Ordner der App gespeichert, falls die Berechtigung verweigert wurde.</p>
 
         <br/>
         <hr/>
index 43bb65f..6f41a37 100644 (file)
         <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>
+        <h3>Schreibrechte im Dateisystem</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>
+        <p>Benötigt, um Dateien im öffentlichen Download-Ordner abzuspeichern.
+            In Android Marshmallow (API 23) und neuer werden Downloads im Downdload-Ordner der App gespeichert, falls die Berechtigung verweigert wurde.</p>
 
         <br/>
         <hr/>
index b8e3173..27eb4e0 100644 (file)
@@ -34,9 +34,9 @@
         <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>
+        <h3>Schreibrechte im Dateisystem</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>
+        <p>Benötigt, um Dateien im öffentlichen Download-Ordner abzuspeichern.
+            In Android Marshmallow (API 23) und neuer werden Downloads im Downdload-Ordner der App gespeichert, falls die Berechtigung verweigert wurde.</p>
     </body>
 </html>
\ No newline at end of file
index 0ff9f7b..54863f0 100644 (file)
@@ -34,9 +34,9 @@
         <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>
+        <h3>Schreibrechte im Dateisystem</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>
+        <p>Benötigt, um Dateien im öffentlichen Download-Ordner abzuspeichern.
+            In Android Marshmallow (API 23) und neuer werden Downloads im Downdload-Ordner der App gespeichert, falls die Berechtigung verweigert wurde.</p>
     </body>
 </html>
\ No newline at end of file
index 0e81bf4..bb525e7 100644 (file)
@@ -289,6 +289,9 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
     // `privacyBrowserRuntime` is used in `onCreate()`, `onOptionsItemSelected()`, and `applyAppSettings()`.
     private Runtime privacyBrowserRuntime;
 
+    // `proxyThroughOrbot` is used in `onRestart()` and `applyAppSettings()`.
+    boolean proxyThroughOrbot;
+
     // `incognitoModeEnabled` is used in `onCreate()` and `applyAppSettings()`.
     private boolean incognitoModeEnabled;
 
@@ -1429,6 +1432,18 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
         // Run the default commands.
         super.onRestart();
 
+        // Make sure Orbot is running if Privacy Browser is proxying through Orbot.
+        if (proxyThroughOrbot) {
+            // Request Orbot to start.  If Orbot is already running no hard will be caused by this request.
+            Intent orbotIntent = new Intent("org.torproject.android.intent.action.START");
+
+            // Send the intent to the Orbot package.
+            orbotIntent.setPackage("org.torproject.android");
+
+            // Make it so.
+            sendBroadcast(orbotIntent);
+        }
+
         // Apply the app settings if returning from the Settings activity..
         if (reapplyAppSettingsOnRestart) {
             // Apply the app settings.
@@ -3050,7 +3065,7 @@ public class MainWebViewActivity extends AppCompatActivity implements AddDomainD
         String searchCustomURLString = sharedPreferences.getString("search_custom_url", "");
         incognitoModeEnabled = sharedPreferences.getBoolean("incognito_mode", false);
         boolean doNotTrackEnabled = sharedPreferences.getBoolean("do_not_track", false);
-        boolean proxyThroughOrbot = sharedPreferences.getBoolean("proxy_through_orbot", false);
+        proxyThroughOrbot = sharedPreferences.getBoolean("proxy_through_orbot", false);
         fullScreenBrowsingModeEnabled = sharedPreferences.getBoolean("full_screen_browsing_mode", false);
         hideSystemBarsOnFullscreen = sharedPreferences.getBoolean("hide_system_bars", false);
         translucentNavigationBarOnFullscreen = sharedPreferences.getBoolean("translucent_navigation_bar", true);
index 6253bc1..b56269b 100644 (file)
@@ -49,21 +49,26 @@ public class OrbotProxyHelper {
         // Use reflection to apply the new proxy values.
         try {
             Class applicationClass = Class.forName("android.app.Application");
-            Field mLoadedApkField = applicationClass.getDeclaredField("mLoadedApk");
-            // `setAccessible(true)` allows us to change the value of `mLoadedApkField`.
+
+            // Suppress the lint warning that `mLoadedApk` cannot be resolved.
+            @SuppressWarnings("JavaReflectionMemberAccess") Field mLoadedApkField = applicationClass.getDeclaredField("mLoadedApk");
+
+            // `setAccessible(true)` allows the value of `mLoadedApkField` to be changed..
             mLoadedApkField.setAccessible(true);
             Object mLoadedApkObject = mLoadedApkField.get(privacyBrowserContext);
 
+            // Suppress the lint warning that reflection may not alwasy work in the future and on all devices.
             @SuppressLint("PrivateApi") Class loadedApkClass = Class.forName("android.app.LoadedApk");
             Field mReceiversField = loadedApkClass.getDeclaredField("mReceivers");
-            // `setAccessible(true)` allows us to change the value of `mReceiversField`.
+
+            // `setAccessible(true)` allows the value of `mReceiversField` to be changed.
             mReceiversField.setAccessible(true);
 
             ArrayMap receivers = (ArrayMap) mReceiversField.get(mLoadedApkObject);
 
             for (Object receiverMap : receivers.values()) {
                 for (Object receiver : ((ArrayMap) receiverMap).keySet()) {
-                    // We have to use `Class<?>`, which is an `unbounded wildcard parameterized type`, instead of `Class`, which is a `raw type`.
+                    // `Class<?>`, which is an `unbounded wildcard parameterized type`, must be used instead of `Class`, which is a `raw type`.
                     // Otherwise, `receiveClass.getDeclaredMethod` below will produce an error.
                     Class<?> receiverClass = receiver.getClass();
                     if (receiverClass.getName().contains("ProxyChangeListener")) {
index e72b0d5..92b0832 100644 (file)
@@ -47,6 +47,7 @@
     <string name="open_navigation_drawer">Navigationspanel öffnen</string>
     <string name="close_navigation_drawer">Navigationspanel schließen</string>
     <string name="no_title">Kein Titel</string>
+    <string name="unrecognized_url">Unbekannte URL:</string>
 
     <!-- Save As. -->
     <string name="save_as">Speichern Unter</string>
         <string name="display_additional_app_bar_icons">Weitere Icons in der Titelleiste</string>
         <string name="display_additional_app_bar_icons_summary">Icons zum Umschalten von Cookies, DOM-Speicher und Formulardaten neben der Adresszeile anzeigen, wenn noch Platz dafür da ist.</string>
 
+    <!-- Download Location -->
+    <string name="download_location">Download-Zielordner</string>
+    <string name="download_location_message">Privacy Browser benötigt die Berechtigung zur Speicherung im öffentlichen Download-Ordner. Anderenfalls wird der Download-Ordner der App verwendet.</string>
+    <string name="ok">OK</string>
+
     <!-- Orbot. -->
     <string name="orbot_proxy_not_installed">Orbot-Proxy wird nicht funktionieren, solange Orbot nicht installiert ist.</string>
     <string name="waiting_for_orbot">Warte, bis sich Orbot verbindet...</string>
index e2b8bbf..ef1b12d 100644 (file)
@@ -45,6 +45,7 @@
     <string name="open_navigation_drawer">Abrir la caja de navegación</string>
     <string name="close_navigation_drawer">Cerrar la caja de navegación</string>
     <string name="no_title">Sin título</string>
+    <string name="unrecognized_url">URL no reconocida:</string>
 
     <!-- Save As. -->
     <string name="save_as">Guardar como</string>
             </string-array>
         <string name="custom_user_agent">Agente de usuario personalizado</string>
         <string name="incognito_mode">Modo incógnito</string>
-        <string name="incognito_mode_summary">Borrar el historial y el caché después de que cada página web termine de cargar. Forward and back do not work in Incognito Mode.</string>
+        <string name="incognito_mode_summary">Borrar el historial y el caché después de que cada página web termine de cargar. Adelante y atrás no funcionan en el Modo incógnito.</string>
         <string name="do_not_track">No rastrear</string>
         <string name="do_not_track_summary">Enviar la cabecera de no rastrear (DNT) que educadamente sugiere que los servidores web no rastreen este navegador.</string>
     <string name="block_lists">Listas de bloqueo</string>
index 2a02ddb..aa99f13 100644 (file)
@@ -47,6 +47,7 @@
     <string name="open_navigation_drawer">Открыть панель навигации</string>
     <string name="close_navigation_drawer">Закрыть панель навигации</string>
     <string name="no_title">Без названия</string>
+    <string name="unrecognized_url">Нераспознанный URL:</string>
 
     <!-- Save As. -->
     <string name="save_as">Сохранить как</string>
             </string-array>
         <string name="custom_user_agent">Пользовательский user agent</string>
         <string name="incognito_mode">Режим инкогнито</string>
-        <string name="incognito_mode_summary">Очистка журнала и кэша после завершения загрузки каждой веб-страницы. Forward and back do not work in Incognito Mode.</string>
+        <string name="incognito_mode_summary">Очистка журнала и кэша после завершения загрузки каждой веб-страницы. Кнопки \'Вперед\' и \'Назад\' не работают в этом режиме.</string>
         <string name="do_not_track">Не отслеживать</string>
         <string name="do_not_track_summary">Отправлять заголовок \'не отслеживать\', являющийся пожеланием веб-серверу не отслеживать этот браузер.</string>
     <string name="block_lists">Списки блокировки</string>