[tor-commits] [orbot/master] intent api: restore key

n8fr8 at torproject.org n8fr8 at torproject.org
Thu Mar 2 04:10:21 UTC 2017


commit bb7ffd96926a794e6732543cf5ce9c6a2aaa968a
Author: arrase <arrase at 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 at 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 at 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();





More information about the tor-commits mailing list