[tor-commits] [orbot/master] user interface updates - "log" drawer with up/down stats

n8fr8 at torproject.org n8fr8 at torproject.org
Mon Oct 1 07:41:26 UTC 2012


commit abebfd565edda58fff5f8aac4b38c7bc9acd641e
Author: n8fr8 <nathan at freitas.net>
Date:   Mon Oct 1 12:35:48 2012 +0530

    user interface updates - "log" drawer with up/down stats
---
 src/org/torproject/android/AnimatedBlockView.java  |  135 ------------------
 src/org/torproject/android/ImageProgressView.java  |   78 +++++++++++
 src/org/torproject/android/Orbot.java              |  143 +++++++++++++-------
 .../torproject/android/RandomColorCircleView.java  |  132 ++++++++++++++++++
 .../torproject/android/settings/AppManager.java    |    2 +-
 src/org/torproject/android/wizard/Permissions.java |    6 +-
 6 files changed, 310 insertions(+), 186 deletions(-)

diff --git a/src/org/torproject/android/AnimatedBlockView.java b/src/org/torproject/android/AnimatedBlockView.java
deleted file mode 100644
index 7ba4e63..0000000
--- a/src/org/torproject/android/AnimatedBlockView.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package org.torproject.android;
-
-import java.util.Random;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.os.Handler;
-import android.os.Message;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.MeasureSpec;
-
-public class AnimatedBlockView extends View
-{
-
-	  private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
-
-	  private float initX, initY, radius;
-	  private boolean drawing = false;
-
-		Random rand = new Random();
-		
-
-	public AnimatedBlockView(Context context) {
-	 super(context);
-	 // TODO Auto-generated constructor stub
-	 init();
-	 
-	}
-
-	public AnimatedBlockView(Context context, AttributeSet attrs) {
-	 super(context, attrs);
-	 init();
-	}
-
-	public AnimatedBlockView(Context context, AttributeSet attrs, int defStyle) {
-	 super(context, attrs, defStyle);
-	 
-	 init();
-	}
-
-	private void init(){
-	 paint.setStyle(Paint.Style.FILL);
-	 paint.setColor(Color.WHITE);
-	 paint.setAntiAlias(true);
-
-	}
-
-	@Override
-	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-	   super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-	   
-	   setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),
-	   MeasureSpec.getSize(heightMeasureSpec));
-	 
-	}
-
-	int a1 = 30;
-	int a2 = 255;
-	
-	@Override
-	protected void onDraw(Canvas canvas) {
-
-		super.onDraw(canvas);
-		
-		for (int i = 0; i < 20; i++)
-		{
-			float r = rand.nextFloat()*255f;
-			float g = rand.nextFloat()*255f;
-			float b = rand.nextFloat()*255f;
-	
-			paint.setARGB(a1,(int)r,(int)g,(int)b);
-		
-			float x = rand.nextFloat() * getWidth();
-			float y = rand.nextFloat() * getHeight();
-
-			float w = rand.nextFloat() * getWidth();
-			float h = rand.nextFloat() * getHeight();
-			
-			canvas.drawCircle(x, y, w/2, paint);
-			
-			
-		}
-		
-	}
-	
-	int a1mod = 1;
-	
-	public void updateAlpha ()
-	{
-		a1 += a1mod;
-		
-		if (a1 > 255 || a1 < 0)
-			a1mod *= -1;
-		
-
-	}
-
-	@Override
-	public boolean onTouchEvent(MotionEvent event) {
-	 
-
-	 int action = event.getAction();
-	 if (action==MotionEvent.ACTION_MOVE){
-	  float x = event.getX();
-	  float y = event.getY();
-
-	 // radius = (float) Math.sqrt(Math.pow(x-initX, 2) + Math.pow(y-initY, 2));
-	  //updateAlpha();
-	  
-	     a1 = (int)(255*(y/((float)getHeight())));
-	  
-	 }
-	 else if (action==MotionEvent.ACTION_DOWN){
-	  initX = event.getX();
-	  initY = event.getY();
-	  radius = 1;
-	  drawing = true;
-	 
-	  
-	 }
-	 else if (action==MotionEvent.ACTION_UP){
-	  drawing = false;
-	 
-	  
-	 }
-	 
-	 return true;
-	 
-	}
-
-}
\ No newline at end of file
diff --git a/src/org/torproject/android/ImageProgressView.java b/src/org/torproject/android/ImageProgressView.java
new file mode 100644
index 0000000..6e813eb
--- /dev/null
+++ b/src/org/torproject/android/ImageProgressView.java
@@ -0,0 +1,78 @@
+package org.torproject.android;
+
+import java.util.Random;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.ImageView;
+
+public class ImageProgressView extends ImageView
+{
+
+	  private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+
+	  private float progress = 0f; // 0 to 1
+	  
+	  private RectF circle;
+	  
+	public ImageProgressView(Context context) {
+	 super(context);
+	 // TODO Auto-generated constructor stub
+	 init();
+	 
+	}
+
+	public ImageProgressView(Context context, AttributeSet attrs) {
+	 super(context, attrs);
+	 init();
+	}
+
+	public ImageProgressView(Context context, AttributeSet attrs, int defStyle) {
+	 super(context, attrs, defStyle);
+	 
+	 init();
+	}
+
+	private void init(){
+	 paint.setStyle(Paint.Style.STROKE);
+	 paint.setColor(Color.GREEN);
+	 paint.setAntiAlias(true);
+	 paint.setStrokeWidth(20);
+	 
+	}
+
+	@Override
+	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+	   super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+	   
+	   setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),
+	   MeasureSpec.getSize(heightMeasureSpec));
+	 
+	}
+
+	@Override
+	protected void onDraw(Canvas canvas) {
+
+		super.onDraw(canvas);
+		
+		if (circle == null)
+		{
+		circle = new RectF(getWidth()/2,getHeight()/2+getHeight()/8, getWidth()/3,getHeight()/3);
+		}
+		
+		float sweepAngle = 360f * progress;
+		
+		canvas.drawArc(circle, 0, sweepAngle, true, paint);
+		
+	}
+	
+	
+
+	
+}
\ No newline at end of file
diff --git a/src/org/torproject/android/Orbot.java b/src/org/torproject/android/Orbot.java
index d952cc4..f95ff45 100644
--- a/src/org/torproject/android/Orbot.java
+++ b/src/org/torproject/android/Orbot.java
@@ -11,12 +11,10 @@ import org.torproject.android.service.TorServiceConstants;
 import org.torproject.android.settings.ProcessSettingsAsyncTask;
 import org.torproject.android.settings.SettingsPreferences;
 import org.torproject.android.wizard.ChooseLocaleWizardActivity;
