commit b2081789f5d634a679a4d45dbd9c5fda1c8d650e
Author: Nathan Freitas <nat...@freitas.net>
Date:   Wed Jan 6 23:42:08 2016 -0500

    add initial support for easy exit country selection
---
 res/layout/layout_main.xml                         |    6 +
 src/org/torproject/android/OrbotMainActivity.java  |   47 +++++++
 src/org/torproject/android/service/TorService.java |  130 +++++++++++++++-----
 .../android/service/TorServiceConstants.java       |    5 +-
 4 files changed, 157 insertions(+), 31 deletions(-)

diff --git a/res/layout/layout_main.xml b/res/layout/layout_main.xml
index 104e96e..a3b99de 100644
--- a/res/layout/layout_main.xml
+++ b/res/layout/layout_main.xml
@@ -205,6 +205,12 @@ 
android:layout_gravity="center_horizontal|center_vertical"/>
                             android:ellipsize="end"
           android:singleLine="true"
                            />
+
+                       <Spinner
+                           android:id="@+id/spinnerCountry"
+                           android:layout_width="wrap_content"
+                           android:layout_height="wrap_content"
+                           android:layout_weight="1" />
                         
                    </LinearLayout>
                     </LinearLayout>
diff --git a/src/org/torproject/android/OrbotMainActivity.java 
b/src/org/torproject/android/OrbotMainActivity.java
index f56069e..a2e5a60 100644
--- a/src/org/torproject/android/OrbotMainActivity.java
+++ b/src/org/torproject/android/OrbotMainActivity.java
@@ -44,7 +44,11 @@ import android.view.View.OnLongClickListener;
 import android.view.View.OnTouchListener;
 import android.view.Window;
 import android.view.animation.AccelerateInterpolator;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemSelectedListener;
+import android.widget.ArrayAdapter;
 import android.widget.Button;
+import android.widget.Spinner;
 import android.widget.TextView;
 import android.widget.Toast;
 import android.widget.ToggleButton;
@@ -66,6 +70,8 @@ import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
 import java.net.URLEncoder;
 import java.text.NumberFormat;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Locale;
 
 
@@ -83,6 +89,9 @@ public class OrbotMainActivity extends Activity
     private Button mBtnBrowser = null;
     private ToggleButton mBtnVPN = null;
     private ToggleButton mBtnBridges = null;
+    
+    private Spinner spnCountries = null;
+    
 
        private DrawerLayout mDrawer;
        private ActionBarDrawerToggle mDrawerToggle;
@@ -297,8 +306,46 @@ public class OrbotMainActivity extends Activity
                        
                });
                
+               Locale[] locale = Locale.getAvailableLocales();
+               ArrayList<String> countries = new ArrayList<String>();
+               countries.add("World (best)");
+               countries.add("US");
+               countries.add("DE");
+               countries.add("CA");
+               countries.add("FR");
+               
                
+               
+
+               spnCountries = (Spinner)findViewById(R.id.spinnerCountry);
+               ArrayAdapter<String> adapter = new 
ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, countries);
+               spnCountries.setAdapter(adapter);
+
+               spnCountries.setOnItemSelectedListener(new 
OnItemSelectedListener() {
+                   @Override
+                   public void onItemSelected(AdapterView<?> parentView, View 
selectedItemView, int position, long id) {
+                       // your code here
+                       
+                       String country = 
(String)spnCountries.getItemAtPosition(position);
+                       
+                       if (position == 0)
+                               country = "";
+                       else
+                               country =  '{' + country.toLowerCase() + '}';
+                       
+                       Intent torService = new Intent(OrbotMainActivity.this, 
TorService.class);    
+                               
torService.setAction(TorServiceConstants.CMD_SET_EXIT);
+                               torService.putExtra("exit",country);
+                               startService(torService);
+                   
+                   }
+
+                   @Override
+                   public void onNothingSelected(AdapterView<?> parentView) {
+                       // your code here
+                   }
 
+               });
     }
     
     GestureDetector mGestureDetector;
