diff --git a/src/net/i2p/android/router/receiver/I2PReceiver.java b/src/net/i2p/android/router/receiver/I2PReceiver.java index 1116cf775f66eb3a61ddf884df4703b5703270f7..e4a5666802a73a18319cee82c9f4b350398a367a 100644 --- a/src/net/i2p/android/router/receiver/I2PReceiver.java +++ b/src/net/i2p/android/router/receiver/I2PReceiver.java @@ -46,6 +46,11 @@ public class I2PReceiver extends BroadcastReceiver { } } + public boolean isConnected() { + NetworkInfo current = getInfo(); + return current != null && current.isConnected(); + } + private NetworkInfo getInfo() { ConnectivityManager cm = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo current = cm.getActiveNetworkInfo(); diff --git a/src/net/i2p/android/router/service/RouterService.java b/src/net/i2p/android/router/service/RouterService.java index c47e53762e2f0f99e949fd9e041489ba4ce83ed0..2c4cf7e90130ddd594aa3e7a76d9182f81db2bdd 100644 --- a/src/net/i2p/android/router/service/RouterService.java +++ b/src/net/i2p/android/router/service/RouterService.java @@ -24,7 +24,7 @@ import net.i2p.util.NativeBigInteger; * Runs the router */ public class RouterService extends Service { - private enum State {INIT, STARTING, RUNNING, STOPPING, STOPPED} + private enum State {INIT, WAITING, STARTING, RUNNING, STOPPING, STOPPED} private RouterContext _context; private String _myDir; @@ -33,7 +33,7 @@ public class RouterService extends Service { private Thread _starterThread; private Thread _statusThread; private StatusBar _statusBar; - private BroadcastReceiver _receiver; + private I2PReceiver _receiver; private final Object _stateLock = new Object(); private static final String MARKER = "************************************** "; @@ -58,16 +58,50 @@ public class RouterService extends Service { synchronized (_stateLock) { if (_state != State.INIT) return START_STICKY; - _statusBar.update("I2P is starting up"); - _state = State.STARTING; - - _starterThread = new Thread(new Starter()); - _starterThread.start(); _receiver = new I2PReceiver(this); + if (_receiver.isConnected()) { + _statusBar.update("I2P is starting up"); + _state = State.STARTING; + _starterThread = new Thread(new Starter()); + _starterThread.start(); + } else { + _statusBar.update("I2P is waiting for a network connection"); + _state = State.WAITING; + _starterThread = new Thread(new Waiter()); + _starterThread.start(); + } } return START_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); + while (_state == State.WAITING) { + try { + Thread.sleep(30*1000); + } catch (InterruptedException ie) { + break; + } + + if (_receiver.isConnected()) { + synchronized (_stateLock) { + if (_state != State.WAITING) + break; + _statusBar.update("Network connected, I2P is starting up"); + _state = State.STARTING; + _starterThread = new Thread(new Starter()); + _starterThread.start(); + } + break; + } + } + System.err.println("waiter finished"); + } + } + private class Starter implements Runnable { public void run() { System.err.println(MARKER + this + " starter thread" + @@ -104,7 +138,7 @@ public class RouterService extends Service { Router router = _context.router(); while (_state == State.RUNNING && router.isAlive()) { try { - Thread.sleep(5000); + Thread.sleep(15*1000); } catch (InterruptedException ie) { break; }