-import org.torproject.android.wizard.LotsaText;
 
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.NotificationManager;
-import android.app.ProgressDialog;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -33,28 +31,40 @@ import android.os.IBinder;
 import android.os.Message;
 import android.os.RemoteException;
 import android.preference.PreferenceManager;
+import android.text.ClipboardManager;
+import android.text.method.ScrollingMovementMethod;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
+import android.view.MotionEvent;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.View.OnLongClickListener;
+import android.view.View.OnTouchListener;
+import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.RelativeLayout;
+import android.widget.SlidingDrawer;
+import android.widget.SlidingDrawer.OnDrawerCloseListener;
+import android.widget.SlidingDrawer.OnDrawerOpenListener;
 import android.widget.TextView;
+import android.widget.Toast;
 
 public class Orbot extends Activity implements TorConstants, OnLongClickListener
 {
 	/* Useful UI bits */
 	private TextView lblStatus = null; //the main text display widget
-	private ImageView imgStatus = null; //the main touchable image for activating Orbot
-	private ProgressDialog progressDialog;
+	private ImageProgressView imgStatus = null; //the main touchable image for activating Orbot
+//	private ProgressDialog progressDialog;
 	private MenuItem mItemOnOff = null;
     private RelativeLayout trafficRow = null; // the row showing the traffic
     private TextView downloadText = null;
     private TextView uploadText = null;
+    private TextView mTxtOrbotLog = null;
+    private SlidingDrawer mDrawer = null;
+    private boolean mDrawerOpen = false;
 
 	/* Some tracking bits */
 	private int torStatus = TorServiceConstants.STATUS_OFF; //latest status reported from the tor service
@@ -92,14 +102,46 @@ public class Orbot extends Activity implements TorConstants, OnLongClickListener
 		
     	lblStatus = (TextView)findViewById(R.id.lblStatus);
 		lblStatus.setOnLongClickListener(this);
-    	imgStatus = (ImageView)findViewById(R.id.imgStatus);
+    	imgStatus = (ImageProgressView)findViewById(R.id.imgStatus);
     	imgStatus.setOnLongClickListener(this);
     	trafficRow = (RelativeLayout)findViewById(R.id.trafficRow);
     	downloadText = (TextView)findViewById(R.id.trafficDown);
         uploadText = (TextView)findViewById(R.id.trafficUp);
+        mTxtOrbotLog = (TextView)findViewById(R.id.orbotLog);
         
+        mDrawer = ((SlidingDrawer)findViewById(R.id.SlidingDrawer));
+    	Button slideButton = (Button)findViewById(R.id.slideButton);
+    	slideButton.setOnTouchListener(new OnTouchListener (){
+
+			@Override
+			public boolean onTouch(View v, MotionEvent event) {
+
+				if (event.equals(MotionEvent.ACTION_DOWN))
+				{
+					mDrawerOpen = !mDrawerOpen;
+					mTxtOrbotLog.setEnabled(mDrawerOpen);				
+				}
+				return false;
+			}
+    		
+    	});
+    	
+        mTxtOrbotLog.setMovementMethod(new ScrollingMovementMethod());
+        mTxtOrbotLog.setOnLongClickListener(new View.OnLongClickListener() {
+         
 
-
+			@Override
+			public boolean onLongClick(View v) {
+				  ClipboardManager cm = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
+	                cm.setText(mTxtOrbotLog.getText());
+	                Toast.makeText(Orbot.this, "LOG COPIED TO CLIPBOARD. PLEASE EMAIL TO help at guardianproject.info TO DEBUG PROBLEM", Toast.LENGTH_SHORT).show();
+	            return true;
+			}
+        });
+        
+		downloadText.setText(formatCount(0) + " / " + formatTotal(0));
+		uploadText.setText(formatCount(0) + " / " + formatTotal(0));
+	
     }
     
    /*
@@ -249,7 +291,7 @@ public class Orbot extends Activity implements TorConstants, OnLongClickListener
 		
 		unbindService();
 		
-		hideProgressDialog();
+		//hideProgressDialog();
 
 		if (aDialog != null)
 			aDialog.dismiss();
@@ -315,8 +357,6 @@ public class Orbot extends Activity implements TorConstants, OnLongClickListener
 	protected void onResume() {
 		super.onResume();
 		
-//		setLocale();
-
     	bindService();
 		
 		if (getIntent() == null)
@@ -405,7 +445,6 @@ public class Orbot extends Activity implements TorConstants, OnLongClickListener
 
 	@Override
 	public void onConfigurationChanged(Configuration newConfig) {
-		// TODO Auto-generated method stub
 		super.onConfigurationChanged(newConfig);
 	}
 
@@ -526,7 +565,7 @@ public class Orbot extends Activity implements TorConstants, OnLongClickListener
                             {
                                     imgStatus.setImageResource(R.drawable.toron);
 
-                                    hideProgressDialog();
+                           //         hideProgressDialog();
                                     
                                     String lblMsg = getString(R.string.status_activated);
                                      
@@ -534,8 +573,8 @@ public class Orbot extends Activity implements TorConstants, OnLongClickListener
                                     
                                     if (torServiceMsg != null && torServiceMsg.length() > 0)
                                     {
-                                    //        showAlert("Update", torServiceMsg, false);
-                                    	lblStatus.setText(torServiceMsg);
+                                    //        showAlert("Update", torServiceMsg,xte
+                                    	mTxtOrbotLog.append(torServiceMsg + "\n");
                                     }
                                     
                                     boolean showFirstTime = prefs.getBoolean("connect_first_time",true);
@@ -563,8 +602,10 @@ public class Orbot extends Activity implements TorConstants, OnLongClickListener
                                     
                                     imgStatus.setImageResource(R.drawable.torstarting);
                                     
-                                    if (progressDialog != null)
-                                            progressDialog.setMessage(torServiceMsg);
+                                  //  if (progressDialog != null)
+                                    //        progressDialog.setMessage(torServiceMsg);
+                                    
+                                    mTxtOrbotLog.append(torServiceMsg + '\n');
                                     
                                     if (mItemOnOff != null)
                                             mItemOnOff.setTitle(R.string.menu_stop);
@@ -574,7 +615,7 @@ public class Orbot extends Activity implements TorConstants, OnLongClickListener
                             {
 
 
-                                    hideProgressDialog();
+                                  //  hideProgressDialog();
                                     
                                     imgStatus.setImageResource(R.drawable.toroff);
                                     lblStatus.setText(getString(R.string.status_disabled) + "\n" + getString(R.string.press_to_start));
@@ -599,6 +640,9 @@ public class Orbot extends Activity implements TorConstants, OnLongClickListener
     private void startTor () throws RemoteException
     {
             
+
+			mTxtOrbotLog.setText("");
+		
             // this is a bit of a strange/old/borrowed code/design i used to change the service state
             // not sure it really makes sense when what we want to say is just "startTor"
             mService.setProfile(TorServiceConstants.PROFILE_ON); //this means turn on
@@ -624,8 +668,9 @@ public class Orbot extends Activity implements TorConstants, OnLongClickListener
     		mService.setProfile(TorServiceConstants.PROFILE_OFF);
     		Message msg = mHandler.obtainMessage(TorServiceConstants.DISABLE_TOR_MSG);
     		mHandler.sendMessage(msg);
-            trafficRow.setVisibility(RelativeLayout.GONE);
+            //trafficRow.setVisibility(RelativeLayout.GONE);
 
+            
     	}
     	
      
@@ -637,32 +682,35 @@ public class Orbot extends Activity implements TorConstants, OnLongClickListener
      */
         public boolean onLongClick(View view) {
                 
-                
-            try
-            {
-                    
-                if (mService != null && mService.getStatus() == TorServiceConstants.STATUS_OFF)
-                {
-                        
-                        createProgressDialog(getString(R.string.status_starting_up));
-
-                        startTor();
-                }
-                else
-                {
-                        
-                        stopTor();
-                        
-                }
-                
-                return true;
-                    
-            }
-            catch (Exception e)
-            {
-                    Log.d(TAG,"error onclick",e);
-            }
-            
+        	if (!mDrawerOpen)
+        	{
+	            try
+	            {
+	                    
+	                if (mService != null && mService.getStatus() == TorServiceConstants.STATUS_OFF)
+	                {
+	                        
+	                       // createProgressDialog(getString(R.string.status_starting_up));
+	
+	                        startTor();
+	                }
+	                else
+	                {
+	                        
+	                        stopTor();
+	                        
+	                }
+	                
+	                return true;
+	                    
+	            }
+	            catch (Exception e)
+	            {
+	                    Log.d(TAG,"error onclick",e);
+	            }
+
+        	}
+        	
             return false;
                     
         }
