Wait for Orbot to connect when proxying though Orbot before trying to load a URL.
authorSoren Stoutner <soren@stoutner.com>
Wed, 22 Feb 2017 20:46:42 +0000 (13:46 -0700)
committerSoren Stoutner <soren@stoutner.com>
Wed, 22 Feb 2017 20:46:42 +0000 (13:46 -0700)
.idea/dictionaries/soren.xml
.idea/inspectionProfiles/Project_Default.xml
app/src/main/java/com/stoutner/privacybrowser/activities/MainWebView.java
app/src/main/java/com/stoutner/privacybrowser/helpers/OrbotProxyHelper.java
app/src/main/res/values/strings.xml

index f0da2a0df3f198fb9f8e99475b87a6dab589126b..84598132016850834f944215305d0c325178cdef 100644 (file)
@@ -60,6 +60,7 @@
       <w>parameterized</w>
       <w>parentfolder</w>
       <w>programatically</w>
+      <w>proxying</w>
       <w>qwant</w>
       <w>radiobutton</w>
       <w>radiogroup</w>
index 46885f81d3a35b2ac2563ec1dc4759827383c151..ba31176e77938ebd7df47efe0cec1c0baee14f69 100644 (file)
@@ -2,6 +2,7 @@
   <profile version="1.0">
     <option name="myName" value="Project Default" />
     <option name="myLocal" value="true" />
+    <inspection_tool class="AndroidLintTypographyEllipsis" enabled="false" level="WARNING" enabled_by_default="false" />
     <inspection_tool class="HtmlUnknownTag" enabled="true" level="WARNING" enabled_by_default="true">
       <option name="myValues">
         <value>
index e0cd539456b5eb0c005686b74706ef883c4412ca..eb6392b2ad97d8fda4f0aac8ccbfeb8567cede16 100644 (file)
@@ -202,7 +202,10 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
     private boolean proxyThroughOrbot;
 
     // `pendingUrl` is used in `onCreate()` and `applySettings()`
-    private String pendingUrl;
+    private static String pendingUrl;
+
+    // `waitingForOrbotData` is used in `onCreate()` and `applySettings()`.
+    private String waitingForOrbotHTMLString;
 
     // `findOnPageLinearLayout` is used in `onCreate()`, `onOptionsItemSelected()`, and `closeFindOnPage()`.
     private LinearLayout findOnPageLinearLayout;
@@ -278,6 +281,45 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
             }
         });
 
+        // Set `waitingForOrbotHTMLString`.
+        waitingForOrbotHTMLString = "<html><body><br/><center><h1>" + getString(R.string.waiting_for_orbot) + "</h1></center></body></html>";
+
+        // Initialize `pendingUrl`.
+        pendingUrl = "";
+
+        // Set the initial Orbot status.
+        orbotStatus = "unknown";
+
+        // Create an Orbot status `BroadcastReceiver`.
+        BroadcastReceiver orbotStatusBroadcastReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                // Store the content of the status message in `orbotStatus`.
+                orbotStatus = intent.getStringExtra("org.torproject.android.intent.extra.STATUS");
+
+                // If we are waiting on `pendingUrl`, load it now that Orbot is connected.
+                if (orbotStatus.equals("ON") && !pendingUrl.isEmpty()) {
+
+                    // Wait 500 milliseconds, because Orbot isn't really ready yet.
+                    try {
+                        Thread.sleep(500);
+                    } catch (InterruptedException exception) {
+                        // Do nothing.
+                    }
+
+                    // Copy `pendingUrl` to `formattedUrlString` and reset `pendingUrl` to be empty.
+                    formattedUrlString = pendingUrl;
+                    pendingUrl = "";
+
+                    // Load `formattedUrlString
+                    mainWebView.loadUrl(formattedUrlString, customHeaders);
+                }
+            }
+        };
+
+        // Register `orbotStatusBroadcastReceiver` on `this` context.
+        this.registerReceiver(orbotStatusBroadcastReceiver, new IntentFilter("org.torproject.android.intent.action.STATUS"));
+
         // Get handles for views that need to be accessed.
         drawerLayout = (DrawerLayout) findViewById(R.id.drawerlayout);
         rootCoordinatorLayout = (CoordinatorLayout) findViewById(R.id.root_coordinatorlayout);
