diff --git a/briar-android/src/net/sf/briar/android/BriarService.java b/briar-android/src/net/sf/briar/android/BriarService.java index dee2fda34063716891e447fb0b69f8e46390ec12..ebcd1d04e936509414999041f372ca37fc4abe19 100644 --- a/briar-android/src/net/sf/briar/android/BriarService.java +++ b/briar-android/src/net/sf/briar/android/BriarService.java @@ -4,6 +4,7 @@ import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; import java.io.IOException; +import java.util.concurrent.CountDownLatch; import java.util.logging.Logger; import net.sf.briar.R; @@ -12,7 +13,9 @@ import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DbException; import net.sf.briar.api.plugins.PluginManager; import roboguice.service.RoboService; +import android.content.ComponentName; import android.content.Intent; +import android.content.ServiceConnection; import android.os.Binder; import android.os.IBinder; import android.support.v4.app.NotificationCompat; @@ -24,6 +27,8 @@ public class BriarService extends RoboService { private static final Logger LOG = Logger.getLogger(BriarService.class.getName()); + private final CountDownLatch startupLatch = new CountDownLatch(1); + private final CountDownLatch shutdownLatch = new CountDownLatch(1); private final Binder binder = new BriarBinder(); @Inject private DatabaseComponent db; @@ -82,6 +87,7 @@ public class BriarService extends RoboService { int pluginsStarted = pluginManager.start(this); if(LOG.isLoggable(INFO)) LOG.info(pluginsStarted + " plugins started"); + startupLatch.countDown(); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); } catch(IOException e) { @@ -99,6 +105,7 @@ public class BriarService extends RoboService { if(LOG.isLoggable(INFO)) LOG.info("Key manager stopped"); db.close(); if(LOG.isLoggable(INFO)) LOG.info("Database closed"); + shutdownLatch.countDown(); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); } catch(IOException e) { @@ -106,10 +113,41 @@ public class BriarService extends RoboService { } } + public void waitForStartup() throws InterruptedException { + startupLatch.await(); + } + + public void shutdown() { + stopSelf(); + } + + public void waitForShutdown() throws InterruptedException { + shutdownLatch.await(); + } + public class BriarBinder extends Binder { - BriarService getService() { + public BriarService getService() { return BriarService.this; } } + + public static class BriarServiceConnection implements ServiceConnection { + + private final CountDownLatch binderLatch = new CountDownLatch(1); + + private volatile IBinder binder = null; + + public void onServiceConnected(ComponentName name, IBinder binder) { + this.binder = binder; + binderLatch.countDown(); + } + + public void onServiceDisconnected(ComponentName name) {} + + public IBinder waitForBinder() throws InterruptedException { + binderLatch.await(); + return binder; + } + } }