@@ -730,6 +778,7 @@ public class Orbot extends Activity implements TorConstants, OnLongClickListener
         public void handleMessage(Message msg) {
             switch (msg.what) {
                 case TorServiceConstants.STATUS_MSG:
+                case TorServiceConstants.LOG_MSG:
 
                         String torServiceMsg = (String)msg.getData().getString(HANDLER_TOR_MSG);
                         
@@ -741,10 +790,6 @@ public class Orbot extends Activity implements TorConstants, OnLongClickListener
                         }
                         
                     break;
-                case TorServiceConstants.LOG_MSG:
-                        
-                        
-                    break;
                 case TorServiceConstants.ENABLE_TOR_MSG:
                         
                         
@@ -760,7 +805,7 @@ public class Orbot extends Activity implements TorConstants, OnLongClickListener
 
             	case TorServiceConstants.MESSAGE_TRAFFIC_COUNT :
                     
-            		trafficRow.setVisibility(RelativeLayout.VISIBLE);
+            		//trafficRow.setVisibility(RelativeLayout.VISIBLE);
             		Bundle data = msg.getData();
             		DataCount datacount =  new DataCount(data.getLong("upload"),data.getLong("download"));     
             		String TotalUpload = "";
@@ -897,6 +942,7 @@ public class Orbot extends Activity implements TorConstants, OnLongClickListener
         }
     }
         
