From 9422ba2718985b70de9c0feefe9e97c5a483d03b Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 25 Feb 2019 12:29:09 -0300 Subject: [PATCH] Don't pass UI classes to the core, use events instead This removed the ContactExchangeListener in favor of new events --- .../api/contact/ContactExchangeListener.java | 20 -------- .../api/contact/ContactExchangeTask.java | 3 +- .../event/ContactExchangeFailedEvent.java | 32 ++++++++++++ .../event/ContactExchangeSucceededEvent.java | 20 ++++++++ .../contact/ContactExchangeTaskImpl.java | 32 ++++++------ .../keyagreement/ContactExchangeActivity.java | 50 +++++++++++++++---- 6 files changed, 110 insertions(+), 47 deletions(-) delete mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactExchangeListener.java create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/contact/event/ContactExchangeFailedEvent.java create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/contact/event/ContactExchangeSucceededEvent.java diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactExchangeListener.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactExchangeListener.java deleted file mode 100644 index 66a79c1e2..000000000 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactExchangeListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.briarproject.bramble.api.contact; - -import org.briarproject.bramble.api.identity.Author; -import org.briarproject.bramble.api.nullsafety.NotNullByDefault; - -@NotNullByDefault -public interface ContactExchangeListener { - - void contactExchangeSucceeded(Author remoteAuthor); - - /** - * The exchange failed because the contact already exists. - */ - void duplicateContact(Author remoteAuthor); - - /** - * A general failure. - */ - void contactExchangeFailed(); -} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactExchangeTask.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactExchangeTask.java index 28857276e..d54bff1c3 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactExchangeTask.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactExchangeTask.java @@ -41,8 +41,7 @@ public interface ContactExchangeTask { /** * Exchanges contact information with a remote peer. */ - void startExchange(ContactExchangeListener listener, - LocalAuthor localAuthor, SecretKey masterSecret, + void startExchange(LocalAuthor localAuthor, SecretKey masterSecret, DuplexTransportConnection conn, TransportId transportId, boolean alice); } diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/event/ContactExchangeFailedEvent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/event/ContactExchangeFailedEvent.java new file mode 100644 index 000000000..0d300f72f --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/event/ContactExchangeFailedEvent.java @@ -0,0 +1,32 @@ +package org.briarproject.bramble.api.contact.event; + +import org.briarproject.bramble.api.event.Event; +import org.briarproject.bramble.api.identity.Author; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import javax.annotation.Nullable; + +@NotNullByDefault +public class ContactExchangeFailedEvent extends Event { + + @Nullable + private final Author duplicateRemoteAuthor; + + public ContactExchangeFailedEvent(@Nullable Author duplicateRemoteAuthor) { + this.duplicateRemoteAuthor = duplicateRemoteAuthor; + } + + public ContactExchangeFailedEvent() { + this(null); + } + + @Nullable + public Author getDuplicateRemoteAuthor() { + return duplicateRemoteAuthor; + } + + public boolean wasDuplicateContact() { + return duplicateRemoteAuthor != null; + } + +} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/event/ContactExchangeSucceededEvent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/event/ContactExchangeSucceededEvent.java new file mode 100644 index 000000000..941a212af --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/event/ContactExchangeSucceededEvent.java @@ -0,0 +1,20 @@ +package org.briarproject.bramble.api.contact.event; + +import org.briarproject.bramble.api.event.Event; +import org.briarproject.bramble.api.identity.Author; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +@NotNullByDefault +public class ContactExchangeSucceededEvent extends Event { + + private final Author remoteAuthor; + + public ContactExchangeSucceededEvent(Author remoteAuthor) { + this.remoteAuthor = remoteAuthor; + } + + public Author getRemoteAuthor() { + return remoteAuthor; + } + +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java index 696097962..76163e696 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java @@ -2,10 +2,11 @@ package org.briarproject.bramble.contact; import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.client.ClientHelper; -import org.briarproject.bramble.api.contact.ContactExchangeListener; import org.briarproject.bramble.api.contact.ContactExchangeTask; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactManager; +import org.briarproject.bramble.api.contact.event.ContactExchangeFailedEvent; +import org.briarproject.bramble.api.contact.event.ContactExchangeSucceededEvent; import org.briarproject.bramble.api.crypto.CryptoComponent; import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.data.BdfDictionary; @@ -13,6 +14,7 @@ import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.db.ContactExistsException; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; @@ -63,6 +65,7 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { private final ClientHelper clientHelper; private final RecordReaderFactory recordReaderFactory; private final RecordWriterFactory recordWriterFactory; + private final EventBus eventBus; private final Clock clock; private final ConnectionManager connectionManager; private final ContactManager contactManager; @@ -71,7 +74,6 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { private final StreamReaderFactory streamReaderFactory; private final StreamWriterFactory streamWriterFactory; - private volatile ContactExchangeListener listener; private volatile LocalAuthor localAuthor; private volatile DuplexTransportConnection conn; private volatile TransportId transportId; @@ -81,8 +83,9 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { @Inject ContactExchangeTaskImpl(DatabaseComponent db, ClientHelper clientHelper, RecordReaderFactory recordReaderFactory, - RecordWriterFactory recordWriterFactory, Clock clock, - ConnectionManager connectionManager, ContactManager contactManager, + RecordWriterFactory recordWriterFactory, EventBus eventBus, + Clock clock, ConnectionManager connectionManager, + ContactManager contactManager, TransportPropertyManager transportPropertyManager, CryptoComponent crypto, StreamReaderFactory streamReaderFactory, StreamWriterFactory streamWriterFactory) { @@ -90,6 +93,7 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { this.clientHelper = clientHelper; this.recordReaderFactory = recordReaderFactory; this.recordWriterFactory = recordWriterFactory; + this.eventBus = eventBus; this.clock = clock; this.connectionManager = connectionManager; this.contactManager = contactManager; @@ -100,11 +104,9 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { } @Override - public void startExchange(ContactExchangeListener listener, - LocalAuthor localAuthor, SecretKey masterSecret, + public void startExchange(LocalAuthor localAuthor, SecretKey masterSecret, DuplexTransportConnection conn, TransportId transportId, boolean alice) { - this.listener = listener; this.localAuthor = localAuthor; this.conn = conn; this.transportId = transportId; @@ -123,8 +125,8 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { out = conn.getWriter().getOutputStream(); } catch (IOException e) { logException(LOG, WARNING, e); - listener.contactExchangeFailed(); tryToClose(conn); + eventBus.broadcast(new ContactExchangeFailedEvent()); return; } @@ -134,7 +136,7 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { localProperties = transportPropertyManager.getLocalProperties(); } catch (DbException e) { logException(LOG, WARNING, e); - listener.contactExchangeFailed(); + eventBus.broadcast(new ContactExchangeFailedEvent()); tryToClose(conn); return; } @@ -196,7 +198,7 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { } } catch (IOException e) { logException(LOG, WARNING, e); - listener.contactExchangeFailed(); + eventBus.broadcast(new ContactExchangeFailedEvent()); tryToClose(conn); return; } @@ -204,7 +206,7 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { // Verify the contact's signature if (!verify(remoteInfo.author, remoteNonce, remoteInfo.signature)) { LOG.warning("Invalid signature"); - listener.contactExchangeFailed(); + eventBus.broadcast(new ContactExchangeFailedEvent()); tryToClose(conn); return; } @@ -221,15 +223,17 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { conn); // Pseudonym exchange succeeded LOG.info("Pseudonym exchange succeeded"); - listener.contactExchangeSucceeded(remoteInfo.author); + eventBus.broadcast( + new ContactExchangeSucceededEvent(remoteInfo.author)); } catch (ContactExistsException e) { logException(LOG, WARNING, e); tryToClose(conn); - listener.duplicateContact(remoteInfo.author); + eventBus.broadcast( + new ContactExchangeFailedEvent(remoteInfo.author)); } catch (DbException e) { logException(LOG, WARNING, e); tryToClose(conn); - listener.contactExchangeFailed(); + eventBus.broadcast(new ContactExchangeFailedEvent()); } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ContactExchangeActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ContactExchangeActivity.java index b6acf79c1..cf4329518 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ContactExchangeActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ContactExchangeActivity.java @@ -4,9 +4,12 @@ import android.os.Bundle; import android.support.annotation.UiThread; import android.widget.Toast; -import org.briarproject.bramble.api.contact.ContactExchangeListener; import org.briarproject.bramble.api.contact.ContactExchangeTask; +import org.briarproject.bramble.api.contact.event.ContactExchangeFailedEvent; +import org.briarproject.bramble.api.contact.event.ContactExchangeSucceededEvent; import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.event.Event; +import org.briarproject.bramble.api.event.EventListener; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; @@ -28,7 +31,7 @@ import static org.briarproject.bramble.util.LogUtils.logException; @MethodsNotNullByDefault @ParametersNotNullByDefault public class ContactExchangeActivity extends KeyAgreementActivity implements - ContactExchangeListener { + EventListener { private static final Logger LOG = Logger.getLogger(ContactExchangeActivity.class.getName()); @@ -50,6 +53,20 @@ public class ContactExchangeActivity extends KeyAgreementActivity implements getSupportActionBar().setTitle(R.string.add_contact_title); } + @Override + public void onStart() { + super.onStart(); + // Listen to updates from contactExchangeTask + eventBus.addListener(this); + } + + @Override + protected void onStop() { + super.onStop(); + // Stop listen to updates from contactExchangeTask + eventBus.addListener(this); + } + private void startContactExchange(KeyAgreementResult result) { runOnDbThread(() -> { LocalAuthor localAuthor; @@ -63,15 +80,28 @@ public class ContactExchangeActivity extends KeyAgreementActivity implements } // Exchange contact details - contactExchangeTask.startExchange(ContactExchangeActivity.this, - localAuthor, result.getMasterKey(), - result.getConnection(), result.getTransportId(), - result.wasAlice()); + contactExchangeTask.startExchange(localAuthor, + result.getMasterKey(), result.getConnection(), + result.getTransportId(), result.wasAlice()); }); } @Override - public void contactExchangeSucceeded(Author remoteAuthor) { + public void eventOccurred(Event e) { + if (e instanceof ContactExchangeSucceededEvent) { + contactExchangeSucceeded( + ((ContactExchangeSucceededEvent) e).getRemoteAuthor()); + } else if (e instanceof ContactExchangeFailedEvent) { + ContactExchangeFailedEvent fe = (ContactExchangeFailedEvent) e; + if (fe.wasDuplicateContact()) { + duplicateContact(fe.getDuplicateRemoteAuthor()); + } else { + contactExchangeFailed(); + } + } + } + + private void contactExchangeSucceeded(Author remoteAuthor) { runOnUiThreadUnlessDestroyed(() -> { String contactName = remoteAuthor.getName(); String format = getString(R.string.contact_added_toast); @@ -82,8 +112,7 @@ public class ContactExchangeActivity extends KeyAgreementActivity implements }); } - @Override - public void duplicateContact(Author remoteAuthor) { + private void duplicateContact(Author remoteAuthor) { runOnUiThreadUnlessDestroyed(() -> { String contactName = remoteAuthor.getName(); String format = getString(R.string.contact_already_exists); @@ -94,8 +123,7 @@ public class ContactExchangeActivity extends KeyAgreementActivity implements }); } - @Override - public void contactExchangeFailed() { + private void contactExchangeFailed() { runOnUiThreadUnlessDestroyed(() -> { showErrorFragment(R.string.connection_error_explanation); });