From de5d9bfe464be1960cbd5be194c65cf685572b51 Mon Sep 17 00:00:00 2001 From: Sathyanarayanan Gunasekaran Date: Mon, 30 May 2011 11:01:47 +0530 Subject: [PATCH 01/22] First two wizard screens --- AndroidManifest.xml | 5 +- res/layout/scrollingtext_buttons_view.xml | 63 ++++++ res/values/strings.xml | 14 +- src/org/torproject/android/AboutActivity.java | 204 ++++++++++++++++++ src/org/torproject/android/Orbot.java | 4 +- .../torproject/android/WizardActivity.java | 71 ------ 6 files changed, 284 insertions(+), 77 deletions(-) create mode 100644 res/layout/scrollingtext_buttons_view.xml create mode 100644 src/org/torproject/android/AboutActivity.java delete mode 100644 src/org/torproject/android/WizardActivity.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index d01b58e4..f11a63ef 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -28,8 +28,9 @@ - - + + + diff --git a/res/layout/scrollingtext_buttons_view.xml b/res/layout/scrollingtext_buttons_view.xml new file mode 100644 index 00000000..623f59c2 --- /dev/null +++ b/res/layout/scrollingtext_buttons_view.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index bca3df91..2212f494 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -69,8 +69,6 @@ Application Error -Welcome to Orbot - About Orbot Next Back @@ -130,5 +128,15 @@ General Start Orbot on Boot Automatically start Orbot and connect Tor when your Android device boots - + + + Orbot + Orbot brings Tor to Android \nTor helps you defend against a form of network surveillance that threatens privacy, confidential business activity and relationships, and state security known as traffic analysis + + Warning + Simply installing Orbot will not automatically anonymize your mobile traffic.\nPlease follow the following steps to get started + + Permissions + + diff --git a/src/org/torproject/android/AboutActivity.java b/src/org/torproject/android/AboutActivity.java new file mode 100644 index 00000000..a03314bb --- /dev/null +++ b/src/org/torproject/android/AboutActivity.java @@ -0,0 +1,204 @@ +package org.torproject.android; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.DialogInterface.OnClickListener; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +public class AboutActivity extends Activity implements OnClickListener +{ + //WizardHelper wizard = null; + + private int title[] = { + R.string.wizard_title, + R.string.wizard_warning_title, + R.string.wizard_permissions_title + }; + + private int msg[] = { + R.string.wizard_title_msg, + R.string.wizard_warning_msg, + }; + + private String buttons[][] = + { + {null,"Next"}, + {"Back","Next"}, + {"Back","Next"}, + {"Back","Next"}, + + }; + + private View.OnClickListener listener[][] = + { + { + null, + new View.OnClickListener() { + + @Override + public void onClick(View v) { + + nextContent(); + + } + } + }, + + { + new View.OnClickListener() { + + @Override + public void onClick(View v) { + prevContent(); + + } + }, + new View.OnClickListener() { + + @Override + public void onClick(View v) { + + nextContent(); + + } + } + }, + + { + new View.OnClickListener() { + + @Override + public void onClick(View v) { + prevContent(); + + } + }, + new View.OnClickListener() { + + @Override + public void onClick(View v) { + + + //Intent intent = new Intent(getBaseContext(), AccountWizardActivity.class); + + + //startActivity(intent); + + } + } + }, + + + + }; + + + private int contentIdx = -1; + + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + } + + @Override + protected void onStart() { + + super.onStart(); + + if (contentIdx == -1) + { + setContentView(R.layout.scrollingtext_buttons_view); + + nextContent (); + } + } + + private void prevContent () + { + contentIdx--; + showContent(contentIdx); + } + + private void nextContent () + { + contentIdx++; + showContent(contentIdx); + } + + private void showContent (int contentIdx) + { + TextView txtTitle = ((TextView)findViewById(R.id.WizardTextTitle)); + txtTitle.setText(getString(title[contentIdx])); + + TextView txtBody = ((TextView)findViewById(R.id.WizardTextBody)); + txtBody.setText(getString(msg[contentIdx])); + + Button btn1 = ((Button)findViewById(R.id.btnWizard1)); + + ImageView img = (ImageView) findViewById(R.id.gibber_image); + + if (buttons[contentIdx][0] != null) + { + btn1.setText(buttons[contentIdx][0]); + btn1.setOnClickListener(listener[contentIdx][0]); + btn1.setVisibility(Button.VISIBLE); + + } + else + { + btn1.setVisibility(Button.INVISIBLE); + } + + Button btn2 = ((Button)findViewById(R.id.btnWizard2)); + if (buttons[contentIdx][1] != null) + { + btn2.setText(buttons[contentIdx][1]); + btn2.setOnClickListener(listener[contentIdx][1]); + btn2.setVisibility(Button.VISIBLE); + + } + else + { + btn2.setVisibility(Button.INVISIBLE); + } + + if(contentIdx !=0) + { + img.setVisibility(ImageView.GONE); + } + else + { + img.setVisibility(ImageView.VISIBLE); + } + + } + + + + @Override + protected void onResume() { + super.onResume(); + + + } + + + + + @Override + public void onClick(DialogInterface arg0, int arg1) { + + + } + + + +} diff --git a/src/org/torproject/android/Orbot.java b/src/org/torproject/android/Orbot.java index 4bc5695d..eb269606 100644 --- a/src/org/torproject/android/Orbot.java +++ b/src/org/torproject/android/Orbot.java @@ -4,6 +4,8 @@ package org.torproject.android; + + import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -454,7 +456,7 @@ public class Orbot extends Activity implements OnLongClickListener, TorConstants private void showHelp () { - new WizardHelper(this).showWizard(); + startActivityForResult(new Intent(getBaseContext(), AboutActivity.class), 1); } diff --git a/src/org/torproject/android/WizardActivity.java b/src/org/torproject/android/WizardActivity.java deleted file mode 100644 index 2a8bf33e..00000000 --- a/src/org/torproject/android/WizardActivity.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.torproject.android; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; - -public class WizardActivity extends Activity implements OnClickListener -{ - - protected void onCreate(Bundle savedInstanceState) - { - - this.setContentView(R.layout.layout_help); - - } - - - - @Override - protected void onStart() { - - super.onStart(); - - - } - - - - @Override - protected void onResume() { - super.onResume(); - - showStep1(); - } - - - - public void showStep1() - { - showDialog("Test","","foo","bar",this); - } - - private void showDialog (String title, String msg, String button1, String button2, OnClickListener ocListener) - { - - new AlertDialog.Builder(this) - .setInverseBackgroundForced(true) - .setTitle(title) - .setMessage(msg) - .setNeutralButton(button1, ocListener) - .setNegativeButton(button2, ocListener) - .show(); - - - } - - - - @Override - public void onClick(DialogInterface arg0, int arg1) { - - - } - - - -} From 3181d00c1d8a5b5e78dbe26da548bdb177481b04 Mon Sep 17 00:00:00 2001 From: Sathyanarayanan Gunasekaran Date: Fri, 3 Jun 2011 23:07:30 +0530 Subject: [PATCH 02/22] First two screens - rewrite --- AndroidManifest.xml | 2 +- res/layout/scrollingtext_buttons_view.xml | 8 +- src/org/torproject/android/AboutActivity.java | 204 ------------------ src/org/torproject/android/LotsaText.java | 122 +++++++++++ src/org/torproject/android/Orbot.java | 2 +- 5 files changed, 128 insertions(+), 210 deletions(-) delete mode 100644 src/org/torproject/android/AboutActivity.java create mode 100644 src/org/torproject/android/LotsaText.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index f11a63ef..59c2cca7 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -29,7 +29,7 @@ - + diff --git a/res/layout/scrollingtext_buttons_view.xml b/res/layout/scrollingtext_buttons_view.xml index 623f59c2..75b7925b 100644 --- a/res/layout/scrollingtext_buttons_view.xml +++ b/res/layout/scrollingtext_buttons_view.xml @@ -13,14 +13,14 @@ android:layout_gravity="center_horizontal"> - - + + diff --git a/src/org/torproject/android/AboutActivity.java b/src/org/torproject/android/AboutActivity.java deleted file mode 100644 index a03314bb..00000000 --- a/src/org/torproject/android/AboutActivity.java +++ /dev/null @@ -1,204 +0,0 @@ -package org.torproject.android; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.DialogInterface.OnClickListener; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.TextView; - -public class AboutActivity extends Activity implements OnClickListener -{ - //WizardHelper wizard = null; - - private int title[] = { - R.string.wizard_title, - R.string.wizard_warning_title, - R.string.wizard_permissions_title - }; - - private int msg[] = { - R.string.wizard_title_msg, - R.string.wizard_warning_msg, - }; - - private String buttons[][] = - { - {null,"Next"}, - {"Back","Next"}, - {"Back","Next"}, - {"Back","Next"}, - - }; - - private View.OnClickListener listener[][] = - { - { - null, - new View.OnClickListener() { - - @Override - public void onClick(View v) { - - nextContent(); - - } - } - }, - - { - new View.OnClickListener() { - - @Override - public void onClick(View v) { - prevContent(); - - } - }, - new View.OnClickListener() { - - @Override - public void onClick(View v) { - - nextContent(); - - } - } - }, - - { - new View.OnClickListener() { - - @Override - public void onClick(View v) { - prevContent(); - - } - }, - new View.OnClickListener() { - - @Override - public void onClick(View v) { - - - //Intent intent = new Intent(getBaseContext(), AccountWizardActivity.class); - - - //startActivity(intent); - - } - } - }, - - - - }; - - - private int contentIdx = -1; - - protected void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - - } - - @Override - protected void onStart() { - - super.onStart(); - - if (contentIdx == -1) - { - setContentView(R.layout.scrollingtext_buttons_view); - - nextContent (); - } - } - - private void prevContent () - { - contentIdx--; - showContent(contentIdx); - } - - private void nextContent () - { - contentIdx++; - showContent(contentIdx); - } - - private void showContent (int contentIdx) - { - TextView txtTitle = ((TextView)findViewById(R.id.WizardTextTitle)); - txtTitle.setText(getString(title[contentIdx])); - - TextView txtBody = ((TextView)findViewById(R.id.WizardTextBody)); - txtBody.setText(getString(msg[contentIdx])); - - Button btn1 = ((Button)findViewById(R.id.btnWizard1)); - - ImageView img = (ImageView) findViewById(R.id.gibber_image); - - if (buttons[contentIdx][0] != null) - { - btn1.setText(buttons[contentIdx][0]); - btn1.setOnClickListener(listener[contentIdx][0]); - btn1.setVisibility(Button.VISIBLE); - - } - else - { - btn1.setVisibility(Button.INVISIBLE); - } - - Button btn2 = ((Button)findViewById(R.id.btnWizard2)); - if (buttons[contentIdx][1] != null) - { - btn2.setText(buttons[contentIdx][1]); - btn2.setOnClickListener(listener[contentIdx][1]); - btn2.setVisibility(Button.VISIBLE); - - } - else - { - btn2.setVisibility(Button.INVISIBLE); - } - - if(contentIdx !=0) - { - img.setVisibility(ImageView.GONE); - } - else - { - img.setVisibility(ImageView.VISIBLE); - } - - } - - - - @Override - protected void onResume() { - super.onResume(); - - - } - - - - - @Override - public void onClick(DialogInterface arg0, int arg1) { - - - } - - - -} diff --git a/src/org/torproject/android/LotsaText.java b/src/org/torproject/android/LotsaText.java new file mode 100644 index 00000000..d044c576 --- /dev/null +++ b/src/org/torproject/android/LotsaText.java @@ -0,0 +1,122 @@ +package org.torproject.android; + +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +public class LotsaText extends Activity implements TorConstants{ + + private Context context; + private int step = -1; + + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + context = this; + + } + + @Override + protected void onStart() { + + super.onStart(); + + + if (step == -1) + { + setContentView(R.layout.scrollingtext_buttons_view); + stepOne(); + } + } + + @Override + protected void onResume() { + super.onResume(); + + + } + + + /*public void startWizard(){ + + switch(step){ + + case -1 : stepOne();break; + + } + } + */ + private void stepOne() { + + step++; + + //setContentView(R.layout.scrollingtext_buttons_view); + String title = context.getString(R.string.wizard_title); + String msg = context.getString(R.string.wizard_title_msg); + + TextView txtTitle = ((TextView)findViewById(R.id.WizardTextTitle)); + txtTitle.setText(title); + + TextView txtBody = ((TextView)findViewById(R.id.WizardTextBody)); + txtBody.setText(msg); + + Button btn1 = ((Button)findViewById(R.id.btnWizard1)); + Button btn2 = ((Button)findViewById(R.id.btnWizard2)); + ImageView img = (ImageView) findViewById(R.id.orbot_image); + + btn1.setVisibility(Button.INVISIBLE); + img.setVisibility(ImageView.VISIBLE); + + btn2.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + stepTwo(); + } + }); + + } + + private void stepTwo() { + step++; + + setContentView(R.layout.scrollingtext_buttons_view); + String title = context.getString(R.string.wizard_warning_title); + String msg = context.getString(R.string.wizard_warning_msg); + + TextView txtTitle = ((TextView)findViewById(R.id.WizardTextTitle)); + txtTitle.setText(title); + + TextView txtBody = ((TextView)findViewById(R.id.WizardTextBody)); + txtBody.setText(msg); + + Button btn1 = ((Button)findViewById(R.id.btnWizard1)); + Button btn2 = ((Button)findViewById(R.id.btnWizard2)); + ImageView img = (ImageView) findViewById(R.id.orbot_image); + + btn1.setVisibility(Button.VISIBLE); + img.setVisibility(ImageView.INVISIBLE); + + btn1.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + + stepOne(); + } + }); + + btn2.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + //stepThree(); + } + }); + + } +} \ No newline at end of file diff --git a/src/org/torproject/android/Orbot.java b/src/org/torproject/android/Orbot.java index eb269606..383929d1 100644 --- a/src/org/torproject/android/Orbot.java +++ b/src/org/torproject/android/Orbot.java @@ -456,7 +456,7 @@ public class Orbot extends Activity implements OnLongClickListener, TorConstants private void showHelp () { - startActivityForResult(new Intent(getBaseContext(), AboutActivity.class), 1); + startActivityForResult(new Intent(getBaseContext(), LotsaText.class), 1); } From 6af2989ab82bff30ad45f14a40dfe15a4f787ddc Mon Sep 17 00:00:00 2001 From: Sathyanarayanan Gunasekaran Date: Sat, 4 Jun 2011 02:12:06 +0530 Subject: [PATCH 03/22] Permissions screen added --- AUTHORS | 2 +- AndroidManifest.xml | 1 + res/layout/layout_wizard_permissions.xml | 67 ++++++++ res/values/strings.xml | 3 + src/org/torproject/android/LotsaText.java | 17 +- src/org/torproject/android/Permissions.java | 176 ++++++++++++++++++++ 6 files changed, 256 insertions(+), 10 deletions(-) create mode 100644 res/layout/layout_wizard_permissions.xml create mode 100644 src/org/torproject/android/Permissions.java diff --git a/AUTHORS b/AUTHORS index f99ac6f9..135d9b46 100644 --- a/AUTHORS +++ b/AUTHORS @@ -27,7 +27,7 @@ provided guidance in the entire effort. Adam Langley made the original valiant effort to port Tor to Android. -Sathyanarayanan created a patch for the wizard +Sathyanarayanan created a patch for the wizard which updated the icon and link for the secure chat app info to point to Gibberbot, and hopefully will continue to contribute useful patches. diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 59c2cca7..be3c43f5 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -30,6 +30,7 @@ + diff --git a/res/layout/layout_wizard_permissions.xml b/res/layout/layout_wizard_permissions.xml new file mode 100644 index 00000000..b861d7a4 --- /dev/null +++ b/res/layout/layout_wizard_permissions.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 2212f494..f4ca03c4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -137,6 +137,9 @@ Simply installing Orbot will not automatically anonymize your mobile traffic.\nPlease follow the following steps to get started Permissions + Orbot has detected that you have root permissions enabled. To enable \'Transparent Proxying\', please grant superuser privileges to Orbot + If you choose to continue without providing superuser privileges, make sure to use apps made to work with orbot + Orbot has detected that you do not have root permissions.\nTransparent Proxying is not possible without superuser privileges.\nMake sure to use apps that have been configured to work with Orbot diff --git a/src/org/torproject/android/LotsaText.java b/src/org/torproject/android/LotsaText.java index d044c576..e9fc556b 100644 --- a/src/org/torproject/android/LotsaText.java +++ b/src/org/torproject/android/LotsaText.java @@ -2,6 +2,7 @@ package org.torproject.android; import android.app.Activity; import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; @@ -24,13 +25,10 @@ public class LotsaText extends Activity implements TorConstants{ protected void onStart() { super.onStart(); + setContentView(R.layout.scrollingtext_buttons_view); - - if (step == -1) - { - setContentView(R.layout.scrollingtext_buttons_view); - stepOne(); - } + stepOne(); + } @Override @@ -52,7 +50,6 @@ public class LotsaText extends Activity implements TorConstants{ */ private void stepOne() { - step++; //setContentView(R.layout.scrollingtext_buttons_view); String title = context.getString(R.string.wizard_title); @@ -82,7 +79,7 @@ public class LotsaText extends Activity implements TorConstants{ } private void stepTwo() { - step++; + step=0; setContentView(R.layout.scrollingtext_buttons_view); String title = context.getString(R.string.wizard_warning_title); @@ -114,9 +111,11 @@ public class LotsaText extends Activity implements TorConstants{ @Override public void onClick(View v) { - //stepThree(); + startActivityForResult(new Intent(getBaseContext(), Permissions.class), 1); } }); } + + } \ No newline at end of file diff --git a/src/org/torproject/android/Permissions.java b/src/org/torproject/android/Permissions.java new file mode 100644 index 00000000..bd96e56b --- /dev/null +++ b/src/org/torproject/android/Permissions.java @@ -0,0 +1,176 @@ +package org.torproject.android; + +import org.torproject.android.service.TorService; +import org.torproject.android.service.TorServiceUtils; +import org.torproject.android.service.TorTransProxy; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; +import android.widget.Toast; + +public class Permissions extends Activity implements TorConstants { + + private Context context; + + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + context = this; + + } + + @Override + protected void onStart() { + + super.onStart(); + setContentView(R.layout.layout_wizard_permissions); + + stepThree(); + + } + + @Override + protected void onResume() { + super.onResume(); + + + } + + private void stepThree(){ + + boolean hasRoot = TorServiceUtils.checkRootAccess(); + + if (hasRoot) + { + try { + int resp = TorTransProxy.testOwnerModule(context); + + if (resp < 0) + { + hasRoot = false; + Toast.makeText(context, "ERROR: IPTables OWNER module not available", Toast.LENGTH_LONG).show(); + + Log.i(TorService.TAG,"ERROR: IPTables OWNER module not available"); + } + + } catch (Exception e) { + + hasRoot = false; + Log.d(TorService.TAG,"ERROR: IPTables OWNER module not available",e); + } + } + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + Editor pEdit = prefs.edit(); + pEdit.putBoolean("has_root",hasRoot); + pEdit.commit(); + + if (hasRoot) + { + Toast.makeText(context, "Has Root", Toast.LENGTH_SHORT).show(); + stepFourRoot(); + } + else + { + Toast.makeText(context, "Unable to get root access", Toast.LENGTH_LONG).show(); + stepFour(); + } + + } + + private void stepFourRoot(){ + + String title = context.getString(R.string.wizard_permissions_title); + String msg1 = context.getString(R.string.wizard_permissions_root_msg1); + String msg2 = context.getString(R.string.wizard_permissions_root_msg2); + + TextView txtTitle = ((TextView)findViewById(R.id.WizardTextTitle)); + txtTitle.setText(title); + + TextView txtBody1 = ((TextView)findViewById(R.id.WizardTextBody1)); + txtBody1.setText(msg1); + + + TextView txtBody2 = ((TextView)findViewById(R.id.WizardTextBody2)); + txtBody2.setText(msg2); + txtBody2.setVisibility(TextView.VISIBLE); + + Button grantPermissions = ((Button)findViewById(R.id.grantPermissions)); + grantPermissions.setVisibility(Button.VISIBLE); + + Button back = ((Button)findViewById(R.id.btnWizard1)); + Button next = ((Button)findViewById(R.id.btnWizard2)); + + grantPermissions.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + //Check and Install iptables + + } + }); + + back.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + + startActivityForResult(new Intent(getBaseContext(), LotsaText.class), 1); + } + }); + + next.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + //Tips Screen + } + }); + + } + + private void stepFour(){ + + + String title = context.getString(R.string.wizard_permissions_title); + String msg = context.getString(R.string.wizard_permissions_msg); + + TextView txtTitle = ((TextView)findViewById(R.id.WizardTextTitle)); + txtTitle.setText(title); + + TextView txtBody = ((TextView)findViewById(R.id.WizardTextBody)); + txtBody.setText(msg); + + Button btn1 = ((Button)findViewById(R.id.btnWizard1)); + Button btn2 = ((Button)findViewById(R.id.btnWizard2)); + + btn1.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + + startActivityForResult(new Intent(getBaseContext(), LotsaText.class), 1); + } + }); + + btn2.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + //Tips Screen + } + }); + } + + +} \ No newline at end of file From 22118bc38280bdf3d375018dac1c0de743b75ec0 Mon Sep 17 00:00:00 2001 From: Sathyanarayanan Gunasekaran Date: Mon, 6 Jun 2011 02:25:18 +0530 Subject: [PATCH 04/22] Tips and Tricks screen added --- res/drawable/icon_otrchat.png | Bin 4610 -> 0 bytes res/layout/layout_wizard_tips.xml | 63 +++++++++-- res/values/strings.xml | 13 ++- src/org/torproject/android/Permissions.java | 4 +- src/org/torproject/android/TipsAndTricks.java | 103 ++++++++++++++++++ 5 files changed, 168 insertions(+), 15 deletions(-) delete mode 100755 res/drawable/icon_otrchat.png create mode 100644 src/org/torproject/android/TipsAndTricks.java diff --git a/res/drawable/icon_otrchat.png b/res/drawable/icon_otrchat.png deleted file mode 100755 index 08171aba53ddb0d2c3c71d9cbe9b33b58495f263..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4610 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 diff --git a/res/layout/layout_wizard_tips.xml b/res/layout/layout_wizard_tips.xml index 19aaef06..60cba512 100644 --- a/res/layout/layout_wizard_tips.xml +++ b/res/layout/layout_wizard_tips.xml @@ -1,15 +1,54 @@ - + android:layout_height="fill_parent" + android:background="@drawable/background"> + + + + + + + + + + + + - + + - + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index f4ca03c4..25e253d8 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -99,7 +99,6 @@ Orbot-enabled Apps We encourage you to download & use apps that know how to connect directly to Orbot. Click on the buttons below to install. - Gibberbot - Secure instant messaging client for Android ORWEB (Android 1.x Only) - Browser designed for privacy & for Orbot Proxy Settings - Learn how to configure apps to work with Orbot @@ -113,8 +112,6 @@ Orbot is ready! Hundreds of thousands of people around the world use Tor for a wide variety of reasons: journalists and bloggers, human rights workers, law enforcement officers, soldiers, corporations, citizens of repressive regimes, and just ordinary citizens... and now you are ready to, as well! - market://search?q=pname:info.guardianproject.otr.app.im - market://search?q=pname:nfo.guardianproject.browser @@ -140,6 +137,12 @@ Orbot has detected that you have root permissions enabled. To enable \'Transparent Proxying\', please grant superuser privileges to Orbot If you choose to continue without providing superuser privileges, make sure to use apps made to work with orbot Orbot has detected that you do not have root permissions.\nTransparent Proxying is not possible without superuser privileges.\nMake sure to use apps that have been configured to work with Orbot - - + + Gibberbot - Secure instant messaging client for Android + Firefox - Android browser - To be used along with ProxyMob Add-on + ProxyMob - Simple Firefox Add-on for setting HTTP, SOCKS and SSL proxy settings + https://market.android.com/details?id=info.guardianproject.otr.app.im + https://market.android.com/details?id=org.mozilla.firefox + https://addons.mozilla.org/mobile/downloads/latest/251558/type:attachment/addon-251558-latest.xpi?src=addon-detail + diff --git a/src/org/torproject/android/Permissions.java b/src/org/torproject/android/Permissions.java index bd96e56b..996a1dc8 100644 --- a/src/org/torproject/android/Permissions.java +++ b/src/org/torproject/android/Permissions.java @@ -133,7 +133,7 @@ public class Permissions extends Activity implements TorConstants { @Override public void onClick(View v) { - //Tips Screen + startActivityForResult(new Intent(getBaseContext(), TipsAndTricks.class), 1); } }); @@ -167,7 +167,7 @@ public class Permissions extends Activity implements TorConstants { @Override public void onClick(View v) { - //Tips Screen + startActivityForResult(new Intent(getBaseContext(), TipsAndTricks.class), 1); } }); } diff --git a/src/org/torproject/android/TipsAndTricks.java b/src/org/torproject/android/TipsAndTricks.java new file mode 100644 index 00000000..c4aba967 --- /dev/null +++ b/src/org/torproject/android/TipsAndTricks.java @@ -0,0 +1,103 @@ +package org.torproject.android; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; + +public class TipsAndTricks extends Activity implements TorConstants { + + private Context context; + + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + context = this; + + } + + @Override + protected void onStart() { + + super.onStart(); + setContentView(R.layout.layout_wizard_tips); + + //stepFive(); + + } + + @Override + protected void onResume() { + super.onResume(); + + + } + + void stepFive(){ + + + + Button btn1 = (Button)findViewById(R.id.WizardRootButtonInstallGibberbot); + + btn1.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View view) { + + String url = context.getString(R.string.gibberbot_apk_url); + context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); + + } + }); + + Button btn2 = (Button)findViewById(R.id.WizardRootButtonInstallFirefox); + + btn2.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View view) { + + String url = context.getString(R.string.firefox_apk_url); + context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); + + } + }); + + Button btn3 = (Button)findViewById(R.id.WizardRootButtonInstallProxyMob); + + btn3.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View view) { + + String url = context.getString(R.string.proxymob_url); + context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); + } + }); + + Button back = ((Button)findViewById(R.id.btnWizard1)); + Button next = ((Button)findViewById(R.id.btnWizard2)); + + back.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + + startActivityForResult(new Intent(getBaseContext(), Permissions.class), 1); + } + }); + + next.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + //Finsh Screen + } + }); + + } +} \ No newline at end of file From c9c35ead48b0453458e91b64810bb3971ff195d1 Mon Sep 17 00:00:00 2001 From: Sathyanarayanan Gunasekaran Date: Mon, 6 Jun 2011 02:39:52 +0530 Subject: [PATCH 05/22] Updated AndroidManifest, Tips Screen --- AndroidManifest.xml | 1 + res/values/strings.xml | 1 + src/org/torproject/android/TipsAndTricks.java | 9 ++++++--- src/org/torproject/android/WizardHelper.java | 6 +++--- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index be3c43f5..ad48d9d4 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -31,6 +31,7 @@ + diff --git a/res/values/strings.xml b/res/values/strings.xml index 25e253d8..0bf8286f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -138,6 +138,7 @@ If you choose to continue without providing superuser privileges, make sure to use apps made to work with orbot Orbot has detected that you do not have root permissions.\nTransparent Proxying is not possible without superuser privileges.\nMake sure to use apps that have been configured to work with Orbot + Orbot configured Apps Gibberbot - Secure instant messaging client for Android Firefox - Android browser - To be used along with ProxyMob Add-on ProxyMob - Simple Firefox Add-on for setting HTTP, SOCKS and SSL proxy settings diff --git a/src/org/torproject/android/TipsAndTricks.java b/src/org/torproject/android/TipsAndTricks.java index c4aba967..a3aa1ef7 100644 --- a/src/org/torproject/android/TipsAndTricks.java +++ b/src/org/torproject/android/TipsAndTricks.java @@ -8,6 +8,7 @@ import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; +import android.widget.TextView; public class TipsAndTricks extends Activity implements TorConstants { @@ -26,7 +27,7 @@ public class TipsAndTricks extends Activity implements TorConstants { super.onStart(); setContentView(R.layout.layout_wizard_tips); - //stepFive(); + stepFive(); } @@ -39,8 +40,10 @@ public class TipsAndTricks extends Activity implements TorConstants { void stepFive(){ - - + String title = context.getString(R.string.wizard_tips_title); + TextView txtTitle = ((TextView)findViewById(R.id.WizardTextTitle)); + txtTitle.setText(title); + Button btn1 = (Button)findViewById(R.id.WizardRootButtonInstallGibberbot); btn1.setOnClickListener(new OnClickListener() { diff --git a/src/org/torproject/android/WizardHelper.java b/src/org/torproject/android/WizardHelper.java index c3fa3c08..684a7300 100644 --- a/src/org/torproject/android/WizardHelper.java +++ b/src/org/torproject/android/WizardHelper.java @@ -215,7 +215,7 @@ public class WizardHelper implements TorConstants { LayoutInflater li = LayoutInflater.from(context); View view = li.inflate(R.layout.layout_wizard_tips, null); - Button btn1 = (Button)view.findViewById(R.id.WizardRootButtonInstallOtrchat); + Button btn1 = (Button)view.findViewById(R.id.WizardRootButtonInstallGibberbot); btn1.setOnClickListener(new OnClickListener() { @@ -228,7 +228,7 @@ public class WizardHelper implements TorConstants { } }); - Button btn2 = (Button)view.findViewById(R.id.WizardRootButtonInstallOrweb); + Button btn2 = (Button)view.findViewById(R.id.WizardRootButtonInstallFirefox); btn2.setOnClickListener(new OnClickListener() { @@ -241,7 +241,7 @@ public class WizardHelper implements TorConstants { } }); - Button btn3 = (Button)view.findViewById(R.id.WizardRootButtonProxyHelp); + Button btn3 = (Button)view.findViewById(R.id.WizardRootButtonInstallProxyMob); btn3.setOnClickListener(new OnClickListener() { From 991b2d72706f093852ddbf54cef5a27b6d53dc99 Mon Sep 17 00:00:00 2001 From: Sathyanarayanan Gunasekaran Date: Tue, 7 Jun 2011 13:04:09 +0530 Subject: [PATCH 06/22] Added missing icons --- res/drawable/icon_firefox.png | Bin 0 -> 9233 bytes res/drawable/icon_orweb.png | Bin 8783 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 res/drawable/icon_firefox.png delete mode 100755 res/drawable/icon_orweb.png diff --git a/res/drawable/icon_firefox.png b/res/drawable/icon_firefox.png new file mode 100644 index 0000000000000000000000000000000000000000..27b0cf48961c1a2d6e171e0e57a159b260b9a4a6 GIT binary patch literal 9233 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 Date: Wed, 8 Jun 2011 00:32:59 +0530 Subject: [PATCH 07/22] TransProxy screen added --- AndroidManifest.xml | 1 + res/layout/layout_wizard_permissions.xml | 19 +-- res/layout/layout_wizard_root.xml | 53 +++++-- res/layout/layout_wizard_tips.xml | 19 +-- res/values/strings.xml | 5 +- .../android/ConfigureTransProxy.java | 150 ++++++++++++++++++ src/org/torproject/android/Permissions.java | 2 + 7 files changed, 207 insertions(+), 42 deletions(-) create mode 100644 src/org/torproject/android/ConfigureTransProxy.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index ad48d9d4..030bbff5 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -32,6 +32,7 @@ + diff --git a/res/layout/layout_wizard_permissions.xml b/res/layout/layout_wizard_permissions.xml index b861d7a4..f7ecab80 100644 --- a/res/layout/layout_wizard_permissions.xml +++ b/res/layout/layout_wizard_permissions.xml @@ -11,19 +11,10 @@ android:layout_height="wrap_content" android:id="@+id/relativeLayout1" android:layout_gravity="center_horizontal"> - - + + android:padding="20px" android:layout_centerInParent="true"> diff --git a/res/layout/layout_wizard_root.xml b/res/layout/layout_wizard_root.xml index f71c284a..62afa38a 100644 --- a/res/layout/layout_wizard_root.xml +++ b/res/layout/layout_wizard_root.xml @@ -1,29 +1,64 @@ - + android:layout_height="fill_parent" + android:background="@drawable/background"> + + + + + + + + + + - + + - + - - + + - + + + + + diff --git a/res/layout/layout_wizard_tips.xml b/res/layout/layout_wizard_tips.xml index 60cba512..6a304caf 100644 --- a/res/layout/layout_wizard_tips.xml +++ b/res/layout/layout_wizard_tips.xml @@ -11,18 +11,9 @@ android:layout_height="wrap_content" android:id="@+id/relativeLayout1" android:layout_gravity="center_horizontal"> - - - + android:padding="20px" android:layout_centerInParent="true"> diff --git a/res/values/strings.xml b/res/values/strings.xml index 0bf8286f..da4cca30 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -145,5 +145,8 @@ https://market.android.com/details?id=info.guardianproject.otr.app.im https://market.android.com/details?id=org.mozilla.firefox https://addons.mozilla.org/mobile/downloads/latest/251558/type:attachment/addon-251558-latest.xpi?src=addon-detail - + + Transparent Proxy + Transparent Proxying allows you to redirect client requests without any special configuration or knowledge at the client. + (Check this box if you have no idea what we are talking about) diff --git a/src/org/torproject/android/ConfigureTransProxy.java b/src/org/torproject/android/ConfigureTransProxy.java new file mode 100644 index 00000000..8ff6dad9 --- /dev/null +++ b/src/org/torproject/android/ConfigureTransProxy.java @@ -0,0 +1,150 @@ +package org.torproject.android; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.net.Uri; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.TextView; +import android.widget.CompoundButton.OnCheckedChangeListener; + +public class ConfigureTransProxy extends Activity implements TorConstants { + + private Context context; + + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + context = this; + + } + + @Override + protected void onStart() { + + super.onStart(); + setContentView(R.layout.layout_wizard_root); + + stepSix(); + + } + + @Override + protected void onResume() { + super.onResume(); + + + } + + private void stepSix(){ + + String title = context.getString(R.string.wizard_transproxy_title); + TextView txtTitle = ((TextView)findViewById(R.id.WizardTextTitle)); + txtTitle.setText(title); + + CheckBox cb1 = (CheckBox)findViewById(R.id.WizardRootCheckBox01); + Button btn1 = (Button)findViewById(R.id.WizardRootButton01); + + cb1.setOnCheckedChangeListener(new OnCheckedChangeListener (){ + + @Override + public void onCheckedChanged(CompoundButton buttonView, + boolean isChecked) { + + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + Editor pEdit = prefs.edit(); + + pEdit.putBoolean(PREF_TRANSPARENT, isChecked); + pEdit.putBoolean(PREF_TRANSPARENT_ALL, isChecked); + + pEdit.commit(); + + } + + }); + + + + btn1.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View view) { + + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + Editor pEdit = prefs.edit(); + pEdit.putBoolean(PREF_TRANSPARENT, true); + pEdit.putBoolean(PREF_TRANSPARENT_ALL, false); + pEdit.commit(); + + context.startActivity(new Intent(context, AppManager.class)); + + } + }); + + Button back = ((Button)findViewById(R.id.btnWizard1)); + Button next = ((Button)findViewById(R.id.btnWizard2)); + + back.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + + startActivityForResult(new Intent(getBaseContext(), Permissions.class), 1); + } + }); + + next.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + showWizardFinal(); + } + }); + } + + private void showWizardFinal () + { + String title = null; + String msg = null; + + + title = context.getString(R.string.wizard_final); + msg = context.getString(R.string.wizard_final_msg); + + DialogInterface.OnClickListener ocListener = new DialogInterface.OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, int which) { + //close wizard - return to orbot + + } + }; + + + new AlertDialog.Builder(context) + .setIcon(R.drawable.icon) + .setTitle(title) + .setPositiveButton(R.string.button_close, ocListener) + .setMessage(msg) + .show(); + + + + + + } +} \ No newline at end of file diff --git a/src/org/torproject/android/Permissions.java b/src/org/torproject/android/Permissions.java index 996a1dc8..248fd965 100644 --- a/src/org/torproject/android/Permissions.java +++ b/src/org/torproject/android/Permissions.java @@ -116,6 +116,8 @@ public class Permissions extends Activity implements TorConstants { @Override public void onClick(View v) { //Check and Install iptables + startActivityForResult(new Intent(getBaseContext(), ConfigureTransProxy.class), 1); + } }); From 86727d6298766816bccbd5f58e91fd58f6846786 Mon Sep 17 00:00:00 2001 From: Sathyanarayanan Gunasekaran Date: Thu, 9 Jun 2011 01:31:32 +0530 Subject: [PATCH 08/22] Updated Transproxy screen --- res/values/strings.xml | 1 + .../android/ConfigureTransProxy.java | 81 ++++++++++--------- src/org/torproject/android/Permissions.java | 2 +- 3 files changed, 45 insertions(+), 39 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index da4cca30..daf8f3c2 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -149,4 +149,5 @@ Transparent Proxy Transparent Proxying allows you to redirect client requests without any special configuration or knowledge at the client. (Check this box if you have no idea what we are talking about) + None diff --git a/src/org/torproject/android/ConfigureTransProxy.java b/src/org/torproject/android/ConfigureTransProxy.java index 8ff6dad9..3969dbbc 100644 --- a/src/org/torproject/android/ConfigureTransProxy.java +++ b/src/org/torproject/android/ConfigureTransProxy.java @@ -15,13 +15,16 @@ import android.view.View.OnClickListener; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; +import android.widget.RadioButton; +import android.widget.RadioGroup; import android.widget.TextView; import android.widget.CompoundButton.OnCheckedChangeListener; +import android.widget.Toast; public class ConfigureTransProxy extends Activity implements TorConstants { private Context context; - + private int flag =0; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -46,55 +49,53 @@ public class ConfigureTransProxy extends Activity implements TorConstants { } + + private void stepSix(){ String title = context.getString(R.string.wizard_transproxy_title); TextView txtTitle = ((TextView)findViewById(R.id.WizardTextTitle)); txtTitle.setText(title); - CheckBox cb1 = (CheckBox)findViewById(R.id.WizardRootCheckBox01); - Button btn1 = (Button)findViewById(R.id.WizardRootButton01); + RadioGroup mRadioGroup = (RadioGroup)findViewById(R.id.radioGroup); + mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener (){ - cb1.setOnCheckedChangeListener(new OnCheckedChangeListener (){ + + @Override + public void onCheckedChanged(RadioGroup group, int checkedId){ + + flag = 0; + + RadioButton rb0 = (RadioButton)findViewById(R.id.radio0); + RadioButton rb1 = (RadioButton)findViewById(R.id.radio1); + RadioButton rb2 = (RadioButton)findViewById(R.id.radio2); - @Override - public void onCheckedChanged(CompoundButton buttonView, - boolean isChecked) { - - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); Editor pEdit = prefs.edit(); - - pEdit.putBoolean(PREF_TRANSPARENT, isChecked); - pEdit.putBoolean(PREF_TRANSPARENT_ALL, isChecked); - + + pEdit.putBoolean(PREF_TRANSPARENT, rb0.isChecked()); + pEdit.putBoolean(PREF_TRANSPARENT_ALL, rb0.isChecked()); + pEdit.commit(); - - } - + + + if(rb1.isChecked()) + { + flag = 1; + SharedPreferences prefs1 = PreferenceManager.getDefaultSharedPreferences(context); + + Editor pEdit1 = prefs1.edit(); + pEdit1.putBoolean(PREF_TRANSPARENT, true); + pEdit1.putBoolean(PREF_TRANSPARENT_ALL, false); + pEdit1.commit(); + + } + + + } }); - - - - btn1.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View view) { - - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - Editor pEdit = prefs.edit(); - pEdit.putBoolean(PREF_TRANSPARENT, true); - pEdit.putBoolean(PREF_TRANSPARENT_ALL, false); - pEdit.commit(); - - context.startActivity(new Intent(context, AppManager.class)); - - } - }); - Button back = ((Button)findViewById(R.id.btnWizard1)); Button next = ((Button)findViewById(R.id.btnWizard2)); @@ -111,7 +112,11 @@ public class ConfigureTransProxy extends Activity implements TorConstants { @Override public void onClick(View v) { - showWizardFinal(); + if( flag == 1 ) + context.startActivity(new Intent(context, AppManager.class)); + + else + showWizardFinal(); } }); } diff --git a/src/org/torproject/android/Permissions.java b/src/org/torproject/android/Permissions.java index 248fd965..a37d3c39 100644 --- a/src/org/torproject/android/Permissions.java +++ b/src/org/torproject/android/Permissions.java @@ -115,7 +115,7 @@ public class Permissions extends Activity implements TorConstants { @Override public void onClick(View v) { - //Check and Install iptables + //Check and Install iptables - orTransProxy.testOwnerModule(this) startActivityForResult(new Intent(getBaseContext(), ConfigureTransProxy.class), 1); From 026a7ca4c91b2cb56008d46ac0d6b612d7f58681 Mon Sep 17 00:00:00 2001 From: Sathyanarayanan Gunasekaran Date: Thu, 9 Jun 2011 20:35:56 +0530 Subject: [PATCH 09/22] Added proxymob icon for TipsAndTricks Screen --- res/drawable/proxymob.png | Bin 0 -> 11265 bytes res/layout/layout_wizard_tips.xml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 res/drawable/proxymob.png diff --git a/res/drawable/proxymob.png b/res/drawable/proxymob.png new file mode 100644 index 0000000000000000000000000000000000000000..6e23219403d57be4c48fbec4b9463b5447df6a4e GIT binary patch literal 11265 zcmV+cEdJApP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FZT01FZU(%pXi00007bV*G`2ipY) z4HXkw$;BK103ZNKL_t(|+ReO4tgYE~-}hU)`MT5G?!9|oTdx|vDi+BSRWj9(mZLO6 zVjCXFMqn$0Lv#dh=~{!vO@(jO3siJVpfv1gh5GK5|>YjY{{V{ zaUa!R{Idb;PZywHL*zq@`8j0L;^wyr6Gh>u z5GpIwny4+*YN90w5+#V)|({5HcHqg3G0MzfwjN}SVvf^u#!X@g>7)O z4D{}IBHA7H_bt3YU|6(!fPY%%kiI{y%Il~nNrMJ{RGj)a;h8+X@ zV%W2ZgCaIZ(|B-w5{_=pxqiKoqr<8=n3-Z?ZCPP#ff$2e5M*4=M=R1yMo}`F0-Aer zXtfV#>sC+BSNY+?l{|T{vd0fQSwD#;KUFwGIM>WYNGvm~acs98eSbn2-X`(Oe=@iG z69Hs@2PrJBsPQFKUYUq6H?U_6`zjo`#8ETs-JbP_cXrb4=ceZNt)jX*bInYguduej ziNmSGU=geute8Kr6#d>`)=ZY9kt~U%fk+_bK<-zB;k@0X2ahlG{d-IM@ZQ>;elWQ7 zSTavlIZJScWiceyeM{F~5aOGJ{L4SOHT~!S{R2#M6E`U-fx1v;4)#PiP{UP|xz=>E zXLg6%FYV}acPHl74L3a~ecj+qiI)OTsSYnzJQk0|V#H$P4_Xo5gGR|@O=OKkB8d^8 zpo2zw2?SzjN!>+ihlj^Y-h1cV+<$XjoZbsgACWmhI7x6GBdeI%woAHpMaX}N^rr@p z`8904hbwofih_xO9S8d&93mXmoxiiQx%KiqJ^zVmap#Vk9TY`1r8Ff4m3k`iQsAY; ziN~7)D-MgpU@!>E_iad3VT6aQnM5RMB4{9KAkY)Fr`KL1o%HmC*pjvvx$Qo9wBX)% z&dPh=-qzcDD34WnlHoLEF8ZEzr*zvDgZ|t9e30Bf7s21eOy>Bapz@BXhh0$)#c^bm z8?)8!OMC4LuTJd?FBQ8-v!b3+*qV}xl1d9|DQrz;Ya9-%j$we42OX=k4c$7?^_Pi{ z8ps(Z8SkK|49(QAbG2f=S5P=dvYsFXJp~pogIWZOu|hvJrYg#tcC&Y--0a=F=->Iq zV)E$Qp`bE}3c>pVt6)qYRg>oHADu`{P=YFuft z&S9*9q;xT|Q6;9xaMCioy~c(G`%UE9wSsHUO{nXNqOn+UnCviO)Tq#VB+pG*Z_1bL zdUoKu=HPty{_k~lEKS0Dj}=9v2Ck#)FQfX|A8tuM6d?O`OzrT6Qv1Zr!@gCnXUC1E z^Dpc^z5SCj_tLB7&W(ejnN!+^LMtt$k%^s2?HWw*Jb0t!t*<}f{2c7woT`{J-)Wdu zHPfORKUWvHqQI0T8P}?q0dL`?=ab|LJ1)a9Y$e3aPZvlFCeETF&r&$)h)WUjOnVE;fQKr_3i4 z_T7wmHDglMlx2Y}3f$ftzc)v$U_{W6NY<14fsAD;1-q`~g-K06Y&b3qk1OGEyXL)r z_=FpWj!%4ghuQTCnJ9<~IgguQl|{|rq*>Y@x9hSo@>a2&Ev?Off`CeaT7z!CgAOnM z;oa?z1gN-zt(CIKOsrwg2uIm+W7^d(9$dWevyFZB({}et?W+c_g_e|3y9qNtW%E$@ z>OXzVgZFyWRm`gihvg2tlR1;J!8wn`APF>Oa)_jqFlxXWuofmYnlrfzkQA$im#=zu z%PFhQbF%d4**zW}w7j?SeCPAW+`75LwNK5l*GjTUf+(s<)hE%Ny`tEdkMC`))BGKl zJ1dn$wn8G4r6>1^%s(RVAN*jR^oIbFFJr4Ig@?wBiQg3r*X!1OZ1?2m=l10KkKgI3 z9?dOA3oR(6DJC?z=G`x?`OcS?Y&S|_E3Q;i4x4?Z)f8_$MwJ{hstHtZ3cA=LlNzcL zW!$|~m6U~)GASlBC4To_B1dIfSgtfRS9a%oYVw$wKIQ(#aR0a=e0!Ip{uEJDh;w9BvMQRDwC#v(PmYP4666e;=(@<+MdrgN2Ylo8 z0@Eg5zB;gbWx?Um30Kx9>@G6C%Uo0zbymi2&7#g2$;GbQ9e!R-pPP|s zX^7-)M-GvkMvziWkP-*1ICK~6O_Y3|cr`|JYv{=2y^0+fxP8&nbcy52k_#)4R3(cR z)|$cXnRU>iTwWxrog{)71~CM-r1&3^_|<W?WHEhZcl*L$ zD0Z$N-P{IVI$dMMG8f@&QSz<-2QJ=Dn9v}x;h>tcQ%zK7q`1*V2e3NhM)fw%x^UK zJ`x^T#P8GZ-y%!R?e#h3a?9gMfeKQDpwS{)c;`B|V?x*V^?IR}PJ~_{m`n@}DgAF_ zz_tMLHDorYC`)Re*)fJgW4T$i{>8oJozGR%XJ4%9T3&j*)T=`jYdtej_(1vkcWR!V zl%&=$uPUD1E18wTpoXCncB;T%{#41ob;oeM?pb~KkiY$vC2wqI*!dK>c@;H+0x2ZY zx+4#P90GaUlZQYG5uH?MQ;~CKxz3yg&&5#kG+2Vd;jKN2t5dp%=PXx_{>CBdj<~s5 z;xAp+*0~O{ya-iT3G|xjwW80E!rvhCcTfkQ=NNYjUqEez8Nz|d zT(7tLFV*hmOKxu}zJ-Hjhh&2&4C{jWEbvp!IUhXJaOY@;SFTUEI(1lMXp>>x2d?Ux z7u||{e_%cIeDz`EJ@YaA(G_&wkc^-yLl@A#hm^rOR5Lkev~cLOhNc2BP#0)jvHtK0 zZ!Qad|Gj~$)^Ycm@|hQf=7j_7hv)PUE?7SE62`pDE2nSrujp1gstv`OSdiH0_tGBMY zvc#{G-o1Y&UM;%uTs*93R|Q8q4KE)yeCB4!-2=ydW7w&M!`apT57uN^r&CQfH~cfhsHhSPk(yvnTVlGcdeopD>4B^GCW(Vk;y zjnJv3Pjf>2_sNbIk@^6Kp%!H(h65YSwds2QZdG5q<)<|g4JL}X4%(3D&m+?e-U@l! zv8SgL(y?6@7~>J|5lyh&U{nz^-uw?1J@=|T%Cf|kCCPgXLMs=%%kT0a-zQ7ru|46g zvF!U7$kB{DnJTCw13e}|t~s?xG+3|EceX1T3i z+TT3;x%%kluCoq_qD8Cn%$rZ?Rt6KGv5q2pw9k~9u(2a;wuJ49xLFc6tIJgNvMMKY zd@}I1KV*Aw4ayo*6sUoV`~mNEuM;#OVrc0pY{}GIh3qb=j}f4*iwr}ia|LO=C2v|% zQu1UQ**<>o)IQ$s47F@92C}5i!wDTJ7wQoZ^|n-i)oEyqeiTh zR`}S5rzBUQ*#ZVFJroUTFvt*51TlgUgUN!?(Q1r{Fc9R{CPGPU*)@< z@`csA)cXt4-JeEMKt&*r#F?t1Ig@gxA0ja)k|^mTLKY=kM-B->B8QA7MXcp zJ2%V8UUSJ3i$!?;phNsSH=);*}fT7z+dNnng%RZvl^CR7ZjXvy=3 zbncw8-lZil+Q4m&CI^z0WQVis_B+HyE1u17zPH0S{ zi^oLndJg*&_I=0un}*@sQ0`h%&TP*UMfTia;GPJ{SW(T`YAW+~|JJEI-i!1TpfQfp z$=KnnQ5uu&PTkIK7Dvq(LNL6zSc6%0=;|?=)@-I9a;o~hV#&Yv zq9dLQnhoL%aiheIW8ard)X-T2DxwH=xi_11lf!jh%`#eJDV+!fN~J1I-8EN=X4W|8 z(2%iWxpBOJM+>xd80YY|BF2PCN-j$%3{?f2RU~9H@;E9uQH(R#=?P17j4>tFIQH%w zVxD`I$b{ec$6w_O?-p!#uVYO|#vy9ZY%nRKDU+6?icOYnTvD2Mu=zTj zR%7svV-U|nq}v3}roa^J3K$GDmb`_ogI!-z^uqPyGalcblMLW$Gcoh4Mvo_nR3a1x z#j8*nq;`Yft!6W85v&;IZI5}hVEHhSvqy@GrmSd&OtzL>mkc3MImP=i6epBulj{HIo35eDX?mA*kXP7QWibmBT9w=7F$s0@l1CudqNzsT>O2!)$H!3Woa_T2VQD9IkhM_L_#@==IuQnvHNL13gW5|%bM`Fb0 zL{P<-!rp#G*%VNCCR0OjYpkzuzQp?qUpDMCH<%YM@anZGYHHNgh^??vV6($!gH2$J zBUcqkh0sUhu+M~Rlv-djSOuF6F|29o_A?rZ580b>Wv`}ggl*_3E2yj|dqEH+ zIgT2~q%e3fSP^mJC|q4xOa&Bba84A5;;h=jo1$^np&}|GGVIpu?kZj?^eiLYfLIU4 zpaRkj;}&j&U=8)8V1{9#N-|qQj$r(FZ^R*H!rb0MOvBZQ#hFZ2i|E*Z)~uHVn_{9u z-Jmle$4KfEr5;ep8J&hphS9)cN#P&i@-qzEHL@9SYB1h#uv3sUGYkqv!i&dxC<{5Z>YtblW)H;HxPd|l28Yb}})j9^iAwk_F~n9UY3maHRvDj{J) z9DfZ#1%?!{u0R4TFBYuXjya5hV?QB!$F-)UDmTolfg_plB+LPWPZrGyQ2{I1Y_WiA zri7&AlVi56VP4Kiy82%63I==jfO_TWPdC(JxmLrYp=44CeHSr6G8vaMRbf%rv5A4A z$+U6o=^8N@5h_!=!jy$1oGR7{h=37{@wRYI3|SP^U^KIn0@_*fIv|Au3=%K-8xce^ z8Y2wQrNpw249U^-8(QtL2Hw?@&vz5%lWS<2fDSxAk1QtwCSy`f!xYWuAcB_~pXaDr zya>A9VB3}~Lcx@zmXs6Zu~{t|slp0PnTjoUXRrz-2XjG(v24kJhD23()ES~z)Cz6L zm`e+?STKcHF;-QK7!@ZVA5qlSh&nMOQ4ql*Ombv+(qekBUcosC2^j*&_dZHixL6Bq zhN4mmXHY39t#YpWIDZY_+@jMXwq4{~y`yv$RwAx$DC8NOnV}|Qbc)7Zavtwqf#R%1 z0Z&0tJ65!eC5eb4l28TbEzj;oC|j;fB5W?-XO!4QT+!o=koFA(=!ybk4OYNj@-kxv zh^jDlUKAA3lqDx4cFbl+v%-czca~^uajCojoJEE>KB^){Xa@)ZOd*W*i$#s2F5t(D z%y(B)a1++8XEltyE|&sD*D_U$uXZppg{WjTWEC{0@%M@fo$ruW3p6Ec232$EV&D)Y z>u4$UoWuPEFH{#yOdfS;6-WU&Dc!bZXcMw$kU?pu1tKFr&KQ#9oFpYdHD}Z@a^*1+ zVi(tgMMic@z@X@6Aod<}#f<9-0WE9j;zw|SDk)tq)__0SrHl$t&ArOZRbv;lv6~?*C>U|VXAsHBHa#*Fb!ENksjNJCV{n%Jo!q8cM|h|g$QKp#eoR8hUOH~}#-=04Wrjp7ab{QL>K-Ru1Q?GB4r;Ig6_ za!#bKr&|RM=372}G_YSsvT>Y-g146y10IF3Jsq|f)zQT+?~f$QW*fnlIF0yHksX11 zik1qVu^DH9PLUg6N=Ofsd}EF=BhT)PK{XCR!o z&!!9{JNAz?f@XzMVNb9*^Ym%JeqsV*$*5XmB!$o=%^eU>l2Zs6hM04^(DREFddjjU zX~LkyqdE4`8R{X$k>4RkAdtPoq)g6=HHu>ls+LTbJo|1!WP>$2QXs%j&)%mw>Um>P z(}#j8C-$Xh&qO9<(urfe@l59xSB?e_j&5^hZ_2O!#y#3_LXt2_tu8IsS5YiZ2 zt5TWEz;c~%Q$eF5dEALKDqL4&D%eG)-=AW90W!+7tr3>_Y#FrQq6|QASqUyPDB1-V z&O^V+Zg#~W88X=0bKE!2iCG~+VMlh45WpMM8qkchhKzzJma%)2nNYbv*G7s$s7paL z^UCf8`?lqHqqxZTf^NVN(?GWo&KDOPY}V{Z=4dwI&^+ONT`+QxmjH=DV!_izfIP=* z=DFQS9|l67v6Vm&)Qs(HCK)CfF$QxHd7K?;{be3x$+UE-U8I~_pjTmVm%i3vbhELm zv-S3(J(A}ph$TyAaWLbC7y1y9EKq`GK|+QY5MxneFert|V=EcO#LPMt+$<*~x8dD; z16L0$R}KVU1a9vdyem1`W)ImOj-rbhRFZ@FfhFHF7qn0=p!OyLMK^K1Sg)y z!&NqM%dsJ>T``1AX$?^#Qccl9AUqubl8oCrwr3Ih%2iD1$w~3nv*xLuhtuOo zS|?~l7@R7-3au!c-uCAg{mIijgo$-l4I;Bo+$5B*lh-|}B?&>CKvd96hFwQxm^EWp zLN1fcu8(ZWhAWLSpJpCCQO-^ylP1&DnVF9irr=}{&Nqp!O%y2aC&O1aHEK)dq2oLy zG8Xd@Z;fD#&~+6bKDyw=gBjP%f)h94QwIyG#?r@3B*AP7;?Vq4Uyo;fxa_247dim#!j<7A-PuuTWk_ zaFnc!98ey)V4D+06BaNzv*?wOr#yFaO6@Hv7`AJ;I8B@#cMOX)2fF3slfcKX!1<)) zUU|TLXTnaShy{$th~pzItQAY44G;R8I2Hcdt%sbhgg<}u6ep2Q3Jlu_^&FjFMN>b5 z6Eh4J-)4?WhZZ#k!5O1sA{X)L@g{9gNo+LGs?eFF3{hywtd+Dlvrj*~*c`XsIGk7& zW8tTsqY{YQEkhg8(xBdaq-7py(Uj4wXc|)iLO_xdL*~(1QJwM0yHm=E!F08fW< zUmZ7QQ(k)3^MAY*dF#wwW^WECz`C)SC>GLY{62A)CB>y2Sqv$Zytj%hg5j4w`H-JF zFg#s({@P26QJiIU6lh&JK(1)GnyROf;fOP2{FQ0 zzFn5S^8Flz{E=czStqcz;Il`bsV}&{o}=0zQX!Ox)QGJSX~st!qL;;_7A!l@2g^v; z5B$fU82H4_nr=v#oG2xs3DhRIQ^D@t@%8!JuvtJU6lz#3wzRL_#2@V=ihAoMx{mL( zzxU>Q>vz8%HQz^g5|s0;VQs@NfiH1J@G^o_M`E=*?A*LIzd5zWiWs51zDxM6x3NPY zcraUslm-1V;Ju9CSh)`gYK)}P(R}9#gH2?C;Utp_L)vBv54O0ppnRFvUGI2%fKUCYnkYWb^oBU78nLCIl^d6Jb}f;?~0o$ILC zN7Dj*`aV2eLNyMpotaF0^%<(YT?A2QoCMqP?e=TmeRK21*9J}RVR#e+=X*u~01I_V zL_t&yrzx<$fZplX(dBc5xzY(NopKhfK7MFF{O)__Z{FRX9^Nd&jTMwze z^@w&lzy#vfBHq$M-+(o0E>KRX{U@J`;nIx;Q4Xl||N}q#`K6ww-Wh?lK8&6F?M=M9Sm*4WFQ$T z>zLIAQy;iiZn@KJd8TPODm%&?89F6w6T>PHHv_68g~6d9w`5pNJMHIa8vXZm>+WNP@_2&A`uO`)dDm)6A(->KA*L3+W5l4;UUx&O0 zMaD?R8Z!>uZu45o*6kjZH;yLtOpGyVc52bWF}e4YZZ*&kg7t!0V1N{0+h#(mkighK z5U}+!$y1@*CQ=;Bm&zITXT>O_>LWQaiXp-XO1BL37d`!QAm@yDFguF531(`?rl4fh zCX^OVpQ2|iwlUNdoHvHymFK8;=7^52m2KpW?zIPBTmJ5sRPW$&*yyvg!`e1&eRy?pZB`VO7;DsCn~N@5isK80zNhO9wi04g z=moKmeWqPzbQr0SadT5*ucS`ct`c!j>e8|^^JEg;5XR2QkcivJupDU52D)WHHDgLJ zbFhbs>|An1novn&L1zY7EXXHYY-Olx=x3JrxtC~e9D=GEF=CAHAilHu%Ib?>`JjFD z4Fex!c$}59*s)#@^!an+Xu|hZu77zH47g@YUPZ@zuCrb4He0t7=SNqjN0oO@q;Q(A z?Ml9XMzh@#QlQ@o#tK6Vc{BQ%okKq;{W23anb_s=`6{zIO$@6{;~gm`Hj6;qB!+dO zUk2Jmpj!q~PS{4VbH(l{rpaI~w?)aQNnitN0<1gqbikIDs)AH1!%x42zj+n{`j%FMfZp@O z7h_T@W-PZXNOI^|e%cRbUA>d%SLc&G=bV@7%2dpS zimgU5dFYhb3Vmm=2E-(W@DY8hh*gXmAH^zaMm3d4zI?4c?%}MyixY%mi68g z{=!dSZyW-mRz$3^a-L7pS2w?P@3)t~^~JMc`%O0{gpX3@w9BkEnQr)iz+d^nVU|A( z(BFah8Pq*HjtQxtl1I)dRymyM$)>&7_(_`V?@ji+_gzGEyawOb(emDD=>{%+*~-)mWBy zZjpZCQ<%N^rCV9C#_}{jj=!_{{M%nzeBlch!}gmNKFo$k5uOHR*?QXUZ34gWhsUAp zA2~1f>!|*%kJ>?GQL;cXN=~)*r+U0zt}e9f%e}p7uPTd5d{f|WA0W>kikVdSvo*Wk zQhP{dAW0(IOL3>oBpDdhi*XFJMiG}0m%(P#C8S8BwfHmwn?QqNlQMCM!yU)LZpn6c z&id1zfKR+YxjRt-tT<80JP7x?-(G*=Tfe>d@)s9F`)y=FRw!XhBbVcl*a*1 zg0c*T?Z(ol=SY7PI6uT5gsMs zIAzX5V%fKB+m>PYxj%lW_eUEG|01@m@O4R5Stcg4YYYe0ay2X0i`Lz_-QRloWj^_1 zKX&x$&09C_7+)0RltyiH%9wr}RB6NZ zT%^RRhj#mfklrWhfBMIt#PFjZEbwK_bc(ATr3p-&VQz(8V>!rhXd>5U{p8u(@%D>% z<>Md!_?1r_-8#H&n`SzS$#d2`X6dAEoUF|uAu(YtXT{_XtVR{GF}T8!#-M_@vAZiH z>n+wevL;T`F>iNooV~vN_FM04-+AL{IC(E5eIUZIDo>+u9$^tO+fM1W7YzLDpW?v+ z-?OBzA+EsJ1-{JGe(VR%jj)GsAi`A>IGlFVTSw{exsS<Y4e6B@nN{vzy0*P?VIns*WQ2UY&icQk{+vYf^v#- z9+XAStolT|4h(5S$UpaIaWut8*Z+>lOPI>xtCF(J)DEVMQ;NHy>;wCfIjD1ev=e97 zkMhwoxBN4=o|)b`ING^h?>7fjzQ$QUQX_Ins(lZwkIGxQRE|Uj4Xo0Fr}23BV7Pz& ze*gZXhy8>5r{VO$I&F_*OivL`1{!E&CicAA-9n4K36q08*}FQI*}-9TxHtDZ)0v-@bH7^_ zwzNi!e8h&(4*91>sxT2{ikOKJX}p?= zVCqWBx-v~A7$>41@wKXG9JKG-+_uT2Hl@5xnzyQX3#@fKWNEFi&ahU)I>9z6-QelA zi4a%B^qGHM2Q2-;>z5GuZxI1M4R}ArTcL7>%8$o!)jEpR8-XfAWya&V3IUIZ)3Iay z(FrG6bd=?&YE)qWdZ5!xhZ&FP(o7qLHY#0G`k^NzN59=C@>^tn@!xYyo*#~#zWplVDM%Xth&oqq*1x-g^aqTao|S@BE)PN$P5^Ukmw17 rU - + diff --git a/res/layout/layout_wizard_root.xml b/res/layout/layout_wizard_root.xml index 62afa38a..afe60052 100644 --- a/res/layout/layout_wizard_root.xml +++ b/res/layout/layout_wizard_root.xml @@ -41,12 +41,17 @@ android:layout_height="fill_parent" android:padding="3px"> - - - - - - - + diff --git a/res/layout/layout_wizard_root.xml b/res/layout/layout_wizard_root.xml index afe60052..d038a960 100644 --- a/res/layout/layout_wizard_root.xml +++ b/res/layout/layout_wizard_root.xml @@ -40,7 +40,7 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="3px"> - + - - + - - + + - + diff --git a/res/layout/layout_wizard_root.xml b/res/layout/layout_wizard_root.xml index d038a960..4c640356 100644 --- a/res/layout/layout_wizard_root.xml +++ b/res/layout/layout_wizard_root.xml @@ -3,30 +3,29 @@ + android:layout_height="fill_parent"> + android:layout_gravity="center_horizontal" + android:background="#000000"> - + - - + + + android:paddingBottom="10dip" android:paddingRight="20dip"> @@ -58,7 +58,7 @@ - + diff --git a/res/layout/layout_wizard_tips.xml b/res/layout/layout_wizard_tips.xml index a9c4d0b0..1b7b50b9 100644 --- a/res/layout/layout_wizard_tips.xml +++ b/res/layout/layout_wizard_tips.xml @@ -3,30 +3,29 @@ + android:layout_height="fill_parent"> + android:layout_gravity="center_horizontal" + android:background="#000000"> - + - + + android:paddingRight="20dip" + > - + diff --git a/res/layout/scrollingtext_buttons_view.xml b/res/layout/scrollingtext_buttons_view.xml index 04023ffb..930bf729 100644 --- a/res/layout/scrollingtext_buttons_view.xml +++ b/res/layout/scrollingtext_buttons_view.xml @@ -4,13 +4,15 @@ android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" - android:background="@drawable/background"> + > + android:layout_gravity="center_horizontal" + android:background="#000000" + > - - + - + - + - + diff --git a/res/values/theme.xml b/res/values/theme.xml new file mode 100644 index 00000000..efc15c45 --- /dev/null +++ b/res/values/theme.xml @@ -0,0 +1,9 @@ + + + + #333 + + diff --git a/src/org/torproject/android/ConfigureTransProxy.java b/src/org/torproject/android/ConfigureTransProxy.java index 3f0f31cf..4e9405ba 100644 --- a/src/org/torproject/android/ConfigureTransProxy.java +++ b/src/org/torproject/android/ConfigureTransProxy.java @@ -81,22 +81,24 @@ public class ConfigureTransProxy extends Activity implements TorConstants { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); Editor pEdit = prefs.edit(); - pEdit.putBoolean(PREF_TRANSPARENT, rb0.isChecked()); pEdit.putBoolean(PREF_TRANSPARENT_ALL, rb0.isChecked()); - pEdit.commit(); + + if(rb0.isChecked()) + { + pEdit.putString("radiobutton","rb0"); + pEdit.commit(); + } - - if(rb1.isChecked()) + else if(rb1.isChecked()) { flag = 1; - SharedPreferences prefs1 = PreferenceManager.getDefaultSharedPreferences(context); - - Editor pEdit1 = prefs1.edit(); - pEdit1.putBoolean(PREF_TRANSPARENT, true); - pEdit1.putBoolean(PREF_TRANSPARENT_ALL, false); - pEdit1.commit(); + + pEdit.putBoolean(PREF_TRANSPARENT, true); + pEdit.putBoolean(PREF_TRANSPARENT_ALL, false); + pEdit.putString("radiobutton","rb1"); + pEdit.commit(); next.setOnClickListener(new View.OnClickListener() { @@ -109,7 +111,11 @@ public class ConfigureTransProxy extends Activity implements TorConstants { } }); } - + else if(rb2.isChecked()) + { + pEdit.putString("radiobutton", "rb2"); + pEdit.commit(); + } } }); @@ -127,7 +133,8 @@ public class ConfigureTransProxy extends Activity implements TorConstants { }); next.setOnClickListener(new View.OnClickListener() { - + + //Dirty flag variable - improve logic @Override public void onClick(View v) { if( flag == 1 ) @@ -152,8 +159,8 @@ public class ConfigureTransProxy extends Activity implements TorConstants { @Override public void onClick(DialogInterface dialog, int which) { - //close wizard - return to orbot - + context.startActivity(new Intent(context, Orbot.class)); + } }; @@ -164,7 +171,6 @@ public class ConfigureTransProxy extends Activity implements TorConstants { .setPositiveButton(R.string.button_close, ocListener) .setMessage(msg) .show(); - diff --git a/src/org/torproject/android/Permissions.java b/src/org/torproject/android/Permissions.java index 4b74c553..1c5b10c6 100644 --- a/src/org/torproject/android/Permissions.java +++ b/src/org/torproject/android/Permissions.java @@ -80,12 +80,10 @@ public class Permissions extends Activity implements TorConstants { if (hasRoot) { - Toast.makeText(context, "Has Root", Toast.LENGTH_SHORT).show(); stepFourRoot(); } else { - Toast.makeText(context, "Unable to get root access", Toast.LENGTH_LONG).show(); stepFour(); } diff --git a/src/org/torproject/android/TipsAndTricks.java b/src/org/torproject/android/TipsAndTricks.java index a3aa1ef7..ebb5ad37 100644 --- a/src/org/torproject/android/TipsAndTricks.java +++ b/src/org/torproject/android/TipsAndTricks.java @@ -1,7 +1,9 @@ package org.torproject.android; import android.app.Activity; +import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -98,9 +100,40 @@ public class TipsAndTricks extends Activity implements TorConstants { @Override public void onClick(View v) { - //Finsh Screen + showWizardFinal(); } }); + } + + private void showWizardFinal () + { + String title = null; + String msg = null; + + + title = context.getString(R.string.wizard_final); + msg = context.getString(R.string.wizard_final_msg); + + DialogInterface.OnClickListener ocListener = new DialogInterface.OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, int which) { + context.startActivity(new Intent(context, Orbot.class)); + + } + }; + + + new AlertDialog.Builder(context) + .setIcon(R.drawable.icon) + .setTitle(title) + .setPositiveButton(R.string.button_close, ocListener) + .setMessage(msg) + .show(); + + + + } } \ No newline at end of file From eb3a09ae06cd7b822d1105815663a0ad254b59a6 Mon Sep 17 00:00:00 2001 From: Sathyanarayanan Gunasekaran Date: Mon, 13 Jun 2011 01:15:44 +0530 Subject: [PATCH 17/22] Added the AndroidManifest --- AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 030bbff5..a27e2c1d 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -5,7 +5,7 @@ - + From fbdeb71974a4ea3567b5f6cb7b6962ab9c5a19cf Mon Sep 17 00:00:00 2001 From: Sathyanarayanan Gunasekaran Date: Mon, 13 Jun 2011 15:40:34 +0530 Subject: [PATCH 18/22] Updated RadioButtons in ConfigureTransProxy All the RadioButtons are unchecked by default. The next button is disabled until a RadioButton is checked. --- res/layout/layout_wizard_root.xml | 2 +- .../android/ConfigureTransProxy.java | 52 ++++++++++--------- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/res/layout/layout_wizard_root.xml b/res/layout/layout_wizard_root.xml index 4c640356..443106e1 100644 --- a/res/layout/layout_wizard_root.xml +++ b/res/layout/layout_wizard_root.xml @@ -42,7 +42,7 @@ android:padding="3px"> - + Date: Tue, 14 Jun 2011 22:38:14 +0530 Subject: [PATCH 19/22] Added warning icon to Warning screen --- res/drawable/warning.png | Bin 0 -> 2922 bytes res/layout/scrollingtext_buttons_view.xml | 8 +++++--- src/org/torproject/android/LotsaText.java | 6 +++--- 3 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 res/drawable/warning.png diff --git a/res/drawable/warning.png b/res/drawable/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..42dc6d665cd1cff03f98c1b7b64d7969acf1e3de GIT binary patch literal 2922 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 literal 0 HcmV?d00001 diff --git a/res/layout/scrollingtext_buttons_view.xml b/res/layout/scrollingtext_buttons_view.xml index 930bf729..ebecfad7 100644 --- a/res/layout/scrollingtext_buttons_view.xml +++ b/res/layout/scrollingtext_buttons_view.xml @@ -14,12 +14,12 @@ android:background="#000000" > + android:paddingLeft="20px" android:layout_marginLeft="10dip" android:layout_marginTop="8dip"> + android:paddingLeft="5px" + android:padding="20px" + > diff --git a/src/org/torproject/android/LotsaText.java b/src/org/torproject/android/LotsaText.java index 43e6d16c..9f845db2 100644 --- a/src/org/torproject/android/LotsaText.java +++ b/src/org/torproject/android/LotsaText.java @@ -73,8 +73,8 @@ public class LotsaText extends Activity implements TorConstants{ ImageView img = (ImageView) findViewById(R.id.orbot_image); btn1.setVisibility(Button.INVISIBLE); - img.setVisibility(ImageView.VISIBLE); - + img.setImageResource(R.drawable.tor); + btn2.setOnClickListener(new View.OnClickListener() { @Override @@ -108,7 +108,7 @@ public class LotsaText extends Activity implements TorConstants{ ImageView img = (ImageView) findViewById(R.id.orbot_image); btn1.setVisibility(Button.VISIBLE); - img.setVisibility(ImageView.INVISIBLE); + img.setImageResource(R.drawable.warning); btn1.setOnClickListener(new View.OnClickListener() { From e63c745808ac9020983e872c5deac190d4f884de Mon Sep 17 00:00:00 2001 From: Sathyanarayanan Gunasekaran Date: Tue, 28 Jun 2011 09:12:52 +0530 Subject: [PATCH 20/22] Updated TorServiceUtils.checkRootAccess() checkRootAccess() now checks if 'su' binary and Superuser.apk exist to check if the phone has root access --- .../android/service/TorServiceUtils.java | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/org/torproject/android/service/TorServiceUtils.java b/src/org/torproject/android/service/TorServiceUtils.java index 2aa58e67..657d525d 100644 --- a/src/org/torproject/android/service/TorServiceUtils.java +++ b/src/org/torproject/android/service/TorServiceUtils.java @@ -17,7 +17,9 @@ public class TorServiceUtils implements TorServiceConstants { * Check if we have root access * @return boolean true if we have root */ - public static boolean checkRootAccess() { + /* + public static boolean checkRootAccess() { + StringBuilder log = new StringBuilder(); @@ -45,7 +47,40 @@ public class TorServiceUtils implements TorServiceConstants { TorService.logMessage("Could not acquire root permissions"); return false; } + */ + public static boolean checkRootAccess(){ + + StringBuilder log = new StringBuilder(); + + try { + + // Check if Superuser.apk exists + File file = new File("/system/app/Superuser.apk"); + + //Check for 'su' binary + String[] cmd = {"which su"}; + int exitCode = TorServiceUtils.doShellCommand(cmd, log, false, true); + + if (file.exists() && exitCode == 0) { + TorService.logMessage("Can acquire root permissions"); + return true; + + } + + } catch (IOException e) { + //this means that there is no root to be had (normally) so we won't log anything + TorService.logException("Error checking for root access",e); + + } + catch (Exception e) { + TorService.logException("Error checking for root access",e); + //this means that there is no root to be had (normally) + } + + TorService.logMessage("Could not acquire root permissions"); + return false; + } public static int findProcessId(String command) From d9e0ede79743ee65ab10f1036c3ee003fa023078 Mon Sep 17 00:00:00 2001 From: Sathyanarayanan Gunasekaran Date: Tue, 28 Jun 2011 09:14:43 +0530 Subject: [PATCH 21/22] Updated Permissions Asks for superuser privileges after user clicks "Grant Permissions" and checks for iptables OWNER module --- src/org/torproject/android/Permissions.java | 62 +++++++++++++-------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/src/org/torproject/android/Permissions.java b/src/org/torproject/android/Permissions.java index 1c5b10c6..2ee4f7e3 100644 --- a/src/org/torproject/android/Permissions.java +++ b/src/org/torproject/android/Permissions.java @@ -51,27 +51,6 @@ public class Permissions extends Activity implements TorConstants { private void stepThree(){ boolean hasRoot = TorServiceUtils.checkRootAccess(); - - if (hasRoot) - { - try { - int resp = TorTransProxy.testOwnerModule(context); - - if (resp < 0) - { - hasRoot = false; - Toast.makeText(context, "ERROR: IPTables OWNER module not available", Toast.LENGTH_LONG).show(); - - Log.i(TorService.TAG,"ERROR: IPTables OWNER module not available"); - } - - } catch (Exception e) { - - hasRoot = false; - Log.d(TorService.TAG,"ERROR: IPTables OWNER module not available",e); - } - } - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); Editor pEdit = prefs.edit(); @@ -149,6 +128,31 @@ public class Permissions extends Activity implements TorConstants { @Override public void onClick(View v) { //Check and Install iptables - TorTransProxy.testOwnerModule(this) + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + boolean hasRoot = prefs.getBoolean("has_root",false); + + if (hasRoot) + { + try { + int resp = TorTransProxy.testOwnerModule(context); + + if (resp < 0) + { + hasRoot = false; + Toast.makeText(context, "ERROR: IPTables OWNER module not available", Toast.LENGTH_LONG).show(); + + Log.i(TorService.TAG,"ERROR: IPTables OWNER module not available"); + stepFour(); + } + + } catch (Exception e) { + + hasRoot = false; + Log.d(TorService.TAG,"ERROR: IPTables OWNER module not available",e); + } + } + startActivityForResult(new Intent(getBaseContext(), ConfigureTransProxy.class), 1); @@ -185,12 +189,24 @@ public class Permissions extends Activity implements TorConstants { TextView txtTitle = ((TextView)findViewById(R.id.WizardTextTitle)); txtTitle.setText(title); - TextView txtBody = ((TextView)findViewById(R.id.WizardTextBody)); + TextView txtBody = ((TextView)findViewById(R.id.WizardTextBody1)); txtBody.setText(msg); Button btn1 = ((Button)findViewById(R.id.btnWizard1)); Button btn2 = ((Button)findViewById(R.id.btnWizard2)); - + btn2.setEnabled(true); + + + TextView txtBody2 = ((TextView)findViewById(R.id.WizardTextBody2)); + txtBody2.setVisibility(TextView.GONE); + + Button grantPermissions = ((Button)findViewById(R.id.grantPermissions)); + grantPermissions.setVisibility(Button.GONE); + + + CheckBox consent = (CheckBox)findViewById(R.id.checkBox); + consent.setVisibility(CheckBox.GONE); + btn1.setOnClickListener(new View.OnClickListener() { @Override From d7c15dd81bead96956cd5164c287c2729b60f409 Mon Sep 17 00:00:00 2001 From: Sathyanarayanan Gunasekaran Date: Tue, 28 Jun 2011 09:20:01 +0530 Subject: [PATCH 22/22] Minor changes to LotsaText.java Now shows "Introduction" screen when the app is installed for the first time. --- src/org/torproject/android/LotsaText.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/torproject/android/LotsaText.java b/src/org/torproject/android/LotsaText.java index 9f845db2..1b0656b6 100644 --- a/src/org/torproject/android/LotsaText.java +++ b/src/org/torproject/android/LotsaText.java @@ -34,7 +34,7 @@ public class LotsaText extends Activity implements TorConstants{ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - boolean wizardScreen1 = prefs.getBoolean("wizardscreen1",false); + boolean wizardScreen1 = prefs.getBoolean("wizardscreen1",true); if(wizardScreen1) stepOne(); else