commit abebfd565edda58fff5f8aac4b38c7bc9acd641e
Author: n8fr8 <nathan(a)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(a)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();