diff --git a/src/org/torproject/android/service/TorService.java 
b/src/org/torproject/android/service/TorService.java
index 5513e78..24f5965 100644
--- a/src/org/torproject/android/service/TorService.java
+++ b/src/org/torproject/android/service/TorService.java
@@ -339,6 +339,10 @@ public class TorService extends Service implements 
TorServiceConstants, OrbotCon
                     enableVpnProxy();
                 } else if (action.equals(CMD_VPN_CLEAR)) {
                     clearVpnProxy();
+                } else if (action.equals(CMD_SET_EXIT)) {
+                       
+                       setExitNode(mIntent.getStringExtra("exit"));
+                       
                 } else {
                     Log.w(TAG, "unhandled TorService Intent: " + action);
                 }
@@ -2088,38 +2092,25 @@ public class TorService extends Service implements 
TorServiceConstants, OrbotCon
         
         if (entranceNodes.length() > 0 || exitNodes.length() > 0 || 
excludeNodes.length() > 0)
         {
-            //only apply GeoIP if you need it
-            File fileGeoIP = new File(OrbotApp.appBinHome, GEOIP_ASSET_KEY);
-            File fileGeoIP6 = new File(OrbotApp.appBinHome, GEOIP6_ASSET_KEY);
-                
-            try
-            {
-                if ((!fileGeoIP.exists()))
-                {
-                    TorResourceInstaller installer = new 
TorResourceInstaller(this, OrbotApp.appBinHome);
-                    boolean success = installer.installGeoIP();
+           
+            if (enableGeoIP ())
+            { //only apply GeoIP if you need it
+                File fileGeoIP = new File(OrbotApp.appBinHome, 
GEOIP_ASSET_KEY);
+                File fileGeoIP6 = new File(OrbotApp.appBinHome, 
GEOIP6_ASSET_KEY);
                     
-                }
-                
                 extraLines.append("GeoIPFile" + ' ' + 
fileGeoIP.getCanonicalPath()).append('\n');
                 extraLines.append("GeoIPv6File" + ' ' + 
fileGeoIP6.getCanonicalPath()).append('\n');
-
-            }
-            catch (Exception e)
-            {
-                 showToolbarNotification 
(getString(R.string.error_installing_binares),ERROR_NOTIFY_ID,R.drawable.ic_stat_notifyerr);
-
-                return false;
             }
+            
         }
 
-        if (entranceNodes != null && entranceNodes.length() > 0)
+        if (!TextUtils.isEmpty(entranceNodes))
                extraLines.append("EntryNodes" + ' ' + 
entranceNodes).append('\n');
        
-        if (exitNodes != null && exitNodes.length() > 0)
+        if (!TextUtils.isEmpty(exitNodes))
                extraLines.append("ExitNodes" + ' ' + exitNodes).append('\n');
         
-        if (excludeNodes != null && excludeNodes.length() > 0)
+        if (!TextUtils.isEmpty(excludeNodes))
                extraLines.append("ExcludeNodes" + ' ' + 
excludeNodes).append('\n');
         
         extraLines.append("StrictNodes" + ' ' + (enableStrictNodes ? "1" : 
"0")).append('\n');
@@ -2210,14 +2201,6 @@ public class TorService extends Service implements 
TorServiceConstants, OrbotCon
             
         }
         
-        if (Prefs.useVpn())
-        {
-
-               //extraLines.append("DNSPort 
").append(TOR_VPN_DNS_LISTEN_ADDRESS).append(":").append(TorServiceConstants.TOR_DNS_PORT_DEFAULT).append("\n");
-               //extraLines.append("DNSPort 
").append(TorServiceConstants.TOR_DNS_PORT_DEFAULT).append("\n");
-
-        }
-    
         return true;
     }
     
