From 1219725e6adb743dfb7dce69570f35fe44de1a7d Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Mon, 4 Jul 2011 16:15:45 +0000 Subject: [PATCH] - Notification icon rotations - Clean up debug text on main screen - Move most logging from System.err.println to Util - Stub out HTTP auth handler - Don't restart Peers page on orientation change - Add inbound/outbound arrows, not loaded yet - Tweak log levels --- AndroidManifest.xml | 1 + build.xml | 4 ++ res/drawable/ic_launcher_itoopie_120.png | Bin 0 -> 3537 bytes res/drawable/ic_launcher_itoopie_150.png | Bin 0 -> 3532 bytes res/drawable/ic_launcher_itoopie_180.png | Bin 0 -> 2710 bytes res/drawable/ic_launcher_itoopie_300.png | Bin 0 -> 3503 bytes res/drawable/ic_launcher_itoopie_330.png | Bin 0 -> 3522 bytes res/raw/logger_config | 6 +- .../router/activity/I2PActivityBase.java | 38 ++++++----- .../router/activity/I2PWebViewClient.java | 7 ++ .../android/router/activity/MainActivity.java | 9 ++- .../router/activity/PeersActivity.java | 17 +++++ .../android/router/receiver/I2PReceiver.java | 20 +++--- src/net/i2p/android/router/service/Init.java | 52 +++++++------- .../router/service/LoadClientsJob.java | 7 +- .../android/router/service/RouterService.java | 64 +++++++++--------- .../i2p/android/router/service/StatusBar.java | 16 +++-- 17 files changed, 143 insertions(+), 98 deletions(-) create mode 100644 res/drawable/ic_launcher_itoopie_120.png create mode 100644 res/drawable/ic_launcher_itoopie_150.png create mode 100644 res/drawable/ic_launcher_itoopie_180.png create mode 100644 res/drawable/ic_launcher_itoopie_300.png create mode 100644 res/drawable/ic_launcher_itoopie_330.png diff --git a/AndroidManifest.xml b/AndroidManifest.xml index e1fbe15a7..d4a86d9cb 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -67,6 +67,7 @@ </activity> <activity android:name=".activity.PeersActivity" android:label="I2P Peers and Transport Status" + android:configChanges="orientation|keyboardHidden" android.theme="@android:style/Theme.NoTitleBar" android:launchMode="singleTop" > </activity> diff --git a/build.xml b/build.xml index 7cc7aec23..2ce91e831 100644 --- a/build.xml +++ b/build.xml @@ -165,6 +165,8 @@ <copy file="LICENSE.txt" tofile="res/raw/license_app_txt" /> <copy file="licenses/LICENSE-Apache2.0.txt" tofile="res/raw/license_apache20_txt" /> <copy file="${i2pbase}/installer/resources/themes/console/images/i2plogo.png" todir="res/drawable/" /> + <copy file="${i2pbase}/installer/resources/themes/console/images/outbound.png" todir="res/drawable/" /> + <copy file="${i2pbase}/installer/resources/themes/console/images/inbound.png" todir="res/drawable/" /> <copy file="${i2pbase}/installer/resources/themes/console/light/images/header.png" todir="res/drawable/" /> <copy file="${i2pbase}/installer/resources/themes/console/light/console.css" tofile="res/raw/console_css" /> <copy file="${i2pbase}/installer/resources/blocklist.txt" tofile="res/raw/blocklist_txt" /> @@ -210,6 +212,8 @@ <target name="distclean" depends="clean"> <delete dir="${jar.libs.dir}" verbose="${verbose}" /> <delete file="res/drawable/i2plogo.png" verbose="${verbose}"/> + <delete file="res/drawable/outbound.png" verbose="${verbose}"/> + <delete file="res/drawable/inbound.png" verbose="${verbose}"/> <delete file="res/drawable/header.png" verbose="${verbose}"/> <delete file="res/raw/console_css" verbose="${verbose}"/> <delete file="res/raw/blocklist_txt" verbose="${verbose}" /> diff --git a/res/drawable/ic_launcher_itoopie_120.png b/res/drawable/ic_launcher_itoopie_120.png new file mode 100644 index 0000000000000000000000000000000000000000..c58050aa3959772b4af6d3ab2301281b52bd69ae GIT binary patch literal 3537 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 LNkvXXu0mjfb-LSY literal 0 HcmV?d00001 diff --git a/res/drawable/ic_launcher_itoopie_150.png b/res/drawable/ic_launcher_itoopie_150.png new file mode 100644 index 0000000000000000000000000000000000000000..9ac17ab32d977f36bb13fb70066e9752dcfe6f15 GIT binary patch literal 3532 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 GLSTZT3)r3j literal 0 HcmV?d00001 diff --git a/res/drawable/ic_launcher_itoopie_180.png b/res/drawable/ic_launcher_itoopie_180.png new file mode 100644 index 0000000000000000000000000000000000000000..b8087a5e0afa4612f7ae48a459230993580a101c GIT binary patch literal 2710 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 Qx&QzG07*qoM6N<$f>!Yn4*&oF literal 0 HcmV?d00001 diff --git a/res/drawable/ic_launcher_itoopie_300.png b/res/drawable/ic_launcher_itoopie_300.png new file mode 100644 index 0000000000000000000000000000000000000000..c5c291314014bbb0396d27b68792e9fbc0bc91ae GIT binary patch literal 3503 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 literal 0 HcmV?d00001 diff --git a/res/drawable/ic_launcher_itoopie_330.png b/res/drawable/ic_launcher_itoopie_330.png new file mode 100644 index 0000000000000000000000000000000000000000..d6c393b251bb12d75a9817c4f2be19f925328e92 GIT binary patch literal 3522 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 literal 0 HcmV?d00001 diff --git a/res/raw/logger_config b/res/raw/logger_config index b83d079e0..13b9d6154 100644 --- a/res/raw/logger_config +++ b/res/raw/logger_config @@ -1,13 +1,13 @@ logger.consoleBufferSize=250 logger.dateFormat=MM/dd HH:mm:ss.SSS -logger.defaultLevel=INFO +logger.defaultLevel=WARN logger.displayOnScreen=true logger.logFileSize=64k logger.logRotationLimit=2 logger.minimumOnScreenLevel=WARN logger.record.net.i2p.crypto=WARN logger.record.net.i2p.router.InNetMessagePool=WARN -logger.record.net.i2p.router.Router=INFO +logger.record.net.i2p.router.Router=WARN logger.record.net.i2p.router.Shitlist=WARN logger.record.net.i2p.router.networkdb=WARN logger.record.net.i2p.router.peermanager=WARN @@ -19,5 +19,5 @@ logger.record.net.i2p.stat.Rate=ERROR logger.record.net.i2p.util.I2PThread=ERROR logger.record.net.i2p.util.LogManager=WARN logger.record.net.i2p.util.LogWriter=WARN -logger.record.net.i2p.util.NativeBigInteger=DEBUG +logger.record.net.i2p.util.NativeBigInteger=ERROR logger.record.net.org.cybergarage.util.Debug=DEBUG diff --git a/src/net/i2p/android/router/activity/I2PActivityBase.java b/src/net/i2p/android/router/activity/I2PActivityBase.java index 7b1ad7e12..e56dc41c0 100644 --- a/src/net/i2p/android/router/activity/I2PActivityBase.java +++ b/src/net/i2p/android/router/activity/I2PActivityBase.java @@ -41,7 +41,7 @@ public abstract class I2PActivityBase extends Activity { @Override public void onCreate(Bundle savedInstanceState) { - System.err.println(this + " onCreate called"); + Util.i(this + " onCreate called"); super.onCreate(savedInstanceState); _myDir = getFilesDir().getAbsolutePath(); } @@ -49,14 +49,14 @@ public abstract class I2PActivityBase extends Activity { @Override public void onRestart() { - System.err.println(this + " onRestart called"); + Util.i(this + " onRestart called"); super.onRestart(); } @Override public void onStart() { - System.err.println(this + " onStart called"); + Util.i(this + " onStart called"); super.onStart(); _sharedPrefs = getSharedPreferences(SHARED_PREFS, 0); if (_sharedPrefs.getBoolean(PREF_AUTO_START, DEFAULT_AUTO_START)) @@ -87,28 +87,28 @@ public abstract class I2PActivityBase extends Activity { @Override public void onResume() { - System.err.println(this + " onResume called"); + Util.i(this + " onResume called"); super.onResume(); } @Override public void onPause() { - System.err.println(this + " onPause called"); + Util.i(this + " onPause called"); super.onPause(); } @Override public void onSaveInstanceState(Bundle outState) { - System.err.println(this + " onSaveInstanceState called"); + Util.i(this + " onSaveInstanceState called"); super.onSaveInstanceState(outState); } @Override public void onStop() { - System.err.println(this + " onStop called"); + Util.i(this + " onStop called"); unbindRouter(); super.onStop(); } @@ -116,7 +116,7 @@ public abstract class I2PActivityBase extends Activity { @Override public void onDestroy() { - System.err.println(this + " onDestroy called"); + Util.i(this + " onDestroy called"); super.onDestroy(); } @@ -151,9 +151,11 @@ public abstract class I2PActivityBase extends Activity { MenuItem addressbook = menu.findItem(R.id.menu_addressbook); addressbook.setVisible(showAddressbook); addressbook.setEnabled(showAddressbook); + + boolean showReload = showAddressbook || (this instanceof PeersActivity); MenuItem reload = menu.findItem(R.id.menu_reload); - reload.setVisible(showAddressbook); - reload.setEnabled(showAddressbook); + reload.setVisible(showReload); + reload.setEnabled(showReload); return super.onPrepareOptionsMenu(menu); } @@ -208,14 +210,14 @@ public abstract class I2PActivityBase extends Activity { protected boolean startRouter() { Intent intent = new Intent(); intent.setClassName(this, "net.i2p.android.router.service.RouterService"); - System.err.println(this + " calling startService"); + Util.i(this + " calling startService"); ComponentName name = startService(intent); if (name == null) - System.err.println(this + " XXXXXXXXXXXXXXXXXXXX got from startService: " + name); - System.err.println(this + " got from startService: " + name); + Util.i(this + " XXXXXXXXXXXXXXXXXXXX got from startService: " + name); + Util.i(this + " got from startService: " + name); boolean success = bindRouter(true); if (!success) - System.err.println(this + " Bind router failed"); + Util.i(this + " Bind router failed"); return success; } @@ -225,10 +227,10 @@ public abstract class I2PActivityBase extends Activity { protected boolean bindRouter(boolean autoCreate) { Intent intent = new Intent(); intent.setClassName(this, "net.i2p.android.router.service.RouterService"); - System.err.println(this + " calling bindService"); + Util.i(this + " calling bindService"); _connection = new RouterConnection(); boolean success = bindService(intent, _connection, autoCreate ? BIND_AUTO_CREATE : 0); - System.err.println(this + " bindService: auto create? " + autoCreate + " success? " + success); + Util.i(this + " bindService: auto create? " + autoCreate + " success? " + success); return success; } @@ -243,7 +245,7 @@ public abstract class I2PActivityBase extends Activity { protected class RouterConnection implements ServiceConnection { public void onServiceConnected(ComponentName name, IBinder service) { - System.err.println(this + " connected to router service"); + Util.i(this + " connected to router service"); RouterBinder binder = (RouterBinder) service; RouterService svc = binder.getService(); _routerService = svc; @@ -252,7 +254,7 @@ public abstract class I2PActivityBase extends Activity { } public void onServiceDisconnected(ComponentName name) { - System.err.println(this + " disconnected from router service!!!!!!!"); + Util.i(this + " disconnected from router service!!!!!!!"); // save memory _routerService = null; _isBound = false; diff --git a/src/net/i2p/android/router/activity/I2PWebViewClient.java b/src/net/i2p/android/router/activity/I2PWebViewClient.java index a458346e4..5129d2f83 100644 --- a/src/net/i2p/android/router/activity/I2PWebViewClient.java +++ b/src/net/i2p/android/router/activity/I2PWebViewClient.java @@ -9,6 +9,7 @@ import android.net.Uri; import android.os.AsyncTask; import android.view.Gravity; import android.view.View; +import android.webkit.HttpAuthHandler; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; @@ -173,6 +174,12 @@ class I2PWebViewClient extends WebViewClient { super.onPageFinished(view, url); } + @Override + public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) { + Util.e("ORHAR URL: " + host); + super.onReceivedHttpAuthRequest(view, handler, host, realm); + } + /****** API 11 :( diff --git a/src/net/i2p/android/router/activity/MainActivity.java b/src/net/i2p/android/router/activity/MainActivity.java index 7aed83e59..9eb863f9b 100644 --- a/src/net/i2p/android/router/activity/MainActivity.java +++ b/src/net/i2p/android/router/activity/MainActivity.java @@ -256,11 +256,11 @@ public class MainActivity extends I2PActivityBase { private void updateStatus() { RouterContext ctx = getRouterContext(); TextView tv = (TextView) findViewById(R.id.main_status_text); -/*** + if (!Util.isConnected(this)) { tv.setText("No Internet connection is available"); tv.setVisibility(View.VISIBLE); - } else ****/ if (ctx != null) { + } else if (ctx != null) { int active = ctx.commSystem().countActivePeers(); int known = Math.max(ctx.netDb().getKnownRouters() - 1, 0); int inEx = ctx.tunnelManager().getFreeTunnelCount(); @@ -303,7 +303,9 @@ public class MainActivity extends I2PActivityBase { tv.setText(_savedStatus); tv.setVisibility(View.VISIBLE); } else { - //tv.setVisibility(View.INVISIBLE); + // network but no router context + tv.setVisibility(View.INVISIBLE); + /**** RouterService svc = _routerService; String status = "connected? " + Util.isConnected(this) + @@ -317,6 +319,7 @@ public class MainActivity extends I2PActivityBase { "\ncan stop? " + (svc == null ? "null" : svc.canManualStop()); tv.setText(status); tv.setVisibility(View.VISIBLE); + ****/ } } diff --git a/src/net/i2p/android/router/activity/PeersActivity.java b/src/net/i2p/android/router/activity/PeersActivity.java index f775ee146..2bbc3e664 100644 --- a/src/net/i2p/android/router/activity/PeersActivity.java +++ b/src/net/i2p/android/router/activity/PeersActivity.java @@ -2,6 +2,7 @@ package net.i2p.android.router.activity; import android.os.Bundle; import android.view.KeyEvent; +import android.view.MenuItem; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.TextView; @@ -70,6 +71,9 @@ public class PeersActivity extends I2PActivityBase { } try { wv.loadData(data, "text/html", "UTF-8"); + // figure out a way to get /themes/console/images/outbound.png to load + //String url = "file://" + _myDir + "/docs/"; + //wv.loadDataWithBaseURL(url, data, "text/html", "UTF-8", url); } catch (Exception e) { } } @@ -87,4 +91,17 @@ public class PeersActivity extends I2PActivityBase { } return super.onKeyDown(keyCode, event); } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + WebView wv = (WebView) findViewById(R.id.peers_webview); + switch (item.getItemId()) { + case R.id.menu_reload: + update(); + return true; + + default: + return super.onOptionsItemSelected(item); + } + } } diff --git a/src/net/i2p/android/router/receiver/I2PReceiver.java b/src/net/i2p/android/router/receiver/I2PReceiver.java index 4db24f1bd..cbfa6354f 100644 --- a/src/net/i2p/android/router/receiver/I2PReceiver.java +++ b/src/net/i2p/android/router/receiver/I2PReceiver.java @@ -38,7 +38,7 @@ public class I2PReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); - System.err.println("Got broadcast: " + action); + Util.w("Got broadcast: " + action); if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { boolean failover = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false); @@ -47,7 +47,7 @@ public class I2PReceiver extends BroadcastReceiver { NetworkInfo other = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO); /***** - System.err.println("No conn? " + noConn + " failover? " + failover + + Util.w("No conn? " + noConn + " failover? " + failover + " info: " + info + " other: " + other); printInfo(info); printInfo(other); @@ -63,10 +63,10 @@ public class I2PReceiver extends BroadcastReceiver { if (++_unconnectedCount >= 3) { RouterService svc = _routerService; if (_isBound && svc != null) { - System.err.println("********* Network down, already bound"); + Util.w("********* Network down, already bound"); svc.networkStop(); } else { - System.err.println("********* Network down, binding to router"); + Util.w("********* Network down, binding to router"); // connection will call networkStop() bindRouter(); } @@ -81,10 +81,10 @@ public class I2PReceiver extends BroadcastReceiver { /**** private static void printInfo(NetworkInfo ni) { if (ni == null) { - System.err.println("Network info is null"); + Util.w("Network info is null"); return; } - System.err.println( + Util.w( "state: " + ni.getState() + " detail: " + ni.getDetailedState() + " extrainfo: " + ni.getExtraInfo() + @@ -101,10 +101,10 @@ public class I2PReceiver extends BroadcastReceiver { private boolean bindRouter() { Intent intent = new Intent(); intent.setClassName(_context, "net.i2p.android.router.service.RouterService"); - System.err.println(this + " calling bindService"); + Util.w(this + " calling bindService"); _connection = new RouterConnection(); boolean success = _context.bindService(intent, _connection, 0); - System.err.println(this + " got from bindService: " + success); + Util.w(this + " got from bindService: " + success); return success; } @@ -123,7 +123,7 @@ public class I2PReceiver extends BroadcastReceiver { _isBound = true; _unconnectedCount = 0; _wasConnected = false; - System.err.println("********* Network down, stopping router"); + Util.w("********* Network down, stopping router"); _routerService.networkStop(); // this doesn't work here... TODO where to unbind //_context.unbindService(this); @@ -132,7 +132,7 @@ public class I2PReceiver extends BroadcastReceiver { public void onServiceDisconnected(ComponentName name) { _isBound = false; _routerService = null; - System.err.println("********* Receiver unbinding from router"); + Util.w("********* Receiver unbinding from router"); } } } diff --git a/src/net/i2p/android/router/service/Init.java b/src/net/i2p/android/router/service/Init.java index 6e9f76d24..89612416f 100644 --- a/src/net/i2p/android/router/service/Init.java +++ b/src/net/i2p/android/router/service/Init.java @@ -41,23 +41,23 @@ class Init { } void debugStuff() { - System.err.println("java.io.tmpdir" + ": " + System.getProperty("java.io.tmpdir")); - System.err.println("java.vendor" + ": " + System.getProperty("java.vendor")); - System.err.println("java.version" + ": " + System.getProperty("java.version")); - System.err.println("os.arch" + ": " + System.getProperty("os.arch")); - System.err.println("os.name" + ": " + System.getProperty("os.name")); - System.err.println("os.version" + ": " + System.getProperty("os.version")); - System.err.println("user.dir" + ": " + System.getProperty("user.dir")); - System.err.println("user.home" + ": " + System.getProperty("user.home")); - System.err.println("user.name" + ": " + System.getProperty("user.name")); - System.err.println("getFilesDir()" + ": " + myDir); - System.err.println("max mem" + ": " + DataHelper.formatSize(Runtime.getRuntime().maxMemory())); - System.err.println("Package" + ": " + ctx.getPackageName()); - System.err.println("Version" + ": " + _ourVersion); - System.err.println("MODEL" + ": " + Build.MODEL); - System.err.println("DISPLAY" + ": " + Build.DISPLAY); - System.err.println("VERSION" + ": " + Build.VERSION.RELEASE); - System.err.println("SDK" + ": " + Build.VERSION.SDK); + Util.i("java.io.tmpdir" + ": " + System.getProperty("java.io.tmpdir")); + Util.i("java.vendor" + ": " + System.getProperty("java.vendor")); + Util.i("java.version" + ": " + System.getProperty("java.version")); + Util.i("os.arch" + ": " + System.getProperty("os.arch")); + Util.i("os.name" + ": " + System.getProperty("os.name")); + Util.i("os.version" + ": " + System.getProperty("os.version")); + Util.i("user.dir" + ": " + System.getProperty("user.dir")); + Util.i("user.home" + ": " + System.getProperty("user.home")); + Util.i("user.name" + ": " + System.getProperty("user.name")); + Util.i("getFilesDir()" + ": " + myDir); + Util.i("max mem" + ": " + DataHelper.formatSize(Runtime.getRuntime().maxMemory())); + Util.i("Package" + ": " + ctx.getPackageName()); + Util.i("Version" + ": " + _ourVersion); + Util.i("MODEL" + ": " + Build.MODEL); + Util.i("DISPLAY" + ": " + Build.DISPLAY); + Util.i("VERSION" + ": " + Build.VERSION.RELEASE); + Util.i("SDK" + ": " + Build.VERSION.SDK); } void initialize() { @@ -101,6 +101,8 @@ class Init { imgDir.mkdir(); copyResourceToFile(R.drawable.i2plogo, "docs/themes/console/images/i2plogo.png"); copyResourceToFile(R.drawable.itoopie_sm, "docs/themes/console/images/itoopie_sm.png"); + copyResourceToFile(R.drawable.outbound, "docs/themes/console/images/outbound.png"); + copyResourceToFile(R.drawable.inbound, "docs/themes/console/images/inbound.png"); File img2Dir = new File(cssDir, "images"); img2Dir.mkdir(); @@ -122,7 +124,7 @@ class Init { InputStream in = null; FileOutputStream out = null; - System.err.println("Creating file " + f + " from resource"); + Util.i("Creating file " + f + " from resource"); byte buf[] = new byte[4096]; try { // Context methods @@ -165,9 +167,9 @@ class Init { try { fin = new FileInputStream(new File(myDir, f)); DataHelper.loadProps(props, fin); - System.err.println("Merging resource into file " + f); + Util.i("Merging resource into file " + f); } catch (IOException ioe) { - System.err.println("Creating file " + f + " from resource"); + Util.i("Creating file " + f + " from resource"); } // override user settings @@ -177,7 +179,7 @@ class Init { props.putAll(overrides); File path = new File(myDir, f); DataHelper.storeProps(props, path); - System.err.println("Saved " + props.size() +" properties in " + f); + Util.i("Saved " + props.size() +" properties in " + f); } catch (IOException ioe) { } catch (Resources.NotFoundException nfe) { } finally { @@ -199,7 +201,7 @@ class Init { fin = ctx.openFileInput(CONFIG_FILE); DataHelper.loadProps(props, fin); } catch (IOException ioe) { - System.err.println("Looks like a new install"); + Util.i("Looks like a new install"); } finally { if (fin != null) try { fin.close(); } catch (IOException ioe) {} } @@ -209,12 +211,12 @@ class Init { boolean newVersion = !_ourVersion.equals(oldVersion); if (newVersion) { - System.err.println("New version " + _ourVersion); + Util.i("New version " + _ourVersion); props.setProperty(PROP_INSTALLED_VERSION, _ourVersion); try { DataHelper.storeProps(props, ctx.getFileStreamPath(CONFIG_FILE)); } catch (IOException ioe) { - System.err.println("Failed to write " + CONFIG_FILE); + Util.i("Failed to write " + CONFIG_FILE); } } return newVersion; @@ -227,7 +229,7 @@ class Init { if (files != null) { for (int i = 0; i < files.length; i++) { File f = files[i]; - System.err.println("Deleting old file/dir " + f); + Util.i("Deleting old file/dir " + f); FileUtil.rmdir(f, false); } } diff --git a/src/net/i2p/android/router/service/LoadClientsJob.java b/src/net/i2p/android/router/service/LoadClientsJob.java index 6374d6882..ac9425722 100644 --- a/src/net/i2p/android/router/service/LoadClientsJob.java +++ b/src/net/i2p/android/router/service/LoadClientsJob.java @@ -2,6 +2,7 @@ package net.i2p.android.router.service; import net.i2p.addressbook.DaemonThread; import net.i2p.android.apps.NewsFetcher; +import net.i2p.android.router.util.Util; import net.i2p.i2ptunnel.TunnelControllerGroup; import net.i2p.router.Job; import net.i2p.router.JobImpl; @@ -71,17 +72,17 @@ class LoadClientsJob extends JobImpl { public String getName() { return "Start I2P Tunnel"; }; public void runJob() { - System.err.println("Starting i2ptunnel"); + Util.i("Starting i2ptunnel"); TunnelControllerGroup tcg = TunnelControllerGroup.getInstance(); int sz = tcg.getControllers().size(); - System.err.println("i2ptunnel started " + sz + " clients"); + Util.i("i2ptunnel started " + sz + " clients"); } } private class ClientShutdownHook implements Runnable { public void run() { - System.err.println("client shutdown hook"); + Util.i("client shutdown hook"); // i2ptunnel registers its own hook if (_fetcherThread != null) _fetcherThread.interrupt(); diff --git a/src/net/i2p/android/router/service/RouterService.java b/src/net/i2p/android/router/service/RouterService.java index 61f9edc32..300fe2f80 100644 --- a/src/net/i2p/android/router/service/RouterService.java +++ b/src/net/i2p/android/router/service/RouterService.java @@ -60,7 +60,7 @@ public class RouterService extends Service { public void onCreate() { State lastState = getSavedState(); setState(State.INIT); - System.err.println(this + " onCreate called" + + Util.i(this + " onCreate called" + " Saved state is: " + lastState + " Current state is: " + _state); @@ -86,14 +86,14 @@ public class RouterService extends Service { /** NOT called by system if it restarts us after a crash */ @Override public int onStartCommand(Intent intent, int flags, int startId) { - System.err.println(this + " onStart called" + + Util.i(this + " onStart called" + " Intent is: " + intent + " Flags is: " + flags + " ID is: " + startId + " Current state is: " + _state); boolean restart = intent != null && intent.getBooleanExtra(EXTRA_RESTART, false); if (restart) - System.err.println(this + " RESTARTING"); + Util.i(this + " RESTARTING"); synchronized (_stateLock) { if (_state != State.INIT) //return START_STICKY; @@ -101,14 +101,14 @@ public class RouterService extends Service { _receiver = new I2PReceiver(this); if (Util.isConnected(this)) { if (restart) - _statusBar.replace("I2P is restarting"); + _statusBar.replace(StatusBar.ICON1, "I2P is restarting"); else - _statusBar.replace("I2P is starting up"); + _statusBar.replace(StatusBar.ICON1, "I2P is starting up"); setState(State.STARTING); _starterThread = new Thread(new Starter()); _starterThread.start(); } else { - _statusBar.replace("I2P is waiting for a network connection"); + _statusBar.replace(StatusBar.ICON6, "I2P is waiting for a network connection"); setState(State.WAITING); _handler.postDelayed(new Waiter(), 10*1000); } @@ -123,14 +123,14 @@ public class RouterService extends Service { /** maybe this goes away when the receiver can bind to us */ private class Waiter implements Runnable { public void run() { - System.err.println(MARKER + this + " waiter handler" + + Util.i(MARKER + this + " waiter handler" + " Current state is: " + _state); if (_state == State.WAITING) { if (Util.isConnected(RouterService.this)) { synchronized (_stateLock) { if (_state != State.WAITING) return; - _statusBar.replace("Network connected, I2P is starting up"); + _statusBar.replace(StatusBar.ICON1, "Network connected, I2P is starting up"); setState(State.STARTING); _starterThread = new Thread(new Starter()); _starterThread.start(); @@ -144,11 +144,11 @@ public class RouterService extends Service { private class Starter implements Runnable { public void run() { - System.err.println(MARKER + this + " starter thread" + + Util.i(MARKER + this + " starter thread" + " Current state is: " + _state); - //System.err.println(MARKER + this + " JBigI speed test started"); + //Util.i(MARKER + this + " JBigI speed test started"); //NativeBigInteger.main(null); - //System.err.println(MARKER + this + " JBigI speed test finished, launching router"); + //Util.i(MARKER + this + " JBigI speed test finished, launching router"); RouterLaunch.main(null); synchronized (_stateLock) { if (_state != State.STARTING) @@ -157,7 +157,7 @@ public class RouterService extends Service { List contexts = RouterContext.listContexts(); if ( (contexts == null) || (contexts.isEmpty()) ) throw new IllegalStateException("No contexts. This is usually because the router is either starting up or shutting down."); - _statusBar.update("I2P is running"); + _statusBar.replace(StatusBar.ICON2, "I2P is running"); _context = (RouterContext)contexts.get(0); _context.router().setKillVMOnEnd(false); Job loadJob = new LoadClientsJob(_context); @@ -166,7 +166,7 @@ public class RouterService extends Service { _context.addFinalShutdownTask(new FinalShutdownHook()); _starterThread = null; } - System.err.println("Router.main finished"); + Util.i("Router.main finished"); } } @@ -215,9 +215,9 @@ public class RouterService extends Service { boolean haveTunnels = inCl > 0 && outCl > 0; if (haveTunnels != _hadTunnels) { if (haveTunnels) - _statusBar.replace("Client tunnels are ready"); + _statusBar.replace(StatusBar.ICON3, "Client tunnels are ready"); else - _statusBar.replace("Client tunnels are down"); + _statusBar.replace(StatusBar.ICON2, "Client tunnels are down"); _hadTunnels = haveTunnels; } _statusBar.update(status, details); @@ -226,7 +226,7 @@ public class RouterService extends Service { @Override public IBinder onBind(Intent intent) { - System.err.println(this + "onBind called" + + Util.i(this + "onBind called" + " Current state is: " + _state); return _binder; } @@ -264,7 +264,7 @@ public class RouterService extends Service { * Stop and don't restart the router, but keep the service */ public void manualStop() { - System.err.println("manualStop called" + + Util.i("manualStop called" + " Current state is: " + _state); synchronized (_stateLock) { if (!canManualStop()) @@ -272,7 +272,7 @@ public class RouterService extends Service { if (_state == State.STARTING) _starterThread.interrupt(); if (_state == State.STARTING || _state == State.RUNNING) { - _statusBar.replace("Stopping I2P"); + _statusBar.replace(StatusBar.ICON4, "Stopping I2P"); Thread stopperThread = new Thread(new Stopper(State.MANUAL_STOPPING, State.MANUAL_STOPPED)); stopperThread.start(); } @@ -283,7 +283,7 @@ public class RouterService extends Service { * Stop the router and kill the service */ public void manualQuit() { - System.err.println("manualQuit called" + + Util.i("manualQuit called" + " Current state is: " + _state); synchronized (_stateLock) { if (!canManualStop()) @@ -291,7 +291,7 @@ public class RouterService extends Service { if (_state == State.STARTING) _starterThread.interrupt(); if (_state == State.STARTING || _state == State.RUNNING) { - _statusBar.replace("Stopping I2P"); + _statusBar.replace(StatusBar.ICON4, "Stopping I2P"); Thread stopperThread = new Thread(new Stopper(State.MANUAL_QUITTING, State.MANUAL_QUITTED)); stopperThread.start(); } else if (_state == State.WAITING) { @@ -305,13 +305,13 @@ public class RouterService extends Service { * Stop and then spin waiting for a network connection, then restart */ public void networkStop() { - System.err.println("networkStop called" + + Util.i("networkStop called" + " Current state is: " + _state); synchronized (_stateLock) { if (_state == State.STARTING) _starterThread.interrupt(); if (_state == State.STARTING || _state == State.RUNNING) { - _statusBar.replace("Network disconnected, stopping I2P"); + _statusBar.replace(StatusBar.ICON4, "Network disconnected, stopping I2P"); // don't change state, let the shutdown hook do it Thread stopperThread = new Thread(new Stopper(State.NETWORK_STOPPING, State.NETWORK_STOPPING)); stopperThread.start(); @@ -325,12 +325,12 @@ public class RouterService extends Service { } public void manualStart() { - System.err.println("restart called" + + Util.i("restart called" + " Current state is: " + _state); synchronized (_stateLock) { if (!canManualStart()) return; - _statusBar.replace("I2P is starting up"); + _statusBar.replace(StatusBar.ICON1, "I2P is starting up"); setState(State.STARTING); _starterThread = new Thread(new Starter()); _starterThread.start(); @@ -346,7 +346,7 @@ public class RouterService extends Service { */ @Override public void onDestroy() { - System.err.println("onDestroy called" + + Util.i("onDestroy called" + " Current state is: " + _state); _handler.removeCallbacks(_updater); @@ -368,7 +368,7 @@ public class RouterService extends Service { _starterThread.interrupt(); if (_state == State.STARTING || _state == State.RUNNING) { // should this be in a thread? - _statusBar.replace("I2P is shutting down"); + _statusBar.replace(StatusBar.ICON5, "I2P is shutting down"); Thread stopperThread = new Thread(new Stopper(State.STOPPING, State.STOPPED)); stopperThread.start(); } @@ -393,13 +393,13 @@ public class RouterService extends Service { } public void run() { - System.err.println(MARKER + this + " stopper thread" + + Util.i(MARKER + this + " stopper thread" + " Current state is: " + _state); RouterContext ctx = _context; if (ctx != null) ctx.router().shutdown(Router.EXIT_HARD); _statusBar.off(); - System.err.println("********** Router shutdown complete"); + Util.i("********** Router shutdown complete"); synchronized (_stateLock) { if (_state == nextState) setState(stopState); @@ -414,9 +414,9 @@ public class RouterService extends Service { */ private class ShutdownHook implements Runnable { public void run() { - System.err.println(this + " shutdown hook" + + Util.i(this + " shutdown hook" + " Current state is: " + _state); - _statusBar.replace("I2P is shutting down"); + _statusBar.replace(StatusBar.ICON5, "I2P is shutting down"); I2PReceiver rcvr = _receiver; if (rcvr != null) { synchronized(rcvr) { @@ -450,7 +450,7 @@ public class RouterService extends Service { */ private class FinalShutdownHook implements Runnable { public void run() { - System.err.println(this + " final shutdown hook" + + Util.i(this + " final shutdown hook" + " Current state is: " + _state); _statusBar.off(); //I2PReceiver rcvr = _receiver; @@ -469,7 +469,7 @@ public class RouterService extends Service { _handler.postDelayed(new Waiter(), 10*1000); } else if (_state == State.STARTING || _state == State.RUNNING || _state == State.STOPPING) { - System.err.println(this + " died of unknown causes"); + Util.i(this + " died of unknown causes"); setState(State.STOPPED); stopSelf(); } else if (_state == State.MANUAL_QUITTING) { diff --git a/src/net/i2p/android/router/service/StatusBar.java b/src/net/i2p/android/router/service/StatusBar.java index 7f60cc530..d456fe130 100644 --- a/src/net/i2p/android/router/service/StatusBar.java +++ b/src/net/i2p/android/router/service/StatusBar.java @@ -11,7 +11,7 @@ import java.lang.Thread.UncaughtExceptionHandler; import net.i2p.android.router.R; import net.i2p.android.router.activity.MainActivity; -public class StatusBar { +class StatusBar { private final Context ctx; private final Intent intent; @@ -20,13 +20,20 @@ public class StatusBar { private static final int ID = 1; + public static final int ICON1 = R.drawable.ic_launcher_itoopie_300; + public static final int ICON2 = R.drawable.ic_launcher_itoopie_330; + public static final int ICON3 = R.drawable.ic_launcher_itoopie; + public static final int ICON4 = R.drawable.ic_launcher_itoopie_120; + public static final int ICON5 = R.drawable.ic_launcher_itoopie_150; + public static final int ICON6 = R.drawable.ic_launcher_itoopie_180; + StatusBar(Context cx) { ctx = cx; String ns = Context.NOTIFICATION_SERVICE; mgr = (NotificationManager)ctx.getSystemService(ns); Thread.currentThread().setUncaughtExceptionHandler(new CrashHandler(mgr)); - int icon = R.drawable.ic_launcher_itoopie; + int icon = ICON1; // won't be shown if replace() is called String text = "Starting I2P"; long now = System.currentTimeMillis(); @@ -37,9 +44,10 @@ public class StatusBar { } /** remove and re-add */ - public void replace(String tickerText) { + public void replace(int icon, String tickerText) { off(); - notif.tickerText = tickerText; + notif.icon = icon; + notif.tickerText= tickerText; update(tickerText); } -- GitLab