I2P Address: [http://git.idk.i2p]

Skip to content
Snippets Groups Projects
Commit e86e69f4 authored by zzz's avatar zzz
Browse files

- Move network waiter from a thread to the service handler

- Allow quitting while waiting
- Move connected detection to utility class
- Use connected info for displaying buttons
parent 29b9ca63
No related branches found
No related tags found
No related merge requests found
......@@ -14,6 +14,7 @@ import android.view.MenuItem;
import net.i2p.android.router.R;
import net.i2p.android.router.binder.RouterBinder;
import net.i2p.android.router.service.RouterService;
import net.i2p.android.router.util.Util;
import net.i2p.router.CommSystemFacade;
import net.i2p.router.NetworkDatabaseFacade;
import net.i2p.router.Router;
......@@ -145,7 +146,8 @@ public abstract class I2PActivityBase extends Activity {
public boolean onPrepareOptionsMenu(Menu menu) {
// add/hide items here
RouterService svc = _routerService;
boolean showStart = (svc == null) || (!_isBound) || svc.canManualStart();
boolean showStart = ((svc == null) || (!_isBound) || svc.canManualStart()) &&
Util.isConnected(this);
MenuItem start = menu.findItem(R.id.menu_start);
start.setVisible(showStart);
start.setEnabled(showStart);
......
......@@ -199,7 +199,8 @@ public class MainActivity extends I2PActivityBase {
private void updateVisibility() {
RouterService svc = _routerService;
boolean showStart = (svc == null) || (!_isBound) || svc.canManualStart();
boolean showStart = ((svc == null) || (!_isBound) || svc.canManualStart()) &&
Util.isConnected(this);
Button start = (Button) findViewById(R.id.router_start_button);
start.setVisibility(showStart ? View.VISIBLE : View.INVISIBLE);
......@@ -214,7 +215,10 @@ public class MainActivity extends I2PActivityBase {
private void updateStatus() {
RouterContext ctx = getRouterContext();
TextView tv = (TextView) findViewById(R.id.main_status_text);
if (ctx != null) {
if (!Util.isConnected(this)) {
tv.setText("No Internet connection is available");
tv.setVisibility(View.VISIBLE);
} else if (ctx != null) {
int active = ctx.commSystem().countActivePeers();
int known = Math.max(ctx.netDb().getKnownRouters() - 1, 0);
int inEx = ctx.tunnelManager().getFreeTunnelCount();
......
......@@ -8,11 +8,11 @@ import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.IBinder;
import net.i2p.android.router.binder.RouterBinder;
import net.i2p.android.router.service.RouterService;
import net.i2p.android.router.util.Util;
public class I2PReceiver extends BroadcastReceiver {
private final Context _context;
......@@ -21,7 +21,6 @@ public class I2PReceiver extends BroadcastReceiver {
private int _unconnectedCount;
private RouterService _routerService;
private ServiceConnection _connection;
private static final boolean _isEmulator = Build.MODEL.equals("sdk");
/**
* Registers itself
......@@ -29,13 +28,12 @@ public class I2PReceiver extends BroadcastReceiver {
public I2PReceiver(Context context) {
super();
_context = context;
getInfo();
IntentFilter intents = new IntentFilter();
intents.addAction(Intent.ACTION_TIME_CHANGED);
intents.addAction(Intent.ACTION_TIME_TICK); // once per minute, for testing
intents.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(this, intents);
_wasConnected = isConnected();
_wasConnected = Util.isConnected(context);
}
public void onReceive(Context context, Intent intent) {
......@@ -59,7 +57,7 @@ public class I2PReceiver extends BroadcastReceiver {
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION) ||
action.equals(Intent.ACTION_TIME_TICK)) {
boolean connected = isConnected();
boolean connected = Util.isConnected(context);
if (_wasConnected && !connected) {
// notify + 2 timer ticks
if (++_unconnectedCount >= 3) {
......@@ -80,22 +78,7 @@ public class I2PReceiver extends BroadcastReceiver {
}
}
public boolean isConnected() {
// emulator always returns null NetworkInfo
if (_isEmulator)
return true;
NetworkInfo current = getInfo();
return current != null && current.isConnected();
}
private NetworkInfo getInfo() {
ConnectivityManager cm = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo current = cm.getActiveNetworkInfo();
System.err.println("Current network info:");
printInfo(current);
return current;
}
/****
private static void printInfo(NetworkInfo ni) {
if (ni == null) {
System.err.println("Network info is null");
......@@ -113,6 +96,7 @@ public class I2PReceiver extends BroadcastReceiver {
" failover: " + ni.isFailover());
}
****/
private boolean bindRouter() {
Intent intent = new Intent();
......
......@@ -15,6 +15,7 @@ import java.util.List;
import net.i2p.android.router.R;
import net.i2p.android.router.binder.RouterBinder;
import net.i2p.android.router.receiver.I2PReceiver;
import net.i2p.android.router.util.Util;
import net.i2p.data.DataHelper;
import net.i2p.router.Job;
import net.i2p.router.Router;
......@@ -77,7 +78,7 @@ public class RouterService extends Service {
//return START_STICKY;
return START_NOT_STICKY;
_receiver = new I2PReceiver(this);
if (_receiver.isConnected()) {
if (Util.isConnected(this)) {
_statusBar.update("I2P is starting up");
_state = State.STARTING;
_starterThread = new Thread(new Starter());
......@@ -99,28 +100,22 @@ 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 thread" +
System.err.println(MARKER + this + " waiter handler" +
" Current state is: " + _state);
while (_state == State.WAITING) {
try {
Thread.sleep(30*1000);
} catch (InterruptedException ie) {
break;
}
if (_receiver.isConnected()) {
if (_state == State.WAITING) {
if (Util.isConnected(RouterService.this)) {
synchronized (_stateLock) {
if (_state != State.WAITING)
break;
return;
_statusBar.update("Network connected, I2P is starting up");
_state = State.STARTING;
_starterThread = new Thread(new Starter());
_starterThread.start();
}
break;
return;
}
_handler.postDelayed(this, 15*1000);
}
System.err.println("waiter finished");
}
}
......@@ -236,7 +231,7 @@ public class RouterService extends Service {
synchronized (_stateLock) {
if (!canManualStop())
return;
if (_state == State.WAITING || _state == State.STARTING)
if (_state == State.STARTING)
_starterThread.interrupt();
if (_state == State.STARTING || _state == State.RUNNING) {
_statusBar.update("Stopping I2P");
......@@ -255,12 +250,15 @@ public class RouterService extends Service {
synchronized (_stateLock) {
if (!canManualStop())
return;
if (_state == State.WAITING || _state == State.STARTING)
if (_state == State.STARTING)
_starterThread.interrupt();
if (_state == State.STARTING || _state == State.RUNNING) {
_statusBar.update("Quitting I2P");
Thread stopperThread = new Thread(new Stopper(State.MANUAL_QUITTING, State.MANUAL_QUITTED));
stopperThread.start();
} else if (_state == State.WAITING) {
_state = State.MANUAL_QUITTING;
(new FinalShutdownHook()).run();
}
}
}
......@@ -272,7 +270,7 @@ public class RouterService extends Service {
System.err.println("networkStop called" +
" Current state is: " + _state);
synchronized (_stateLock) {
if (_state == State.WAITING || _state == State.STARTING)
if (_state == State.STARTING)
_starterThread.interrupt();
if (_state == State.STARTING || _state == State.RUNNING) {
_statusBar.update("Network disconnected, stopping I2P");
......@@ -327,7 +325,7 @@ public class RouterService extends Service {
}
}
synchronized (_stateLock) {
if (_state == State.WAITING || _state == State.STARTING)
if (_state == State.STARTING)
_starterThread.interrupt();
if (_state == State.STARTING || _state == State.RUNNING) {
// should this be in a thread?
......@@ -394,7 +392,7 @@ public class RouterService extends Service {
synchronized (_stateLock) {
// null out to release the memory
_context = null;
if (_state == State.WAITING || _state == State.STARTING)
if (_state == State.STARTING)
_starterThread.interrupt();
if (_state == State.WAITING || _state == State.STARTING ||
_state == State.RUNNING)
......@@ -421,15 +419,14 @@ public class RouterService extends Service {
synchronized (_stateLock) {
// null out to release the memory
_context = null;
if (_state == State.WAITING || _state == State.STARTING)
if (_state == State.STARTING)
_starterThread.interrupt();
if (_state == State.MANUAL_STOPPING) {
_state = State.MANUAL_STOPPED;
} else if (_state == State.NETWORK_STOPPING) {
// start waiter thread
// start waiter handler
_state = State.WAITING;
_starterThread = new Thread(new Waiter());
_starterThread.start();
_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");
......
......@@ -3,8 +3,12 @@ package net.i2p.android.router.util;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
public abstract class Util {
private static final boolean _isEmulator = Build.MODEL.equals("sdk");
public static String getOurVersion(Context ctx) {
PackageManager pm = ctx.getPackageManager();
......@@ -20,4 +24,19 @@ public abstract class Util {
} catch (Exception e) {}
return "??";
}
public static boolean isConnected(Context ctx) {
// emulator always returns null NetworkInfo
if (_isEmulator)
return true;
NetworkInfo current = getNetworkInfo(ctx);
return current != null && current.isConnected();
}
public static NetworkInfo getNetworkInfo(Context ctx) {
ConnectivityManager cm = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo current = cm.getActiveNetworkInfo();
return current;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment