Create two new events to signal enabling and disabling of transports

This commit is contained in:
Torsten Grote
2015-12-16 13:48:56 -02:00
parent c7e4d5ffa9
commit 2d28dcada2
14 changed files with 132 additions and 18 deletions

View File

@@ -116,6 +116,10 @@
<string name="online">Online</string> <string name="online">Online</string>
<string name="offline">Offline</string> <string name="offline">Offline</string>
<string name="send">Send</string> <string name="send">Send</string>
<string name="data_transports">Data Transports</string>
<string name="transport_tor">Internet via Tor</string>
<string name="transport_bt">Bluetooth</string>
<string name="transport_lan">Local Area Network</string>
<!-- Dialogs --> <!-- Dialogs -->
<string name="dialog_title_lost_password">Lost password</string> <string name="dialog_title_lost_password">Lost password</string>

View File

@@ -18,9 +18,19 @@ import org.briarproject.android.contact.ContactListActivity;
import org.briarproject.android.forum.ForumListActivity; import org.briarproject.android.forum.ForumListActivity;
import org.briarproject.android.util.LayoutUtils; import org.briarproject.android.util.LayoutUtils;
import org.briarproject.api.LocalAuthor; import org.briarproject.api.LocalAuthor;
import org.briarproject.api.TransportId;
import org.briarproject.api.android.ReferenceManager; import org.briarproject.api.android.ReferenceManager;
import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
import org.briarproject.api.event.Event;
import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.TransportAddedEvent;
import org.briarproject.api.event.TransportDisabledEvent;
import org.briarproject.api.event.TransportEnabledEvent;
import org.briarproject.api.event.TransportRemovedEvent;
import org.briarproject.api.plugins.Plugin;
import org.briarproject.api.plugins.PluginManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -34,15 +44,17 @@ import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING; import static java.util.logging.Level.WARNING;
import static org.briarproject.android.util.CommonLayoutParams.MATCH_MATCH; import static org.briarproject.android.util.CommonLayoutParams.MATCH_MATCH;
public class DashboardActivity extends BriarActivity { public class DashboardActivity extends BriarActivity implements EventListener {
private static final Logger LOG = private static final Logger LOG =
Logger.getLogger(DashboardActivity.class.getName()); Logger.getLogger(DashboardActivity.class.getName());
@Inject private ReferenceManager referenceManager; @Inject private ReferenceManager referenceManager;
@Inject private PluginManager pluginManager;
// Fields that are accessed from background threads must be volatile // Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db; @Inject private volatile DatabaseComponent db;
@Inject private volatile EventBus eventBus;
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
@@ -50,12 +62,41 @@ public class DashboardActivity extends BriarActivity {
handleIntent(getIntent()); handleIntent(getIntent());
} }
@Override
public void onResume() {
super.onResume();
eventBus.addListener(this);
}
@Override
public void onPause() {
super.onPause();
eventBus.removeListener(this);
}
@Override @Override
public void onNewIntent(Intent i) { public void onNewIntent(Intent i) {
super.onNewIntent(i); super.onNewIntent(i);
handleIntent(i); handleIntent(i);
} }
@Override
public void eventOccurred(Event e) {
if (e instanceof TransportEnabledEvent) {
TransportId id = ((TransportEnabledEvent) e).getTransportId();
if (LOG.isLoggable(INFO)) {
LOG.info("TransportEnabledEvent: " + id.getString());
}
} else if (e instanceof TransportDisabledEvent) {
TransportId id = ((TransportDisabledEvent) e).getTransportId();
if (LOG.isLoggable(INFO)) {
LOG.info("TransportDisabledEvent: " + id.getString());
}
}
}
private void handleIntent(Intent i) { private void handleIntent(Intent i) {
boolean failed = i.getBooleanExtra("briar.STARTUP_FAILED", false); boolean failed = i.getBooleanExtra("briar.STARTUP_FAILED", false);
long handle = i.getLongExtra("briar.LOCAL_AUTHOR_HANDLE", -1); long handle = i.getLongExtra("briar.LOCAL_AUTHOR_HANDLE", -1);

View File

@@ -172,7 +172,7 @@ class DroidtoothPlugin implements DuplexPlugin {
} }
LOG.info("Socket bound"); LOG.info("Socket bound");
socket = ss; socket = ss;
callback.pollNow(); callback.transportEnabled();
acceptContactConnections(); acceptContactConnections();
} }
}); });
@@ -196,6 +196,8 @@ class DroidtoothPlugin implements DuplexPlugin {
if (ss != null) ss.close(); if (ss != null) ss.close();
} catch (IOException e) { } catch (IOException e) {
if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
} finally {
callback.transportDisabled();
} }
} }

View File

@@ -391,6 +391,8 @@ class TorPlugin implements DuplexPlugin, EventHandler,
if (ss != null) ss.close(); if (ss != null) ss.close();
} catch (IOException e) { } catch (IOException e) {
if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
} finally {
callback.transportDisabled();
} }
} }
@@ -459,7 +461,10 @@ class TorPlugin implements DuplexPlugin, EventHandler,
private void enableNetwork(boolean enable) throws IOException { private void enableNetwork(boolean enable) throws IOException {
if (!running) return; if (!running) return;
if (LOG.isLoggable(INFO)) LOG.info("Enabling network: " + enable); if (LOG.isLoggable(INFO)) LOG.info("Enabling network: " + enable);
if (!enable) circuitBuilt.set(false); if (!enable) {
circuitBuilt.set(false);
callback.transportDisabled();
}
networkEnabled = enable; networkEnabled = enable;
controlConnection.setConf("DisableNetwork", enable ? "0" : "1"); controlConnection.setConf("DisableNetwork", enable ? "0" : "1");
} }
@@ -549,7 +554,7 @@ class TorPlugin implements DuplexPlugin, EventHandler,
public void circuitStatus(String status, String id, String path) { public void circuitStatus(String status, String id, String path) {
if (status.equals("BUILT") && !circuitBuilt.getAndSet(true)) { if (status.equals("BUILT") && !circuitBuilt.getAndSet(true)) {
LOG.info("First circuit built"); LOG.info("First circuit built");
if (isRunning()) callback.pollNow(); if (isRunning()) callback.transportEnabled();
} }
} }
@@ -567,7 +572,7 @@ class TorPlugin implements DuplexPlugin, EventHandler,
if (LOG.isLoggable(INFO)) LOG.info(severity + " " + msg); if (LOG.isLoggable(INFO)) LOG.info(severity + " " + msg);
if (severity.equals("NOTICE") && msg.startsWith("Bootstrapped 100%")) { if (severity.equals("NOTICE") && msg.startsWith("Bootstrapped 100%")) {
bootstrapped = true; bootstrapped = true;
if (isRunning()) callback.pollNow(); if (isRunning()) callback.transportEnabled();
} }
} }

View File

@@ -0,0 +1,17 @@
package org.briarproject.api.event;
import org.briarproject.api.TransportId;
/** An event that is broadcast when a transport is disabled. */
public class TransportDisabledEvent extends Event {
private final TransportId transportId;
public TransportDisabledEvent(TransportId transportId) {
this.transportId = transportId;
}
public TransportId getTransportId() {
return transportId;
}
}

View File

@@ -0,0 +1,17 @@
package org.briarproject.api.event;
import org.briarproject.api.TransportId;
/** An event that is broadcast when a transport is enabled. */
public class TransportEnabledEvent extends Event {
private final TransportId transportId;
public TransportEnabledEvent(TransportId transportId) {
this.transportId = transportId;
}
public TransportId getTransportId() {
return transportId;
}
}

View File

@@ -50,6 +50,9 @@ public interface PluginCallback {
*/ */
void showMessage(String... message); void showMessage(String... message);
/** Schedules the plugin to be polled immediately. */ /** Signal that the transport got enabled. */
void pollNow(); void transportEnabled();
/** Signal that the transport got disabled. */
void transportDisabled();
} }

View File

@@ -6,6 +6,9 @@ import org.briarproject.api.TransportId;
import org.briarproject.api.TransportProperties; import org.briarproject.api.TransportProperties;
import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.TransportDisabledEvent;
import org.briarproject.api.event.TransportEnabledEvent;
import org.briarproject.api.lifecycle.IoExecutor; import org.briarproject.api.lifecycle.IoExecutor;
import org.briarproject.api.plugins.ConnectionManager; import org.briarproject.api.plugins.ConnectionManager;
import org.briarproject.api.plugins.Plugin; import org.briarproject.api.plugins.Plugin;
@@ -48,6 +51,7 @@ class PluginManagerImpl implements PluginManager {
Logger.getLogger(PluginManagerImpl.class.getName()); Logger.getLogger(PluginManagerImpl.class.getName());
private final Executor ioExecutor; private final Executor ioExecutor;
private final EventBus eventBus;
private final SimplexPluginConfig simplexPluginConfig; private final SimplexPluginConfig simplexPluginConfig;
private final DuplexPluginConfig duplexPluginConfig; private final DuplexPluginConfig duplexPluginConfig;
private final Clock clock; private final Clock clock;
@@ -60,12 +64,13 @@ class PluginManagerImpl implements PluginManager {
private final List<DuplexPlugin> duplexPlugins; private final List<DuplexPlugin> duplexPlugins;
@Inject @Inject
PluginManagerImpl(@IoExecutor Executor ioExecutor, PluginManagerImpl(@IoExecutor Executor ioExecutor, EventBus eventBus,
SimplexPluginConfig simplexPluginConfig, SimplexPluginConfig simplexPluginConfig,
DuplexPluginConfig duplexPluginConfig, Clock clock, DuplexPluginConfig duplexPluginConfig, Clock clock,
DatabaseComponent db, Poller poller, DatabaseComponent db, Poller poller,
ConnectionManager connectionManager, UiCallback uiCallback) { ConnectionManager connectionManager, UiCallback uiCallback) {
this.ioExecutor = ioExecutor; this.ioExecutor = ioExecutor;
this.eventBus = eventBus;
this.simplexPluginConfig = simplexPluginConfig; this.simplexPluginConfig = simplexPluginConfig;
this.duplexPluginConfig = duplexPluginConfig; this.duplexPluginConfig = duplexPluginConfig;
this.clock = clock; this.clock = clock;
@@ -360,10 +365,16 @@ class PluginManagerImpl implements PluginManager {
uiCallback.showMessage(message); uiCallback.showMessage(message);
} }
public void pollNow() { public void transportEnabled() {
eventBus.broadcast(new TransportEnabledEvent(id));
Plugin p = plugins.get(id); Plugin p = plugins.get(id);
if (p != null) poller.pollNow(p); if (p != null) poller.pollNow(p);
} }
public void transportDisabled() {
eventBus.broadcast(new TransportDisabledEvent(id));
}
} }
private class SimplexCallback extends PluginCallbackImpl private class SimplexCallback extends PluginCallbackImpl

View File

@@ -106,7 +106,7 @@ abstract class TcpPlugin implements DuplexPlugin {
SocketAddress local = ss.getLocalSocketAddress(); SocketAddress local = ss.getLocalSocketAddress();
setLocalSocketAddress((InetSocketAddress) local); setLocalSocketAddress((InetSocketAddress) local);
if (LOG.isLoggable(INFO)) LOG.info("Listening on " + local); if (LOG.isLoggable(INFO)) LOG.info("Listening on " + local);
callback.pollNow(); callback.transportEnabled();
acceptContactConnections(); acceptContactConnections();
} }
}); });
@@ -117,6 +117,8 @@ abstract class TcpPlugin implements DuplexPlugin {
if (ss != null) ss.close(); if (ss != null) ss.close();
} catch (IOException e) { } catch (IOException e) {
if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
} finally {
callback.transportDisabled();
} }
} }

View File

@@ -117,7 +117,7 @@ class BluetoothPlugin implements DuplexPlugin {
return; return;
} }
socket = ss; socket = ss;
callback.pollNow(); callback.transportEnabled();
acceptContactConnections(ss); acceptContactConnections(ss);
} }
}); });
@@ -145,6 +145,8 @@ class BluetoothPlugin implements DuplexPlugin {
if (ss != null) ss.close(); if (ss != null) ss.close();
} catch (IOException e) { } catch (IOException e) {
if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
} finally {
callback.transportDisabled();
} }
} }

View File