@@ -711,45 +753,9 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
         // Replace the header that `WebView` creates for `X-Requested-With` with a null value.  The default value is the application ID (com.stoutner.privacybrowser.standard).
         customHeaders.put("X-Requested-With", "");
 
-        // Set the initial Orbot status.
-        orbotStatus = "unknown";
-
-        // Create a Orbot status `BroadcastReceiver`.
-        BroadcastReceiver orbotStatusBroadcastReceiver = new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                // Store the content of the status message in `orbotStatus`.
-                orbotStatus = intent.getStringExtra("org.torproject.android.intent.extra.STATUS");
-
-                // If we are waiting on `pendingUrl`, load it now that Orbot is connected.
-                if (orbotStatus.equals("ON") && !pendingUrl.isEmpty()) {
-
-                    // Wait 500 milliseconds, because Orbot isn't really ready yet.
-                    try {
-                        Thread.sleep(500);
-                    } catch (InterruptedException exception) {
-                        // Do nothing.
-                    }
-
-                    // Load `pendingUrl`.
-                    formattedUrlString = pendingUrl;
-                    mainWebView.loadUrl(formattedUrlString, customHeaders);
-
-                    // Reset `pendingUrl` to be empty.
-                    pendingUrl = "";
-                }
-            }
-        };
-
-        // Register `orbotStatusBroadcastReceiver` on `this` context.
-        this.registerReceiver(orbotStatusBroadcastReceiver, new IntentFilter("org.torproject.android.intent.action.STATUS"));
-
         // Initialize the default preference values the first time the program is run.  `this` is the context.  `false` keeps this command from resetting any current preferences back to default.
         PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
 
-        // Apply the settings from the shared preferences.
-        applySettings();
-
         // Get the intent information that started the app.
         final Intent intent = getIntent();
 
@@ -759,22 +765,11 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
             formattedUrlString = intentUriData.toString();
         }
 
