[or-cvs] r22697: {projects} big checkin for 0.0.8-beta-280710a build with new start wiza (in projects/android/trunk/Orbot: . res/drawable res/drawable/bak res/layout res/values src/org/torproject/android src/org/torproject/android/service)
Nathan Freitas
nathan at freitas.net
Wed Jul 28 04:43:59 UTC 2010
Author: n8fr8
Date: 2010-07-28 04:43:58 +0000 (Wed, 28 Jul 2010)
New Revision: 22697
Added:
projects/android/trunk/Orbot/res/drawable/bak/
projects/android/trunk/Orbot/res/drawable/bak/tornotification.png
projects/android/trunk/Orbot/res/drawable/bak/tornotificationoff.png
projects/android/trunk/Orbot/res/drawable/bak/toroff.png
projects/android/trunk/Orbot/res/drawable/bak/toron.png
projects/android/trunk/Orbot/res/drawable/bak/torstarting.png
projects/android/trunk/Orbot/res/drawable/bak/torstopping.png
projects/android/trunk/Orbot/res/drawable/bgtitanium.jpg
projects/android/trunk/Orbot/res/drawable/ic_menu_check.png
projects/android/trunk/Orbot/res/drawable/ic_menu_exit.png
projects/android/trunk/Orbot/res/layout/layout_wizard.xml
projects/android/trunk/Orbot/res/layout/layout_wizard_root.xml
projects/android/trunk/Orbot/res/layout/layout_wizard_stock.xml
projects/android/trunk/Orbot/res/layout/layout_wizard_tips.xml
projects/android/trunk/Orbot/res/layout/layout_wizard_welcome.xml
projects/android/trunk/Orbot/src/org/torproject/android/AppManager.java
projects/android/trunk/Orbot/src/org/torproject/android/HiddenServiceManager.java
projects/android/trunk/Orbot/src/org/torproject/android/OnBootReceiver.java
projects/android/trunk/Orbot/src/org/torproject/android/WizardActivity.java
projects/android/trunk/Orbot/src/org/torproject/android/WizardHelper.java
Modified:
projects/android/trunk/Orbot/AndroidManifest.xml
projects/android/trunk/Orbot/res/layout/layout_about.xml
projects/android/trunk/Orbot/res/values/strings.xml
projects/android/trunk/Orbot/src/org/torproject/android/Orbot.java
projects/android/trunk/Orbot/src/org/torproject/android/SettingsPreferences.java
projects/android/trunk/Orbot/src/org/torproject/android/TorConstants.java
projects/android/trunk/Orbot/src/org/torproject/android/service/TorService.java
projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceUtils.java
projects/android/trunk/Orbot/src/org/torproject/android/service/TorTransProxy.java
Log:
big checkin for 0.0.8-beta-280710a build with new start wizard, improved ctrlport handling, and root config
Modified: projects/android/trunk/Orbot/AndroidManifest.xml
===================================================================
--- projects/android/trunk/Orbot/AndroidManifest.xml 2010-07-27 20:40:26 UTC (rev 22696)
+++ projects/android/trunk/Orbot/AndroidManifest.xml 2010-07-28 04:43:58 UTC (rev 22697)
@@ -25,6 +25,7 @@
<activity android:name=".SettingsPreferences" android:label="@string/app_name"/>
<activity android:name=".AppManager" android:label="@string/app_name"/>
+ <activity android:name=".WizardActivity" android:label="@string/app_name"/>
<service android:name=".service.TorService" android:process=":remote" android:debuggable="false">
<intent-filter>
Added: projects/android/trunk/Orbot/res/drawable/bak/tornotification.png
===================================================================
(Binary files differ)
Property changes on: projects/android/trunk/Orbot/res/drawable/bak/tornotification.png
___________________________________________________________________
Added: svn:executable
+ *
Added: svn:mime-type
+ application/octet-stream
Added: projects/android/trunk/Orbot/res/drawable/bak/tornotificationoff.png
===================================================================
(Binary files differ)
Property changes on: projects/android/trunk/Orbot/res/drawable/bak/tornotificationoff.png
___________________________________________________________________
Added: svn:executable
+ *
Added: svn:mime-type
+ application/octet-stream
Added: projects/android/trunk/Orbot/res/drawable/bak/toroff.png
===================================================================
(Binary files differ)
Property changes on: projects/android/trunk/Orbot/res/drawable/bak/toroff.png
___________________________________________________________________
Added: svn:executable
+ *
Added: svn:mime-type
+ application/octet-stream
Added: projects/android/trunk/Orbot/res/drawable/bak/toron.png
===================================================================
(Binary files differ)
Property changes on: projects/android/trunk/Orbot/res/drawable/bak/toron.png
___________________________________________________________________
Added: svn:executable
+ *
Added: svn:mime-type
+ application/octet-stream
Added: projects/android/trunk/Orbot/res/drawable/bak/torstarting.png
===================================================================
(Binary files differ)
Property changes on: projects/android/trunk/Orbot/res/drawable/bak/torstarting.png
___________________________________________________________________
Added: svn:executable
+ *
Added: svn:mime-type
+ application/octet-stream
Added: projects/android/trunk/Orbot/res/drawable/bak/torstopping.png
===================================================================
(Binary files differ)
Property changes on: projects/android/trunk/Orbot/res/drawable/bak/torstopping.png
___________________________________________________________________
Added: svn:executable
+ *
Added: svn:mime-type
+ application/octet-stream
Added: projects/android/trunk/Orbot/res/drawable/bgtitanium.jpg
===================================================================
(Binary files differ)
Property changes on: projects/android/trunk/Orbot/res/drawable/bgtitanium.jpg
___________________________________________________________________
Added: svn:executable
+ *
Added: svn:mime-type
+ application/octet-stream
Added: projects/android/trunk/Orbot/res/drawable/ic_menu_check.png
===================================================================
(Binary files differ)
Property changes on: projects/android/trunk/Orbot/res/drawable/ic_menu_check.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: projects/android/trunk/Orbot/res/drawable/ic_menu_exit.png
===================================================================
(Binary files differ)
Property changes on: projects/android/trunk/Orbot/res/drawable/ic_menu_exit.png
___________________________________________________________________
Added: svn:executable
+ *
Added: svn:mime-type
+ application/octet-stream
Modified: projects/android/trunk/Orbot/res/layout/layout_about.xml
===================================================================
--- projects/android/trunk/Orbot/res/layout/layout_about.xml 2010-07-27 20:40:26 UTC (rev 22696)
+++ projects/android/trunk/Orbot/res/layout/layout_about.xml 2010-07-28 04:43:58 UTC (rev 22697)
@@ -11,13 +11,28 @@
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
+ <TextView android:text="@string/wizard_details"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="15px"
+ android:paddingLeft="15px"
+ android:textStyle="bold"
+ android:textColor="#00ff00" />
+ <TextView android:text="@string/wizard_details_msg"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:autoLink="web"
+ android:textColorLink="#ffffff"
+ android:paddingLeft="15px"
+ android:textColor="#ffffff" />
+
<TextView android:text="Version: "
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="15px"
android:paddingLeft="15px"
android:textStyle="bold"
- android:textColor="#ffffff" />
+ android:textColor="#00ff00" />
<TextView android:text="- Unknown -"
android:id="@+id/versionName"
android:layout_width="fill_parent"
@@ -25,13 +40,13 @@
android:paddingLeft="15px"
android:layout_gravity="center_vertical"
android:textColor="#ffffff" />
- <TextView android:text="Project-Home: "
+ <TextView android:text="Project Home(s): "
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="15px"
android:paddingLeft="15px"
android:textStyle="bold"
- android:textColor="#ffffff" />
+ android:textColor="#00ff00" />
<TextView android:text="https://www.torproject.org/docs/android\nhttps://guardianproject.info/apps/orbot/"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
@@ -45,7 +60,7 @@
android:paddingTop="15px"
android:paddingLeft="15px"
android:textStyle="bold"
- android:textColor="#ffffff" />
+ android:textColor="#00ff00" />
<TextView android:text="The Tor License"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
@@ -64,7 +79,7 @@
android:paddingTop="15px"
android:paddingLeft="15px"
android:textStyle="bold"
- android:textColor="#ffffff" />
+ android:textColor="#00ff00" />
<TextView android:text="Tor v0.2.2.13: https://www.torproject.org"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
Added: projects/android/trunk/Orbot/res/layout/layout_wizard.xml
===================================================================
--- projects/android/trunk/Orbot/res/layout/layout_wizard.xml (rev 0)
+++ projects/android/trunk/Orbot/res/layout/layout_wizard.xml 2010-07-28 04:43:58 UTC (rev 22697)
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+ <ScrollView android:id="@+id/helpscrollview"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+ <TextView android:text=""
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:textColor="#ffffff" />
+ </LinearLayout>
+ </ScrollView>
+</LinearLayout>
+
+
\ No newline at end of file
Added: projects/android/trunk/Orbot/res/layout/layout_wizard_root.xml
===================================================================
--- projects/android/trunk/Orbot/res/layout/layout_wizard_root.xml (rev 0)
+++ projects/android/trunk/Orbot/res/layout/layout_wizard_root.xml 2010-07-28 04:43:58 UTC (rev 22697)
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+ <ScrollView android:id="@+id/helpscrollview"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:padding="3px">
+<TextView android:text="@string/wizard_configure_msg" android:textColor="#ffffff" android:id="@+id/WizardRootTextView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
+
+
+<CheckBox android:layout_marginTop="20px" android:text="@string/wizard_configure_all" android:id="@+id/WizardRootCheckBox01" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
+<TextView android:text=" or " android:textColor="#ffffff" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
+
+<Button android:text="@string/wizard_configure_select_apps" android:id="@+id/WizardRootButton01" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
+
+
+ </LinearLayout>
+ </ScrollView>
+</LinearLayout>
+
Added: projects/android/trunk/Orbot/res/layout/layout_wizard_stock.xml
===================================================================
--- projects/android/trunk/Orbot/res/layout/layout_wizard_stock.xml (rev 0)
+++ projects/android/trunk/Orbot/res/layout/layout_wizard_stock.xml 2010-07-28 04:43:58 UTC (rev 22697)
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+ <ScrollView android:id="@+id/helpscrollview"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:padding="3px">
+
+
+<TextView android:text="@string/wizard_permissions_msg_stock" android:textColor="#ffffff" android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
+
+<Button android:text="@string/wizard_permission_enable_root" android:layout_marginTop="10px" android:id="@+id/WizardRootButtonEnable" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
+
+
+
+<TextView android:text="@string/wizard_permissions_no_root" android:layout_marginTop="10px" android:textColor="#ffffff" android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
+
+<CheckBox android:text="@string/wizard_permissions_consent" android:id="@+id/CheckBoxConsent" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
+ </LinearLayout>
+ </ScrollView>
+</LinearLayout>
+
Added: projects/android/trunk/Orbot/res/layout/layout_wizard_tips.xml
===================================================================
--- projects/android/trunk/Orbot/res/layout/layout_wizard_tips.xml (rev 0)
+++ projects/android/trunk/Orbot/res/layout/layout_wizard_tips.xml 2010-07-28 04:43:58 UTC (rev 22697)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+ <ScrollView android:id="@+id/helpscrollview"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:padding="3px">
+
+<TextView android:text="@string/wizard_tips_msg" android:textColor="#ffffff" android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
+
+<Button android:text="@string/wizard_tips_otrchat" android:layout_marginTop="10px" android:id="@+id/WizardRootButtonInstallOtrchat" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
+
+<Button android:text="@string/wizard_tips_orweb" android:layout_marginTop="10px" android:id="@+id/WizardRootButtonInstallOrweb" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
+
+
+ </LinearLayout>
+ </ScrollView>
+</LinearLayout>
+
Added: projects/android/trunk/Orbot/res/layout/layout_wizard_welcome.xml
===================================================================
--- projects/android/trunk/Orbot/res/layout/layout_wizard_welcome.xml (rev 0)
+++ projects/android/trunk/Orbot/res/layout/layout_wizard_welcome.xml 2010-07-28 04:43:58 UTC (rev 22697)
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+ <ScrollView android:id="@+id/helpscrollview"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:padding="3px">
+<TextView android:text="@string/wizard_welcome_msg" android:textColor="#ffffff" android:id="@+id/WizardRootTextView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
+
+
+
+ </LinearLayout>
+ </ScrollView>
+</LinearLayout>
+
Modified: projects/android/trunk/Orbot/res/values/strings.xml
===================================================================
--- projects/android/trunk/Orbot/res/values/strings.xml 2010-07-27 20:40:26 UTC (rev 22696)
+++ projects/android/trunk/Orbot/res/values/strings.xml 2010-07-28 04:43:58 UTC (rev 22697)
@@ -58,10 +58,52 @@
<string name="pref_trans_proxy_summary">Automatic Torifying of Apps</string>
<string name="pref_transparent_all_title">Tor Everything</string>
-<string name="pref_transparent_all_summary">Send traffic for all apps through Tor</string>
+<string name="pref_transparent_all_summary">Proxy traffic for all apps through Tor</string>
<string name="status_install_success">Tor binaries successfully installed!</string>
<string name="status_install_fail">The Tor binary files were unable to be installed. Please check the log and notify tor-assistants at torproject.org</string>
<string name="title_error">Application Error</string>
+
+<string name="wizard_title">Welcome to Orbot</string>
+
+<string name="wizard_btn_tell_me_more">About Orbot</string>
+<string name="btn_next">Next</string>
+<string name="btn_back">Back</string>
+<string name="btn_finish">Finish</string>
+
+
+ <!-- Welcome Wizard strings (DJH) -->
+ <string name="wizard_welcome_msg">Orbot brings Tor to Android. Tor is free software and an open network that helps you defend against a form of network surveillance that threatens personal freedom and privacy, confidential business activities and relationships, and state security known as traffic analysis.\n\n*WARNING:* Simply installing Orbot will _not_ magically anonymize your mobile traffic! This wizard will help you get started.</string>
+ <string name="wizard_details">Some Orbot Details</string>
+ <string name="wizard_details_msg">Orbot is an open-source application that contains Tor, LibEvent and Privoxy. It provides a local HTTP proxy (8118) and a SOCKS proxy (9050) into the Tor network. Orbot also has the ability, on rooted device, to send all internet traffic through Tor.</string>
+ <string name="wizard_permissions_root">Grant Permissions</string>
+ <string name="wizard_permissions_stock">Permissions Warning</string>
+ <string name="wizard_premissions_msg_root">Excellent! We\'ve detected that you have root permissions enabled for Orbot. We will use this power wisely.</string>
+ <string name="wizard_permissions_msg_stock">We\'ve detected that you do not have root permissions enabled. Your application data usage will NOT be transparently routed through Tor without root access. </string>
+
+ <string name="wizard_permissions_no_root">If you choose to continue WITHOUT root, you must use apps that know how to talk to Tor.</string>
+ <string name="wizard_permissions_consent">I understand and would like to continue without root</string>
+
+ <string name="wizard_permission_enable_root">Attempt to enable root access</string>
+ <string name="wizard_configure">Configure Torification</string>
+ <string name="wizard_configure_msg">Orbot gives you the option to route all application traffic through Tor OR to choose your applications individually.</string>
+ <string name="wizard_configure_all">Proxy All Apps Through Tor</string>
+ <string name="wizard_configure_select_apps">Select Individual Apps for Tor</string>
+
+
+ <string name="wizard_tips_tricks">Orbot-enabled Apps</string>
+ <string name="wizard_tips_msg">We encourage you to download & use apps that know how to connect directly to Orbot. Click on the buttons below to install.</string>
+ <string name="wizard_tips_otrchat">OtrChat - From the Orbot dev team, a secure Instant Messaging client for Android.</string>
+ <string name="wizard_tips_orweb">OrWeb (Android 1.x Only) - From the Orbot dev team, a web browser designed to work with Tor.</string>
+
+ <string name="wizard_final">Orbot is ready!</string>
+ <string name="wizard_final_msg">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!</string>
+
+ <string name="otrchat_apk_url">https://github.com/downloads/guardianproject/OtRChat/OtRChat-0.0.1-alpha-build6a.apk</string>
+ <string name="orweb_apk_url">http://github.com/downloads/guardianproject/Orweb/Orweb-0.0.1c.apk.apk</string>
+
+ <!-- END Welcome Wizard strings (DJH) -->
+
+
</resources>
Added: projects/android/trunk/Orbot/src/org/torproject/android/AppManager.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/AppManager.java (rev 0)
+++ projects/android/trunk/Orbot/src/org/torproject/android/AppManager.java 2010-07-28 04:43:58 UTC (rev 22697)
@@ -0,0 +1,263 @@
+/* Copyright (c) 2009, Nathan Freitas, Orbot / The Guardian Project - http://openideals.com/guardian */
+/* See LICENSE for licensing information */
+
+package org.torproject.android;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.CompoundButton.OnCheckedChangeListener;
+import android.widget.ImageView;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+
+
+public class AppManager extends Activity implements OnCheckedChangeListener, OnClickListener, TorConstants {
+
+ private static TorifiedApp[] apps = null;
+
+ private ListView listApps;
+
+ private AppManager mAppManager;
+
+
+ private boolean appsLoaded = false;
+
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ this.setContentView(R.layout.layout_apps);
+
+ mAppManager = this;
+
+
+
+ }
+
+
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ listApps = (ListView)findViewById(R.id.applistview);
+
+ if (!appsLoaded)
+ loadApps();
+ }
+
+
+
+ private void loadApps ()
+ {
+ final TorifiedApp[] apps = getApps(this);
+
+ Arrays.sort(apps, new Comparator<TorifiedApp>() {
+ public int compare(TorifiedApp o1, TorifiedApp o2) {
+ if (o1.isTorified() == o2.isTorified()) return o1.getName().compareTo(o2.getName());
+ if (o1.isTorified()) return -1;
+ return 1;
+ }
+ });
+
+ final LayoutInflater inflater = getLayoutInflater();
+
+ final ListAdapter adapter = new ArrayAdapter<TorifiedApp>(this,R.layout.layout_apps_item,R.id.itemtext,apps) {
+ public View getView(int position, View convertView, ViewGroup parent) {
+ ListEntry entry;
+ if (convertView == null) {
+ // Inflate a new view
+ convertView = inflater.inflate(R.layout.layout_apps_item, parent, false);
+ entry = new ListEntry();
+ entry.icon = (ImageView) convertView.findViewById(R.id.itemicon);
+ entry.box = (CheckBox) convertView.findViewById(R.id.itemcheck);
+ entry.text = (TextView) convertView.findViewById(R.id.itemtext);
+
+ entry.text.setOnClickListener(mAppManager);
+ entry.text.setOnClickListener(mAppManager);
+
+ convertView.setTag(entry);
+
+ entry.box.setOnCheckedChangeListener(mAppManager);
+ } else {
+ // Convert an existing view
+ entry = (ListEntry) convertView.getTag();
+ }
+
+
+ final TorifiedApp app = apps[position];
+
+
+ entry.icon.setImageDrawable(app.getIcon());
+ entry.text.setText(app.getName());
+
+ final CheckBox box = entry.box;
+ box.setTag(app);
+ box.setChecked(app.isTorified());
+
+ entry.text.setTag(box);
+ entry.icon.setTag(box);
+
+ return convertView;
+ }
+ };
+
+ listApps.setAdapter(adapter);
+
+ appsLoaded = true;
+
+ }
+
+ private static class ListEntry {
+ private CheckBox box;
+ private TextView text;
+ private ImageView icon;
+ }
+
+ /* (non-Javadoc)
+ * @see android.app.Activity#onStop()
+ */
+ @Override
+ protected void onStop() {
+ super.onStop();
+
+ //Log.i(getClass().getName(),"Exiting Preferences");
+ }
+
+
+ public static TorifiedApp[] getApps (Context context)
+ {
+ if (apps != null)
+ return apps;
+
+ final SharedPreferences prefs = context.getSharedPreferences(PREFS_KEY, 0);
+
+ String tordAppString = prefs.getString(PREFS_KEY_TORIFIED, "");
+ String[] tordApps;
+
+ StringTokenizer st = new StringTokenizer(tordAppString,"|");
+ tordApps = new String[st.countTokens()];
+ int tordIdx = 0;
+ while (st.hasMoreTokens())
+ {
+ tordApps[tordIdx++] = st.nextToken();
+ }
+
+ Arrays.sort(tordApps);
+
+ //else load the apps up
+ PackageManager pMgr = context.getPackageManager();
+
+ List<ApplicationInfo> lAppInfo = pMgr.getInstalledApplications(0);
+
+ Iterator<ApplicationInfo> itAppInfo = lAppInfo.iterator();
+
+ apps = new TorifiedApp[lAppInfo.size()];
+
+ ApplicationInfo aInfo = null;
+
+ int appIdx = 0;
+
+ while (itAppInfo.hasNext())
+ {
+ aInfo = itAppInfo.next();
+
+ apps[appIdx] = new TorifiedApp();
+
+ apps[appIdx].setEnabled(aInfo.enabled);
+ apps[appIdx].setUid(aInfo.uid);
+ apps[appIdx].setUsername(pMgr.getNameForUid(apps[appIdx].getUid()));
+ apps[appIdx].setProcname(aInfo.processName);
+ apps[appIdx].setName(pMgr.getApplicationLabel(aInfo).toString());
+ apps[appIdx].setIcon(pMgr.getApplicationIcon(aInfo));
+
+ // check if this application is allowed
+ if (Arrays.binarySearch(tordApps, apps[appIdx].getUsername()) >= 0) {
+ apps[appIdx].setTorified(true);
+ }
+ else
+ {
+ apps[appIdx].setTorified(false);
+ }
+
+ appIdx++;
+ }
+
+ return apps;
+ }
+
+
+ public static void saveAppSettings (Context context)
+ {
+ if (apps == null)
+ return;
+
+ final SharedPreferences prefs = context.getSharedPreferences(PREFS_KEY, 0);
+
+ StringBuilder tordApps = new StringBuilder();
+
+ for (int i = 0; i < apps.length; i++)
+ {
+ if (apps[i].isTorified())
+ {
+ tordApps.append(apps[i].getUsername());
+ tordApps.append("|");
+ }
+ }
+
+ Editor edit = prefs.edit();
+ edit.putString(PREFS_KEY_TORIFIED, tordApps.toString());
+ edit.commit();
+
+ }
+
+
+ /**
+ * Called an application is check/unchecked
+ */
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ final TorifiedApp app = (TorifiedApp) buttonView.getTag();
+ if (app != null) {
+ app.setTorified(isChecked);
+ }
+
+ saveAppSettings(this);
+
+ }
+
+
+
+ @Override
+ public void onClick(View v) {
+
+ CheckBox cbox = (CheckBox)v.getTag();
+
+ final TorifiedApp app = (TorifiedApp)cbox.getTag();
+ if (app != null) {
+ app.setTorified(!app.isTorified());
+ cbox.setChecked(app.isTorified());
+ }
+
+ saveAppSettings(this);
+
+ }
+
+}
Added: projects/android/trunk/Orbot/src/org/torproject/android/HiddenServiceManager.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/HiddenServiceManager.java (rev 0)
+++ projects/android/trunk/Orbot/src/org/torproject/android/HiddenServiceManager.java 2010-07-28 04:43:58 UTC (rev 22697)
@@ -0,0 +1,25 @@
+package org.torproject.android;
+
+
+//list view with add/remove hidden services - user is prompted for port
+
+public class HiddenServiceManager {
+
+}
+/*
+ *
+ * ## Once you have configured a hidden service, you can look at the
+## contents of the file ".../hidden_service/hostname" for the address
+## to tell people.
+##
+## HiddenServicePort x y:z says to redirect requests on port x to the
+## address y:z.
+
+#HiddenServiceDir @LOCALSTATEDIR@/lib/tor/hidden_service/
+#HiddenServicePort 80 127.0.0.1:80
+
+#HiddenServiceDir @LOCALSTATEDIR@/lib/tor/other_hidden_service/
+#HiddenServicePort 80 127.0.0.1:80
+#HiddenServicePort 22 127.0.0.1:22
+*/
+
Added: projects/android/trunk/Orbot/src/org/torproject/android/OnBootReceiver.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/OnBootReceiver.java (rev 0)
+++ projects/android/trunk/Orbot/src/org/torproject/android/OnBootReceiver.java 2010-07-28 04:43:58 UTC (rev 22697)
@@ -0,0 +1,18 @@
+package org.torproject.android;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+public class OnBootReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Intent serviceIntent = new Intent();
+ serviceIntent.setAction("org.torproject.android.service.TorService");
+ context.startService(serviceIntent);
+
+ }
+
+}
+
Modified: projects/android/trunk/Orbot/src/org/torproject/android/Orbot.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/Orbot.java 2010-07-27 20:40:26 UTC (rev 22696)
+++ projects/android/trunk/Orbot/src/org/torproject/android/Orbot.java 2010-07-28 04:43:58 UTC (rev 22697)
@@ -19,6 +19,7 @@
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
@@ -35,7 +36,10 @@
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
+import android.widget.Button;
import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.TextView;
@@ -58,10 +62,14 @@
/* The primary interface we will be calling on the service. */
ITorService mService = null;
+ Orbot mOrbot = null;
+
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ mOrbot = this;
+
setTheme(android.R.style.Theme_Black_NoTitleBar);
//setTitle(getString(R.string.app_name) + ' ' + getString(R.string.app_version));
showMain();
@@ -244,10 +252,8 @@
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
-
mNotificationManager.cancelAll();
-
if (mService != null)
{
try {
@@ -258,6 +264,23 @@
}
}
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mOrbot);
+
+ boolean showWizard = prefs.getBoolean("show_wizard",true);
+
+ if (showWizard)
+ {
+
+ Editor pEdit = prefs.edit();
+
+ pEdit.putBoolean("show_wizard",false);
+
+ pEdit.commit();
+
+ showHelp();
+ }
+
+
}
/* (non-Javadoc)
@@ -272,7 +295,7 @@
//updateStatus ("");
- hasRoot = TorTransProxy.hasRootAccess();
+
}
@@ -297,7 +320,6 @@
{
bindService(); //connect the UI activity to the remote service
-
currentView = R.layout.layout_main;
setContentView(currentView);
@@ -358,67 +380,10 @@
private void showHelp ()
{
- LayoutInflater li = LayoutInflater.from(this);
- View view = li.inflate(R.layout.layout_help, null);
-
- StringBuilder msg = new StringBuilder();
- msg.append(getString(R.string.help_text_1));
- msg.append("\n\n");
-
- if (hasRoot)
- {
- msg.append("Your device is ROOTED. Please enable the 'Transparent Proxying' setting to select which apps to send through Tor.");
- }
- else
- {
-
- msg.append("Your device is NOT rooted.\n");
-
- msg.append(getString(R.string.help_text_5));
-
- msg.append("\n\n");
-
- msg.append(getString(R.string.not_anonymous_yet));
- }
-
- /*
-
- msg.append(getString(R.string.help_text_2));
- msg.append("\n\n");
- msg.append(getString(R.string.help_text_3));
- msg.append("\n\n");
- msg.append(getString(R.string.help_text_4));
- msg.append("\n\n");
- msg.append(getString(R.string.help_text_5));
- msg.append("\n\n");
- */
-
-
- new AlertDialog.Builder(this)
- .setTitle(getString(R.string.menu_info))
- .setMessage(msg.toString())
- .setNeutralButton(getString(R.string.button_about), new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
-
- showAbout();
- }
- })
- .setNegativeButton(getString(R.string.button_close), new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- // Log.d(TAG, "Close pressed");
- }
- })
- .show();
+ new WizardHelper(this).showWizard();
}
- private void showHelpWizard ()
- {
-
- //sshowAlert("Configure",getString(R.string.not_anonymous_yet));
-
- }
-
/*
* Show the message log UI
*/
@@ -447,6 +412,8 @@
}
+
+
/*
* Read in the Preferences and write then to the .torrc file
*/
@@ -611,18 +578,9 @@
return;
}
- mService.updateConfiguration("UseBridges", "1", false);
- if (autoUpdateBridges)
- {
- mService.updateConfiguration("UpdateBridgesFromAuthority", "1", false);
+ mService.updateConfiguration("UseBridges", "1", false);
- }
- else
- {
- mService.updateConfiguration("UpdateBridgesFromAuthority", "0", false);
- }
-
String bridgeDelim = "\n";
if (bridgeList.indexOf(",") != -1)
@@ -637,6 +595,9 @@
mService.updateConfiguration("bridge", st.nextToken(), false);
}
+
+ mService.updateConfiguration("UpdateBridgesFromAuthority", "0", false);
+
}
else
{
@@ -721,8 +682,8 @@
lblStatus.setText(getString(R.string.status_activated));
- showHelpWizard ();
+
/*
if (progressDialog != null)
@@ -998,7 +959,6 @@
};
boolean mIsBound = false;
- boolean hasRoot = false;
private void bindService ()
{
Modified: projects/android/trunk/Orbot/src/org/torproject/android/SettingsPreferences.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/SettingsPreferences.java 2010-07-27 20:40:26 UTC (rev 22696)
+++ projects/android/trunk/Orbot/src/org/torproject/android/SettingsPreferences.java 2010-07-28 04:43:58 UTC (rev 22697)
@@ -4,6 +4,7 @@
package org.torproject.android;
import org.torproject.android.service.TorServiceUtils;
+import org.torproject.android.service.TorTransProxy;
import android.content.Intent;
import android.os.Bundle;
@@ -28,7 +29,7 @@
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
- hasRoot = TorServiceUtils.hasRoot();
+ hasRoot = TorTransProxy.hasRootAccess();
}
Modified: projects/android/trunk/Orbot/src/org/torproject/android/TorConstants.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/TorConstants.java 2010-07-27 20:40:26 UTC (rev 22696)
+++ projects/android/trunk/Orbot/src/org/torproject/android/TorConstants.java 2010-07-28 04:43:58 UTC (rev 22697)
@@ -46,6 +46,8 @@
public final static String PREF_REACHABLE_ADDRESSES = "pref_reachable_addresses";
public final static String PREF_REACHABLE_ADDRESSES_PORTS = "pref_reachable_addresses_ports";
public final static String PREF_TRANSPARENT = "pref_transparent";
+ public final static String PREF_TRANSPARENT_ALL = "pref_transparent_all";
+
}
Added: projects/android/trunk/Orbot/src/org/torproject/android/WizardActivity.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/WizardActivity.java (rev 0)
+++ projects/android/trunk/Orbot/src/org/torproject/android/WizardActivity.java 2010-07-28 04:43:58 UTC (rev 22697)
@@ -0,0 +1,71 @@
+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","this is nathan's 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) {
+
+
+ }
+
+
+
+}
Added: projects/android/trunk/Orbot/src/org/torproject/android/WizardHelper.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/WizardHelper.java (rev 0)
+++ projects/android/trunk/Orbot/src/org/torproject/android/WizardHelper.java 2010-07-28 04:43:58 UTC (rev 22697)
@@ -0,0 +1,371 @@
+package org.torproject.android;
+
+import org.torproject.android.service.TorTransProxy;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+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.preference.PreferenceManager;
+import android.view.LayoutInflater;
+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;
+import android.widget.Toast;
+
+public class WizardHelper implements TorConstants {
+
+ private Context context;
+ private Dialog currentDialog;
+
+ public WizardHelper (Context context)
+ {
+ this.context = context;
+ }
+
+
+ public void showWizard ()
+ {
+ showWizardStep1();
+ }
+
+ public void showWizardStep1()
+ {
+
+
+ String title = context.getString(R.string.wizard_title);
+
+ LayoutInflater li = LayoutInflater.from(context);
+ View view = li.inflate(R.layout.layout_wizard_welcome, null);
+
+
+ showCustomDialog(title, view,context.getString(R.string.btn_next),context.getString(R.string.wizard_btn_tell_me_more),new DialogInterface.OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+
+ if (which == DialogInterface.BUTTON_NEUTRAL)
+ {
+
+ showWizardStep2();
+ }
+ else if (which == DialogInterface.BUTTON_POSITIVE)
+ {
+ showAbout();
+ }
+
+ }
+ });
+ }
+
+ public void showWizardStep2()
+ {
+
+ String title = null;
+ String msg = null;
+
+
+ title = context.getString(R.string.wizard_permissions_root);
+ msg = context.getString(R.string.wizard_premissions_msg_root);
+
+
+ title = context.getString(R.string.wizard_permissions_stock);
+
+ LayoutInflater li = LayoutInflater.from(context);
+ View view = li.inflate(R.layout.layout_wizard_stock, null);
+
+ Button btn1 = (Button)view.findViewById(R.id.WizardRootButtonEnable);
+
+ btn1.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View view) {
+
+
+ boolean hasRoot = TorTransProxy.hasRootAccess();
+
+ if (hasRoot)
+ {
+ currentDialog.dismiss();
+ showWizardStep2Root();
+ }
+ else
+ {
+ Toast.makeText(context, "Unable to get root access", Toast.LENGTH_LONG).show();
+ }
+ }
+ });
+
+ showCustomDialog(title, view,context.getString(R.string.btn_next),context.getString(R.string.btn_back),new DialogInterface.OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+
+ if (which == DialogInterface.BUTTON_NEUTRAL)
+ {
+ showWizardTipsAndTricks();
+ }
+ else if (which == DialogInterface.BUTTON_POSITIVE)
+ {
+ showWizardStep1();
+ }
+
+ }
+ });
+
+
+ }
+
+ public void showWizardStep2Root()
+ {
+
+ String title = null;
+ String msg = null;
+
+
+
+ title = context.getString(R.string.wizard_permissions_root);
+ msg = context.getString(R.string.wizard_premissions_msg_root);
+
+
+
+ showDialog(title, msg,context.getString(R.string.btn_next),context.getString(R.string.btn_back),new DialogInterface.OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+
+ if (which == DialogInterface.BUTTON_NEUTRAL)
+ {
+ showWizardRootConfigureTorification();
+ }
+ else if (which == DialogInterface.BUTTON_POSITIVE)
+ {
+ showWizardStep1();
+ }
+
+ }
+ });
+
+
+ }
+
+ public void showWizardTipsAndTricks()
+ {
+
+ String title = context.getString(R.string.wizard_tips_tricks);
+
+ LayoutInflater li = LayoutInflater.from(context);
+ View view = li.inflate(R.layout.layout_wizard_tips, null);
+
+ Button btn1 = (Button)view.findViewById(R.id.WizardRootButtonInstallOtrchat);
+
+ btn1.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View view) {
+
+ String url = context.getString(R.string.otrchat_apk_url);
+ context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
+
+ }
+ });
+
+ Button btn2 = (Button)view.findViewById(R.id.WizardRootButtonInstallOrweb);
+
+ btn2.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View view) {
+
+ String url = context.getString(R.string.orweb_apk_url);
+ context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
+
+ }
+ });
+
+ showCustomDialog(title, view,context.getString(R.string.btn_next),context.getString(R.string.btn_back),new DialogInterface.OnClickListener() {
+
+
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+
+ if (which == DialogInterface.BUTTON_NEUTRAL)
+ {
+ showWizardFinal();
+
+ }
+ else if (which == DialogInterface.BUTTON_POSITIVE)
+ {
+ showWizardStep2();
+ }
+
+ }
+ });
+ }
+
+ public void showWizardRootConfigureTorification()
+ {
+
+ LayoutInflater li = LayoutInflater.from(context);
+ View view = li.inflate(R.layout.layout_wizard_root, null);
+
+ CheckBox cb1 = (CheckBox)view.findViewById(R.id.WizardRootCheckBox01);
+ Button btn1 = (Button)view.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();
+
+ //Button btn1 = (Button)buttonView.getParent().findViewById(R.id.WizardRootButton01);
+ //btn1.setEnabled(!isChecked);
+
+ }
+
+ });
+
+
+
+ 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));
+
+ }
+ });
+
+ showCustomDialog(context.getString(R.string.wizard_configure),view,context.getString(R.string.btn_next),context.getString(R.string.btn_back),new DialogInterface.OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+
+ dialog.dismiss();
+
+ if (which == DialogInterface.BUTTON_NEUTRAL)
+ {
+ showWizardTipsAndTricks();
+
+ }
+ else if (which == DialogInterface.BUTTON_POSITIVE)
+ {
+ showWizardStep2();
+ }
+
+ }
+ });
+
+
+
+ }
+
+
+ private void showWizardFinal ()
+ {
+ String title = null;
+ String msg = null;
+
+
+ title = context.getString(R.string.wizard_final);
+ msg = context.getString(R.string.wizard_final_msg);
+
+ new AlertDialog.Builder(context)
+ .setIcon(R.drawable.icon)
+ .setTitle(title)
+ .setPositiveButton(R.string.button_close, null)
+ .setMessage(msg)
+ .show();
+
+
+
+
+
+ }
+
+ private void showDialog (String title, String msg, String button1, String button2, DialogInterface.OnClickListener ocListener)
+ {
+
+// dialog.setContentView(R.layout.custom_dialog);
+
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(context)
+ .setIcon(R.drawable.icon)
+ .setTitle(title)
+ .setMessage(msg)
+ .setNeutralButton(button1, ocListener)
+ .setPositiveButton(button2, ocListener);
+
+
+ currentDialog = builder.show();
+
+
+ }
+
+ private void showCustomDialog (String title, View view, String button1, String button2, DialogInterface.OnClickListener ocListener)
+ {
+
+ currentDialog = new AlertDialog.Builder(context)
+ .setIcon(R.drawable.icon)
+ .setTitle(title)
+ .setView(view)
+ .setNeutralButton(button1, ocListener)
+ .setPositiveButton(button2, ocListener)
+ .show();
+
+
+ }
+
+ private void showAbout ()
+ {
+
+ LayoutInflater li = LayoutInflater.from(context);
+ View view = li.inflate(R.layout.layout_about, null);
+ TextView versionName = (TextView)view.findViewById(R.id.versionName);
+ versionName.setText(R.string.app_version);
+
+ new AlertDialog.Builder(context)
+ .setTitle(context.getString(R.string.button_about))
+ .setView(view)
+ .setNeutralButton(context.getString(R.string.btn_back), new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ showWizard();
+ }
+ })
+ .show();
+ }
+
+}
+
Modified: projects/android/trunk/Orbot/src/org/torproject/android/service/TorService.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/service/TorService.java 2010-07-27 20:40:26 UTC (rev 22696)
+++ projects/android/trunk/Orbot/src/org/torproject/android/service/TorService.java 2010-07-28 04:43:58 UTC (rev 22697)
@@ -49,7 +49,6 @@
private ArrayList<String> configBuffer = null;
- private boolean hasRoot = false;
private String appHome = null;
private String torBinaryPath = null;
@@ -61,8 +60,6 @@
Log.i(TAG,"TorService: onCreate");
-
-
}
@@ -223,15 +220,25 @@
sendCallbackMessage("Web proxy shutdown");
- killTorProcess ();
+ try
+ {
+ killTorProcess ();
- currentStatus = STATUS_READY;
+ currentStatus = STATUS_READY;
- showToolbarNotification (getString(R.string.status_disabled),R.drawable.tornotificationoff);
- sendCallbackMessage(getString(R.string.status_disabled));
+ showToolbarNotification (getString(R.string.status_disabled),R.drawable.tornotificationoff);
+ sendCallbackMessage(getString(R.string.status_disabled));
- setupTransProxy(false);
+ setupTransProxy(false);
+ }
+ catch (Exception e)
+ {
+ Log.i(TAG, "An error occured stopping Tor",e);
+ logNotice("An error occured stopping Tor: " + e.getMessage());
+ sendCallbackMessage("Something bad happened. Check the log");
+
+ }
}
@@ -257,7 +264,7 @@
}
}
- private void killTorProcess ()
+ private void killTorProcess () throws Exception
{
if (conn != null)
@@ -318,6 +325,7 @@
String APK_EXT = ".apk";
+ int MAX_TRIES = 10;
String buildPath = apkBase + TOR_APP_USERNAME + APK_EXT;
Log.i(TAG, "Checking APK location: " + buildPath);
@@ -327,7 +335,7 @@
if (fileApk.exists())
return fileApk.getAbsolutePath();
- for (int i = 0; i < 10; i++)
+ for (int i = 0; i < MAX_TRIES; i++)
{
buildPath = apkBase + TOR_APP_USERNAME + '-' + i + APK_EXT;
fileApk = new File(buildPath);
@@ -338,10 +346,33 @@
return fileApk.getAbsolutePath();
}
+ String apkBaseExt = "/mnt/asec/" + TOR_APP_USERNAME;
+ String pkgFile = "/pkg.apk";
+
+ buildPath = apkBaseExt + pkgFile;
+ fileApk = new File(buildPath);
+
+ Log.i(TAG, "Checking external storage APK location: " + buildPath);
+
+ if (fileApk.exists())
+ return fileApk.getAbsolutePath();
+
+ for (int i = 0; i < MAX_TRIES; i++)
+ {
+ buildPath = apkBaseExt + '-' + i + pkgFile;
+ fileApk = new File(buildPath);
+
+ Log.i(TAG, "Checking external storage APK location: " + buildPath);
+
+ if (fileApk.exists())
+ return fileApk.getAbsolutePath();
+ }
+
+
return null;
}
- private boolean checkTorBinaries ()
+ private boolean checkTorBinaries () throws Exception
{
//android.os.Debug.waitForDebugger();
@@ -366,8 +397,8 @@
return false;
}
- torBinaryPath = appHome + '/' + TOR_BINARY_ASSET_KEY;
- privoxyPath = appHome + '/' + PRIVOXY_ASSET_KEY;
+ torBinaryPath = appHome + TOR_BINARY_ASSET_KEY;
+ privoxyPath = appHome + PRIVOXY_ASSET_KEY;
boolean torBinaryExists = new File(torBinaryPath).exists();
boolean privoxyBinaryExists = new File(privoxyPath).exists();
@@ -402,14 +433,21 @@
}
}
+ else
+ {
+ logNotice("Found Tor binary: " + torBinaryPath);
+
+ logNotice("Found prvoxy binary: " + privoxyPath);
+
+ }
StringBuilder log = new StringBuilder ();
- logNotice("Setting permission on Tor binary");
+ logNotice("(re)Setting permission on Tor binary");
String[] cmd1 = {SHELL_CMD_CHMOD + ' ' + CHMOD_EXE_VALUE + ' ' + torBinaryPath};
TorServiceUtils.doShellCommand(cmd1, log, false, true);
- logNotice("Setting permission on Privoxy binary");
+ logNotice("(re)Setting permission on Privoxy binary");
String[] cmd2 = {SHELL_CMD_CHMOD + ' ' + CHMOD_EXE_VALUE + ' ' + privoxyPath};
TorServiceUtils.doShellCommand(cmd2, log, false, true);
@@ -525,6 +563,9 @@
private void runPrivoxyShellCmd () throws Exception
{
+
+ Log.i(TAG,"Starting privoxy process");
+
int privoxyProcId = TorServiceUtils.findProcessId(privoxyPath);
StringBuilder log = null;
@@ -538,9 +579,9 @@
String privoxyConfigPath = appHome + PRIVOXYCONFIG_ASSET_KEY;
String[] cmds =
- { privoxyPath + " " + privoxyConfigPath };
+ { privoxyPath + " " + privoxyConfigPath + " &" };
- logNotice (cmds[0]);
+ logNotice (cmds[0]);
TorServiceUtils.doShellCommand(cmds, log, false, true);
@@ -845,13 +886,19 @@
if (appHome == null)
{
- checkTorBinaries();
+ try
+ {
+ checkTorBinaries();
- findExistingProc ();
+ findExistingProc ();
- _torInstance = this;
-
- hasRoot = TorServiceUtils.hasRoot();
+ _torInstance = this;
+ }
+ catch (Exception e)
+ {
+ Log.i(TAG,"Unable to check for Tor binaries",e);
+ return null;
+ }
}
if (ITorService.class.getName().equals(intent.getAction())) {
@@ -1037,16 +1084,28 @@
logNotice ("Transparent Proxying: " + enableTransparentProxy);
+ boolean hasRoot = TorTransProxy.hasRootAccess();
+
if (enabled)
{
-
+
if (hasRoot && enableTransparentProxy)
{
- TorTransProxy.setDNSProxying();
- TorTransProxy.setTransparentProxyingByApp(this,AppManager.getApps(this),transProxyAll);
+ try
+ {
+ TorTransProxy.setDNSProxying();
+ boolean success = TorTransProxy.setTransparentProxyingByApp(this,AppManager.getApps(this),transProxyAll);
+ logNotice ("TorTransProxy enabled: " + success);
+
+ } catch (Exception e) {
+ logNotice("WARNING: Error configuring transparenty proxying: " + e.getMessage());
+
+ Log.w(TAG, "error refreshing iptables: err=" + e.getMessage(), e);
+ }
+
}
else
{
Modified: projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceUtils.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceUtils.java 2010-07-27 20:40:26 UTC (rev 22696)
+++ projects/android/trunk/Orbot/src/org/torproject/android/service/TorServiceUtils.java 2010-07-28 04:43:58 UTC (rev 22697)
@@ -123,26 +123,16 @@
}
- public static boolean hasRoot ()
+ public static int doShellCommand(String[] cmds, StringBuilder log, boolean runAsRoot, boolean waitFor) throws Exception
{
- String[] cmds = {"exit 0"};
+ Log.i(TAG,"executing shell cmds: " + cmds[0] + "; runAsRoot=" + runAsRoot);
- int code = doShellCommand(cmds,null,true, true);
-
- return (code == 0);
- }
-
- public static int doShellCommand(String[] cmds, StringBuilder log, boolean isRoot, boolean waitFor)
- {
- Log.i(TAG,"executing shell cmds: " + cmds[0] + "; isRoot=" + isRoot);
-
Process proc = null;
int exitCode = -1;
- try {
- if (isRoot)
+ if (runAsRoot)
proc = Runtime.getRuntime().exec("su");
else
proc = Runtime.getRuntime().exec("sh");
@@ -163,11 +153,8 @@
if (waitFor)
{
- exitCode = proc.waitFor();
- log.append("process exit code: ");
- log.append(exitCode);
- log.append("\n");
+
final char buf[] = new char[10];
// Consume the "stdout"
@@ -183,13 +170,16 @@
while ((read=reader.read(buf)) != -1) {
if (log != null) log.append(buf, 0, read);
}
+
+ exitCode = proc.waitFor();
+ log.append("process exit code: ");
+ log.append(exitCode);
+ log.append("\n");
+
Log.i(TAG,"command process exit value: " + exitCode);
}
-
- } catch (Exception e) {
- Log.w(TAG, "Error executing shell cmd: " + e.getMessage());
- }
+
return exitCode;
}
Modified: projects/android/trunk/Orbot/src/org/torproject/android/service/TorTransProxy.java
===================================================================
--- projects/android/trunk/Orbot/src/org/torproject/android/service/TorTransProxy.java 2010-07-27 20:40:26 UTC (rev 22696)
+++ projects/android/trunk/Orbot/src/org/torproject/android/service/TorTransProxy.java 2010-07-28 04:43:58 UTC (rev 22697)
@@ -1,13 +1,8 @@
package org.torproject.android.service;
-import java.util.Iterator;
-import java.util.List;
-
import org.torproject.android.TorifiedApp;
import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
import android.util.Log;
public class TorTransProxy {
@@ -23,29 +18,35 @@
private final static String IPTABLES_ADD = " -A ";
//private final static String IPTABLES_DELETE = " -D "; //not deleting manually anymore - just calling a system wide flush of iptables rules
- private final static String IPTABLES_DROP_ALL = " -j DROP ";
- private static boolean hasRoot = false;
+ // private final static String IPTABLES_DROP_ALL = " -j DROP ";
/**
* Check if we have root access
* @return boolean true if we have root
*/
public static boolean hasRootAccess() {
- if (hasRoot) return true;
+
+
+ StringBuilder log = new StringBuilder();
+
try {
+
// Run an empty script just to check root access
- String[] cmd = {"exit 0"};
- if (TorServiceUtils.doShellCommand(cmd, null, true, true) == 0) {
- hasRoot = true;
+ String[] cmd = {"whoami"};
+ int exitCode = TorServiceUtils.doShellCommand(cmd, log, true, true);
+ if (exitCode == 0) {
+
return true;
}
+
} catch (Exception e) {
+ Log.w(TAG,"Error checking for root access: " + e.getMessage() ,e);
}
- Log.w(TAG, "Could not acquire root access.");
+ Log.w(TAG, "Could not acquire root access: " + log.toString());
return false;
}
- public static int setDNSProxying ()
+ public static int setDNSProxying () throws Exception
{
final StringBuilder log = new StringBuilder();
@@ -93,7 +94,8 @@
}
}
- public static boolean setTransparentProxyingByApp(Context context, TorifiedApp[] apps, boolean forceAll) {
+ public static boolean setTransparentProxyingByApp(Context context, TorifiedApp[] apps, boolean forceAll) throws Exception
+ {
String command = null;
@@ -104,9 +106,6 @@
StringBuilder res = new StringBuilder();
int code = -1;
- try {
-
-
for (int i = 0; i < apps.length; i++)
{
if (forceAll || apps[i].isTorified())
@@ -147,9 +146,7 @@
String msg = res.toString();
Log.e(TAG, msg);
- } catch (Exception e) {
- Log.w(TAG, "error refreshing iptables: err=" + code + "; resp=" + res.toString(), e);
- }
+
return false;
}
More information about the tor-commits
mailing list