From 3f62eded024ca9d8273d0a33140416324c6d5f46 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Sat, 11 Jun 2011 21:02:39 +0000
Subject: [PATCH] simple wait for network thread. still need to hook up the
 binder

---
 .../android/router/receiver/I2PReceiver.java  |  5 ++
 .../android/router/service/RouterService.java | 50 ++++++++++++++++---
 2 files changed, 47 insertions(+), 8 deletions(-)

diff --git a/src/net/i2p/android/router/receiver/I2PReceiver.java b/src/net/i2p/android/router/receiver/I2PReceiver.java
index 1116cf775..e4a566680 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 c47e53762..2c4cf7e90 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;
                 }
-- 
GitLab