-        // If formattedUrlString is null assign the homepage to it.
-        if (formattedUrlString == null) {
-            formattedUrlString = homepage;
-        }
-
-        // Initialize `pendingUrl`.
-        pendingUrl = "";
-
-        if (proxyThroughOrbot & !orbotStatus.equals("ON")) {  // We are waiting on Orbot.
-            // Save `formattedUrlString` in `pendingUrl`.
-            pendingUrl = formattedUrlString;
+        // Apply the settings from the shared preferences.
+        applySettings();
 
-            // Load a waiting page.  `null` specifies no encoding, which defaults to ASCII.
-            mainWebView.loadData("<html><body><br/><center><h1>Waiting for Orbot to connect...</h1></center></body></html>", "text/html", null);
-        } else {
-            // Load the initial website.
+        // Load `formattedUrlString` if we are not proxying through Orbot and waiting for Orbot to connect.
+        if (!(proxyThroughOrbot & !orbotStatus.equals("ON"))) {
             mainWebView.loadUrl(formattedUrlString, customHeaders);
         }
 
@@ -1864,6 +1859,11 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
             // Set `torHomepageString` as `homepage`.
             homepage = torHomepageString;
 
+            // If formattedUrlString is null assign the homepage to it.
+            if (formattedUrlString == null) {
+                formattedUrlString = homepage;
+            }
+
             // Set JavaScript disabled search.
             if (torJavaScriptDisabledSearchString.equals("Custom URL")) {  // Get the custom URL string.
                 javaScriptDisabledSearchURL = torJavaScriptDisabledSearchCustomURLString;
@@ -1880,10 +1880,24 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
 
             // Set the proxy.  `this` refers to the current activity where an `AlertDialog` might be displayed.
             OrbotProxyHelper.setProxy(getApplicationContext(), this, "localhost", "8118");
+
+            // Display a message to the user if we are waiting on Orbot.
+            if (!orbotStatus.equals("ON")) {
+                // Save `formattedUrlString` in `pendingUrl`.
+                pendingUrl = formattedUrlString;
+
+                // Load a waiting page.  `null` specifies no encoding, which defaults to ASCII.
+                mainWebView.loadData(waitingForOrbotHTMLString, "text/html", null);
+            }
         } else {  // Set the non-Tor options.
             // Set `homepageString` as `homepage`.
             homepage = homepageString;
 
+            // If formattedUrlString is null assign the homepage to it.
+            if (formattedUrlString == null) {
+                formattedUrlString = homepage;
+            }
+
             // Set JavaScript disabled search.
             if (javaScriptDisabledSearchString.equals("Custom URL")) {  // Get the custom URL string.
                 javaScriptDisabledSearchURL = javaScriptDisabledSearchCustomURLString;
@@ -1900,6 +1914,12 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
 
             // Reset the proxy to default.  The host is `""` and the port is `"0"`.
             OrbotProxyHelper.setProxy(getApplicationContext(), this, "", "0");
+
+            // Reset `pendingUrl` if we are currently waiting for Orbot to connect.
+            if (!pendingUrl.isEmpty()) {
+                formattedUrlString = pendingUrl;
+                pendingUrl = "";
+            }
         }
 
         // Set swipe to refresh.
@@ -1930,7 +1950,7 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
             customHeaders.remove("DNT");
         }
 
-        // If we are in full screen mode update the `SYSTEM_UI` flags.
+        // Update the `SYSTEM_UI` flags if we are in full screen mode.
         if (inFullScreenBrowsingMode) {
             if (hideSystemBarsOnFullscreen) {  // Hide everything.
                 // Remove the translucent navigation setting if it is currently flagged.
@@ -1960,14 +1980,6 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
                 }
             }
         }
-
-        if (proxyThroughOrbot & !orbotStatus.equals("ON")) {  // We are waiting on Orbot.
-            // Save `formattedUrlString` in `pendingUrl`.
-            pendingUrl = formattedUrlString;
-
-            // Load a waiting page.  `null` specifies no encoding, which defaults to ASCII.
-            mainWebView.loadData("<html><body><br/><center><h1>Waiting for Orbot to connect...</h1></center></body></html>", "text/html", null);
-        }
     }
 
     private void updatePrivacyIcons(boolean runInvalidateOptionsMenu) {
index c4cbc6b96d74a8c9eaea7a4a061d5b079f4c6da4..8d0e408262fc8d993b3660466d3a1d1bd654c7e8 100644 (file)
@@ -86,8 +86,16 @@ public class OrbotProxyHelper {
 
                 // Ask Orbot to connect if its current status is not "ON".
                 if (!MainWebView.orbotStatus.equals("ON")) {
+                    // Request Orbot to start.
                     Intent orbotIntent = new Intent("org.torproject.android.intent.action.START");
+
+                    // Send the intent to the Orbot package.
                     orbotIntent.setPackage("org.torproject.android");
+
+                    // Request a status response be sent back to this package.
+                    orbotIntent.putExtra("org.torproject.android.intent.extra.PACKAGE_NAME", privacyBrowserContext.getPackageName());
+
+                    // Make it so.
                     privacyBrowserContext.sendBroadcast(orbotIntent);
                 }
             } catch (PackageManager.NameNotFoundException exception){  // If an exception is thrown, Orbot is not installed.
index cfaa785d1607e5477010244269738fd5c45a025e..3fa168fa0f842e3e50e9cd324da2ff24d221e5a2 100644 (file)
 
     <!-- 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>
 
     <!-- About Activity. -->
     <string name="about_privacy_browser">About Privacy Browser</string>