@@ -2337,6 +2320,93 @@ public class TorService extends Service implements 
TorServiceConstants, OrbotCon
         return null;
     }
     
+    private void setExitNode (String newExits)
+    {
+       SharedPreferences prefs = 
TorServiceUtils.getSharedPrefs(getApplicationContext());
+        
+       if (TextUtils.isEmpty(newExits))
+       {
+               prefs.edit().remove("pref_exit_nodes").apply();
+               
+               if (conn != null)
+               {
+               try
+               {
+                       ArrayList<String> resetBuffer = new ArrayList<String>();
+                       resetBuffer.add("ExitNodes");
+                       resetBuffer.add("StrictNodes");
+                       conn.resetConf(resetBuffer);
+                       conn.setConf("DisableNetwork","1");
+                       conn.setConf("DisableNetwork","0");
+                       
+               }
+               catch (IOException ioe)
+               {
+                       ioe.printStackTrace();
+               }
+               }
+       }
+       else
+       {
+               prefs.edit().putString("pref_exit_nodes", newExits).apply();
+               
+               if (conn != null)
+               {
+               try
+               {
+                       
+                       enableGeoIP ();
+                               
+                    File fileGeoIP = new File(OrbotApp.appBinHome, 
GEOIP_ASSET_KEY);
+                    File fileGeoIP6 = new File(OrbotApp.appBinHome, 
GEOIP6_ASSET_KEY);
+                        
+                    conn.setConf("GeoIPFile",fileGeoIP.getCanonicalPath());
+                    conn.setConf("GeoIPv6File",fileGeoIP6.getCanonicalPath());
+                    
+                       conn.setConf("ExitNodes", newExits);
+                       conn.setConf("StrictNodes","1");
+                       
+                       conn.setConf("DisableNetwork","1");
+                       conn.setConf("DisableNetwork","0");
+                       
+                       
+                       
+
+               }
+               catch (IOException ioe)
+               {
+                       ioe.printStackTrace();
+               }
+               }
+       }
+       
+       
+
+    }
     
+    private boolean enableGeoIP ()
+    {
+        File fileGeoIP = new File(OrbotApp.appBinHome, GEOIP_ASSET_KEY);
+         File fileGeoIP6 = new File(OrbotApp.appBinHome, GEOIP6_ASSET_KEY);
+        
+        try
+         {
+             if ((!fileGeoIP.exists()))
+             {
+                 TorResourceInstaller installer = new 
TorResourceInstaller(this, OrbotApp.appBinHome);
+                 boolean success = installer.installGeoIP();
+                 
+             }
+             
+             return true;
+             
+         }
+         catch (Exception e)
+         {
+              showToolbarNotification 
(getString(R.string.error_installing_binares),ERROR_NOTIFY_ID,R.drawable.ic_stat_notifyerr);
+
+             return false;
+         }
+    }
 
 }
diff --git a/src/org/torproject/android/service/TorServiceConstants.java 
b/src/org/torproject/android/service/TorServiceConstants.java
index 77b7a9b..c9bb6ec 100644
--- a/src/org/torproject/android/service/TorServiceConstants.java
+++ b/src/org/torproject/android/service/TorServiceConstants.java
@@ -131,7 +131,10 @@ public interface TorServiceConstants {
     public static final String CMD_VPN = "vpn";
     public static final String CMD_VPN_CLEAR = "vpnclear";
     public static final String CMD_UPDATE_TRANS_PROXY = "update";
-
+    public static final String CMD_SET_EXIT = "setexit";
+    
+    
+    
     public static final String BINARY_TOR_VERSION = "0.2.7.5-020120160125";
     public static final String PREF_BINARY_TOR_VERSION_INSTALLED = 
"BINARY_TOR_VERSION_INSTALLED";
     



_______________________________________________
tor-commits mailing list
tor-commits@lists.torproject.org
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits

Reply via email to