Use the event bus to observe contacts connecting and disconnecting.

This commit is contained in:
akwizgran
2014-10-03 10:04:02 +01:00
parent 8b8df435a5
commit cdb5a12156
8 changed files with 85 additions and 51 deletions

View File

@@ -31,6 +31,8 @@ import org.briarproject.api.db.DbException;
import org.briarproject.api.db.MessageHeader;
import org.briarproject.api.db.NoSuchContactException;
import org.briarproject.api.event.ContactAddedEvent;
import org.briarproject.api.event.ContactConnectedEvent;
import org.briarproject.api.event.ContactDisconnectedEvent;
import org.briarproject.api.event.ContactRemovedEvent;
import org.briarproject.api.event.Event;
import org.briarproject.api.event.EventBus;
@@ -38,7 +40,6 @@ import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.MessageAddedEvent;
import org.briarproject.api.event.MessageExpiredEvent;
import org.briarproject.api.messaging.GroupId;
import org.briarproject.api.transport.ConnectionListener;
import org.briarproject.api.transport.ConnectionRegistry;
import android.content.Intent;
@@ -61,7 +62,7 @@ import android.widget.Toast;
public class ContactListActivity extends BriarActivity
implements OnClickListener, OnItemClickListener, OnCreateContextMenuListener,
EventListener, ConnectionListener {
EventListener {
private static final int MENU_ITEM_DELETE = 1;
private static final Logger LOG =
@@ -128,7 +129,6 @@ EventListener, ConnectionListener {
public void onResume() {
super.onResume();
eventBus.addListener(this);
connectionRegistry.addListener(this);
loadContacts();
}
@@ -213,7 +213,6 @@ EventListener, ConnectionListener {
public void onPause() {
super.onPause();
eventBus.removeListener(this);
connectionRegistry.removeListener(this);
}
public void onClick(View view) {
@@ -271,6 +270,10 @@ EventListener, ConnectionListener {
public void eventOccurred(Event e) {
if(e instanceof ContactAddedEvent) {
loadContacts();
} else if(e instanceof ContactConnectedEvent) {
setConnected(((ContactConnectedEvent) e).getContactId(), true);
} else if(e instanceof ContactDisconnectedEvent) {
setConnected(((ContactDisconnectedEvent) e).getContactId(), false);
} else if(e instanceof ContactRemovedEvent) {
LOG.info("Contact removed");
removeItem(((ContactRemovedEvent) e).getContactId());
@@ -335,14 +338,6 @@ EventListener, ConnectionListener {
});
}
public void contactConnected(ContactId c) {
setConnected(c, true);
}
public void contactDisconnected(ContactId c) {
setConnected(c, false);
}
private void setConnected(final ContactId c, final boolean connected) {
runOnUiThread(new Runnable() {
public void run() {

View File

@@ -0,0 +1,20 @@
package org.briarproject.api.event;
import org.briarproject.api.ContactId;
/**
* An event that is broadcast when a contact connects that was not previously
* connected via any transport.
*/
public class ContactConnectedEvent extends Event {
private final ContactId contactId;
public ContactConnectedEvent(ContactId contactId) {
this.contactId = contactId;
}
public ContactId getContactId() {
return contactId;
}
}

View File

@@ -0,0 +1,20 @@
package org.briarproject.api.event;
import org.briarproject.api.ContactId;
/**
* An event that is broadcast when a contact disconnects and is no longer
* connected via any transport.
*/
public class ContactDisconnectedEvent extends Event {
private final ContactId contactId;
public ContactDisconnectedEvent(ContactId contactId) {
this.contactId = contactId;
}
public ContactId getContactId() {
return contactId;
}
}

View File

@@ -1,13 +0,0 @@
package org.briarproject.api.transport;
import org.briarproject.api.ContactId;
/** An interface for listening for connection and disconnection events. */
public interface ConnectionListener {
/** Called when a contact connects and has no existing connections. */
void contactConnected(ContactId c);
/** Called when a contact disconnects and has no remaining connections. */
void contactDisconnected(ContactId c);
}

View File

@@ -10,10 +10,6 @@ import org.briarproject.api.TransportId;
*/
public interface ConnectionRegistry {
void addListener(ConnectionListener c);
void removeListener(ConnectionListener c);
void registerConnection(ContactId c, TransportId t);
void unregisterConnection(ContactId c, TransportId t);

View File

@@ -8,37 +8,33 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger;
import org.briarproject.api.ContactId;
import org.briarproject.api.TransportId;
import org.briarproject.api.transport.ConnectionListener;
import org.briarproject.api.event.ContactConnectedEvent;
import org.briarproject.api.event.ContactDisconnectedEvent;
import org.briarproject.api.event.EventBus;
import org.briarproject.api.transport.ConnectionRegistry;
import com.google.inject.Inject;
class ConnectionRegistryImpl implements ConnectionRegistry {
private static final Logger LOG =
Logger.getLogger(ConnectionRegistryImpl.class.getName());
private final EventBus eventBus;
// Locking: this
private final Map<TransportId, Map<ContactId, Integer>> connections;
// Locking: this
private final Map<ContactId, Integer> contactCounts;
private final List<ConnectionListener> listeners;
ConnectionRegistryImpl() {
@Inject
ConnectionRegistryImpl(EventBus eventBus) {
this.eventBus = eventBus;
connections = new HashMap<TransportId, Map<ContactId, Integer>>();
contactCounts = new HashMap<ContactId, Integer>();
listeners = new CopyOnWriteArrayList<ConnectionListener>();
}
public void addListener(ConnectionListener c) {
listeners.add(c);
}
public void removeListener(ConnectionListener c) {
listeners.remove(c);
}
public void registerConnection(ContactId c, TransportId t) {
@@ -63,7 +59,7 @@ class ConnectionRegistryImpl implements ConnectionRegistry {
}
if(firstConnection) {
LOG.info("Contact connected");
for(ConnectionListener l : listeners) l.contactConnected(c);
eventBus.broadcast(new ContactConnectedEvent(c));
}
}
@@ -91,7 +87,7 @@ class ConnectionRegistryImpl implements ConnectionRegistry {
}
if(lastConnection) {
LOG.info("Contact disconnected");
for(ConnectionListener l : listeners) l.contactDisconnected(c);
eventBus.broadcast(new ContactDisconnectedEvent(c));
}
}

View File

@@ -22,9 +22,10 @@ public class TransportModule extends AbstractModule {
ConnectionReaderFactoryImpl.class);
bind(ConnectionRecogniser.class).to(
ConnectionRecogniserImpl.class).in(Singleton.class);
bind(ConnectionRegistry.class).toInstance(new ConnectionRegistryImpl());
bind(ConnectionWriterFactory.class).to(
ConnectionWriterFactoryImpl.class);
bind(ConnectionRegistry.class).to(
ConnectionRegistryImpl.class).in(Singleton.class);;
bind(ConnectionWriterFactory.class).to(
ConnectionWriterFactoryImpl.class);
}
@Provides @Singleton

View File

@@ -7,7 +7,12 @@ import java.util.Collections;
import org.briarproject.BriarTestCase;
import org.briarproject.api.ContactId;
import org.briarproject.api.TransportId;
import org.briarproject.api.event.ContactConnectedEvent;
import org.briarproject.api.event.ContactDisconnectedEvent;
import org.briarproject.api.event.EventBus;
import org.briarproject.api.transport.ConnectionRegistry;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.junit.Test;
public class ConnectionRegistryImplTest extends BriarTestCase {
@@ -24,13 +29,24 @@ public class ConnectionRegistryImplTest extends BriarTestCase {
@Test
public void testRegisterAndUnregister() {
ConnectionRegistry c = new ConnectionRegistryImpl();
Mockery context = new Mockery();
final EventBus eventBus = context.mock(EventBus.class);
context.checking(new Expectations() {{
exactly(3).of(eventBus).broadcast(with(any(
ContactConnectedEvent.class)));
oneOf(eventBus).broadcast(with(any(
ContactDisconnectedEvent.class)));
}});
ConnectionRegistry c = new ConnectionRegistryImpl(eventBus);
// The registry should be empty
assertEquals(Collections.emptyList(),
c.getConnectedContacts(transportId));
assertEquals(Collections.emptyList(),
c.getConnectedContacts(transportId1));
// Check that a registered connection shows up
// Check that a registered connection shows up - this should
// broadcast a ContactConnectedEvent
c.registerConnection(contactId, transportId);
assertEquals(Arrays.asList(contactId),
c.getConnectedContacts(transportId));
@@ -48,7 +64,8 @@ public class ConnectionRegistryImplTest extends BriarTestCase {
c.getConnectedContacts(transportId));
assertEquals(Collections.emptyList(),
c.getConnectedContacts(transportId1));
// Unregister the other connection - lookup should be affected
// Unregister the other connection - lookup should be affected -
// this should broadcast a ContactDisconnectedEvent
c.unregisterConnection(contactId, transportId);
assertEquals(Collections.emptyList(),
c.getConnectedContacts(transportId));
@@ -59,7 +76,8 @@ public class ConnectionRegistryImplTest extends BriarTestCase {
c.unregisterConnection(contactId, transportId);
fail();
} catch(IllegalArgumentException expected) {}
// Register both contacts with one transport, one contact with both
// Register both contacts with one transport, one contact with both -
// this should broadcast two ContactConnectedEvents
c.registerConnection(contactId, transportId);
c.registerConnection(contactId1, transportId);
c.registerConnection(contactId1, transportId1);
@@ -69,5 +87,6 @@ public class ConnectionRegistryImplTest extends BriarTestCase {
assertTrue(connected.contains(contactId1));
assertEquals(Arrays.asList(contactId1),
c.getConnectedContacts(transportId1));
context.assertIsSatisfied();
}
}