commit abebfd565edda58fff5f8aac4b38c7bc9acd641e Author: n8fr8 nathan@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@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();
tor-commits@lists.torproject.org