@@ -100,11 +100,13 @@ public abstract class DuplexClientTest extends DuplexTest {
public void showMessage(String... message) {} public void showMessage(String... message) {}
public void pollNow() {}
public void incomingConnectionCreated(DuplexTransportConnection d) {} public void incomingConnectionCreated(DuplexTransportConnection d) {}
public void outgoingConnectionCreated(ContactId contactId, public void outgoingConnectionCreated(ContactId contactId,
DuplexTransportConnection d) {} DuplexTransportConnection d) {}
public void transportEnabled() {}
public void transportDisabled() {}
} }
} }

View File

@@ -99,8 +99,6 @@ public abstract class DuplexServerTest extends DuplexTest {
public void showMessage(String... message) {} public void showMessage(String... message) {}
public void pollNow() {}
public void incomingConnectionCreated(DuplexTransportConnection d) { public void incomingConnectionCreated(DuplexTransportConnection d) {
System.out.println("Connection received"); System.out.println("Connection received");
sendChallengeReceiveResponse(d); sendChallengeReceiveResponse(d);
@@ -109,5 +107,9 @@ public abstract class DuplexServerTest extends DuplexTest {
public void outgoingConnectionCreated(ContactId c, public void outgoingConnectionCreated(ContactId c,
DuplexTransportConnection d) {} DuplexTransportConnection d) {}
public void transportEnabled() {}
public void transportDisabled() {}
} }
} }

View File

@@ -3,6 +3,8 @@ package org.briarproject.plugins;
import org.briarproject.BriarTestCase; import org.briarproject.BriarTestCase;
import org.briarproject.api.TransportId; import org.briarproject.api.TransportId;
import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.event.EventBus;
import org.briarproject.api.lifecycle.IoExecutor;
import org.briarproject.api.plugins.ConnectionManager; import org.briarproject.api.plugins.ConnectionManager;
import org.briarproject.api.plugins.duplex.DuplexPlugin; import org.briarproject.api.plugins.duplex.DuplexPlugin;
import org.briarproject.api.plugins.duplex.DuplexPluginCallback; import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
@@ -32,6 +34,7 @@ public class PluginManagerImplTest extends BriarTestCase {
Clock clock = new SystemClock(); Clock clock = new SystemClock();
Mockery context = new Mockery(); Mockery context = new Mockery();
final Executor ioExecutor = Executors.newCachedThreadPool(); final Executor ioExecutor = Executors.newCachedThreadPool();
final EventBus eventBus = context.mock(EventBus.class);
final SimplexPluginConfig simplexPluginConfig = final SimplexPluginConfig simplexPluginConfig =
context.mock(SimplexPluginConfig.class); context.mock(SimplexPluginConfig.class);
final DuplexPluginConfig duplexPluginConfig = final DuplexPluginConfig duplexPluginConfig =
@@ -121,9 +124,10 @@ public class PluginManagerImplTest extends BriarTestCase {
oneOf(simplexPlugin).stop(); oneOf(simplexPlugin).stop();
oneOf(duplexPlugin).stop(); oneOf(duplexPlugin).stop();
}}); }});
PluginManagerImpl p = new PluginManagerImpl(ioExecutor, PluginManagerImpl p = new PluginManagerImpl(ioExecutor, eventBus,
simplexPluginConfig, duplexPluginConfig, clock, db, poller, simplexPluginConfig, duplexPluginConfig, clock, db, poller,
dispatcher, uiCallback); dispatcher, uiCallback);
// Two plugins should be started and stopped // Two plugins should be started and stopped
assertTrue(p.start()); assertTrue(p.start());
assertTrue(p.stop()); assertTrue(p.stop());

View File

@@ -205,13 +205,15 @@ public class LanTcpPluginTest extends BriarTestCase {
public void showMessage(String... message) {} public void showMessage(String... message) {}
public void pollNow() {}
public void incomingConnectionCreated(DuplexTransportConnection d) { public void incomingConnectionCreated(DuplexTransportConnection d) {
connectionsLatch.countDown(); connectionsLatch.countDown();
} }
public void outgoingConnectionCreated(ContactId c, public void outgoingConnectionCreated(ContactId c,
DuplexTransportConnection d) {} DuplexTransportConnection d) {}
public void transportEnabled() {}
public void transportDisabled() {}
} }
} }