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
zcmV;?4KDJDP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m?d01m?e$8V@)00007bV*G`2ipe&
z6f`V`WuXcH01Z(|L_t(&-tC!tkX6-{#((>qd+z(*?!HaG=%%}&d8r_x1Bl=QRCGkp
zLa1cS6mg8PCNr@tb&N3@<71p8I+a9CqGn>H65}YEOq_90WE7)-&<H}?Akehk(B1U&
z_I<z3bI%`rw8WsoC{9wv`s?00ueJ92_P4&ZHk`DRcG8Z=ls`9z)Z@5!9#961{3Wiu
z08+p{pw9jO7X^uX-PIolOadg(<X#K^f3NJPSsl>t-t8b62KE5;z<xI?{lJqz@)+LN
z0GPliV0{rm{vMD*2+QO3lr*oF4TJ+}Euf`+L0?Jrs3jppFR&K)>yLTIB;aD;=Rhy;
zw42S(Y@ScKz5rMOpnBD!H{i{CJRZXr@a0Uy^oL{Nc)Ty(A}v{AS=PCZ?HrblY<DxO
z0_OpL2TW6-Oo5=g<mb5%jGt%-wF5IWuU7B|y_ry1C~@``Xa8|r<G4&}C>08qhf5>9
zBV`BPIxsDMINqEc%{JMl-3~Om@Q8&`?D2TAQ_vDAZ13CXwMC=?%mH?uNE-bbaGg+u
z;}80i{;)qicj?@X_0#G{je?>1gML#=DJp6!@)OUP*weSSuO>Z`snHZsr3m41q>NPK
z$=^=Jj=v##a3R6?GQ$0Dp;ruGX}~t%ofE}EKH$dyzMwB<JGNF{T|V4!N<+MuEqVbQ
z#}NREqR4$)_BADjQ{(+Y(XTjT#(%wZ!*%~$9t?~`P>eW^H;7{U5l$T28%5Ctc#pFN
z9d`h?0}&yFqpGUu^?UOzXSQ_MrhUZyLJ=~T%K5u@bx+TYWE%eA{Bzd)WaaWrYuoou
zEE;CG2ea%UlC!_b(40XmUj)UfLM=&ffQct+6HfxZ>;9HyRb~CQWoya7WO?(<=0VG_
z6e*<u5JHd~Oh&TlT&yw}7@l5NJ$lV=p1I_Wj)Uh(VR=k<mE+ifERGsQQ5--6&HS7y
z`q2XTnVT7jf@2s)K+o%u#89HjGOYtgWIzb1dQ>Yjly340#kl#o7p}|ddc~v`4h8&_
zIy#tWnt01l^*quOLp5WlC3EcYCBRQVZwM^`E>#r8^k|-9ARI{KlDR4&gmb9v(3~xQ
z*m9QU)9g@LNLMx0QB+0l-neI$lv2?h+n3Yza*qdV*_G^g;t5`uKc9CLaHgQ8&cc@-
z#nviN%>Y6IIXBw?mH!8Ac2pYe1X?QVD?1{w$f!5yEfz9`sGiqD`BZ*fF;lGcg?*{1
zbEm#(luTbCQ;78M>zh?(V=a(@0SRK*WBIh%di*>0$W4I&_U*T^NZB5!{H{~Eryft~
zM<gfzhV*m?4gp);dLRKC*x{n$x4`z}rO_LKt9=1qx~`?JW3+FyDLb0241@z&&8z9P
zEw!D#urDPYDSCGI%!&8KCzXcN<Ii-wBP)m;{4$ZgMFdAG994gzUqAKrT~6(ii+HcD
zfz-3xtkbs^^t$nQvb)e@ofwr8VyemvDQQwwnxv!|I0u*oTmhT{ybWZJB?DogUkDK?
zuPN`6QYzt!aD3kKd2ga3g%HxCd2HLZm7eyV`gh;ldv-paX_zj(@mq-Psl{V>z;Qs7
zp;+%>1|HH9QyZ7+o!@_et*^d9%@2Oa#iNImYCposhHY6>L9(KPbW00EkqAaAMWC~j
z8bIyrq|q?&0)sA{|LEg%)BBtFdq6}=DJ{eD`9uCp<IKhm)u&pH<tS20Ox^SdA>`z_
zQw~;7tR8vwXD?lIwHfW2g11n>Q5|<N(m0+96zfbgkbLGvW3Ink8n@j<+k%DceSX*(
zH(@GW*M5y{Q>T)xucug1fqD2a{>Da%`}Y&>=^->QK;X$InYVj4Q-S+{3tb<#9t}d%
zfX4tI0vR0_9TdtK|JO~f8?sGX{ZOWa;`KPYH?+@~(32_qM=CnAIDf)q8bZ#&pNiO?
z()t6&w4y2tcYcSqv(IMVRV(S3HH(xGVB3gn7EK7qWYGM6ocel-jg912tYCjI$ne2~
z)aG(bVXSui(N(fX1n_Ub8Lr|~9LG_jvFK2!B9tkwDNld2aFtR8f8T3+XMd{{=?bAZ
z_EGed1YsdX4Apqm)SFXY+rIQ-x}#A{RRvu~72-$|c|Rc2L>U>uUn-$qbP<DwLGIu|
z>T)^GcM-GE-S8hk=oFya)%4RW-3k^mg>uJsJTuRqxwlj(c|Xki@nkkKQ}rh+B(^>#
z%8teivV>IjVnp6UkKVSLouv}0lpil1tEw;_eUzzNx6(8`tcCmg?b@@>a=IRPfDMTR
zfv2A0BGcpw;5nDAKBxl=TphnqO8Gm-b^-z+a>?Adj%^(iy?(Ey`7{e4J)DmCY#1C(
z)vG9uA7LNO83)8Lw)YpLPd{%7tye5#z;O^#9^LtH7;DoeDj#`7yEqzM+O}-jt!wVT
z|B?IJ+b3w>_y(6;a}E0zFXk;^I&cTz|1gA#Zg&KrN-5`AhE?P7d5py2#Q1n`JQ|1w
zvgOs~`L#cP@vDd4Ie5BhTYeK{HJ(x!#g-p|Q5416OtI>fV7}&ePw{LfgXfc0KNiEh
z_F9$?4LNo3cp`e!O*gLl%2%%LQWOT(u6^~Q3odXvCrlvy`s<uxnuLKhK;~$bZ$EHY
z+VWhW+OjN>PvvXV!|6!puCB=>3+0#1oc=#qAvsXY*HlQMPr{oQA1R6g_&$l#7hdVS
zwR8!+rP9Y&Sf3B)<(Eb6GtVdsq?Bs0SghQ&YgcI5vSoV=!(`K@4K0%==dyF=5P$h)
z8Z#LtO3CZ4uSZp*zn4PJ)C>9#^}L=g<x1L6_t1<)_sFzMPMh}Hzpl7^Q|qnYd?H*I
z>v@)Jiyy`La0WDl+=*TmiOS6E84PB!pWOB7I?99zG9L^&Iv~7WZ#J1sRyQ^_X6x!|
zN&^GA22B&zlquxr&!@wM;g>&IPD`>b@BS6AK}bZz=gs;wk2#tzc%R$R)^KoSbaD~L
z{|1H10KyhyasU%4VkmmTl%YTXD;)mh#@*w=0YrJZH@<4s^2hGI_ul(=?%Z`>fB#_U
z>tDa|s_N>jvtotp@9iZpe?EPhhI9*W@K}1{1n`uE3sS{W<*WPOo4c*2Z+beJtt}Zw
zSpj&I)TvYPww9sT0DgpX05ehwILw<vJeT|AZ#WL3wwB_wX-0g*hOLXwIAiXwZomCo
z^V-^WO&=QCKl9;-c_E#~<MZJplLTxV0Yrhqv8un_Kn-wKPB&utLb0OW7W#4`?|Beb
z3Omq<mTg8WjPXCBfK;}L;<(uhWLHB2Mfame7CQ|`Rgv*HzP>&}D_3$Lk;n&s{p$^@
zvf16$O-%#N>ecp+MT>}MGI(qo#j;@idQLM8b^-qlSe|24t<M2_fz`T{=Xg<^MFfX0
zB{XOtl_<&wFbSd9gIIyA>UfJqRKxgFm`0;mt*ykKep;Nid9$3^+#K82)s>jBawVJB
zt>c&3tnG=#Ff2<di3A!zSs7+)E4A4y0ifJv&tsm<ZFVK@Pl4Vx^s0YhbY>q`pb@PU
zM6n$Z9)y#_QMXX4woAghXAk45s?dethzbx0VBdW=m#kaIf<i&lX3t)-<(_+fa@X3m
zRn2$Y!MVX8wr!93CM75ea%c$OzyJ}S58NTzaZj7`?m+6RKvxH5^~0o2`vvLdek^|&
zVI9H<K2EA-8^zkZE&cDbQ7^=pOnBeQ%P}8+TukZi7EOvGOxrdCmtVeO|1G!N`0iC#
zE&b2#ZcpXF0R9gLttgO8qV@MPPS+W5b<r^mwvJ}60Y9*i_jO~`j$#F0A>Y`5C$|qh
zRs^4gOyl5v`)#JLS;M=F7c=z!!<h`8?b~HTEEYYa>vr(eQ%`+!)v8qofZ$_~{p!u}
z<NxEz?b|ceEiH5#20{o>Rb)Diwrv|TTp6+BvjhO}?`|h`V+JRZ#qkbc`P?jR0os5j
z!(jQwjWl0&+1PBgSVRqlu<PqdcXrm=?d@$3N$HGj9Z+mr7qzvq-o1M>HB!<IW6pPV
z5q$7L7TY#iV7<E^KhuFl!JS+z1fG#&n*HyA(||?5KLJ}T3uoOr&bjL@<_-<vQ&nW4
zfI4v^DUT-+-mqcqxKJo)xe{6K-+v&mb7%iK3m4Mk^Wg-8*gZW2o`0SxZEZ{eIzBoG
zIMH+d+kw05>q%aJJsVc9rYo7md*~3sn{Q@WvDiF%=bg9ywzc*3ro)Fj$M^IcoE!=z
zg6r3_rmqjb-;eX{Z!>@MX67am^theb<6q>MevaFO7(!q#UCO5I+j$_H<$JBIJb1wc
z?5M3312blbcN-h&z2OG_@X9OvcxZ@w9(|N2F1(OdRYkgxS$?#-^+lYtRJyX{dcap!
zM&?UjV&kGk^j1`0l$Bv-GN{eX6nlFKw6{~Sc{3AUdWm_(B7VoA6ZqSYn^Js{M@4gi
z2i<+6R9BM>g~<7Q=(V*Z`}(L#r3jZwgmoRCX)*--(yc%H|D4X-RsnAS@46>Cmdjp-
z5RABxd(3TfKbIq>6JZ`;wksBA0Ykue;6*ne!yR^=w3BwyKE?hQ;LQ2D3rCzD00000
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