+    /*
     private void createProgressDialog (String msg)
     {
             if (progressDialog != null && progressDialog.isShowing())
@@ -920,6 +966,7 @@ public class Orbot extends Activity implements TorConstants, OnLongClickListener
         }
                 
     }
+    */
     
     private void setLocale ()
     {
diff --git a/src/org/torproject/android/RandomColorCircleView.java b/src/org/torproject/android/RandomColorCircleView.java
new file mode 100644
index 0000000..aa25339
--- /dev/null
+++ b/src/org/torproject/android/RandomColorCircleView.java
@@ -0,0 +1,132 @@
+package org.torproject.android;
+
+import java.util.Random;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+public class RandomColorCircleView extends View
+{
+
+	  private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+
+	  private float initX, initY, radius;
+	  private boolean drawing = false;
+
+		Random rand = new Random();
+		
+
+	public RandomColorCircleView(Context context) {
+	 super(context);
+	 // TODO Auto-generated constructor stub
+	 init();
+	 
+	}
+
+	public RandomColorCircleView(Context context, AttributeSet attrs) {
+	 super(context, attrs);
+	 init();
+	}
+
+	public RandomColorCircleView(Context context, AttributeSet attrs, int defStyle) {
+	 super(context, attrs, defStyle);
+	 
+	 init();
+	}
+
+	private void init(){
+	 paint.setStyle(Paint.Style.FILL);
+	 paint.setColor(Color.WHITE);
+	 paint.setAntiAlias(true);
+
+	}
+
+	@Override
+	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+	   super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+	   
+	   setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),
+	   MeasureSpec.getSize(heightMeasureSpec));
+	 
+	}
+
+	int a1 = 30;
+	int a2 = 255;
+	
+	@Override
+	protected void onDraw(Canvas canvas) {
+
+		super.onDraw(canvas);
+		
+		for (int i = 0; i < 20; i++)
+		{
+			float r = rand.nextFloat()*255f;
+			float g = rand.nextFloat()*255f;
+			float b = rand.nextFloat()*255f;
+	
+			paint.setARGB(a1,(int)r,(int)g,(int)b);
+		
+			float x = rand.nextFloat() * getWidth();
+			float y = rand.nextFloat() * getHeight();
+
+			float w = rand.nextFloat() * getWidth();
+			float h = rand.nextFloat() * getHeight();
+			
+			canvas.drawCircle(x, y, w/2, paint);
+			
+			
+		}
+		
+	}
+	
+	int a1mod = 1;
+	
+	public void updateAlpha ()
+	{
+		a1 += a1mod;
+		
+		if (a1 > 255 || a1 < 0)
+			a1mod *= -1;
+		
+
+	}
+
+	@Override
+	public boolean onTouchEvent(MotionEvent event) {
+	 
+
+	 int action = event.getAction();
+	 if (action==MotionEvent.ACTION_MOVE){
+	  float x = event.getX();
+	  float y = event.getY();
+
+	 // radius = (float) Math.sqrt(Math.pow(x-initX, 2) + Math.pow(y-initY, 2));
+	  //updateAlpha();
+	  
+	     a1 = (int)(255*(y/((float)getHeight())));
+	  
+	 }
+	 else if (action==MotionEvent.ACTION_DOWN){
+	  initX = event.getX();
+	  initY = event.getY();
+	  radius = 1;
+	  drawing = true;
+	 
+	  
+	 }
+	 else if (action==MotionEvent.ACTION_UP){
+	  drawing = false;
+	 
+	  
+	 }
+	 
+	 return true;
+	 
+	}
+
+}
\ No newline at end of file
diff --git a/src/org/torproject/android/settings/AppManager.java b/src/org/torproject/android/settings/AppManager.java
index 0733030..46b33f1 100644
--- a/src/org/torproject/android/settings/AppManager.java
+++ b/src/org/torproject/android/settings/AppManager.java
@@ -212,7 +212,7 @@ public class AppManager extends Activity implements OnCheckedChangeListener, OnC
 			try {
 				PackageInfo pInfo = pMgr.getPackageInfo(aInfo.packageName, PackageManager.GET_PERMISSIONS);
 				
-				if (pInfo != null && pInfo.permissions != null)
+				if (pInfo != null && pInfo.requestedPermissions != null)
 				{
 					for (String permInfo:pInfo.requestedPermissions)
 					{
diff --git a/src/org/torproject/android/wizard/Permissions.java b/src/org/torproject/android/wizard/Permissions.java
index a593c12..3b64b04 100644
--- a/src/org/torproject/android/wizard/Permissions.java
+++ b/src/org/torproject/android/wizard/Permissions.java
@@ -162,9 +162,11 @@ public class Permissions extends Activity implements TorConstants {
 				if (hasRoot)
 				{
 					try {
-						int resp = new TorTransProxy().testOwnerModule(context);
+						TorTransProxy ttProxy = new TorTransProxy();
 						
-						if (resp < 0)
+						int resp = ttProxy.testOwnerModule(context,ttProxy.getIpTablesPath(context));
+						
+						if (resp != 0)
 						{
 							hasRoot = false;
 							Toast.makeText(context, "ERROR: IPTables OWNER module not available", Toast.LENGTH_LONG).show();





More information about the tor-commits mailing list