commit b2081789f5d634a679a4d45dbd9c5fda1c8d650e Author: Nathan Freitas nathan@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@lists.torproject.org