From 2ee5d5f02f3ab0724932b4913d8d497f5e88f273 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Sun, 12 Jun 2011 21:49:36 +0000 Subject: [PATCH] - Really change to SDK 7 - Start and stop buttons - Handler for screen updates - Make service not sticky - Log tweaks - Fix version script --- AndroidManifest.xml | 2 +- res/layout/main.xml | 13 ++++ scripts/setversion.sh | 2 +- .../router/activity/I2PActivityBase.java | 1 + .../android/router/activity/MainActivity.java | 72 +++++++++++++++++-- .../android/router/service/RouterService.java | 62 +++++++++++----- src/net/i2p/util/LogWriter.java | 1 - 7 files changed, 129 insertions(+), 24 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 8c3d32be5..8bb553b03 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -10,7 +10,7 @@ <!-- 3 = 1.5, 2 = 1.1, 1 = 1.0; would probably work with 1 but don't have a 1.0 SDK to test against --> <!-- 3 required for NDK --> - <uses-sdk android:minSdkVersion="3" /> + <uses-sdk android:minSdkVersion="7" /> <application android:label="@string/app_name" android:icon="@drawable/ic_launcher_itoopie" > diff --git a/res/layout/main.xml b/res/layout/main.xml index 8a8b089d2..63329e86d 100644 --- a/res/layout/main.xml +++ b/res/layout/main.xml @@ -5,6 +5,7 @@ android:layout_height="fill_parent" > <TextView + android:id="@+id/main_title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="I2P Main Page" @@ -20,5 +21,17 @@ android:layout_height="wrap_content" android:text="Go to news" /> +<Button + android:id="@+id/router_start_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Start router" + /> +<Button + android:id="@+id/router_stop_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Stop router" + /> </LinearLayout> diff --git a/scripts/setversion.sh b/scripts/setversion.sh index da24d62c8..fbc3c6a73 100755 --- a/scripts/setversion.sh +++ b/scripts/setversion.sh @@ -53,7 +53,7 @@ echo "Android version: '$VERSIONSTRING' (${VERSIONINT})" echo "my.version.name=${VERSIONSTRING}" > version.properties echo "my.version.code=${VERSIONINT}" >> version.properties -SUBST='s/android.versionCode="[0-9]"/android.versionCode="'${VERSIONINT}'"/' +SUBST='s/android.versionCode="[0-9]*"/android.versionCode="'${VERSIONINT}'"/' sed "$SUBST" < $MANIFEST > $TMP SUBST='s/android.versionName="[^"]*"/android.versionName="'${VERSIONSTRING}'"/' sed "$SUBST" < $TMP > $MANIFEST diff --git a/src/net/i2p/android/router/activity/I2PActivityBase.java b/src/net/i2p/android/router/activity/I2PActivityBase.java index 225ba897d..342cd7d1b 100644 --- a/src/net/i2p/android/router/activity/I2PActivityBase.java +++ b/src/net/i2p/android/router/activity/I2PActivityBase.java @@ -28,6 +28,7 @@ public abstract class I2PActivityBase extends Activity { @Override public void onCreate(Bundle savedInstanceState) { + System.err.println(this + " onCreate called"); super.onCreate(savedInstanceState); _myDir = getFilesDir().getAbsolutePath(); } diff --git a/src/net/i2p/android/router/activity/MainActivity.java b/src/net/i2p/android/router/activity/MainActivity.java index cdc91c350..e0eb59dbc 100644 --- a/src/net/i2p/android/router/activity/MainActivity.java +++ b/src/net/i2p/android/router/activity/MainActivity.java @@ -2,13 +2,18 @@ package net.i2p.android.router.activity; import android.content.Intent; import android.os.Bundle; +import android.os.Handler; import android.view.View; import android.widget.Button; +import android.widget.TextView; import net.i2p.android.router.R; public class MainActivity extends I2PActivityBase { + private Handler _handler; + private Runnable _updater; + /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) @@ -17,15 +22,74 @@ public class MainActivity extends I2PActivityBase { setContentView(R.layout.main); Button news = (Button) findViewById(R.id.news_button); - if (news == null) { - System.err.println("No button resource!"); - return; - } news.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Intent intent = new Intent(view.getContext(), NewsActivity.class); startActivityForResult(intent, 0); } }); + + Button start = (Button) findViewById(R.id.router_start_button); + start.setOnClickListener(new View.OnClickListener() { + public void onClick(View view) { + if (_routerService != null && _isBound) { + _routerService.manualStart(); + updateVisibility(); + } + } + }); + + Button stop = (Button) findViewById(R.id.router_stop_button); + stop.setOnClickListener(new View.OnClickListener() { + public void onClick(View view) { + if (_routerService != null && _isBound) { + _routerService.manualStop(); + updateVisibility(); + } + } + }); + + _handler = new Handler(); + _updater = new Updater(); + } + + + @Override + public void onStart() + { + super.onStart(); + _handler.removeCallbacks(_updater); + _handler.postDelayed(_updater, 50); + } + + @Override + public void onStop() + { + super.onStop(); + _handler.removeCallbacks(_updater); + } + + @Override + public void onResume() + { + super.onResume(); + updateVisibility(); + } + + private class Updater implements Runnable { + public void run() { + updateVisibility(); + _handler.postDelayed(this, 2500); + } + } + + private void updateVisibility() { + boolean showStart = _routerService != null && _isBound && _routerService.canManualStart(); + Button start = (Button) findViewById(R.id.router_start_button); + start.setVisibility(showStart ? View.VISIBLE : View.INVISIBLE); + + boolean showStop = _routerService != null && _isBound && _routerService.canManualStop(); + Button stop = (Button) findViewById(R.id.router_stop_button); + stop.setVisibility(showStop ? View.VISIBLE : View.INVISIBLE); } } diff --git a/src/net/i2p/android/router/service/RouterService.java b/src/net/i2p/android/router/service/RouterService.java index eb8d3eb79..c34888442 100644 --- a/src/net/i2p/android/router/service/RouterService.java +++ b/src/net/i2p/android/router/service/RouterService.java @@ -59,10 +59,11 @@ public class RouterService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { System.err.println(this + " onStart called" + - "Current state is: " + _state); + " Current state is: " + _state); synchronized (_stateLock) { if (_state != State.INIT) - return START_STICKY; + //return START_STICKY; + return START_NOT_STICKY; _receiver = new I2PReceiver(this); if (_receiver.isConnected()) { _statusBar.update("I2P is starting up"); @@ -76,14 +77,15 @@ public class RouterService extends Service { _starterThread.start(); } } - return START_STICKY; + //return START_STICKY; + return START_NOT_STICKY; } /** 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 thread" + - "Current state is: " + _state); + " Current state is: " + _state); while (_state == State.WAITING) { try { Thread.sleep(30*1000); @@ -110,7 +112,7 @@ public class RouterService extends Service { private class Starter implements Runnable { public void run() { System.err.println(MARKER + this + " starter thread" + - "Current state is: " + _state); + " Current state is: " + _state); //System.err.println(MARKER + this + " JBigI speed test started"); //NativeBigInteger.main(null); //System.err.println(MARKER + this + " JBigI speed test finished, launching router"); @@ -139,7 +141,7 @@ public class RouterService extends Service { private class StatusThread implements Runnable { public void run() { System.err.println(MARKER + this + " status thread started" + - "Current state is: " + _state); + " Current state is: " + _state); Router router = _context.router(); while (_state == State.RUNNING && router.isAlive()) { try { @@ -187,7 +189,7 @@ public class RouterService extends Service { } _statusBar.update("Status thread died"); System.err.println(MARKER + this + " status thread finished" + - "Current state is: " + _state); + " Current state is: " + _state); } } @@ -195,7 +197,7 @@ public class RouterService extends Service { public IBinder onBind(Intent intent) { System.err.println("onBind called" + - "Current state is: " + _state); + " Current state is: " + _state); return _binder; } @@ -218,13 +220,19 @@ public class RouterService extends Service { return rv; } + public boolean canManualStop() { + return _state == State.WAITING || _state == State.STARTING || _state == State.RUNNING; + } + /** * Stop and don't restart */ public void manualStop() { System.err.println("manualStop called" + - "Current state is: " + _state); + " Current state is: " + _state); synchronized (_stateLock) { + if (!canManualStop()) + return; if (_state == State.WAITING || _state == State.STARTING) _starterThread.interrupt(); if (_state == State.STARTING || _state == State.RUNNING) { @@ -240,7 +248,7 @@ public class RouterService extends Service { */ public void networkStop() { System.err.println("networkStop called" + - "Current state is: " + _state); + " Current state is: " + _state); synchronized (_stateLock) { if (_state == State.WAITING || _state == State.STARTING) _starterThread.interrupt(); @@ -253,7 +261,21 @@ public class RouterService extends Service { } } - public void restart() { + public boolean canManualStart() { + return _state == State.MANUAL_STOPPED; + } + + public void manualStart() { + System.err.println("restart called" + + " Current state is: " + _state); + synchronized (_stateLock) { + if (!canManualStart()) + return; + _statusBar.update("I2P is starting up"); + _state = State.STARTING; + _starterThread = new Thread(new Starter()); + _starterThread.start(); + } } // ******** end methods accessed from Activities and Receivers ************ @@ -261,14 +283,17 @@ public class RouterService extends Service { @Override public void onDestroy() { System.err.println("onDestroy called" + - "Current state is: " + _state); + " Current state is: " + _state); _statusBar.off(this); I2PReceiver rcvr = _receiver; if (rcvr != null) { synchronized(rcvr) { - unregisterReceiver(rcvr); + try { + // throws if not registered + unregisterReceiver(rcvr); + } catch (IllegalArgumentException iae) {} //rcvr.unbindRouter(); //_receiver = null; } @@ -298,11 +323,11 @@ public class RouterService extends Service { public void run() { System.err.println(MARKER + this + " stopper thread" + - "Current state is: " + _state); + " Current state is: " + _state); if (_context != null) _context.router().shutdown(Router.EXIT_HARD); _statusBar.off(RouterService.this); - System.err.println("shutdown complete"); + System.err.println("********** Router shutdown complete"); synchronized (_stateLock) { if (_state == nextState) _state = stopState; @@ -313,12 +338,15 @@ public class RouterService extends Service { private class ShutdownHook implements Runnable { public void run() { System.err.println(this + " shutdown hook" + - "Current state is: " + _state); + " Current state is: " + _state); _statusBar.off(RouterService.this); I2PReceiver rcvr = _receiver; if (rcvr != null) { synchronized(rcvr) { - unregisterReceiver(rcvr); + try { + // throws if not registered + unregisterReceiver(rcvr); + } catch (IllegalArgumentException iae) {} //rcvr.unbindRouter(); //_receiver = null; } diff --git a/src/net/i2p/util/LogWriter.java b/src/net/i2p/util/LogWriter.java index 18ba54c8e..8de250199 100644 --- a/src/net/i2p/util/LogWriter.java +++ b/src/net/i2p/util/LogWriter.java @@ -47,7 +47,6 @@ class LogWriter implements Runnable { flushRecords(); rereadConfig(); } - System.err.println("Done writing"); } catch (Exception e) { System.err.println("Error writing the logs: " + e.getMessage()); e.printStackTrace(); -- GitLab