commit bb7ffd96926a794e6732543cf5ce9c6a2aaa968a Author: arrase arrase@gmail.com Date: Sun Nov 27 20:07:49 2016 +0100
intent api: restore key --- .../org/torproject/android/OrbotMainActivity.java | 2037 ++++++++++---------- .../ui/hiddenservices/backup/BackupUtils.java | 8 +- 2 files changed, 970 insertions(+), 1075 deletions(-)
diff --git a/app/src/main/java/org/torproject/android/OrbotMainActivity.java b/app/src/main/java/org/torproject/android/OrbotMainActivity.java index e08ddfa..d7222a9 100644 --- a/app/src/main/java/org/torproject/android/OrbotMainActivity.java +++ b/app/src/main/java/org/torproject/android/OrbotMainActivity.java @@ -3,34 +3,6 @@
package org.torproject.android;
-import java.io.BufferedReader; -import java.io.InputStreamReader; -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; -import java.util.Random; -import java.util.StringTokenizer; - -import org.json.JSONArray; -import org.torproject.android.service.OrbotConstants; -import org.torproject.android.service.util.Prefs; -import org.torproject.android.service.TorService; -import org.torproject.android.service.TorServiceConstants; -import org.torproject.android.service.util.TorServiceUtils; -import org.torproject.android.settings.SettingsPreferences; -import org.torproject.android.ui.AppManager; -import org.torproject.android.ui.hiddenservices.HiddenServicesActivity; -import org.torproject.android.ui.ImageProgressView; -import org.torproject.android.ui.PromoAppsActivity; -import org.torproject.android.ui.Rotate3dAnimation; -import org.torproject.android.ui.hiddenservices.providers.HSContentProvider; -import org.torproject.android.vpn.VPNEnableActivity; -import org.torproject.android.ui.hiddenservices.backup.BackupUtils; - import android.annotation.SuppressLint; import android.app.ActivityManager; import android.app.ActivityManager.RunningServiceInfo; @@ -86,6 +58,36 @@ import android.widget.Toast; import com.google.zxing.integration.android.IntentIntegrator; import com.google.zxing.integration.android.IntentResult;
+import org.json.JSONArray; +import org.torproject.android.service.OrbotConstants; +import org.torproject.android.service.TorService; +import org.torproject.android.service.TorServiceConstants; +import org.torproject.android.service.util.Prefs; +import org.torproject.android.service.util.TorServiceUtils; +import org.torproject.android.settings.SettingsPreferences; +import org.torproject.android.ui.AppManager; +import org.torproject.android.ui.ImageProgressView; +import org.torproject.android.ui.PromoAppsActivity; +import org.torproject.android.ui.Rotate3dAnimation; +import org.torproject.android.ui.hiddenservices.HiddenServicesActivity; +import org.torproject.android.ui.hiddenservices.providers.HSContentProvider; +import org.torproject.android.vpn.VPNEnableActivity; + +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStreamReader; +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; +import java.util.Random; +import java.util.StringTokenizer; + +import static android.support.v4.content.FileProvider.getUriForFile; + public class OrbotMainActivity extends AppCompatActivity implements OrbotConstants, OnLongClickListener, OnTouchListener {
@@ -96,18 +98,18 @@ public class OrbotMainActivity extends AppCompatActivity private TextView downloadText = null; private TextView uploadText = null; private TextView mTxtOrbotLog = null; - + private Button mBtnBrowser = null; - private Button mBtnStart = null; + private Button mBtnStart = null;
- private SwitchCompat mBtnVPN = null; + private SwitchCompat mBtnVPN = null; private SwitchCompat mBtnBridges = null; - + private Spinner spnCountries = null;
- private DrawerLayout mDrawer; - private ActionBarDrawerToggle mDrawerToggle; - + private DrawerLayout mDrawer; + private ActionBarDrawerToggle mDrawerToggle; + /* Some tracking bits */ private String torStatus = null; //latest status reported from the tor service private Intent lastStatusIntent; // the last ACTION_STATUS Intent received @@ -115,7 +117,7 @@ public class OrbotMainActivity extends AppCompatActivity private SharedPreferences mPrefs = null;
private boolean autoStartFromIntent = false; - + private final static int REQUEST_VPN = 8888; private final static int REQUEST_SETTINGS = 0x9874; private final static int REQUEST_VPN_APPS_SELECT = 8889; @@ -126,70 +128,62 @@ public class OrbotMainActivity extends AppCompatActivity private final static int STATUS_UPDATE = 1; private static final int MESSAGE_TRAFFIC_COUNT = 2;
- public final static String INTENT_ACTION_REQUEST_HIDDEN_SERVICE = "org.torproject.android.REQUEST_HS_PORT"; - public final static String INTENT_ACTION_REQUEST_START_TOR = "org.torproject.android.START_TOR"; + public final static String INTENT_ACTION_REQUEST_HIDDEN_SERVICE = "org.torproject.android.REQUEST_HS_PORT"; + public final static String INTENT_ACTION_REQUEST_START_TOR = "org.torproject.android.START_TOR";
- // for bridge loading from the assets default bridges.txt file - class Bridge - { - String type; - String config; + // for bridge loading from the assets default bridges.txt file + class Bridge { + String type; + String config; } - + private ArrayList<Bridge> alBridges = null;
- private String[] mProjection = new String[]{ - HSContentProvider.HiddenService._ID, - HSContentProvider.HiddenService.NAME, - HSContentProvider.HiddenService.DOMAIN, - HSContentProvider.HiddenService.PORT, - HSContentProvider.HiddenService.ONION_PORT}; - + //this is needed for backwards compat back to Android 2.3.* @SuppressLint("NewApi") - public View onCreateView(View parent, String name, Context context, AttributeSet attrs) - { - if(Build.VERSION.SDK_INT >= 11) - return super.onCreateView(parent, name, context, attrs); + public View onCreateView(View parent, String name, Context context, AttributeSet attrs) { + if (Build.VERSION.SDK_INT >= 11) + return super.onCreateView(parent, name, context, attrs); return null; }
- private void migratePreferences(){ - String hsPortString = mPrefs.getString("pref_hs_ports", ""); - if(hsPortString.length() > 0) - { - StringTokenizer st = new StringTokenizer (hsPortString,","); - ContentResolver cr = getContentResolver(); - while (st.hasMoreTokens()) - { - int hsPort = Integer.parseInt(st.nextToken().split(" ")[0]); - ContentValues fields = new ContentValues(); - fields.put("name", hsPort); - fields.put("port", hsPort); - fields.put("onion_port", hsPort); - cr.insert(HSContentProvider.CONTENT_URI, fields); - } - - Editor pEdit = mPrefs.edit(); - pEdit.remove("pref_hs_ports"); - pEdit.commit(); - } - } - - /** Called when the activity is first created. */ + private void migratePreferences() { + String hsPortString = mPrefs.getString("pref_hs_ports", ""); + if (hsPortString.length() > 0) { + StringTokenizer st = new StringTokenizer(hsPortString, ","); + ContentResolver cr = getContentResolver(); + while (st.hasMoreTokens()) { + int hsPort = Integer.parseInt(st.nextToken().split(" ")[0]); + ContentValues fields = new ContentValues(); + fields.put("name", hsPort); + fields.put("port", hsPort); + fields.put("onion_port", hsPort); + cr.insert(HSContentProvider.CONTENT_URI, fields); + } + + Editor pEdit = mPrefs.edit(); + pEdit.remove("pref_hs_ports"); + pEdit.commit(); + } + } + + /** + * Called when the activity is first created. + */ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
mPrefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
- migratePreferences(); // Migrate old preferences + migratePreferences(); // Migrate old preferences
/* Create the widgets before registering for broadcasts to guarantee * that the widgets exist when the status updates try to update them */ - doLayout(); + doLayout();
/* receive the internal status broadcasts, which are separate from the public - * status broadcasts to prevent other apps from sending fake/wrong status + * status broadcasts to prevent other apps from sending fake/wrong status * info to this app */ LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this); lbm.registerReceiver(mLocalBroadcastReceiver, @@ -198,15 +192,15 @@ public class OrbotMainActivity extends AppCompatActivity new IntentFilter(TorServiceConstants.LOCAL_ACTION_BANDWIDTH)); lbm.registerReceiver(mLocalBroadcastReceiver, new IntentFilter(TorServiceConstants.LOCAL_ACTION_LOG)); - } + }
- private void sendIntentToService(final String action) { + private void sendIntentToService(final String action) {
- Intent torService = new Intent(OrbotMainActivity.this, TorService.class); + Intent torService = new Intent(OrbotMainActivity.this, TorService.class); torService.setAction(action); startService(torService);
- } + }
private void stopTor() {
@@ -254,7 +248,7 @@ public class OrbotMainActivity extends AppCompatActivity
} else if (action.equals(TorServiceConstants.ACTION_STATUS)) { lastStatusIntent = intent; - + Message msg = mStatusUpdateHandler.obtainMessage(STATUS_UPDATE); msg.getData().putString("status", intent.getStringExtra(TorServiceConstants.EXTRA_STATUS));
@@ -262,103 +256,94 @@ public class OrbotMainActivity extends AppCompatActivity } } }; - - private void doLayout () - { + + private void doLayout() { setContentView(R.layout.layout_main); - + setTitle(R.string.app_name);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); - + mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); - mDrawerToggle = new ActionBarDrawerToggle( - this, mDrawer, - toolbar, - R.string.btn_okay, R.string.btn_cancel - ); - - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setHomeButtonEnabled(true); - - mDrawer.setDrawerListener(mDrawerToggle); - mDrawerToggle.syncState(); - - mTxtOrbotLog = (TextView)findViewById(R.id.orbotLog); - - lblStatus = (TextView)findViewById(R.id.lblStatus); + mDrawerToggle = new ActionBarDrawerToggle( + this, mDrawer, + toolbar, + R.string.btn_okay, R.string.btn_cancel + ); + + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeButtonEnabled(true); + + mDrawer.setDrawerListener(mDrawerToggle); + mDrawerToggle.syncState(); + + mTxtOrbotLog = (TextView) findViewById(R.id.orbotLog); + + lblStatus = (TextView) findViewById(R.id.lblStatus); lblStatus.setOnLongClickListener(this); - imgStatus = (ImageProgressView)findViewById(R.id.imgStatus); + imgStatus = (ImageProgressView) findViewById(R.id.imgStatus); imgStatus.setOnLongClickListener(this); imgStatus.setOnTouchListener(this); - - downloadText = (TextView)findViewById(R.id.trafficDown); - uploadText = (TextView)findViewById(R.id.trafficUp); - - + + downloadText = (TextView) findViewById(R.id.trafficDown); + uploadText = (TextView) findViewById(R.id.trafficUp); + + downloadText.setText(formatCount(0) + " / " + formatTotal(0)); uploadText.setText(formatCount(0) + " / " + formatTotal(0)); - + // Gesture detection - mGestureDetector = new GestureDetector(this, new MyGestureDetector()); - - mBtnStart =(Button)findViewById(R.id.btnStart); - mBtnStart.setOnClickListener(new View.OnClickListener() - { - @Override - public void onClick(View v) { - - if (torStatus == TorServiceConstants.STATUS_OFF) { - lblStatus.setText(getString(R.string.status_starting_up)); - startTor(); - } else { - lblStatus.setText(getString(R.string.status_shutting_down)); - stopTor(); - } - - } - }); - - mBtnBrowser = (Button)findViewById(R.id.btnBrowser); - mBtnBrowser.setOnClickListener(new View.OnClickListener () - { - - @Override - public void onClick(View v) { - doTorCheck(); - - } - - }); - - mBtnBrowser.setEnabled(false); - - mBtnVPN = (SwitchCompat)findViewById(R.id.btnVPN); - - boolean canDoVPN = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH; - - if (!canDoVPN) - { - //if not SDK 14 or higher, we can't use the VPN feature - mBtnVPN.setVisibility(View.GONE); - } - else - { - boolean useVPN = Prefs.useVpn(); - mBtnVPN.setChecked(useVPN); - - //auto start VPN if VPN is enabled - if (useVPN) - { - startActivity(new Intent(OrbotMainActivity.this,VPNEnableActivity.class)); - } - - mBtnVPN.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() - { + mGestureDetector = new GestureDetector(this, new MyGestureDetector()); + + mBtnStart = (Button) findViewById(R.id.btnStart); + mBtnStart.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + if (torStatus == TorServiceConstants.STATUS_OFF) { + lblStatus.setText(getString(R.string.status_starting_up)); + startTor(); + } else { + lblStatus.setText(getString(R.string.status_shutting_down)); + stopTor(); + } + + } + }); + + mBtnBrowser = (Button) findViewById(R.id.btnBrowser); + mBtnBrowser.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + doTorCheck(); + + } + + }); + + mBtnBrowser.setEnabled(false); + + mBtnVPN = (SwitchCompat) findViewById(R.id.btnVPN); + + boolean canDoVPN = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH; + + if (!canDoVPN) { + //if not SDK 14 or higher, we can't use the VPN feature + mBtnVPN.setVisibility(View.GONE); + } else { + boolean useVPN = Prefs.useVpn(); + mBtnVPN.setChecked(useVPN); + + //auto start VPN if VPN is enabled + if (useVPN) { + startActivity(new Intent(OrbotMainActivity.this, VPNEnableActivity.class)); + } + + mBtnVPN.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) - { + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { enableVPN(isChecked);
@@ -366,93 +351,88 @@ public class OrbotMainActivity extends AppCompatActivity });
- } - - - mBtnBridges = (SwitchCompat)findViewById(R.id.btnBridges); - mBtnBridges.setChecked(Prefs.bridgesEnabled()); - mBtnBridges.setOnClickListener(new View.OnClickListener () - { - - @Override - public void onClick(View v) { - if (Build.CPU_ABI.contains("arm")) - { - promptSetupBridges (); //if ARM processor, show all bridge options - - } - else - { - showGetBridgePrompt(""); //if other chip ar, only stock bridges are supported - } - } - - - }); - - - String currentExit = Prefs.getExitNodes(); - int selIdx = -1; - - ArrayList<String> cList = new ArrayList<String>(); - cList.add(0, getString(R.string.vpn_default_world)); - - for (int i = 0; i < TorServiceConstants.COUNTRY_CODES.length; i++) - { - Locale locale = new Locale("",TorServiceConstants.COUNTRY_CODES[i]); - cList.add(locale.getDisplayCountry()); - - if (currentExit.contains(TorServiceConstants.COUNTRY_CODES[i])) - selIdx = i+1; - } - - spnCountries = (Spinner)findViewById(R.id.spinnerCountry); - ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, cList); - spnCountries.setAdapter(adapter); - - if (selIdx != -1) - spnCountries.setSelection(selIdx); - - spnCountries.setOnItemSelectedListener(new OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { - // your code here - - String country = null; - - if (position == 0) - country = ""; - else - country = '{' + TorServiceConstants.COUNTRY_CODES[position-1] + '}'; - - 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 - } - - }); + } + + + mBtnBridges = (SwitchCompat) findViewById(R.id.btnBridges); + mBtnBridges.setChecked(Prefs.bridgesEnabled()); + mBtnBridges.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + if (Build.CPU_ABI.contains("arm")) { + promptSetupBridges(); //if ARM processor, show all bridge options + + } else { + showGetBridgePrompt(""); //if other chip ar, only stock bridges are supported + } + } + + + }); + + + String currentExit = Prefs.getExitNodes(); + int selIdx = -1; + + ArrayList<String> cList = new ArrayList<String>(); + cList.add(0, getString(R.string.vpn_default_world)); + + for (int i = 0; i < TorServiceConstants.COUNTRY_CODES.length; i++) { + Locale locale = new Locale("", TorServiceConstants.COUNTRY_CODES[i]); + cList.add(locale.getDisplayCountry()); + + if (currentExit.contains(TorServiceConstants.COUNTRY_CODES[i])) + selIdx = i + 1; + } + + spnCountries = (Spinner) findViewById(R.id.spinnerCountry); + ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, cList); + spnCountries.setAdapter(adapter); + + if (selIdx != -1) + spnCountries.setSelection(selIdx); + + spnCountries.setOnItemSelectedListener(new OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { + // your code here + + String country = null; + + if (position == 0) + country = ""; + else + country = '{' + TorServiceConstants.COUNTRY_CODES[position - 1] + '}'; + + 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; - +
@Override public boolean onTouch(View v, MotionEvent event) { return mGestureDetector.onTouchEvent(event); - } - - - /* - * Create the UI Options Menu (non-Javadoc) - * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu) - */ + } + + + /* + * Create the UI Options Menu (non-Javadoc) + * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu) + */ @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); @@ -461,92 +441,79 @@ public class OrbotMainActivity extends AppCompatActivity
return true; } - - +
@Override - public boolean onOptionsItemSelected(MenuItem item) { - - if (item.getItemId() == R.id.menu_settings) - { - Intent intent = new Intent(OrbotMainActivity.this, SettingsPreferences.class); - startActivityForResult(intent, REQUEST_SETTINGS); - } - /** + public boolean onOptionsItemSelected(MenuItem item) { + + if (item.getItemId() == R.id.menu_settings) { + Intent intent = new Intent(OrbotMainActivity.this, SettingsPreferences.class); + startActivityForResult(intent, REQUEST_SETTINGS); + } + /** else if (item.getItemId() == R.id.menu_promo_apps) { - startActivity(new Intent(OrbotMainActivity.this, PromoAppsActivity.class)); + startActivity(new Intent(OrbotMainActivity.this, PromoAppsActivity.class));
}*/ - else if (item.getItemId() == R.id.menu_exit) - { - //exit app - doExit(); - - - } - else if (item.getItemId() == R.id.menu_about) - { - showAbout(); - - - } - else if (item.getItemId() == R.id.menu_scan) - { - IntentIntegrator integrator = new IntentIntegrator(OrbotMainActivity.this); - integrator.initiateScan(); - } - else if (item.getItemId() == R.id.menu_share_bridge) - { - - String bridges = Prefs.getBridgesList(); - - if (bridges != null && bridges.length() > 0) - { - try { - bridges = "bridge://" + URLEncoder.encode(bridges,"UTF-8"); - - IntentIntegrator integrator = new IntentIntegrator(OrbotMainActivity.this); - integrator.shareText(bridges); - - } catch (UnsupportedEncodingException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - } - else if (item.getItemId() == R.id.menu_hidden_services) - { - startActivity(new Intent(this, HiddenServicesActivity.class)); - } - - return super.onOptionsItemSelected(item); - } - - private void showAbout () - { - - LayoutInflater li = LayoutInflater.from(this); - View view = li.inflate(R.layout.layout_about, null); - - String version = ""; - - try { - version = getPackageManager().getPackageInfo(getPackageName(), 0).versionName + " (Tor " + TorServiceConstants.BINARY_TOR_VERSION + ")"; - } catch (NameNotFoundException e) { - version = "Version Not Found"; + else if (item.getItemId() == R.id.menu_exit) { + //exit app + doExit(); + + + } else if (item.getItemId() == R.id.menu_about) { + showAbout(); + + + } else if (item.getItemId() == R.id.menu_scan) { + IntentIntegrator integrator = new IntentIntegrator(OrbotMainActivity.this); + integrator.initiateScan(); + } else if (item.getItemId() == R.id.menu_share_bridge) { + + String bridges = Prefs.getBridgesList(); + + if (bridges != null && bridges.length() > 0) { + try { + bridges = "bridge://" + URLEncoder.encode(bridges, "UTF-8"); + + IntentIntegrator integrator = new IntentIntegrator(OrbotMainActivity.this); + integrator.shareText(bridges); + + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } - - TextView versionName = (TextView)view.findViewById(R.id.versionName); - versionName.setText(version); - - new AlertDialog.Builder(this) - .setTitle(getString(R.string.button_about)) - .setView(view) - .show(); + + } else if (item.getItemId() == R.id.menu_hidden_services) { + startActivity(new Intent(this, HiddenServicesActivity.class)); + } + + return super.onOptionsItemSelected(item); + } + + private void showAbout() { + + LayoutInflater li = LayoutInflater.from(this); + View view = li.inflate(R.layout.layout_about, null); + + String version = ""; + + try { + version = getPackageManager().getPackageInfo(getPackageName(), 0).versionName + " (Tor " + TorServiceConstants.BINARY_TOR_VERSION + ")"; + } catch (NameNotFoundException e) { + version = "Version Not Found"; }
+ TextView versionName = (TextView) view.findViewById(R.id.versionName); + versionName.setText(version); + + new AlertDialog.Builder(this) + .setTitle(getString(R.string.button_about)) + .setView(view) + .show(); + } +
/** * This is our attempt to REALLY exit Orbot, and stop the background service @@ -562,30 +529,25 @@ public class OrbotMainActivity extends AppCompatActivity finish(); }
- protected void onPause() { - try - { - super.onPause(); - - if (aDialog != null) - aDialog.dismiss(); - } - catch (IllegalStateException ise) - { - //can happen on exit/shutdown - } - } - - private void doTorCheck () - { - - openBrowser(URL_TOR_CHECK,false); - - - } - - private void enableVPN (boolean enable) - { + protected void onPause() { + try { + super.onPause(); + + if (aDialog != null) + aDialog.dismiss(); + } catch (IllegalStateException ise) { + //can happen on exit/shutdown + } + } + + private void doTorCheck() { + + openBrowser(URL_TOR_CHECK, false); + + + } + + private void enableVPN(boolean enable) { Prefs.putUseVpn(enable);
if (enable) { @@ -596,570 +558,528 @@ public class OrbotMainActivity extends AppCompatActivity } else stopVpnService(); } - - private void enableHiddenServicePort (String hsName, final int hsPort, int hsRemotePort, final boolean doBackup, final String keyZipPath) throws RemoteException, InterruptedException - { - String onionHostname = null; - - if(hsName == null) - hsName = "hs" + hsPort; - - if(hsRemotePort == -1) - hsRemotePort = hsPort; - - ContentValues fields = new ContentValues(); - fields.put("name", hsName); - fields.put("port", hsPort); - fields.put("onion_port", hsRemotePort); - - ContentResolver cr = getContentResolver(); - Cursor row = cr.query(HSContentProvider.CONTENT_URI, mProjection, "port=" + hsPort, null, null); - - if(row == null) { - cr.insert(HSContentProvider.CONTENT_URI, fields); - } else { - onionHostname = row.getString(row.getColumnIndex(HSContentProvider.HiddenService.DOMAIN)); - row.close(); - } - - if(onionHostname == null || onionHostname.length() < 1) { - - requestTorRereadConfig(); - - new Thread () { - - public void run () - { - String hostname = null; - String backupPath = null; - - while (hostname == null) - { - //we need to stop and start Tor - try { - Thread.sleep(3000); //wait three seconds - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - Cursor onion = getContentResolver().query(HSContentProvider.CONTENT_URI, mProjection, "port=" + hsPort, null, null); - if(onion != null) { - hostname = onion.getString(onion.getColumnIndex(HSContentProvider.HiddenService.NAME)); - BackupUtils hsutils = new BackupUtils(getApplicationContext()); - if(keyZipPath != null && keyZipPath.length() > 0) - { - // TODO - // hsutils.restoreZipBackup(hsPort, keyZipPath); - requestTorRereadConfig(); - }
+ private void enableHiddenServicePort(String hsName, final int hsPort, int hsRemotePort, final String backupToPackage, final String keyZipPath) throws RemoteException, InterruptedException { + String onionHostname = null; + + if (hsName == null) + hsName = "hs" + hsPort; + + if (hsRemotePort == -1) + hsRemotePort = hsPort; + + ContentValues fields = new ContentValues(); + fields.put(HSContentProvider.HiddenService.NAME, hsName); + fields.put(HSContentProvider.HiddenService.PORT, hsPort); + fields.put(HSContentProvider.HiddenService.ONION_PORT, hsRemotePort); + + ContentResolver cr = getContentResolver(); + + Cursor row = cr.query( + HSContentProvider.CONTENT_URI, + HSContentProvider.PROJECTION, + HSContentProvider.HiddenService.ONION_PORT + "=" + hsPort, + null, + null + ); + + if (row == null) { + cr.insert(HSContentProvider.CONTENT_URI, fields); + } else { + onionHostname = row.getString(row.getColumnIndex(HSContentProvider.HiddenService.DOMAIN)); + row.close(); + } + + if (onionHostname == null || onionHostname.length() < 1) { + + requestTorRereadConfig(); + + new Thread() { + + public void run() { + String hostname = null; + Intent nResult = new Intent(); + + while (hostname == null) { + //we need to stop and start Tor + try { + Thread.sleep(3000); //wait three seconds + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + Cursor onion = getContentResolver().query( + HSContentProvider.CONTENT_URI, + HSContentProvider.PROJECTION, + HSContentProvider.HiddenService.ONION_PORT + "=" + hsPort, + null, + null + ); + + if (onion != null && onion.getCount() > 0) { + hostname = onion.getString(onion.getColumnIndex(HSContentProvider.HiddenService.NAME)); + nResult.putExtra("hs_host", hostname); /* TODO - if(doBackup) - { - backupPath = hsutils.createZipBackup(hsPort); - } - */ - onion.close(); - } - } - - Intent nResult = new Intent(); - nResult.putExtra("hs_host", hostname); - /* TODO - if(doBackup && backupPath != null) { - nResult.putExtra("hs_backup_path", backupPath); - } - */ - setResult(RESULT_OK, nResult); - finish(); - } - }.start(); - - } - - Intent nResult = new Intent(); - nResult.putExtra("hs_host", onionHostname); - setResult(RESULT_OK, nResult); - finish(); - - } - - private synchronized void handleIntents () - { - if (getIntent() == null) - return; - - // Get intent, action and MIME type - Intent intent = getIntent(); - String action = intent.getAction(); - Log.d(TAG, "handleIntents " + action); - - //String type = intent.getType(); - - if (action == null) - return; - - switch (action) { - case INTENT_ACTION_REQUEST_HIDDEN_SERVICE: - final int hiddenServicePort = intent.getIntExtra("hs_port", -1); - final int hiddenServiceRemotePort = intent.getIntExtra("hs_onion_port", -1); - final String hiddenServiceName = intent.getStringExtra("hs_name"); - final Boolean createBackup = intent.getBooleanExtra("hs_backup", false); - final String keyZipPath = intent.getStringExtra("hs_key_zip_path"); - - DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { - - public void onClick(DialogInterface dialog, int which) { - switch (which) { - case DialogInterface.BUTTON_POSITIVE: - try { - enableHiddenServicePort( - hiddenServiceName, hiddenServicePort, - hiddenServiceRemotePort, createBackup, keyZipPath - ); - } catch (RemoteException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - break; - } - } - }; - - String requestMsg = getString(R.string.hidden_service_request, hiddenServicePort); - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setMessage(requestMsg).setPositiveButton("Allow", dialogClickListener) - .setNegativeButton("Deny", dialogClickListener).show(); - - return; //don't null the setIntent() as we need it later - - case INTENT_ACTION_REQUEST_START_TOR: - autoStartFromIntent = true; - - startTor(); - - //never allow backgrounds start from this type of intent start - //app devs who want background starts, can use the service intents - /** - if (Prefs.allowBackgroundStarts()) - { - Intent resultIntent; - if (lastStatusIntent == null) { - resultIntent = new Intent(intent); - } else { - resultIntent = lastStatusIntent; - } - resultIntent.putExtra(TorServiceConstants.EXTRA_STATUS, torStatus); - setResult(RESULT_OK, resultIntent); - finish(); - }*/ - - break; - case Intent.ACTION_VIEW: - String urlString = intent.getDataString(); - - if (urlString != null) { - - if (urlString.toLowerCase().startsWith("bridge://")) - - { - String newBridgeValue = urlString.substring(9); //remove the bridge protocol piece - newBridgeValue = URLDecoder.decode(newBridgeValue); //decode the value here - - showAlert(getString(R.string.bridges_updated), getString(R.string.restart_orbot_to_use_this_bridge_) + newBridgeValue, false); - - setNewBridges(newBridgeValue); - } - } - break; - } - - updateStatus(null); - - setIntent(null); - - } - - private void setNewBridges (String newBridgeValue) - { - - Prefs.setBridgesList(newBridgeValue); //set the string to a preference - Prefs.putBridgesEnabled(true); - - setResult(RESULT_OK); - - mBtnBridges.setChecked(true); - - enableBridges(true); - } - - /* - * Launch the system activity for Uri viewing with the provided url - */ - private void openBrowser(final String browserLaunchUrl,boolean forceExternal) - { - boolean isBrowserInstalled = appInstalledOrNot(TorServiceConstants.BROWSER_APP_USERNAME); - - if (isBrowserInstalled) - { - startIntent(TorServiceConstants.BROWSER_APP_USERNAME,Intent.ACTION_VIEW,Uri.parse(browserLaunchUrl)); + BackupUtils hsutils = new BackupUtils(getApplicationContext()); + if (keyZipPath != null && keyZipPath.length() > 0) { + // hsutils.restoreZipBackup(hsPort, keyZipPath); + requestTorRereadConfig(); + } + */ + + if (backupToPackage != null && backupToPackage.length() > 0) { + String servicePath = getFilesDir() + "/" + TorServiceConstants.HIDDEN_SERVICES_DIR + "/hs" + hsPort; + File hidden_service_key = new File(servicePath, "private_key"); + Context context = getApplicationContext(); + + Uri contentUri = getUriForFile( + context, + "org.torproject.android.ui.hiddenservices.storage", + hidden_service_key + ); + + context.grantUriPermission(backupToPackage, contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); + nResult.setData(contentUri); + nResult.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + } + + onion.close(); + } + } + + setResult(RESULT_OK, nResult); + finish(); + } + }.start(); + } - else if (mBtnVPN.isChecked()||forceExternal) - { - //use the system browser since VPN is on - startIntent(null,Intent.ACTION_VIEW, Uri.parse(browserLaunchUrl)); - } - else if (Prefs.useTransparentProxying()) - { - startIntent(null,Intent.ACTION_VIEW, Uri.parse(browserLaunchUrl)); - } - else - { - AlertDialog aDialog = new AlertDialog.Builder(OrbotMainActivity.this) - .setTitle(R.string.install_apps_) - .setMessage(R.string.it_doesn_t_seem_like_you_have_orweb_installed_want_help_with_that_or_should_we_just_open_the_browser_) - .setPositiveButton(R.string.install_orweb, new Dialog.OnClickListener () - { - - @Override - public void onClick(DialogInterface dialog, int which) { - - //prompt to install Orweb - //Intent intent = new Intent(OrbotMainActivity.this,PromoAppsActivity.class); - //startActivity(intent); - - startActivity(PromoAppsActivity.getInstallIntent(TorServiceConstants.BROWSER_APP_USERNAME,OrbotMainActivity.this));
+ Intent nResult = new Intent(); + nResult.putExtra("hs_host", onionHostname); + setResult(RESULT_OK, nResult); + finish(); + + } + + private synchronized void handleIntents() { + if (getIntent() == null) + return; + + // Get intent, action and MIME type + Intent intent = getIntent(); + String action = intent.getAction(); + Log.d(TAG, "handleIntents " + action); + + //String type = intent.getType(); + + if (action == null) + return; + + switch (action) { + case INTENT_ACTION_REQUEST_HIDDEN_SERVICE: + final int hiddenServicePort = intent.getIntExtra("hs_port", -1); + final int hiddenServiceRemotePort = intent.getIntExtra("hs_onion_port", -1); + final String hiddenServiceName = intent.getStringExtra("hs_name"); + final String backupToPackage = intent.getStringExtra("hs_backup_to_package"); + final String keyZipPath = intent.getStringExtra("hs_key_path"); + + DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { + + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_POSITIVE: + try { + enableHiddenServicePort( + hiddenServiceName, hiddenServicePort, + hiddenServiceRemotePort, backupToPackage, keyZipPath + ); + } catch (RemoteException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + break; + } + } + }; + + String requestMsg = getString(R.string.hidden_service_request, hiddenServicePort); + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage(requestMsg).setPositiveButton("Allow", dialogClickListener) + .setNegativeButton("Deny", dialogClickListener).show(); + + return; //don't null the setIntent() as we need it later + + case INTENT_ACTION_REQUEST_START_TOR: + autoStartFromIntent = true; + + startTor(); + + //never allow backgrounds start from this type of intent start + //app devs who want background starts, can use the service intents + /** + if (Prefs.allowBackgroundStarts()) + { + Intent resultIntent; + if (lastStatusIntent == null) { + resultIntent = new Intent(intent); + } else { + resultIntent = lastStatusIntent; + } + resultIntent.putExtra(TorServiceConstants.EXTRA_STATUS, torStatus); + setResult(RESULT_OK, resultIntent); + finish(); + }*/ + + break; + case Intent.ACTION_VIEW: + String urlString = intent.getDataString(); + + if (urlString != null) { + + if (urlString.toLowerCase().startsWith("bridge://"))
+ { + String newBridgeValue = urlString.substring(9); //remove the bridge protocol piece + newBridgeValue = URLDecoder.decode(newBridgeValue); //decode the value here + + showAlert(getString(R.string.bridges_updated), getString(R.string.restart_orbot_to_use_this_bridge_) + newBridgeValue, false); + + setNewBridges(newBridgeValue); + } } - - }) + break; + } + + updateStatus(null); + + setIntent(null); + + } + + private void setNewBridges(String newBridgeValue) { + + Prefs.setBridgesList(newBridgeValue); //set the string to a preference + Prefs.putBridgesEnabled(true); + + setResult(RESULT_OK); + + mBtnBridges.setChecked(true); + + enableBridges(true); + } + + /* + * Launch the system activity for Uri viewing with the provided url + */ + private void openBrowser(final String browserLaunchUrl, boolean forceExternal) { + boolean isBrowserInstalled = appInstalledOrNot(TorServiceConstants.BROWSER_APP_USERNAME); + + if (isBrowserInstalled) { + startIntent(TorServiceConstants.BROWSER_APP_USERNAME, Intent.ACTION_VIEW, Uri.parse(browserLaunchUrl)); + } else if (mBtnVPN.isChecked() || forceExternal) { + //use the system browser since VPN is on + startIntent(null, Intent.ACTION_VIEW, Uri.parse(browserLaunchUrl)); + } else if (Prefs.useTransparentProxying()) { + startIntent(null, Intent.ACTION_VIEW, Uri.parse(browserLaunchUrl)); + } else { + AlertDialog aDialog = new AlertDialog.Builder(OrbotMainActivity.this) + .setTitle(R.string.install_apps_) + .setMessage(R.string.it_doesn_t_seem_like_you_have_orweb_installed_want_help_with_that_or_should_we_just_open_the_browser_) + .setPositiveButton(R.string.install_orweb, new Dialog.OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, int which) { + + //prompt to install Orweb + //Intent intent = new Intent(OrbotMainActivity.this,PromoAppsActivity.class); + //startActivity(intent); + + startActivity(PromoAppsActivity.getInstallIntent(TorServiceConstants.BROWSER_APP_USERNAME, OrbotMainActivity.this)); + + + } + + }) .setNeutralButton(R.string.apps_mode, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - // enableVPN(true); + // enableVPN(true); mBtnVPN.setChecked(true); } }) - .setNegativeButton(R.string.standard_browser, new Dialog.OnClickListener () - { - - @Override - public void onClick(DialogInterface dialog, int which) { - startIntent(null,Intent.ACTION_VIEW, Uri.parse(browserLaunchUrl)); - - } - - }) - .show(); - - } - - } - - private void startIntent (String pkg, String action, Uri data) - { + .setNegativeButton(R.string.standard_browser, new Dialog.OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, int which) { + startIntent(null, Intent.ACTION_VIEW, Uri.parse(browserLaunchUrl)); + + } + + }) + .show(); + + } + + } + + private void startIntent(String pkg, String action, Uri data) { Intent i; - PackageManager pm = getPackageManager(); + PackageManager pm = getPackageManager();
try { - if (pkg != null) { - i = pm.getLaunchIntentForPackage(pkg); - if (i == null) - throw new PackageManager.NameNotFoundException(); - } - else - { - i = new Intent(); - } + if (pkg != null) { + i = pm.getLaunchIntentForPackage(pkg); + if (i == null) + throw new PackageManager.NameNotFoundException(); + } else { + i = new Intent(); + }
i.setAction(action); i.setData(data);
- if (i.resolveActivity(pm)!=null) - startActivity(i); + if (i.resolveActivity(pm) != null) + startActivity(i);
} catch (PackageManager.NameNotFoundException e) {
} } - - private boolean appInstalledOrNot(String uri) - { + + private boolean appInstalledOrNot(String uri) { PackageManager pm = getPackageManager(); - try - { - PackageInfo pi = pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES); - return pi.applicationInfo.enabled; - } - catch (PackageManager.NameNotFoundException e) - { - return false; + try { + PackageInfo pi = pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES); + return pi.applicationInfo.enabled; + } catch (PackageManager.NameNotFoundException e) { + return false; } - } - + } + @Override protected void onActivityResult(int request, int response, Intent data) { super.onActivityResult(request, response, data);
- if (request == REQUEST_SETTINGS && response == RESULT_OK) - { + if (request == REQUEST_SETTINGS && response == RESULT_OK) { OrbotApp.forceChangeLanguage(this); - if (data != null && data.getBooleanExtra("transproxywipe", false)) - { - - boolean result = flushTransProxy(); - - if (result) - { + if (data != null && data.getBooleanExtra("transproxywipe", false)) {
- Toast.makeText(this, R.string.transparent_proxy_rules_flushed_, Toast.LENGTH_SHORT).show(); - - } - else - { + boolean result = flushTransProxy();
- Toast.makeText(this, R.string.you_do_not_have_root_access_enabled, Toast.LENGTH_SHORT).show(); - - } - - } - else if (torStatus == TorServiceConstants.STATUS_ON) - { + if (result) { + + Toast.makeText(this, R.string.transparent_proxy_rules_flushed_, Toast.LENGTH_SHORT).show(); + + } else { + + Toast.makeText(this, R.string.you_do_not_have_root_access_enabled, Toast.LENGTH_SHORT).show(); + + } + + } else if (torStatus == TorServiceConstants.STATUS_ON) { updateTransProxy(); - // Toast.makeText(this, R.string.you_may_need_to_stop_and_start_orbot_for_settings_change_to_be_enabled_, Toast.LENGTH_SHORT).show(); + // Toast.makeText(this, R.string.you_may_need_to_stop_and_start_orbot_for_settings_change_to_be_enabled_, Toast.LENGTH_SHORT).show();
} - } - else if (request == REQUEST_VPN) - { - if (response == RESULT_OK) { + } else if (request == REQUEST_VPN) { + if (response == RESULT_OK) { sendIntentToService(TorServiceConstants.CMD_VPN); - } - else - { - Prefs.putUseVpn(false); + } else { + Prefs.putUseVpn(false);
- } - } - else if (request == REQUEST_VPN_APPS_SELECT) - { - startActivity(new Intent(OrbotMainActivity.this, VPNEnableActivity.class)); + } + } else if (request == REQUEST_VPN_APPS_SELECT) { + startActivity(new Intent(OrbotMainActivity.this, VPNEnableActivity.class)); } - + IntentResult scanResult = IntentIntegrator.parseActivityResult(request, response, data); if (scanResult != null) { - // handle scan result - - String results = scanResult.getContents(); - - if (results != null && results.length() > 0) - { - try { - - int urlIdx = results.indexOf("://"); - - if (urlIdx!=-1) - { - results = URLDecoder.decode(results, "UTF-8"); - results = results.substring(urlIdx+3); - - showAlert(getString(R.string.bridges_updated),getString(R.string.restart_orbot_to_use_this_bridge_) + results,false); - - setNewBridges(results); - } - else - { - JSONArray bridgeJson = new JSONArray(results); - StringBuffer bridgeLines = new StringBuffer(); - - for (int i = 0; i < bridgeJson.length(); i++) - { - String bridgeLine = bridgeJson.getString(i); - bridgeLines.append(bridgeLine).append("\n"); - } - - setNewBridges(bridgeLines.toString()); - } - - - } catch (Exception e) { - Log.e(TAG,"unsupported",e); - } - } - - } - - } - - public void promptSetupBridges () - { - loadBridgeDefaults(); - - LayoutInflater li = LayoutInflater.from(this); - View view = li.inflate(R.layout.layout_diag, null); - - TextView versionName = (TextView)view.findViewById(R.id.diaglog); - versionName.setText(R.string.if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_); - - if (mBtnBridges.isChecked()) - { - new AlertDialog.Builder(this) - .setTitle(R.string.bridge_mode) - .setView(view) - .setItems(R.array.bridge_options, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - // The 'which' argument contains the index position - // of the selected item - - switch (which) - { - case 0: //obfs 4; - setupBridgeType("obfs4"); - enableBridges(true); - - break; - case 1: //azure - Prefs.setBridgesList("2"); - enableBridges(true); - - break; - case 2: //amazon - Prefs.setBridgesList("1"); - enableBridges(true); - - break; - case 3: - showGetBridgePrompt("obfs4"); - - break; - - } - - } - }).setNegativeButton(R.string.btn_cancel, new Dialog.OnClickListener() - { - @Override - public void onClick(DialogInterface dialog, int which) { - - //mBtnBridges.setChecked(false); - - } - }) - .show(); - - + // handle scan result + + String results = scanResult.getContents(); + + if (results != null && results.length() > 0) { + try { + + int urlIdx = results.indexOf("://"); + + if (urlIdx != -1) { + results = URLDecoder.decode(results, "UTF-8"); + results = results.substring(urlIdx + 3); + + showAlert(getString(R.string.bridges_updated), getString(R.string.restart_orbot_to_use_this_bridge_) + results, false); + + setNewBridges(results); + } else { + JSONArray bridgeJson = new JSONArray(results); + StringBuffer bridgeLines = new StringBuffer(); + + for (int i = 0; i < bridgeJson.length(); i++) { + String bridgeLine = bridgeJson.getString(i); + bridgeLines.append(bridgeLine).append("\n"); + } + + setNewBridges(bridgeLines.toString()); + } + + + } catch (Exception e) { + Log.e(TAG, "unsupported", e); + } + } + } - else - { - enableBridges(false); + + } + + public void promptSetupBridges() { + loadBridgeDefaults(); + + LayoutInflater li = LayoutInflater.from(this); + View view = li.inflate(R.layout.layout_diag, null); + + TextView versionName = (TextView) view.findViewById(R.id.diaglog); + versionName.setText(R.string.if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_); + + if (mBtnBridges.isChecked()) { + new AlertDialog.Builder(this) + .setTitle(R.string.bridge_mode) + .setView(view) + .setItems(R.array.bridge_options, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + // The 'which' argument contains the index position + // of the selected item + + switch (which) { + case 0: //obfs 4; + setupBridgeType("obfs4"); + enableBridges(true); + + break; + case 1: //azure + Prefs.setBridgesList("2"); + enableBridges(true); + + break; + case 2: //amazon + Prefs.setBridgesList("1"); + enableBridges(true); + + break; + case 3: + showGetBridgePrompt("obfs4"); + + break; + + } + + } + }).setNegativeButton(R.string.btn_cancel, new Dialog.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + + //mBtnBridges.setChecked(false); + + } + }) + .show(); + + + } else { + enableBridges(false); } - + } - - private void showGetBridgePrompt (final String type) - { - LayoutInflater li = LayoutInflater.from(this); - View view = li.inflate(R.layout.layout_diag, null); - - TextView versionName = (TextView)view.findViewById(R.id.diaglog); - versionName.setText(R.string.you_must_get_a_bridge_address_by_email_web_or_from_a_friend_once_you_have_this_address_please_paste_it_into_the_bridges_preference_in_orbot_s_setting_and_restart_); - + + private void showGetBridgePrompt(final String type) { + LayoutInflater li = LayoutInflater.from(this); + View view = li.inflate(R.layout.layout_diag, null); + + TextView versionName = (TextView) view.findViewById(R.id.diaglog); + versionName.setText(R.string.you_must_get_a_bridge_address_by_email_web_or_from_a_friend_once_you_have_this_address_please_paste_it_into_the_bridges_preference_in_orbot_s_setting_and_restart_); + new AlertDialog.Builder(this) - .setTitle(R.string.bridge_mode) - .setView(view) - .setNegativeButton(R.string.btn_cancel, new Dialog.OnClickListener() - { - @Override - public void onClick(DialogInterface dialog, int which) { - //do nothing - } - }) - .setNeutralButton(R.string.get_bridges_email, new Dialog.OnClickListener () - { - - @Override - public void onClick(DialogInterface dialog, int which) { - - - sendGetBridgeEmail(type); - - } - - - }) - .setPositiveButton(R.string.get_bridges_web, new Dialog.OnClickListener () - { - - @Override - public void onClick(DialogInterface dialog, int which) { - - openBrowser(URL_TOR_BRIDGES + type,true); - - } - - - }).show(); + .setTitle(R.string.bridge_mode) + .setView(view) + .setNegativeButton(R.string.btn_cancel, new Dialog.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + //do nothing + } + }) + .setNeutralButton(R.string.get_bridges_email, new Dialog.OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, int which) { + + + sendGetBridgeEmail(type); + + } + + + }) + .setPositiveButton(R.string.get_bridges_web, new Dialog.OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, int which) { + + openBrowser(URL_TOR_BRIDGES + type, true); + + } + + + }).show(); } - - private void sendGetBridgeEmail (String type) - { - Intent intent = new Intent(Intent.ACTION_SEND); - intent.setType("message/rfc822"); - intent.putExtra(Intent.EXTRA_EMAIL , new String[]{"bridges@torproject.org"}); - - if (type != null) - { - intent.putExtra(Intent.EXTRA_SUBJECT, "get transport " + type); - intent.putExtra(Intent.EXTRA_TEXT, "get transport " + type); - - } - else - { - intent.putExtra(Intent.EXTRA_SUBJECT, "get bridges"); - intent.putExtra(Intent.EXTRA_TEXT, "get bridges"); - - } - - startActivity(Intent.createChooser(intent, getString(R.string.send_email))); + + private void sendGetBridgeEmail(String type) { + Intent intent = new Intent(Intent.ACTION_SEND); + intent.setType("message/rfc822"); + intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"bridges@torproject.org"}); + + if (type != null) { + intent.putExtra(Intent.EXTRA_SUBJECT, "get transport " + type); + intent.putExtra(Intent.EXTRA_TEXT, "get transport " + type); + + } else { + intent.putExtra(Intent.EXTRA_SUBJECT, "get bridges"); + intent.putExtra(Intent.EXTRA_TEXT, "get bridges"); + + } + + startActivity(Intent.createChooser(intent, getString(R.string.send_email))); } - - private void enableBridges (boolean enable) - { - Prefs.putBridgesEnabled(enable); - - if (torStatus == TorServiceConstants.STATUS_ON) - { - String bridgeList = Prefs.getBridgesList(); - if (bridgeList != null && bridgeList.length() > 0) - { - requestTorRereadConfig (); - } - } + + private void enableBridges(boolean enable) { + Prefs.putBridgesEnabled(enable); + + if (torStatus == TorServiceConstants.STATUS_ON) { + String bridgeList = Prefs.getBridgesList(); + if (bridgeList != null && bridgeList.length() > 0) { + requestTorRereadConfig(); + } + } }
private void requestTorRereadConfig() { sendIntentToService(TorServiceConstants.CMD_SIGNAL_HUP); } - - public void stopVpnService () - { + + public void stopVpnService() { sendIntentToService(TorServiceConstants.CMD_VPN_CLEAR); }
- private boolean flushTransProxy () - { + private boolean flushTransProxy() { sendIntentToService(TorServiceConstants.CMD_FLUSH); return true; } - - private boolean updateTransProxy () - { + + private boolean updateTransProxy() { sendIntentToService(TorServiceConstants.CMD_UPDATE_TRANS_PROXY); return true; } @@ -1170,46 +1090,41 @@ public class OrbotMainActivity extends AppCompatActivity
mBtnBridges.setChecked(Prefs.bridgesEnabled());
- requestTorStatus(); + requestTorStatus(); + + updateStatus(null);
- updateStatus(null); - }
AlertDialog aDialog = null; - + //general alert dialog for mostly Tor warning messages //sometimes this can go haywire or crazy with too many error //messages from Tor, and the user cannot stop or exit Orbot //so need to ensure repeated error messages are not spamming this method - private void showAlert(String title, String msg, boolean button) - { - try - { - if (aDialog != null && aDialog.isShowing()) - aDialog.dismiss(); - } - catch (Exception e){} //swallow any errors - - if (button) - { - aDialog = new AlertDialog.Builder(OrbotMainActivity.this) - .setIcon(R.drawable.onion32) - .setTitle(title) - .setMessage(msg) - .setPositiveButton(R.string.btn_okay, null) - .show(); - } - else - { - aDialog = new AlertDialog.Builder(OrbotMainActivity.this) - .setIcon(R.drawable.onion32) - .setTitle(title) - .setMessage(msg) - .show(); - } - - aDialog.setCanceledOnTouchOutside(true); + private void showAlert(String title, String msg, boolean button) { + try { + if (aDialog != null && aDialog.isShowing()) + aDialog.dismiss(); + } catch (Exception e) { + } //swallow any errors + + if (button) { + aDialog = new AlertDialog.Builder(OrbotMainActivity.this) + .setIcon(R.drawable.onion32) + .setTitle(title) + .setMessage(msg) + .setPositiveButton(R.string.btn_okay, null) + .show(); + } else { + aDialog = new AlertDialog.Builder(OrbotMainActivity.this) + .setIcon(R.drawable.onion32) + .setTitle(title) + .setMessage(msg) + .show(); + } + + aDialog.setCanceledOnTouchOutside(true); }
/** @@ -1218,30 +1133,27 @@ public class OrbotMainActivity extends AppCompatActivity */ private void updateStatus(String torServiceMsg) {
- if (torStatus == null) - return; //UI not init'd yet - + if (torStatus == null) + return; //UI not init'd yet + if (torStatus == TorServiceConstants.STATUS_ON) { - + imgStatus.setImageResource(R.drawable.toron);
mBtnBrowser.setEnabled(true); - mBtnStart.setText(R.string.menu_stop); + mBtnStart.setText(R.string.menu_stop);
- if (torServiceMsg != null) - { - if (torServiceMsg.contains(TorServiceConstants.LOG_NOTICE_HEADER)) { + if (torServiceMsg != null) { + if (torServiceMsg.contains(TorServiceConstants.LOG_NOTICE_HEADER)) { lblStatus.setText(torServiceMsg); } - } - else - lblStatus.setText(getString(R.string.status_activated)); + } else + lblStatus.setText(getString(R.string.status_activated));
boolean showFirstTime = mPrefs.getBoolean("connect_first_time", true);
- if (showFirstTime) - { + if (showFirstTime) { Editor pEdit = mPrefs.edit(); pEdit.putBoolean("connect_first_time", false); pEdit.commit(); @@ -1249,39 +1161,35 @@ public class OrbotMainActivity extends AppCompatActivity getString(R.string.connect_first_time), true); }
- if (autoStartFromIntent) - { + if (autoStartFromIntent) { autoStartFromIntent = false; - Intent resultIntent = lastStatusIntent; - resultIntent.putExtra(TorServiceConstants.EXTRA_STATUS, torStatus); - setResult(RESULT_OK, resultIntent); + Intent resultIntent = lastStatusIntent; + resultIntent.putExtra(TorServiceConstants.EXTRA_STATUS, torStatus); + setResult(RESULT_OK, resultIntent); finish(); Log.d(TAG, "autoStartFromIntent finish"); } - - +
} else if (torStatus == TorServiceConstants.STATUS_STARTING) {
imgStatus.setImageResource(R.drawable.torstarting);
- if (torServiceMsg != null) - { - if (torServiceMsg.contains(TorServiceConstants.LOG_NOTICE_BOOTSTRAPPED)) - lblStatus.setText(torServiceMsg); - } - else - lblStatus.setText(getString(R.string.status_starting_up)); + if (torServiceMsg != null) { + if (torServiceMsg.contains(TorServiceConstants.LOG_NOTICE_BOOTSTRAPPED)) + lblStatus.setText(torServiceMsg); + } else + lblStatus.setText(getString(R.string.status_starting_up));
- mBtnStart.setText("..."); + mBtnStart.setText("...");
- mBtnBrowser.setEnabled(false); + mBtnBrowser.setEnabled(false);
} else if (torStatus == TorServiceConstants.STATUS_STOPPING) {
- if (torServiceMsg != null && torServiceMsg.contains(TorServiceConstants.LOG_NOTICE_HEADER)) - lblStatus.setText(torServiceMsg); - + if (torServiceMsg != null && torServiceMsg.contains(TorServiceConstants.LOG_NOTICE_HEADER)) + lblStatus.setText(torServiceMsg); + imgStatus.setImageResource(R.drawable.torstarting); lblStatus.setText(torServiceMsg); mBtnBrowser.setEnabled(false); @@ -1289,15 +1197,14 @@ public class OrbotMainActivity extends AppCompatActivity } else if (torStatus == TorServiceConstants.STATUS_OFF) {
imgStatus.setImageResource(R.drawable.toroff); - // lblStatus.setText(getString(R.string.press_to_start)); + // lblStatus.setText(getString(R.string.press_to_start)); mBtnBrowser.setEnabled(false);
- mBtnStart.setText(R.string.menu_start); + mBtnStart.setText(R.string.menu_start);
}
- if (torServiceMsg != null && torServiceMsg.length() > 0) - { + if (torServiceMsg != null && torServiceMsg.length() > 0) { mTxtOrbotLog.append(torServiceMsg + '\n'); } } @@ -1311,7 +1218,7 @@ public class OrbotMainActivity extends AppCompatActivity sendIntentToService(TorServiceConstants.ACTION_START); mTxtOrbotLog.setText(""); } - + /** * Request tor status without starting it * {@link TorServiceConstants#ACTION_START} {@link Intent} to @@ -1337,52 +1244,50 @@ public class OrbotMainActivity extends AppCompatActivity lblStatus.setText(getString(R.string.status_starting_up)); startTor(); } else { - lblStatus.setText(getString(R.string.status_shutting_down)); - + lblStatus.setText(getString(R.string.status_shutting_down)); + stopTor(); } - + return true; - + }
-// this is what takes messages or values from the callback threads or other non-mainUI threads + // this is what takes messages or values from the callback threads or other non-mainUI threads //and passes them back into the main UI thread for display to the user private Handler mStatusUpdateHandler = new Handler() {
@Override public void handleMessage(final Message msg) { - - String newTorStatus = msg.getData().getString("status"); - String log = (String)msg.obj; - - if (torStatus == null && newTorStatus != null) //first time status - { - torStatus = newTorStatus; - findViewById(R.id.frameMain).setVisibility(View.VISIBLE); - updateStatus(log); - - //now you can handle the intents properly - handleIntents(); - - } - else if (newTorStatus != null && !torStatus.equals(newTorStatus)) //status changed - { - torStatus = newTorStatus; - updateStatus(log); - } - else if (log != null) //it is just a log - updateStatus(log); - + + String newTorStatus = msg.getData().getString("status"); + String log = (String) msg.obj; + + if (torStatus == null && newTorStatus != null) //first time status + { + torStatus = newTorStatus; + findViewById(R.id.frameMain).setVisibility(View.VISIBLE); + updateStatus(log); + + //now you can handle the intents properly + handleIntents(); + + } else if (newTorStatus != null && !torStatus.equals(newTorStatus)) //status changed + { + torStatus = newTorStatus; + updateStatus(log); + } else if (log != null) //it is just a log + updateStatus(log); + switch (msg.what) { case MESSAGE_TRAFFIC_COUNT:
Bundle data = msg.getData(); - DataCount datacount = new DataCount(data.getLong("upload"),data.getLong("download")); - + DataCount datacount = new DataCount(data.getLong("upload"), data.getLong("download")); + long totalRead = data.getLong("readTotal"); long totalWrite = data.getLong("writeTotal"); - + downloadText.setText(formatCount(datacount.Download) + " / " + formatTotal(totalRead)); uploadText.setText(formatCount(datacount.Upload) + " / " + formatTotal(totalWrite));
@@ -1396,22 +1301,22 @@ public class OrbotMainActivity extends AppCompatActivity @Override protected void onDestroy() { super.onDestroy(); - LocalBroadcastManager.getInstance(this).unregisterReceiver(mLocalBroadcastReceiver); + LocalBroadcastManager.getInstance(this).unregisterReceiver(mLocalBroadcastReceiver);
}
public class DataCount { - // data uploaded - public long Upload; - // data downloaded - public long Download; - - DataCount(long Upload, long Download){ - this.Upload = Upload; - this.Download = Download; - } - } - + // data uploaded + public long Upload; + // data downloaded + public long Download; + + DataCount(long Upload, long Download) { + this.Upload = Upload; + this.Download = Download; + } + } + private String formatCount(long count) { NumberFormat numberFormat = NumberFormat.getInstance(Locale.getDefault()); // Converts the supplied argument into a string. @@ -1440,115 +1345,105 @@ public class OrbotMainActivity extends AppCompatActivity + getString(R.string.mb); }
- private static final float ROTATE_FROM = 0.0f; - private static final float ROTATE_TO = 360.0f*4f;// 3.141592654f * 32.0f; + private static final float ROTATE_FROM = 0.0f; + private static final float ROTATE_TO = 360.0f * 4f;// 3.141592654f * 32.0f; + + public void spinOrbot(float direction) { + sendIntentToService(TorServiceConstants.CMD_NEWNYM); + + + Toast.makeText(this, R.string.newnym, Toast.LENGTH_SHORT).show();
- public void spinOrbot (float direction) - { - sendIntentToService (TorServiceConstants.CMD_NEWNYM); - - - Toast.makeText(this, R.string.newnym, Toast.LENGTH_SHORT).show(); - // Rotate3dAnimation rotation = new Rotate3dAnimation(ROTATE_FROM, ROTATE_TO*direction, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); - Rotate3dAnimation rotation = new Rotate3dAnimation(ROTATE_FROM, ROTATE_TO*direction, imgStatus.getWidth()/2f,imgStatus.getWidth()/2f,20f,false); - rotation.setFillAfter(true); - rotation.setInterpolator(new AccelerateInterpolator()); - rotation.setDuration((long) 2*1000); - rotation.setRepeatCount(0); - imgStatus.startAnimation(rotation); - - + Rotate3dAnimation rotation = new Rotate3dAnimation(ROTATE_FROM, ROTATE_TO * direction, imgStatus.getWidth() / 2f, imgStatus.getWidth() / 2f, 20f, false); + rotation.setFillAfter(true); + rotation.setInterpolator(new AccelerateInterpolator()); + rotation.setDuration((long) 2 * 1000); + rotation.setRepeatCount(0); + imgStatus.startAnimation(rotation); + + } - + class MyGestureDetector extends SimpleOnGestureListener { - @Override - public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { - try { - if (torStatus == TorServiceConstants.STATUS_ON) - { - float direction = 1f; - if (velocityX < 0) - direction = -1f; - spinOrbot (direction); - } - } catch (Exception e) { - // nothing + @Override + public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { + try { + if (torStatus == TorServiceConstants.STATUS_ON) { + float direction = 1f; + if (velocityX < 0) + direction = -1f; + spinOrbot(direction); } - return false; + } catch (Exception e) { + // nothing } + return false; + } } - - private void loadBridgeDefaults () - { - if (alBridges == null) - { - alBridges = new ArrayList<Bridge>(); - - try - { - BufferedReader in= - new BufferedReader(new InputStreamReader(getAssets().open("bridges.txt"), "UTF-8")); - String str; - - while ((str=in.readLine()) != null) { - - StringTokenizer st = new StringTokenizer (str," "); - Bridge b = new Bridge(); - b.type = st.nextToken(); - - StringBuffer sbConfig = new StringBuffer(); - - while(st.hasMoreTokens()) - sbConfig.append(st.nextToken()).append(' '); - - b.config = sbConfig.toString().trim(); - - alBridges.add(b); - - } - - in.close(); - } - catch (Exception e) - { - e.printStackTrace(); - } - } - + + private void loadBridgeDefaults() { + if (alBridges == null) { + alBridges = new ArrayList<Bridge>(); + + try { + BufferedReader in = + new BufferedReader(new InputStreamReader(getAssets().open("bridges.txt"), "UTF-8")); + String str; + + while ((str = in.readLine()) != null) { + + StringTokenizer st = new StringTokenizer(str, " "); + Bridge b = new Bridge(); + b.type = st.nextToken(); + + StringBuffer sbConfig = new StringBuffer(); + + while (st.hasMoreTokens()) + sbConfig.append(st.nextToken()).append(' '); + + b.config = sbConfig.toString().trim(); + + alBridges.add(b); + + } + + in.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } - - private void setupBridgeType (String type) - { - StringBuffer sbConfig = new StringBuffer (); - - //we should randomly sort alBridges so we don't have the same bridge order each time - long seed = System.nanoTime(); - Collections.shuffle(alBridges, new Random(seed)); - - //let's just pull up to 2 bridges from the defaults at time - int maxBridges = 2; - int bridgeCount = 0; - - //now go through the list to find the bridges we want - for (Bridge b : alBridges) - { - if (b.type.equals(type)) - { - - sbConfig.append(b.type); - sbConfig.append(' '); - sbConfig.append(b.config); - - bridgeCount++; - - if (bridgeCount == maxBridges) - break; - else - sbConfig.append("\n"); - } - } - - setNewBridges(sbConfig.toString()); + + private void setupBridgeType(String type) { + StringBuffer sbConfig = new StringBuffer(); + + //we should randomly sort alBridges so we don't have the same bridge order each time + long seed = System.nanoTime(); + Collections.shuffle(alBridges, new Random(seed)); + + //let's just pull up to 2 bridges from the defaults at time + int maxBridges = 2; + int bridgeCount = 0; + + //now go through the list to find the bridges we want + for (Bridge b : alBridges) { + if (b.type.equals(type)) { + + sbConfig.append(b.type); + sbConfig.append(' '); + sbConfig.append(b.config); + + bridgeCount++; + + if (bridgeCount == maxBridges) + break; + else + sbConfig.append("\n"); + } + } + + setNewBridges(sbConfig.toString()); } } diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/BackupUtils.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/BackupUtils.java index 5be10d3..4e2e30c 100644 --- a/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/BackupUtils.java +++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/BackupUtils.java @@ -58,7 +58,7 @@ public class BackupUtils {
JSONObject config = new JSONObject(); try { - if (portData.getCount() != 1) + if (portData == null || portData.getCount() != 1) return null;
portData.moveToNext(); @@ -184,7 +184,7 @@ public class BackupUtils { null );
- if (service.getCount() == 0) { + if (service == null || service.getCount() == 0) { mResolver.insert(HSContentProvider.CONTENT_URI, fields); } else { mResolver.update( @@ -193,9 +193,9 @@ public class BackupUtils { HSContentProvider.HiddenService.PORT + "=" + port, null ); - }
- service.close(); + service.close(); + }
} catch (JSONException e) { e.printStackTrace();
tor-commits@lists.torproject.org