Fix receivers of ConversationMessageReceivedEvent

These were only listening to private message events, ignoring all others
This commit is contained in:
Torsten Grote
2018-11-07 11:31:50 -03:00
parent cccaeeda6c
commit f964d1ef07
12 changed files with 117 additions and 34 deletions

View File

@@ -40,9 +40,9 @@ import org.briarproject.briar.android.splash.SplashScreenActivity;
import org.briarproject.briar.android.util.BriarNotificationBuilder; import org.briarproject.briar.android.util.BriarNotificationBuilder;
import org.briarproject.briar.api.android.AndroidNotificationManager; import org.briarproject.briar.api.android.AndroidNotificationManager;
import org.briarproject.briar.api.blog.event.BlogPostAddedEvent; import org.briarproject.briar.api.blog.event.BlogPostAddedEvent;
import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent;
import org.briarproject.briar.api.forum.event.ForumPostReceivedEvent; import org.briarproject.briar.api.forum.event.ForumPostReceivedEvent;
import org.briarproject.briar.api.introduction.event.IntroductionSucceededEvent; import org.briarproject.briar.api.introduction.event.IntroductionSucceededEvent;
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent;
import org.briarproject.briar.api.privategroup.event.GroupMessageAddedEvent; import org.briarproject.briar.api.privategroup.event.GroupMessageAddedEvent;
import java.util.Set; import java.util.Set;
@@ -219,8 +219,9 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
SettingsUpdatedEvent s = (SettingsUpdatedEvent) e; SettingsUpdatedEvent s = (SettingsUpdatedEvent) e;
if (s.getNamespace().equals(SETTINGS_NAMESPACE)) if (s.getNamespace().equals(SETTINGS_NAMESPACE))
settings = s.getSettings(); settings = s.getSettings();
} else if (e instanceof PrivateMessageReceivedEvent) { } else if (e instanceof ConversationMessageReceivedEvent) {
PrivateMessageReceivedEvent p = (PrivateMessageReceivedEvent) e; ConversationMessageReceivedEvent p =
(ConversationMessageReceivedEvent) e;
showContactNotification(p.getContactId()); showContactNotification(p.getContactId());
} else if (e instanceof GroupMessageAddedEvent) { } else if (e instanceof GroupMessageAddedEvent) {
GroupMessageAddedEvent g = (GroupMessageAddedEvent) e; GroupMessageAddedEvent g = (GroupMessageAddedEvent) e;

View File

@@ -37,8 +37,8 @@ import org.briarproject.briar.android.view.BriarRecyclerView;
import org.briarproject.briar.api.android.AndroidNotificationManager; import org.briarproject.briar.api.android.AndroidNotificationManager;
import org.briarproject.briar.api.client.MessageTracker.GroupCount; import org.briarproject.briar.api.client.MessageTracker.GroupCount;
import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.messaging.PrivateMessageHeader; import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent; import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -242,15 +242,16 @@ public class ContactListFragment extends BaseFragment implements EventListener {
} else if (e instanceof ContactRemovedEvent) { } else if (e instanceof ContactRemovedEvent) {
LOG.info("Contact removed, removing item"); LOG.info("Contact removed, removing item");
removeItem(((ContactRemovedEvent) e).getContactId()); removeItem(((ContactRemovedEvent) e).getContactId());
} else if (e instanceof PrivateMessageReceivedEvent) { } else if (e instanceof ConversationMessageReceivedEvent) {
LOG.info("Private message received, updating item"); LOG.info("Conversation message received, updating item");
PrivateMessageReceivedEvent p = (PrivateMessageReceivedEvent) e; ConversationMessageReceivedEvent p =
PrivateMessageHeader h = p.getMessageHeader(); (ConversationMessageReceivedEvent) e;
ConversationMessageHeader h = p.getMessageHeader();
updateItem(p.getContactId(), h); updateItem(p.getContactId(), h);
} }
} }
private void updateItem(ContactId c, PrivateMessageHeader h) { private void updateItem(ContactId c, ConversationMessageHeader h) {
runOnUiThreadUnlessDestroyed(() -> { runOnUiThreadUnlessDestroyed(() -> {
adapter.incrementRevision(); adapter.incrementRevision();
int position = adapter.findItemPosition(c); int position = adapter.findItemPosition(c);

View File

@@ -3,7 +3,7 @@ package org.briarproject.briar.android.contact;
import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.contact.Contact;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.api.client.MessageTracker.GroupCount; import org.briarproject.briar.api.client.MessageTracker.GroupCount;
import org.briarproject.briar.api.messaging.PrivateMessageHeader; import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import javax.annotation.concurrent.NotThreadSafe; import javax.annotation.concurrent.NotThreadSafe;
@@ -23,7 +23,7 @@ public class ContactListItem extends ContactItem {
this.timestamp = count.getLatestMsgTime(); this.timestamp = count.getLatestMsgTime();
} }
void addMessage(PrivateMessageHeader h) { void addMessage(ConversationMessageHeader h) {
empty = false; empty = false;
if (h.getTimestamp() > timestamp) timestamp = h.getTimestamp(); if (h.getTimestamp() > timestamp) timestamp = h.getTimestamp();
if (!h.isRead()) unread++; if (!h.isRead()) unread++;

View File

@@ -67,13 +67,13 @@ import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.conversation.ConversationMessageHeader; import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.conversation.ConversationRequest; import org.briarproject.briar.api.conversation.ConversationRequest;
import org.briarproject.briar.api.conversation.ConversationResponse; import org.briarproject.briar.api.conversation.ConversationResponse;
import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent;
import org.briarproject.briar.api.forum.ForumSharingManager; import org.briarproject.briar.api.forum.ForumSharingManager;
import org.briarproject.briar.api.introduction.IntroductionManager; import org.briarproject.briar.api.introduction.IntroductionManager;
import org.briarproject.briar.api.messaging.MessagingManager; import org.briarproject.briar.api.messaging.MessagingManager;
import org.briarproject.briar.api.messaging.PrivateMessage; import org.briarproject.briar.api.messaging.PrivateMessage;
import org.briarproject.briar.api.messaging.PrivateMessageFactory; import org.briarproject.briar.api.messaging.PrivateMessageFactory;
import org.briarproject.briar.api.messaging.PrivateMessageHeader; import org.briarproject.briar.api.messaging.PrivateMessageHeader;
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent;
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager;
import java.util.ArrayList; import java.util.ArrayList;
@@ -410,11 +410,12 @@ public class ConversationActivity extends BriarActivity
LOG.info("Contact removed"); LOG.info("Contact removed");
finishOnUiThread(); finishOnUiThread();
} }
} else if (e instanceof PrivateMessageReceivedEvent) { } else if (e instanceof ConversationMessageReceivedEvent) {
PrivateMessageReceivedEvent p = (PrivateMessageReceivedEvent) e; ConversationMessageReceivedEvent p =
(ConversationMessageReceivedEvent) e;
if (p.getContactId().equals(contactId)) { if (p.getContactId().equals(contactId)) {
LOG.info("Message received, adding"); LOG.info("Message received, adding");
onNewPrivateMessage(p.getMessageHeader()); onNewConversationMessage(p.getMessageHeader());
} }
} else if (e instanceof MessagesSentEvent) { } else if (e instanceof MessagesSentEvent) {
MessagesSentEvent m = (MessagesSentEvent) e; MessagesSentEvent m = (MessagesSentEvent) e;
@@ -452,7 +453,7 @@ public class ConversationActivity extends BriarActivity
}); });
} }
private void onNewPrivateMessage(ConversationMessageHeader h) { private void onNewConversationMessage(ConversationMessageHeader h) {
runOnUiThreadUnlessDestroyed(() -> { runOnUiThreadUnlessDestroyed(() -> {
if (h instanceof ConversationRequest || if (h instanceof ConversationRequest ||
h instanceof ConversationResponse) { h instanceof ConversationResponse) {

View File

@@ -12,7 +12,7 @@ import javax.annotation.concurrent.Immutable;
*/ */
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
public class ConversationMessageReceivedEvent<H extends ConversationMessageHeader> public abstract class ConversationMessageReceivedEvent<H extends ConversationMessageHeader>
extends Event { extends Event {
private final H messageHeader; private final H messageHeader;

View File

@@ -1,13 +1,41 @@
package org.briarproject.briar.headless.event package org.briarproject.briar.headless.event
import org.briarproject.briar.api.blog.BlogInvitationRequest
import org.briarproject.briar.api.blog.BlogInvitationResponse
import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent
import org.briarproject.briar.api.forum.ForumInvitationRequest
import org.briarproject.briar.api.forum.ForumInvitationResponse
import org.briarproject.briar.api.introduction.IntroductionRequest
import org.briarproject.briar.api.introduction.IntroductionResponse
import org.briarproject.briar.api.messaging.PrivateMessageHeader
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse
import org.briarproject.briar.headless.json.JsonDict
import org.briarproject.briar.headless.messaging.output import org.briarproject.briar.headless.messaging.output
import javax.annotation.concurrent.Immutable import javax.annotation.concurrent.Immutable
@Immutable @Immutable
internal class OutputEvent(val name: String, val data: Any) { @Suppress("unused")
internal class OutputEvent(val name: String, val data: JsonDict) {
val type = "event" val type = "event"
} }
internal fun ConversationMessageReceivedEvent<*>.output(text: String) = internal fun ConversationMessageReceivedEvent<*>.output(text: String): JsonDict {
messageHeader.output(contactId, text) check(messageHeader is PrivateMessageHeader)
return (messageHeader as PrivateMessageHeader).output(contactId, text)
}
internal fun ConversationMessageReceivedEvent<*>.output() = when (messageHeader) {
// requests
is ForumInvitationRequest -> (messageHeader as ForumInvitationRequest).output(contactId)
is BlogInvitationRequest -> (messageHeader as BlogInvitationRequest).output(contactId)
is GroupInvitationRequest -> (messageHeader as GroupInvitationRequest).output(contactId)
is IntroductionRequest -> (messageHeader as IntroductionRequest).output(contactId)
// responses
is ForumInvitationResponse -> (messageHeader as ForumInvitationResponse).output(contactId)
is BlogInvitationResponse -> (messageHeader as BlogInvitationResponse).output(contactId)
is GroupInvitationResponse -> (messageHeader as GroupInvitationResponse).output(contactId)
is IntroductionResponse -> (messageHeader as IntroductionResponse).output(contactId)
// unknown
else -> throw IllegalStateException()
}

View File

@@ -38,7 +38,7 @@ import javax.annotation.concurrent.Immutable
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
internal const val EVENT_PRIVATE_MESSAGE = "ConversationMessageReceivedEvent" internal const val EVENT_CONVERSATION_MESSAGE = "ConversationMessageReceivedEvent"
@Immutable @Immutable
@Singleton @Singleton
@@ -82,8 +82,13 @@ constructor(
override fun eventOccurred(e: Event) { override fun eventOccurred(e: Event) {
when (e) { when (e) {
is ConversationMessageReceivedEvent<*> -> dbExecutor.execute { is ConversationMessageReceivedEvent<*> -> dbExecutor.execute {
val text = messagingManager.getMessageText(e.messageHeader.id) val h = e.messageHeader
webSocketController.sendEvent(EVENT_PRIVATE_MESSAGE, e.output(text)) if (h is PrivateMessageHeader) {
val text = messagingManager.getMessageText(h.id)
webSocketController.sendEvent(EVENT_CONVERSATION_MESSAGE, e.output(text))
} else {
webSocketController.sendEvent(EVENT_CONVERSATION_MESSAGE, e.output())
}
} }
} }
} }

View File

@@ -3,10 +3,10 @@ package org.briarproject.briar.headless.messaging
import org.briarproject.bramble.api.contact.ContactId import org.briarproject.bramble.api.contact.ContactId
import org.briarproject.briar.api.conversation.ConversationMessageHeader import org.briarproject.briar.api.conversation.ConversationMessageHeader
import org.briarproject.briar.api.messaging.PrivateMessage import org.briarproject.briar.api.messaging.PrivateMessage
import org.briarproject.briar.api.messaging.PrivateMessageHeader
import org.briarproject.briar.headless.json.JsonDict import org.briarproject.briar.headless.json.JsonDict
internal fun ConversationMessageHeader.output(contactId: ContactId) = JsonDict( internal fun ConversationMessageHeader.output(contactId: ContactId) = JsonDict(
"type" to "PrivateMessage",
"contactId" to contactId.int, "contactId" to contactId.int,
"timestamp" to timestamp, "timestamp" to timestamp,
"read" to isRead, "read" to isRead,
@@ -23,6 +23,14 @@ internal fun ConversationMessageHeader.output(contactId: ContactId, text: String
return dict return dict
} }
internal fun PrivateMessageHeader.output(contactId: ContactId, text: String?): JsonDict {
val dict = (this as ConversationMessageHeader).output(contactId, text)
dict.putAll(
"type" to "PrivateMessage"
)
return dict
}
/** /**
* Use only for outgoing messages that were just sent * Use only for outgoing messages that were just sent
*/ */

View File

@@ -3,16 +3,16 @@ package org.briarproject.briar.headless.messaging
import org.briarproject.bramble.api.contact.ContactId import org.briarproject.bramble.api.contact.ContactId
import org.briarproject.bramble.identity.output import org.briarproject.bramble.identity.output
import org.briarproject.briar.api.blog.BlogInvitationResponse import org.briarproject.briar.api.blog.BlogInvitationResponse
import org.briarproject.briar.api.conversation.ConversationMessageHeader
import org.briarproject.briar.api.conversation.ConversationResponse
import org.briarproject.briar.api.forum.ForumInvitationResponse import org.briarproject.briar.api.forum.ForumInvitationResponse
import org.briarproject.briar.api.introduction.IntroductionResponse import org.briarproject.briar.api.introduction.IntroductionResponse
import org.briarproject.briar.api.messaging.PrivateMessageHeader
import org.briarproject.briar.api.conversation.ConversationResponse
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse
import org.briarproject.briar.api.sharing.InvitationResponse import org.briarproject.briar.api.sharing.InvitationResponse
import org.briarproject.briar.headless.json.JsonDict import org.briarproject.briar.headless.json.JsonDict
internal fun ConversationResponse.output(contactId: ContactId): JsonDict { internal fun ConversationResponse.output(contactId: ContactId): JsonDict {
val dict = (this as PrivateMessageHeader).output(contactId) val dict = (this as ConversationMessageHeader).output(contactId)
dict.putAll( dict.putAll(
"sessionId" to sessionId.bytes, "sessionId" to sessionId.bytes,
"accepted" to wasAccepted() "accepted" to wasAccepted()

View File

@@ -3,13 +3,20 @@ package org.briarproject.briar.headless.event
import io.javalin.json.JavalinJson.toJson import io.javalin.json.JavalinJson.toJson
import io.javalin.websocket.WsSession import io.javalin.websocket.WsSession
import io.mockk.* import io.mockk.*
import org.briarproject.bramble.api.identity.AuthorInfo
import org.briarproject.bramble.api.identity.AuthorInfo.Status.VERIFIED
import org.briarproject.bramble.test.ImmediateExecutor import org.briarproject.bramble.test.ImmediateExecutor
import org.briarproject.bramble.test.TestUtils.getRandomId
import org.briarproject.briar.api.client.SessionId
import org.briarproject.briar.api.introduction.IntroductionRequest
import org.briarproject.briar.api.introduction.event.IntroductionRequestReceivedEvent
import org.briarproject.briar.api.messaging.PrivateMessageHeader import org.briarproject.briar.api.messaging.PrivateMessageHeader
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent
import org.briarproject.briar.headless.ControllerTest import org.briarproject.briar.headless.ControllerTest
import org.briarproject.briar.headless.messaging.EVENT_PRIVATE_MESSAGE import org.briarproject.briar.headless.messaging.EVENT_CONVERSATION_MESSAGE
import org.briarproject.briar.headless.messaging.output import org.briarproject.briar.headless.messaging.output
import org.eclipse.jetty.websocket.api.WebSocketException import org.eclipse.jetty.websocket.api.WebSocketException
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import java.io.IOException import java.io.IOException
@@ -23,7 +30,7 @@ internal class WebSocketControllerTest : ControllerTest() {
private val header = private val header =
PrivateMessageHeader(message.id, group.id, timestamp, true, true, true, true, emptyList()) PrivateMessageHeader(message.id, group.id, timestamp, true, true, true, true, emptyList())
private val event = PrivateMessageReceivedEvent(header, contact.id) private val event = PrivateMessageReceivedEvent(header, contact.id)
private val outputEvent = OutputEvent(EVENT_PRIVATE_MESSAGE, event.output(text)) private val outputEvent = OutputEvent(EVENT_CONVERSATION_MESSAGE, event.output(text))
@Test @Test
fun testSendEvent() { fun testSendEvent() {
@@ -32,7 +39,7 @@ internal class WebSocketControllerTest : ControllerTest() {
every { session1.send(capture(slot)) } just Runs every { session1.send(capture(slot)) } just Runs
controller.sessions.add(session1) controller.sessions.add(session1)
controller.sendEvent(EVENT_PRIVATE_MESSAGE, event.output(text)) controller.sendEvent(EVENT_CONVERSATION_MESSAGE, event.output(text))
assertJsonEquals(slot.captured, outputEvent) assertJsonEquals(slot.captured, outputEvent)
} }
@@ -55,13 +62,45 @@ internal class WebSocketControllerTest : ControllerTest() {
controller.sessions.add(session1) controller.sessions.add(session1)
controller.sessions.add(session2) controller.sessions.add(session2)
controller.sendEvent(EVENT_PRIVATE_MESSAGE, event.output(text)) controller.sendEvent(EVENT_CONVERSATION_MESSAGE, event.output(text))
verify { session2.send(slot.captured) } verify { session2.send(slot.captured) }
} }
@Test @Test
fun testOutputPrivateMessageReceivedEvent() { fun testIntroductionRequestEvent() {
val sessionId = SessionId(getRandomId())
val authorInfo = AuthorInfo(VERIFIED)
val introductionRequest = IntroductionRequest(
message.id,
group.id,
timestamp,
true,
true,
true,
true,
sessionId,
author,
text,
false,
authorInfo
)
val introductionRequestEvent =
IntroductionRequestReceivedEvent(introductionRequest, contact.id)
val introductionOutputEvent =
OutputEvent(EVENT_CONVERSATION_MESSAGE, introductionRequestEvent.output())
val slot = CapturingSlot<String>()
every { session1.send(capture(slot)) } just Runs
controller.sessions.add(session1)
controller.sendEvent(EVENT_CONVERSATION_MESSAGE, introductionRequestEvent.output())
assertJsonEquals(slot.captured, introductionOutputEvent)
assertEquals("IntroductionRequest", introductionRequestEvent.output()["type"])
}
@Test
fun testOutputConversationMessageReceivedEvent() {
val json = """ val json = """
{ {
"type": "event", "type": "event",

View File

@@ -161,7 +161,7 @@ internal class MessagingControllerImplTest : ControllerTest() {
val event = PrivateMessageReceivedEvent(header, contact.id) val event = PrivateMessageReceivedEvent(header, contact.id)
every { messagingManager.getMessageText(message.id) } returns text every { messagingManager.getMessageText(message.id) } returns text
every { webSocketController.sendEvent(EVENT_PRIVATE_MESSAGE, event.output(text)) } just runs every { webSocketController.sendEvent(EVENT_CONVERSATION_MESSAGE, event.output(text)) } just runs
controller.eventOccurred(event) controller.eventOccurred(event)
} }