Merge branch '1434-message-attachments' into 'master'

Add attachment API for sending/retreiving private messages

See merge request briar/briar!976
This commit is contained in:
akwizgran
2018-11-07 18:08:36 +00:00
75 changed files with 545 additions and 285 deletions

View File

@@ -43,7 +43,7 @@ import org.briarproject.briar.api.feed.FeedManager;
import org.briarproject.briar.api.forum.ForumManager; import org.briarproject.briar.api.forum.ForumManager;
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.ConversationManager; import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.messaging.MessagingManager; import org.briarproject.briar.api.messaging.MessagingManager;
import org.briarproject.briar.api.messaging.PrivateMessageFactory; import org.briarproject.briar.api.messaging.PrivateMessageFactory;
import org.briarproject.briar.api.privategroup.GroupMessageFactory; import org.briarproject.briar.api.privategroup.GroupMessageFactory;

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

@@ -36,9 +36,9 @@ import org.briarproject.briar.android.keyagreement.ContactExchangeActivity;
import org.briarproject.briar.android.view.BriarRecyclerView; 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.messaging.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

@@ -63,16 +63,17 @@ import org.briarproject.briar.api.android.AndroidNotificationManager;
import org.briarproject.briar.api.blog.BlogSharingManager; import org.briarproject.briar.api.blog.BlogSharingManager;
import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.client.ProtocolStateException;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.conversation.ConversationRequest;
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.ConversationManager;
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.PrivateRequest;
import org.briarproject.briar.api.messaging.PrivateResponse;
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;
@@ -95,6 +96,7 @@ import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt.PromptSt
import static android.support.v4.view.ViewCompat.setTransitionName; import static android.support.v4.view.ViewCompat.setTransitionName;
import static android.support.v7.util.SortedList.INVALID_POSITION; import static android.support.v7.util.SortedList.INVALID_POSITION;
import static android.widget.Toast.LENGTH_SHORT; import static android.widget.Toast.LENGTH_SHORT;
import static java.util.Collections.emptyList;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import static java.util.logging.Level.INFO; import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING; import static java.util.logging.Level.WARNING;
@@ -326,7 +328,7 @@ public class ConversationActivity extends BriarActivity
runOnDbThread(() -> { runOnDbThread(() -> {
try { try {
long start = now(); long start = now();
Collection<PrivateMessageHeader> headers = Collection<ConversationMessageHeader> headers =
conversationManager.getMessageHeaders(contactId); conversationManager.getMessageHeaders(contactId);
logDuration(LOG, "Loading messages", start); logDuration(LOG, "Loading messages", start);
displayMessages(revision, headers); displayMessages(revision, headers);
@@ -339,7 +341,7 @@ public class ConversationActivity extends BriarActivity
} }
private void displayMessages(int revision, private void displayMessages(int revision,
Collection<PrivateMessageHeader> headers) { Collection<ConversationMessageHeader> headers) {
runOnUiThreadUnlessDestroyed(() -> { runOnUiThreadUnlessDestroyed(() -> {
if (revision == adapter.getRevision()) { if (revision == adapter.getRevision()) {
adapter.incrementRevision(); adapter.incrementRevision();
@@ -363,9 +365,10 @@ public class ConversationActivity extends BriarActivity
*/ */
@SuppressWarnings("ConstantConditions") @SuppressWarnings("ConstantConditions")
private List<ConversationItem> createItems( private List<ConversationItem> createItems(
Collection<PrivateMessageHeader> headers) { Collection<ConversationMessageHeader> headers) {
List<ConversationItem> items = new ArrayList<>(headers.size()); List<ConversationItem> items = new ArrayList<>(headers.size());
for (PrivateMessageHeader h : headers) items.add(h.accept(visitor)); for (ConversationMessageHeader h : headers)
items.add(h.accept(visitor));
return items; return items;
} }
@@ -407,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;
@@ -449,9 +453,10 @@ public class ConversationActivity extends BriarActivity
}); });
} }
private void onNewPrivateMessage(PrivateMessageHeader h) { private void onNewConversationMessage(ConversationMessageHeader h) {
runOnUiThreadUnlessDestroyed(() -> { runOnUiThreadUnlessDestroyed(() -> {
if (h instanceof PrivateRequest || h instanceof PrivateResponse) { if (h instanceof ConversationRequest ||
h instanceof ConversationResponse) {
// contact name might not have been loaded // contact name might not have been loaded
observeOnce(viewModel.getContactDisplayName(), this, observeOnce(viewModel.getContactDisplayName(), this,
name -> addConversationItem(h.accept(visitor))); name -> addConversationItem(h.accept(visitor)));
@@ -515,7 +520,7 @@ public class ConversationActivity extends BriarActivity
try { try {
//noinspection ConstantConditions init in loadGroupId() //noinspection ConstantConditions init in loadGroupId()
storeMessage(privateMessageFactory.createPrivateMessage( storeMessage(privateMessageFactory.createPrivateMessage(
messagingGroupId, timestamp, text), text); messagingGroupId, timestamp, text, emptyList()), text);
} catch (FormatException e) { } catch (FormatException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@@ -531,7 +536,8 @@ public class ConversationActivity extends BriarActivity
Message message = m.getMessage(); Message message = m.getMessage();
PrivateMessageHeader h = new PrivateMessageHeader( PrivateMessageHeader h = new PrivateMessageHeader(
message.getId(), message.getGroupId(), message.getId(), message.getGroupId(),
message.getTimestamp(), true, false, false, false); message.getTimestamp(), true, false, false, false,
emptyList());
textCache.put(message.getId(), text); textCache.put(message.getId(), text);
addConversationItem(h.accept(visitor)); addConversationItem(h.accept(visitor));
} catch (DbException e) { } catch (DbException e) {

View File

@@ -6,7 +6,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.R; import org.briarproject.briar.R;
import org.briarproject.briar.api.messaging.PrivateResponse; import org.briarproject.briar.api.conversation.ConversationResponse;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.annotation.concurrent.NotThreadSafe; import javax.annotation.concurrent.NotThreadSafe;
@@ -24,7 +24,7 @@ class ConversationNoticeInItem extends ConversationItem {
this.msgText = msgText; this.msgText = msgText;
} }
ConversationNoticeInItem(String text, PrivateResponse r) { ConversationNoticeInItem(String text, ConversationResponse r) {
super(r.getId(), r.getGroupId(), text, r.getTimestamp(), r.isRead()); super(r.getId(), r.getGroupId(), text, r.getTimestamp(), r.isRead());
this.msgText = null; this.msgText = null;
} }

View File

@@ -4,8 +4,8 @@ import android.support.annotation.LayoutRes;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.R; import org.briarproject.briar.R;
import org.briarproject.briar.api.messaging.PrivateRequest; import org.briarproject.briar.api.conversation.ConversationRequest;
import org.briarproject.briar.api.messaging.PrivateResponse; import org.briarproject.briar.api.conversation.ConversationResponse;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.annotation.concurrent.NotThreadSafe; import javax.annotation.concurrent.NotThreadSafe;
@@ -17,13 +17,13 @@ class ConversationNoticeOutItem extends ConversationOutItem {
@Nullable @Nullable
private final String msgText; private final String msgText;
ConversationNoticeOutItem(String text, PrivateRequest r) { ConversationNoticeOutItem(String text, ConversationRequest r) {
super(r.getId(), r.getGroupId(), text, r.getTimestamp(), r.isSent(), super(r.getId(), r.getGroupId(), text, r.getTimestamp(), r.isSent(),
r.isSeen()); r.isSeen());
this.msgText = r.getText(); this.msgText = r.getText();
} }
ConversationNoticeOutItem(String text, PrivateResponse r) { ConversationNoticeOutItem(String text, ConversationResponse r) {
super(r.getId(), r.getGroupId(), text, r.getTimestamp(), r.isSent(), super(r.getId(), r.getGroupId(), text, r.getTimestamp(), r.isSent(),
r.isSeen()); r.isSeen());
this.msgText = null; this.msgText = null;

View File

@@ -6,7 +6,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.briar.R; import org.briarproject.briar.R;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.messaging.PrivateRequest; import org.briarproject.briar.api.conversation.ConversationRequest;
import org.briarproject.briar.api.sharing.InvitationRequest; import org.briarproject.briar.api.sharing.InvitationRequest;
import org.briarproject.briar.api.sharing.Shareable; import org.briarproject.briar.api.sharing.Shareable;
@@ -26,7 +26,7 @@ class ConversationRequestItem extends ConversationNoticeInItem {
private final boolean canBeOpened; private final boolean canBeOpened;
private boolean answered; private boolean answered;
ConversationRequestItem(String text, RequestType type, PrivateRequest r) { ConversationRequestItem(String text, RequestType type, ConversationRequest r) {
super(r.getId(), r.getGroupId(), text, r.getText(), super(r.getId(), r.getGroupId(), text, r.getText(),
r.getTimestamp(), r.isRead()); r.getTimestamp(), r.isRead());
this.requestType = type; this.requestType = type;

View File

@@ -14,7 +14,7 @@ import org.briarproject.briar.api.forum.ForumInvitationResponse;
import org.briarproject.briar.api.introduction.IntroductionRequest; import org.briarproject.briar.api.introduction.IntroductionRequest;
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.messaging.PrivateMessageHeader;
import org.briarproject.briar.api.messaging.PrivateMessageVisitor; import org.briarproject.briar.api.conversation.ConversationMessageVisitor;
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest;
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse;
@@ -28,7 +28,8 @@ import static org.briarproject.briar.android.util.UiUtils.getContactDisplayName;
@UiThread @UiThread
@NotNullByDefault @NotNullByDefault
class ConversationVisitor implements PrivateMessageVisitor<ConversationItem> { class ConversationVisitor implements
ConversationMessageVisitor<ConversationItem> {
private final Context ctx; private final Context ctx;
private final TextCache textCache; private final TextCache textCache;

View File

@@ -20,7 +20,7 @@ import org.briarproject.briar.android.contact.ContactListItem;
import org.briarproject.briar.android.fragment.BaseFragment; import org.briarproject.briar.android.fragment.BaseFragment;
import org.briarproject.briar.android.view.BriarRecyclerView; import org.briarproject.briar.android.view.BriarRecyclerView;
import org.briarproject.briar.api.client.MessageTracker.GroupCount; import org.briarproject.briar.api.client.MessageTracker.GroupCount;
import org.briarproject.briar.api.messaging.ConversationManager; import org.briarproject.briar.api.conversation.ConversationManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

View File

@@ -14,7 +14,7 @@ import org.briarproject.bramble.api.system.Clock;
import org.briarproject.briar.android.contactselection.ContactSelectorControllerImpl; import org.briarproject.briar.android.contactselection.ContactSelectorControllerImpl;
import org.briarproject.briar.android.controller.handler.ExceptionHandler; import org.briarproject.briar.android.controller.handler.ExceptionHandler;
import org.briarproject.briar.api.blog.BlogSharingManager; import org.briarproject.briar.api.blog.BlogSharingManager;
import org.briarproject.briar.api.messaging.ConversationManager; import org.briarproject.briar.api.conversation.ConversationManager;
import java.util.Collection; import java.util.Collection;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;

View File

@@ -14,7 +14,7 @@ import org.briarproject.bramble.api.system.Clock;
import org.briarproject.briar.android.contactselection.ContactSelectorControllerImpl; import org.briarproject.briar.android.contactselection.ContactSelectorControllerImpl;
import org.briarproject.briar.android.controller.handler.ExceptionHandler; import org.briarproject.briar.android.controller.handler.ExceptionHandler;
import org.briarproject.briar.api.forum.ForumSharingManager; import org.briarproject.briar.api.forum.ForumSharingManager;
import org.briarproject.briar.api.messaging.ConversationManager; import org.briarproject.briar.api.conversation.ConversationManager;
import java.util.Collection; import java.util.Collection;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;

View File

@@ -4,7 +4,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.messaging.PrivateMessageVisitor; import org.briarproject.briar.api.conversation.ConversationMessageVisitor;
import org.briarproject.briar.api.sharing.InvitationRequest; import org.briarproject.briar.api.sharing.InvitationRequest;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -21,7 +21,7 @@ public class BlogInvitationRequest extends InvitationRequest<Blog> {
} }
@Override @Override
public <T> T accept(PrivateMessageVisitor<T> v) { public <T> T accept(ConversationMessageVisitor<T> v) {
return v.visitBlogInvitationRequest(this); return v.visitBlogInvitationRequest(this);
} }
} }

View File

@@ -4,7 +4,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.messaging.PrivateMessageVisitor; import org.briarproject.briar.api.conversation.ConversationMessageVisitor;
import org.briarproject.briar.api.sharing.InvitationResponse; import org.briarproject.briar.api.sharing.InvitationResponse;
@NotNullByDefault @NotNullByDefault
@@ -18,7 +18,7 @@ public class BlogInvitationResponse extends InvitationResponse {
} }
@Override @Override
public <T> T accept(PrivateMessageVisitor<T> v) { public <T> T accept(ConversationMessageVisitor<T> v) {
return v.visitBlogInvitationResponse(this); return v.visitBlogInvitationResponse(this);
} }
} }

View File

@@ -3,17 +3,17 @@ package org.briarproject.briar.api.blog.event;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.api.blog.Blog; import org.briarproject.briar.api.blog.Blog;
import org.briarproject.briar.api.messaging.PrivateRequest; import org.briarproject.briar.api.conversation.ConversationRequest;
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent; import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
public class BlogInvitationRequestReceivedEvent extends public class BlogInvitationRequestReceivedEvent extends
PrivateMessageReceivedEvent<PrivateRequest<Blog>> { ConversationMessageReceivedEvent<ConversationRequest<Blog>> {
public BlogInvitationRequestReceivedEvent(PrivateRequest<Blog> request, public BlogInvitationRequestReceivedEvent(ConversationRequest<Blog> request,
ContactId contactId) { ContactId contactId) {
super(request, contactId); super(request, contactId);
} }

View File

@@ -3,14 +3,14 @@ package org.briarproject.briar.api.blog.event;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.api.blog.BlogInvitationResponse; import org.briarproject.briar.api.blog.BlogInvitationResponse;
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent; import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
public class BlogInvitationResponseReceivedEvent public class BlogInvitationResponseReceivedEvent
extends PrivateMessageReceivedEvent<BlogInvitationResponse> { extends ConversationMessageReceivedEvent<BlogInvitationResponse> {
public BlogInvitationResponseReceivedEvent(BlogInvitationResponse response, public BlogInvitationResponseReceivedEvent(BlogInvitationResponse response,
ContactId contactId) { ContactId contactId) {

View File

@@ -1,4 +1,4 @@
package org.briarproject.briar.api.messaging; package org.briarproject.briar.api.conversation;
import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.contact.Contact;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
@@ -9,6 +9,7 @@ import org.briarproject.bramble.api.sync.Group;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.api.client.MessageTracker.GroupCount; import org.briarproject.briar.api.client.MessageTracker.GroupCount;
import org.briarproject.briar.api.messaging.MessagingManager;
import java.util.Collection; import java.util.Collection;
@@ -27,7 +28,7 @@ public interface ConversationManager {
* Only {@link MessagingManager} returns only headers. * Only {@link MessagingManager} returns only headers.
* The others also return the message text. * The others also return the message text.
*/ */
Collection<PrivateMessageHeader> getMessageHeaders(ContactId c) Collection<ConversationMessageHeader> getMessageHeaders(ContactId c)
throws DbException; throws DbException;
/** /**
@@ -40,7 +41,7 @@ public interface ConversationManager {
Group getContactGroup(Contact c); Group getContactGroup(Contact c);
Collection<PrivateMessageHeader> getMessageHeaders(Transaction txn, Collection<ConversationMessageHeader> getMessageHeaders(Transaction txn,
ContactId contactId) throws DbException; ContactId contactId) throws DbException;
GroupCount getGroupCount(Transaction txn, ContactId c) GroupCount getGroupCount(Transaction txn, ContactId c)

View File

@@ -0,0 +1,58 @@
package org.briarproject.briar.api.conversation;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId;
import javax.annotation.concurrent.Immutable;
@Immutable
@NotNullByDefault
public abstract class ConversationMessageHeader {
private final MessageId id;
private final GroupId groupId;
private final long timestamp;
private final boolean local, sent, seen, read;
public ConversationMessageHeader(MessageId id, GroupId groupId, long timestamp,
boolean local, boolean read, boolean sent, boolean seen) {
this.id = id;
this.groupId = groupId;
this.timestamp = timestamp;
this.local = local;
this.sent = sent;
this.seen = seen;
this.read = read;
}
public MessageId getId() {
return id;
}
public GroupId getGroupId() {
return groupId;
}
public long getTimestamp() {
return timestamp;
}
public boolean isLocal() {
return local;
}
public boolean isSent() {
return sent;
}
public boolean isSeen() {
return seen;
}
public boolean isRead() {
return read;
}
public abstract <T> T accept(ConversationMessageVisitor<T> v);
}

View File

@@ -1,4 +1,4 @@
package org.briarproject.briar.api.messaging; package org.briarproject.briar.api.conversation;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.api.blog.BlogInvitationRequest; import org.briarproject.briar.api.blog.BlogInvitationRequest;
@@ -7,11 +7,12 @@ import org.briarproject.briar.api.forum.ForumInvitationRequest;
import org.briarproject.briar.api.forum.ForumInvitationResponse; import org.briarproject.briar.api.forum.ForumInvitationResponse;
import org.briarproject.briar.api.introduction.IntroductionRequest; import org.briarproject.briar.api.introduction.IntroductionRequest;
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.privategroup.invitation.GroupInvitationRequest; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest;
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse;
@NotNullByDefault @NotNullByDefault
public interface PrivateMessageVisitor<T> { public interface ConversationMessageVisitor<T> {
T visitPrivateMessageHeader(PrivateMessageHeader h); T visitPrivateMessageHeader(PrivateMessageHeader h);

View File

@@ -1,4 +1,4 @@
package org.briarproject.briar.api.messaging; package org.briarproject.briar.api.conversation;
import org.briarproject.bramble.api.Nameable; import org.briarproject.bramble.api.Nameable;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
@@ -11,7 +11,8 @@ import javax.annotation.concurrent.Immutable;
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
public class PrivateRequest<N extends Nameable> extends PrivateMessageHeader { public abstract class ConversationRequest<N extends Nameable>
extends ConversationMessageHeader {
private final SessionId sessionId; private final SessionId sessionId;
private final N nameable; private final N nameable;
@@ -19,7 +20,7 @@ public class PrivateRequest<N extends Nameable> extends PrivateMessageHeader {
private final String text; private final String text;
private final boolean answered; private final boolean answered;
public PrivateRequest(MessageId messageId, GroupId groupId, long time, public ConversationRequest(MessageId messageId, GroupId groupId, long time,
boolean local, boolean sent, boolean seen, boolean read, boolean local, boolean sent, boolean seen, boolean read,
SessionId sessionId, N nameable, @Nullable String text, SessionId sessionId, N nameable, @Nullable String text,
boolean answered) { boolean answered) {
@@ -50,4 +51,5 @@ public class PrivateRequest<N extends Nameable> extends PrivateMessageHeader {
public boolean wasAnswered() { public boolean wasAnswered() {
return answered; return answered;
} }
} }

View File

@@ -1,4 +1,4 @@
package org.briarproject.briar.api.messaging; package org.briarproject.briar.api.conversation;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
@@ -9,12 +9,12 @@ import javax.annotation.concurrent.Immutable;
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
public abstract class PrivateResponse extends PrivateMessageHeader { public abstract class ConversationResponse extends ConversationMessageHeader {
private final SessionId sessionId; private final SessionId sessionId;
private final boolean accepted; private final boolean accepted;
public PrivateResponse(MessageId id, GroupId groupId, long time, public ConversationResponse(MessageId id, GroupId groupId, long time,
boolean local, boolean sent, boolean seen, boolean read, boolean local, boolean sent, boolean seen, boolean read,
SessionId sessionId, boolean accepted) { SessionId sessionId, boolean accepted) {
super(id, groupId, time, local, sent, seen, read); super(id, groupId, time, local, sent, seen, read);

View File

@@ -0,0 +1,33 @@
package org.briarproject.briar.api.conversation.event;
import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import javax.annotation.concurrent.Immutable;
/**
* An event that is broadcast when a new conversation message is received.
*/
@Immutable
@NotNullByDefault
public abstract class ConversationMessageReceivedEvent<H extends ConversationMessageHeader>
extends Event {
private final H messageHeader;
private final ContactId contactId;
public ConversationMessageReceivedEvent(H messageHeader, ContactId contactId) {
this.messageHeader = messageHeader;
this.contactId = contactId;
}
public H getMessageHeader() {
return messageHeader;
}
public ContactId getContactId() {
return contactId;
}
}

View File

@@ -4,7 +4,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.messaging.PrivateMessageVisitor; import org.briarproject.briar.api.conversation.ConversationMessageVisitor;
import org.briarproject.briar.api.sharing.InvitationRequest; import org.briarproject.briar.api.sharing.InvitationRequest;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -23,7 +23,7 @@ public class ForumInvitationRequest extends InvitationRequest<Forum> {
} }
@Override @Override
public <T> T accept(PrivateMessageVisitor<T> v) { public <T> T accept(ConversationMessageVisitor<T> v) {
return v.visitForumInvitationRequest(this); return v.visitForumInvitationRequest(this);
} }
} }

View File

@@ -4,7 +4,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.messaging.PrivateMessageVisitor; import org.briarproject.briar.api.conversation.ConversationMessageVisitor;
import org.briarproject.briar.api.sharing.InvitationResponse; import org.briarproject.briar.api.sharing.InvitationResponse;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -21,7 +21,7 @@ public class ForumInvitationResponse extends InvitationResponse {
} }
@Override @Override
public <T> T accept(PrivateMessageVisitor<T> v) { public <T> T accept(ConversationMessageVisitor<T> v) {
return v.visitForumInvitationResponse(this); return v.visitForumInvitationResponse(this);
} }
} }

View File

@@ -2,18 +2,18 @@ package org.briarproject.briar.api.forum.event;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.api.conversation.ConversationRequest;
import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent;
import org.briarproject.briar.api.forum.Forum; import org.briarproject.briar.api.forum.Forum;
import org.briarproject.briar.api.messaging.PrivateRequest;
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
public class ForumInvitationRequestReceivedEvent extends public class ForumInvitationRequestReceivedEvent extends
PrivateMessageReceivedEvent<PrivateRequest<Forum>> { ConversationMessageReceivedEvent<ConversationRequest<Forum>> {
public ForumInvitationRequestReceivedEvent(PrivateRequest<Forum> request, public ForumInvitationRequestReceivedEvent(ConversationRequest<Forum> request,
ContactId contactId) { ContactId contactId) {
super(request, contactId); super(request, contactId);
} }

View File

@@ -2,15 +2,15 @@ package org.briarproject.briar.api.forum.event;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent;
import org.briarproject.briar.api.forum.ForumInvitationResponse; import org.briarproject.briar.api.forum.ForumInvitationResponse;
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
public class ForumInvitationResponseReceivedEvent extends public class ForumInvitationResponseReceivedEvent extends
PrivateMessageReceivedEvent<ForumInvitationResponse> { ConversationMessageReceivedEvent<ForumInvitationResponse> {
public ForumInvitationResponseReceivedEvent( public ForumInvitationResponseReceivedEvent(
ForumInvitationResponse response, ContactId contactId) { ForumInvitationResponse response, ContactId contactId) {

View File

@@ -6,7 +6,7 @@ import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.ClientId; import org.briarproject.bramble.api.sync.ClientId;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.messaging.ConversationManager.ConversationClient; import org.briarproject.briar.api.conversation.ConversationManager.ConversationClient;
import javax.annotation.Nullable; import javax.annotation.Nullable;

View File

@@ -6,15 +6,15 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.messaging.PrivateMessageVisitor; import org.briarproject.briar.api.conversation.ConversationMessageVisitor;
import org.briarproject.briar.api.messaging.PrivateRequest; import org.briarproject.briar.api.conversation.ConversationRequest;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
public class IntroductionRequest extends PrivateRequest<Author> { public class IntroductionRequest extends ConversationRequest<Author> {
private final AuthorInfo authorInfo; private final AuthorInfo authorInfo;
@@ -37,7 +37,7 @@ public class IntroductionRequest extends PrivateRequest<Author> {
} }
@Override @Override
public <T> T accept(PrivateMessageVisitor<T> v) { public <T> T accept(ConversationMessageVisitor<T> v) {
return v.visitIntroductionRequest(this); return v.visitIntroductionRequest(this);
} }
} }

View File

@@ -6,8 +6,8 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.messaging.PrivateMessageVisitor; import org.briarproject.briar.api.conversation.ConversationMessageVisitor;
import org.briarproject.briar.api.messaging.PrivateResponse; import org.briarproject.briar.api.conversation.ConversationResponse;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -15,7 +15,7 @@ import static org.briarproject.briar.api.introduction.Role.INTRODUCER;
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
public class IntroductionResponse extends PrivateResponse { public class IntroductionResponse extends ConversationResponse {
private final Author introducedAuthor; private final Author introducedAuthor;
private final AuthorInfo introducedAuthorInfo; private final AuthorInfo introducedAuthorInfo;
@@ -45,7 +45,7 @@ public class IntroductionResponse extends PrivateResponse {
} }
@Override @Override
public <T> T accept(PrivateMessageVisitor<T> v) { public <T> T accept(ConversationMessageVisitor<T> v) {
return v.visitIntroductionResponse(this); return v.visitIntroductionResponse(this);
} }
} }

View File

@@ -2,15 +2,15 @@ package org.briarproject.briar.api.introduction.event;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent;
import org.briarproject.briar.api.introduction.IntroductionRequest; import org.briarproject.briar.api.introduction.IntroductionRequest;
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
public class IntroductionRequestReceivedEvent extends public class IntroductionRequestReceivedEvent
PrivateMessageReceivedEvent<IntroductionRequest> { extends ConversationMessageReceivedEvent<IntroductionRequest> {
public IntroductionRequestReceivedEvent( public IntroductionRequestReceivedEvent(
IntroductionRequest introductionRequest, ContactId contactId) { IntroductionRequest introductionRequest, ContactId contactId) {

View File

@@ -2,15 +2,15 @@ package org.briarproject.briar.api.introduction.event;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent;
import org.briarproject.briar.api.introduction.IntroductionResponse; import org.briarproject.briar.api.introduction.IntroductionResponse;
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
public class IntroductionResponseReceivedEvent extends public class IntroductionResponseReceivedEvent extends
PrivateMessageReceivedEvent<IntroductionResponse> { ConversationMessageReceivedEvent<IntroductionResponse> {
public IntroductionResponseReceivedEvent( public IntroductionResponseReceivedEvent(
IntroductionResponse introductionResponse, ContactId contactId) { IntroductionResponse introductionResponse, ContactId contactId) {

View File

@@ -0,0 +1,17 @@
package org.briarproject.briar.api.messaging;
import java.nio.ByteBuffer;
public class Attachment {
private final ByteBuffer data;
public Attachment(ByteBuffer data) {
this.data = data;
}
public ByteBuffer getData() {
return data;
}
}

View File

@@ -0,0 +1,28 @@
package org.briarproject.briar.api.messaging;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.MessageId;
import javax.annotation.concurrent.Immutable;
@Immutable
@NotNullByDefault
public class AttachmentHeader {
private final MessageId messageId;
private final String contentType;
public AttachmentHeader(MessageId messageId, String contentType) {
this.messageId = messageId;
this.contentType = contentType;
}
public MessageId getMessageId() {
return messageId;
}
public String getContentType() {
return contentType;
}
}

View File

@@ -6,7 +6,9 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.ClientId; import org.briarproject.bramble.api.sync.ClientId;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.api.messaging.ConversationManager.ConversationClient; import org.briarproject.briar.api.conversation.ConversationManager.ConversationClient;
import java.nio.ByteBuffer;
@NotNullByDefault @NotNullByDefault
public interface MessagingManager extends ConversationClient { public interface MessagingManager extends ConversationClient {
@@ -31,6 +33,12 @@ public interface MessagingManager extends ConversationClient {
*/ */
void addLocalMessage(PrivateMessage m) throws DbException; void addLocalMessage(PrivateMessage m) throws DbException;
/**
* Stores a local attachment message.
*/
AttachmentHeader addLocalAttachment(GroupId groupId, long timestamp,
String contentType, ByteBuffer data) throws DbException;
/** /**
* Returns the ID of the contact with the given private conversation. * Returns the ID of the contact with the given private conversation.
*/ */
@@ -46,4 +54,9 @@ public interface MessagingManager extends ConversationClient {
*/ */
String getMessageText(MessageId m) throws DbException; String getMessageText(MessageId m) throws DbException;
/**
* Returns the attachment with the given ID.
*/
Attachment getAttachment(MessageId m) throws DbException;
} }

View File

@@ -4,10 +4,13 @@ import org.briarproject.bramble.api.FormatException;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import java.util.List;
@NotNullByDefault @NotNullByDefault
public interface PrivateMessageFactory { public interface PrivateMessageFactory {
PrivateMessage createPrivateMessage(GroupId groupId, long timestamp, PrivateMessage createPrivateMessage(GroupId groupId, long timestamp,
String text) throws FormatException; String text, List<AttachmentHeader> attachments)
throws FormatException;
} }

View File

@@ -3,58 +3,33 @@ package org.briarproject.briar.api.messaging;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.conversation.ConversationMessageVisitor;
import java.util.List;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
public class PrivateMessageHeader { public class PrivateMessageHeader extends ConversationMessageHeader {
private final MessageId id; private final List<AttachmentHeader> attachmentHeaders;
private final GroupId groupId;
private final long timestamp;
private final boolean local, sent, seen, read;
public PrivateMessageHeader(MessageId id, GroupId groupId, long timestamp, public PrivateMessageHeader(MessageId id, GroupId groupId, long timestamp,
boolean local, boolean read, boolean sent, boolean seen) { boolean local, boolean read, boolean sent, boolean seen,
this.id = id; List<AttachmentHeader> attachmentHeaders) {
this.groupId = groupId; super(id, groupId, timestamp, local, read, sent, seen);
this.timestamp = timestamp; this.attachmentHeaders = attachmentHeaders;
this.local = local;
this.sent = sent;
this.seen = seen;
this.read = read;
} }
public MessageId getId() { public List<AttachmentHeader> getAttachmentHeaders() {
return id; return attachmentHeaders;
} }
public GroupId getGroupId() { @Override
return groupId; public <T> T accept(ConversationMessageVisitor<T> v) {
}
public long getTimestamp() {
return timestamp;
}
public boolean isLocal() {
return local;
}
public boolean isSent() {
return sent;
}
public boolean isSeen() {
return seen;
}
public boolean isRead() {
return read;
}
public <T> T accept(PrivateMessageVisitor<T> v) {
return v.visitPrivateMessageHeader(this); return v.visitPrivateMessageHeader(this);
} }
} }

View File

@@ -1,8 +1,8 @@
package org.briarproject.briar.api.messaging.event; package org.briarproject.briar.api.messaging.event;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent;
import org.briarproject.briar.api.messaging.PrivateMessageHeader; import org.briarproject.briar.api.messaging.PrivateMessageHeader;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -12,22 +12,12 @@ import javax.annotation.concurrent.Immutable;
*/ */
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
public class PrivateMessageReceivedEvent<H extends PrivateMessageHeader> public class PrivateMessageReceivedEvent
extends Event { extends ConversationMessageReceivedEvent<PrivateMessageHeader> {
private final H messageHeader; public PrivateMessageReceivedEvent(PrivateMessageHeader messageHeader,
private final ContactId contactId; ContactId contactId) {
super(messageHeader, contactId);
public PrivateMessageReceivedEvent(H messageHeader, ContactId contactId) {
this.messageHeader = messageHeader;
this.contactId = contactId;
} }
public H getMessageHeader() {
return messageHeader;
}
public ContactId getContactId() {
return contactId;
}
} }

View File

@@ -2,7 +2,7 @@ package org.briarproject.briar.api.privategroup.event;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent; import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent;
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -10,7 +10,7 @@ import javax.annotation.concurrent.Immutable;
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
public class GroupInvitationRequestReceivedEvent extends public class GroupInvitationRequestReceivedEvent extends
PrivateMessageReceivedEvent<GroupInvitationRequest> { ConversationMessageReceivedEvent<GroupInvitationRequest> {
public GroupInvitationRequestReceivedEvent(GroupInvitationRequest request, public GroupInvitationRequestReceivedEvent(GroupInvitationRequest request,
ContactId contactId) { ContactId contactId) {

View File

@@ -2,7 +2,7 @@ package org.briarproject.briar.api.privategroup.event;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent; import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent;
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -10,7 +10,7 @@ import javax.annotation.concurrent.Immutable;
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
public class GroupInvitationResponseReceivedEvent public class GroupInvitationResponseReceivedEvent
extends PrivateMessageReceivedEvent<GroupInvitationResponse> { extends ConversationMessageReceivedEvent<GroupInvitationResponse> {
public GroupInvitationResponseReceivedEvent( public GroupInvitationResponseReceivedEvent(
GroupInvitationResponse response, ContactId contactId) { GroupInvitationResponse response, ContactId contactId) {

View File

@@ -8,7 +8,7 @@ import org.briarproject.bramble.api.sync.ClientId;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.client.ProtocolStateException;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.messaging.ConversationManager.ConversationClient; import org.briarproject.briar.api.conversation.ConversationManager.ConversationClient;
import org.briarproject.briar.api.privategroup.PrivateGroup; import org.briarproject.briar.api.privategroup.PrivateGroup;
import java.util.Collection; import java.util.Collection;

View File

@@ -4,7 +4,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.messaging.PrivateMessageVisitor; import org.briarproject.briar.api.conversation.ConversationMessageVisitor;
import org.briarproject.briar.api.privategroup.PrivateGroup; import org.briarproject.briar.api.privategroup.PrivateGroup;
import org.briarproject.briar.api.sharing.InvitationRequest; import org.briarproject.briar.api.sharing.InvitationRequest;
@@ -24,7 +24,7 @@ public class GroupInvitationRequest extends InvitationRequest<PrivateGroup> {
} }
@Override @Override
public <T> T accept(PrivateMessageVisitor<T> v) { public <T> T accept(ConversationMessageVisitor<T> v) {
return v.visitGroupInvitationRequest(this); return v.visitGroupInvitationRequest(this);
} }
} }

View File

@@ -4,7 +4,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.messaging.PrivateMessageVisitor; import org.briarproject.briar.api.conversation.ConversationMessageVisitor;
import org.briarproject.briar.api.sharing.InvitationResponse; import org.briarproject.briar.api.sharing.InvitationResponse;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -21,7 +21,7 @@ public class GroupInvitationResponse extends InvitationResponse {
} }
@Override @Override
public <T> T accept(PrivateMessageVisitor<T> v) { public <T> T accept(ConversationMessageVisitor<T> v) {
return v.visitGroupInvitationResponse(this); return v.visitGroupInvitationResponse(this);
} }
} }

View File

@@ -3,12 +3,12 @@ package org.briarproject.briar.api.sharing;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.messaging.PrivateRequest; import org.briarproject.briar.api.conversation.ConversationRequest;
import javax.annotation.Nullable; import javax.annotation.Nullable;
public abstract class InvitationRequest<S extends Shareable> extends public abstract class InvitationRequest<S extends Shareable> extends
PrivateRequest<S> { ConversationRequest<S> {
private final boolean canBeOpened; private final boolean canBeOpened;

View File

@@ -3,9 +3,9 @@ package org.briarproject.briar.api.sharing;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.messaging.PrivateResponse; import org.briarproject.briar.api.conversation.ConversationResponse;
public abstract class InvitationResponse extends PrivateResponse { public abstract class InvitationResponse extends ConversationResponse {
private final GroupId shareableId; private final GroupId shareableId;

View File

@@ -6,7 +6,7 @@ import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.messaging.ConversationManager.ConversationClient; import org.briarproject.briar.api.conversation.ConversationManager.ConversationClient;
import java.util.Collection; import java.util.Collection;

View File

@@ -12,7 +12,7 @@ import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.client.MessageTracker.GroupCount; import org.briarproject.briar.api.client.MessageTracker.GroupCount;
import org.briarproject.briar.api.messaging.ConversationManager.ConversationClient; import org.briarproject.briar.api.conversation.ConversationManager.ConversationClient;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;

View File

@@ -31,11 +31,11 @@ import org.briarproject.bramble.api.versioning.ClientVersioningManager;
import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook; import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook;
import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.introduction.IntroductionManager; import org.briarproject.briar.api.introduction.IntroductionManager;
import org.briarproject.briar.api.introduction.IntroductionRequest; import org.briarproject.briar.api.introduction.IntroductionRequest;
import org.briarproject.briar.api.introduction.IntroductionResponse; import org.briarproject.briar.api.introduction.IntroductionResponse;
import org.briarproject.briar.api.introduction.Role; import org.briarproject.briar.api.introduction.Role;
import org.briarproject.briar.api.messaging.PrivateMessageHeader;
import org.briarproject.briar.client.ConversationClientImpl; import org.briarproject.briar.client.ConversationClientImpl;
import org.briarproject.briar.introduction.IntroducerSession.Introducee; import org.briarproject.briar.introduction.IntroducerSession.Introducee;
@@ -401,15 +401,15 @@ class IntroductionManagerImpl extends ConversationClientImpl
} }
@Override @Override
public Collection<PrivateMessageHeader> getMessageHeaders(Transaction txn, public Collection<ConversationMessageHeader> getMessageHeaders(
ContactId c) throws DbException { Transaction txn, ContactId c) throws DbException {
try { try {
Contact contact = db.getContact(txn, c); Contact contact = db.getContact(txn, c);
GroupId contactGroupId = getContactGroup(contact).getId(); GroupId contactGroupId = getContactGroup(contact).getId();
BdfDictionary query = messageParser.getMessagesVisibleInUiQuery(); BdfDictionary query = messageParser.getMessagesVisibleInUiQuery();
Map<MessageId, BdfDictionary> results = clientHelper Map<MessageId, BdfDictionary> results = clientHelper
.getMessageMetadataAsDictionary(txn, contactGroupId, query); .getMessageMetadataAsDictionary(txn, contactGroupId, query);
List<PrivateMessageHeader> messages = List<ConversationMessageHeader> messages =
new ArrayList<>(results.size()); new ArrayList<>(results.size());
Map<AuthorId, AuthorInfo> authorInfos = new HashMap<>(); Map<AuthorId, AuthorInfo> authorInfos = new HashMap<>();
for (Entry<MessageId, BdfDictionary> e : results.entrySet()) { for (Entry<MessageId, BdfDictionary> e : results.entrySet()) {

View File

@@ -8,7 +8,7 @@ import org.briarproject.bramble.api.sync.ValidationManager;
import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.bramble.api.versioning.ClientVersioningManager;
import org.briarproject.briar.api.introduction.IntroductionManager; import org.briarproject.briar.api.introduction.IntroductionManager;
import org.briarproject.briar.api.messaging.ConversationManager; import org.briarproject.briar.api.conversation.ConversationManager;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;

View File

@@ -6,8 +6,8 @@ import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.db.Transaction;
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.ConversationManager; import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.messaging.PrivateMessageHeader; import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@@ -38,9 +38,9 @@ class ConversationManagerImpl implements ConversationManager {
} }
@Override @Override
public Collection<PrivateMessageHeader> getMessageHeaders(ContactId c) public Collection<ConversationMessageHeader> getMessageHeaders(ContactId c)
throws DbException { throws DbException {
List<PrivateMessageHeader> messages = new ArrayList<>(); List<ConversationMessageHeader> messages = new ArrayList<>();
Transaction txn = db.startTransaction(true); Transaction txn = db.startTransaction(true);
try { try {
for (ConversationClient client : clients) { for (ConversationClient client : clients) {

View File

@@ -23,19 +23,26 @@ import org.briarproject.bramble.api.sync.MessageStatus;
import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.bramble.api.versioning.ClientVersioningManager;
import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook; import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook;
import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.messaging.Attachment;
import org.briarproject.briar.api.messaging.AttachmentHeader;
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.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.client.ConversationClientImpl; import org.briarproject.briar.client.ConversationClientImpl;
import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Map; import java.util.Map;
import java.util.Random;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
import javax.inject.Inject; import javax.inject.Inject;
import static java.util.Collections.emptyList;
import static org.briarproject.bramble.api.sync.SyncConstants.MAX_MESSAGE_BODY_LENGTH;
import static org.briarproject.briar.client.MessageTrackerConstants.MSG_KEY_READ; import static org.briarproject.briar.client.MessageTrackerConstants.MSG_KEY_READ;
@Immutable @Immutable
@@ -113,11 +120,12 @@ class MessagingManagerImpl extends ConversationClientImpl
long timestamp = meta.getLong("timestamp"); long timestamp = meta.getLong("timestamp");
boolean local = meta.getBoolean("local"); boolean local = meta.getBoolean("local");
boolean read = meta.getBoolean(MSG_KEY_READ); boolean read = meta.getBoolean(MSG_KEY_READ);
PrivateMessageHeader header = new PrivateMessageHeader( PrivateMessageHeader header =
m.getId(), groupId, timestamp, local, read, false, false); new PrivateMessageHeader(m.getId(), groupId, timestamp, local,
read, false, false, emptyList());
ContactId contactId = getContactId(txn, groupId); ContactId contactId = getContactId(txn, groupId);
PrivateMessageReceivedEvent<PrivateMessageHeader> event = PrivateMessageReceivedEvent event =
new PrivateMessageReceivedEvent<>(header, contactId); new PrivateMessageReceivedEvent(header, contactId);
txn.attach(event); txn.attach(event);
messageTracker.trackIncomingMessage(txn, m); messageTracker.trackIncomingMessage(txn, m);
@@ -143,6 +151,15 @@ class MessagingManagerImpl extends ConversationClientImpl
} }
} }
@Override
public AttachmentHeader addLocalAttachment(GroupId groupId, long timestamp,
String contentType, ByteBuffer data) {
// TODO add real implementation
byte[] b = new byte[MessageId.LENGTH];
new Random().nextBytes(b);
return new AttachmentHeader(new MessageId(b), "image/png");
}
private ContactId getContactId(Transaction txn, GroupId g) private ContactId getContactId(Transaction txn, GroupId g)
throws DbException { throws DbException {
try { try {
@@ -178,8 +195,8 @@ class MessagingManagerImpl extends ConversationClientImpl
} }
@Override @Override
public Collection<PrivateMessageHeader> getMessageHeaders(Transaction txn, public Collection<ConversationMessageHeader> getMessageHeaders(
ContactId c) throws DbException { Transaction txn, ContactId c) throws DbException {
Map<MessageId, BdfDictionary> metadata; Map<MessageId, BdfDictionary> metadata;
Collection<MessageStatus> statuses; Collection<MessageStatus> statuses;
GroupId g; GroupId g;
@@ -190,7 +207,7 @@ class MessagingManagerImpl extends ConversationClientImpl
} catch (FormatException e) { } catch (FormatException e) {
throw new DbException(e); throw new DbException(e);
} }
Collection<PrivateMessageHeader> headers = new ArrayList<>(); Collection<ConversationMessageHeader> headers = new ArrayList<>();
for (MessageStatus s : statuses) { for (MessageStatus s : statuses) {
MessageId id = s.getMessageId(); MessageId id = s.getMessageId();
BdfDictionary meta = metadata.get(id); BdfDictionary meta = metadata.get(id);
@@ -200,7 +217,7 @@ class MessagingManagerImpl extends ConversationClientImpl
boolean local = meta.getBoolean("local"); boolean local = meta.getBoolean("local");
boolean read = meta.getBoolean("read"); boolean read = meta.getBoolean("read");
headers.add(new PrivateMessageHeader(id, g, timestamp, local, headers.add(new PrivateMessageHeader(id, g, timestamp, local,
read, s.isSent(), s.isSeen())); read, s.isSent(), s.isSeen(), emptyList()));
} catch (FormatException e) { } catch (FormatException e) {
throw new DbException(e); throw new DbException(e);
} }
@@ -218,4 +235,13 @@ class MessagingManagerImpl extends ConversationClientImpl
} }
} }
@Override
public Attachment getAttachment(MessageId m) {
// TODO add real implementation
// TODO return actual random/fake image before real implementation is done
byte[] b = new byte[MAX_MESSAGE_BODY_LENGTH];
new Random().nextBytes(b);
return new Attachment(ByteBuffer.wrap(b));
}
} }

View File

@@ -7,7 +7,7 @@ import org.briarproject.bramble.api.lifecycle.LifecycleManager;
import org.briarproject.bramble.api.sync.ValidationManager; import org.briarproject.bramble.api.sync.ValidationManager;
import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.bramble.api.versioning.ClientVersioningManager;
import org.briarproject.briar.api.messaging.ConversationManager; import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.messaging.MessagingManager; import org.briarproject.briar.api.messaging.MessagingManager;
import org.briarproject.briar.api.messaging.PrivateMessageFactory; import org.briarproject.briar.api.messaging.PrivateMessageFactory;

View File

@@ -6,9 +6,12 @@ import org.briarproject.bramble.api.data.BdfList;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.Message;
import org.briarproject.briar.api.messaging.AttachmentHeader;
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 java.util.List;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
import javax.inject.Inject; import javax.inject.Inject;
@@ -28,7 +31,8 @@ class PrivateMessageFactoryImpl implements PrivateMessageFactory {
@Override @Override
public PrivateMessage createPrivateMessage(GroupId groupId, long timestamp, public PrivateMessage createPrivateMessage(GroupId groupId, long timestamp,
String text) throws FormatException { String text, List<AttachmentHeader> attachments)
throws FormatException {
// Validate the arguments // Validate the arguments
if (utf8IsTooLong(text, MAX_PRIVATE_MESSAGE_TEXT_LENGTH)) if (utf8IsTooLong(text, MAX_PRIVATE_MESSAGE_TEXT_LENGTH))
throw new IllegalArgumentException(); throw new IllegalArgumentException();

View File

@@ -26,7 +26,7 @@ import org.briarproject.bramble.api.versioning.ClientVersioningManager;
import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook; import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook;
import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.messaging.PrivateMessageHeader; import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.privategroup.PrivateGroup; import org.briarproject.briar.api.privategroup.PrivateGroup;
import org.briarproject.briar.api.privategroup.PrivateGroupFactory; import org.briarproject.briar.api.privategroup.PrivateGroupFactory;
import org.briarproject.briar.api.privategroup.PrivateGroupManager; import org.briarproject.briar.api.privategroup.PrivateGroupManager;
@@ -368,7 +368,7 @@ class GroupInvitationManagerImpl extends ConversationClientImpl
} }
@Override @Override
public Collection<PrivateMessageHeader> getMessageHeaders(Transaction txn, public Collection<ConversationMessageHeader> getMessageHeaders(Transaction txn,
ContactId c) throws DbException { ContactId c) throws DbException {
try { try {
Contact contact = db.getContact(txn, c); Contact contact = db.getContact(txn, c);
@@ -376,7 +376,7 @@ class GroupInvitationManagerImpl extends ConversationClientImpl
BdfDictionary query = messageParser.getMessagesVisibleInUiQuery(); BdfDictionary query = messageParser.getMessagesVisibleInUiQuery();
Map<MessageId, BdfDictionary> results = clientHelper Map<MessageId, BdfDictionary> results = clientHelper
.getMessageMetadataAsDictionary(txn, contactGroupId, query); .getMessageMetadataAsDictionary(txn, contactGroupId, query);
List<PrivateMessageHeader> messages = List<ConversationMessageHeader> messages =
new ArrayList<>(results.size()); new ArrayList<>(results.size());
for (Entry<MessageId, BdfDictionary> e : results.entrySet()) { for (Entry<MessageId, BdfDictionary> e : results.entrySet()) {
MessageId m = e.getKey(); MessageId m = e.getKey();

View File

@@ -7,7 +7,7 @@ import org.briarproject.bramble.api.lifecycle.LifecycleManager;
import org.briarproject.bramble.api.sync.ValidationManager; import org.briarproject.bramble.api.sync.ValidationManager;
import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.bramble.api.versioning.ClientVersioningManager;
import org.briarproject.briar.api.messaging.ConversationManager; import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.privategroup.PrivateGroupFactory; import org.briarproject.briar.api.privategroup.PrivateGroupFactory;
import org.briarproject.briar.api.privategroup.PrivateGroupManager; import org.briarproject.briar.api.privategroup.PrivateGroupManager;
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationFactory; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationFactory;

View File

@@ -18,7 +18,7 @@ import org.briarproject.briar.api.blog.BlogManager;
import org.briarproject.briar.api.blog.event.BlogInvitationRequestReceivedEvent; import org.briarproject.briar.api.blog.event.BlogInvitationRequestReceivedEvent;
import org.briarproject.briar.api.blog.event.BlogInvitationResponseReceivedEvent; import org.briarproject.briar.api.blog.event.BlogInvitationResponseReceivedEvent;
import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.messaging.PrivateRequest; import org.briarproject.briar.api.conversation.ConversationRequest;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
import javax.inject.Inject; import javax.inject.Inject;
@@ -50,7 +50,7 @@ class BlogProtocolEngineImpl extends ProtocolEngineImpl<Blog> {
@Override @Override
Event getInvitationRequestReceivedEvent(InviteMessage<Blog> m, Event getInvitationRequestReceivedEvent(InviteMessage<Blog> m,
ContactId contactId, boolean available, boolean canBeOpened) { ContactId contactId, boolean available, boolean canBeOpened) {
PrivateRequest<Blog> request = invitationFactory ConversationRequest<Blog> request = invitationFactory
.createInvitationRequest(false, false, true, false, m, .createInvitationRequest(false, false, true, false, m,
contactId, available, canBeOpened); contactId, available, canBeOpened);
return new BlogInvitationRequestReceivedEvent(request, contactId); return new BlogInvitationRequestReceivedEvent(request, contactId);

View File

@@ -18,7 +18,7 @@ import org.briarproject.briar.api.forum.ForumInvitationResponse;
import org.briarproject.briar.api.forum.ForumManager; import org.briarproject.briar.api.forum.ForumManager;
import org.briarproject.briar.api.forum.event.ForumInvitationRequestReceivedEvent; import org.briarproject.briar.api.forum.event.ForumInvitationRequestReceivedEvent;
import org.briarproject.briar.api.forum.event.ForumInvitationResponseReceivedEvent; import org.briarproject.briar.api.forum.event.ForumInvitationResponseReceivedEvent;
import org.briarproject.briar.api.messaging.PrivateRequest; import org.briarproject.briar.api.conversation.ConversationRequest;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
import javax.inject.Inject; import javax.inject.Inject;
@@ -51,7 +51,7 @@ class ForumProtocolEngineImpl extends ProtocolEngineImpl<Forum> {
@Override @Override
Event getInvitationRequestReceivedEvent(InviteMessage<Forum> m, Event getInvitationRequestReceivedEvent(InviteMessage<Forum> m,
ContactId contactId, boolean available, boolean canBeOpened) { ContactId contactId, boolean available, boolean canBeOpened) {
PrivateRequest<Forum> request = invitationFactory ConversationRequest<Forum> request = invitationFactory
.createInvitationRequest(false, false, true, false, m, .createInvitationRequest(false, false, true, false, m,
contactId, available, canBeOpened); contactId, available, canBeOpened);
return new ForumInvitationRequestReceivedEvent(request, contactId); return new ForumInvitationRequestReceivedEvent(request, contactId);

View File

@@ -3,13 +3,13 @@ package org.briarproject.briar.sharing;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.api.messaging.PrivateRequest; import org.briarproject.briar.api.conversation.ConversationRequest;
import org.briarproject.briar.api.sharing.InvitationResponse; import org.briarproject.briar.api.sharing.InvitationResponse;
import org.briarproject.briar.api.sharing.Shareable; import org.briarproject.briar.api.sharing.Shareable;
public interface InvitationFactory<S extends Shareable, R extends InvitationResponse> { public interface InvitationFactory<S extends Shareable, R extends InvitationResponse> {
PrivateRequest<S> createInvitationRequest(boolean local, boolean sent, ConversationRequest<S> createInvitationRequest(boolean local, boolean sent,
boolean seen, boolean read, InviteMessage<S> m, ContactId c, boolean seen, boolean read, InviteMessage<S> m, ContactId c,
boolean available, boolean canBeOpened); boolean available, boolean canBeOpened);

View File

@@ -26,8 +26,8 @@ import org.briarproject.bramble.api.versioning.ClientVersioningManager;
import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook; import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook;
import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.messaging.PrivateMessageHeader; import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.messaging.PrivateRequest; import org.briarproject.briar.api.conversation.ConversationRequest;
import org.briarproject.briar.api.sharing.InvitationResponse; import org.briarproject.briar.api.sharing.InvitationResponse;
import org.briarproject.briar.api.sharing.Shareable; import org.briarproject.briar.api.sharing.Shareable;
import org.briarproject.briar.api.sharing.SharingInvitationItem; import org.briarproject.briar.api.sharing.SharingInvitationItem;
@@ -321,15 +321,15 @@ abstract class SharingManagerImpl<S extends Shareable>
} }
@Override @Override
public Collection<PrivateMessageHeader> getMessageHeaders(Transaction txn, public Collection<ConversationMessageHeader> getMessageHeaders(
ContactId c) throws DbException { Transaction txn, ContactId c) throws DbException {
try { try {
Contact contact = db.getContact(txn, c); Contact contact = db.getContact(txn, c);
GroupId contactGroupId = getContactGroup(contact).getId(); GroupId contactGroupId = getContactGroup(contact).getId();
BdfDictionary query = messageParser.getMessagesVisibleInUiQuery(); BdfDictionary query = messageParser.getMessagesVisibleInUiQuery();
Map<MessageId, BdfDictionary> results = clientHelper Map<MessageId, BdfDictionary> results = clientHelper
.getMessageMetadataAsDictionary(txn, contactGroupId, query); .getMessageMetadataAsDictionary(txn, contactGroupId, query);
Collection<PrivateMessageHeader> messages = Collection<ConversationMessageHeader> messages =
new ArrayList<>(results.size()); new ArrayList<>(results.size());
for (Entry<MessageId, BdfDictionary> e : results.entrySet()) { for (Entry<MessageId, BdfDictionary> e : results.entrySet()) {
MessageId m = e.getKey(); MessageId m = e.getKey();
@@ -354,7 +354,7 @@ abstract class SharingManagerImpl<S extends Shareable>
} }
} }
private PrivateRequest<S> parseInvitationRequest(Transaction txn, private ConversationRequest<S> parseInvitationRequest(Transaction txn,
ContactId c, MessageId m, MessageMetadata meta, ContactId c, MessageId m, MessageMetadata meta,
MessageStatus status) throws DbException, FormatException { MessageStatus status) throws DbException, FormatException {
// Look up the invite message to get the details of the private group // Look up the invite message to get the details of the private group

View File

@@ -17,7 +17,7 @@ import org.briarproject.briar.api.forum.ForumFactory;
import org.briarproject.briar.api.forum.ForumInvitationResponse; import org.briarproject.briar.api.forum.ForumInvitationResponse;
import org.briarproject.briar.api.forum.ForumManager; import org.briarproject.briar.api.forum.ForumManager;
import org.briarproject.briar.api.forum.ForumSharingManager; import org.briarproject.briar.api.forum.ForumSharingManager;
import org.briarproject.briar.api.messaging.ConversationManager; import org.briarproject.briar.api.conversation.ConversationManager;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;

View File

@@ -53,6 +53,7 @@ import java.util.logging.Logger;
import javax.inject.Inject; import javax.inject.Inject;
import static java.util.Collections.emptyList;
import static java.util.logging.Level.INFO; 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.bramble.api.plugin.BluetoothConstants.UUID_BYTES; import static org.briarproject.bramble.api.plugin.BluetoothConstants.UUID_BYTES;
@@ -327,7 +328,7 @@ public class TestDataCreatorImpl implements TestDataCreator {
private void createPrivateMessage(GroupId groupId, String text, private void createPrivateMessage(GroupId groupId, String text,
long timestamp, boolean local) throws DbException, FormatException { long timestamp, boolean local) throws DbException, FormatException {
PrivateMessage m = privateMessageFactory PrivateMessage m = privateMessageFactory
.createPrivateMessage(groupId, timestamp, text); .createPrivateMessage(groupId, timestamp, text, emptyList());
BdfDictionary meta = new BdfDictionary(); BdfDictionary meta = new BdfDictionary();
meta.put("timestamp", timestamp); meta.put("timestamp", timestamp);
meta.put("local", local); meta.put("local", local);

View File

@@ -24,6 +24,7 @@ import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.test.TestDatabaseModule; import org.briarproject.bramble.test.TestDatabaseModule;
import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.client.ProtocolStateException;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.introduction.IntroductionManager; import org.briarproject.briar.api.introduction.IntroductionManager;
import org.briarproject.briar.api.introduction.IntroductionRequest; import org.briarproject.briar.api.introduction.IntroductionRequest;
import org.briarproject.briar.api.introduction.IntroductionResponse; import org.briarproject.briar.api.introduction.IntroductionResponse;
@@ -297,7 +298,7 @@ public class IntroductionIntegrationTest
Group g1 = introductionManager0.getContactGroup(introducee1); Group g1 = introductionManager0.getContactGroup(introducee1);
Group g2 = introductionManager0.getContactGroup(introducee2); Group g2 = introductionManager0.getContactGroup(introducee2);
Collection<PrivateMessageHeader> messages = Collection<ConversationMessageHeader> messages =
db0.transactionWithResult(true, txn -> introductionManager0 db0.transactionWithResult(true, txn -> introductionManager0
.getMessageHeaders(txn, contactId1From0)); .getMessageHeaders(txn, contactId1From0));
assertEquals(2, messages.size()); assertEquals(2, messages.size());
@@ -363,7 +364,7 @@ public class IntroductionIntegrationTest
assertFalse(contactManager2 assertFalse(contactManager2
.contactExists(author1.getId(), author2.getId())); .contactExists(author1.getId(), author2.getId()));
Collection<PrivateMessageHeader> messages = Collection<ConversationMessageHeader> messages =
db0.transactionWithResult(true, txn -> introductionManager0 db0.transactionWithResult(true, txn -> introductionManager0
.getMessageHeaders(txn, contactId1From0)); .getMessageHeaders(txn, contactId1From0));
assertEquals(2, messages.size()); assertEquals(2, messages.size());
@@ -1102,31 +1103,31 @@ public class IntroductionIntegrationTest
} }
private void assertDefaultUiMessages() throws DbException { private void assertDefaultUiMessages() throws DbException {
Collection<PrivateMessageHeader> messages = Collection<ConversationMessageHeader> messages =
db0.transactionWithResult(true, txn -> introductionManager0 db0.transactionWithResult(true, txn -> introductionManager0
.getMessageHeaders(txn, contactId1From0)); .getMessageHeaders(txn, contactId1From0));
assertEquals(2, messages.size()); assertEquals(2, messages.size());
assertMessagesAreAcked(messages); assertMessagesAreAcked(messages);
messages = db0.transactionWithResult(true, messages = db0.transactionWithResult(true, txn -> introductionManager0
txn -> introductionManager0.getMessageHeaders(txn, contactId2From0)); .getMessageHeaders(txn, contactId2From0));
assertEquals(2, messages.size()); assertEquals(2, messages.size());
assertMessagesAreAcked(messages); assertMessagesAreAcked(messages);
messages = db1.transactionWithResult(true, messages = db1.transactionWithResult(true, txn -> introductionManager1
txn -> introductionManager1.getMessageHeaders(txn, contactId0From1)); .getMessageHeaders(txn, contactId0From1));
assertEquals(2, messages.size()); assertEquals(2, messages.size());
assertMessagesAreAcked(messages); assertMessagesAreAcked(messages);
messages = db2.transactionWithResult(true, messages = db2.transactionWithResult(true, txn -> introductionManager2
txn -> introductionManager2.getMessageHeaders(txn, contactId0From2)); .getMessageHeaders(txn, contactId0From2));
assertEquals(2, messages.size()); assertEquals(2, messages.size());
assertMessagesAreAcked(messages); assertMessagesAreAcked(messages);
} }
private void assertMessagesAreAcked( private void assertMessagesAreAcked(
Collection<PrivateMessageHeader> messages) { Collection<ConversationMessageHeader> messages) {
for (PrivateMessageHeader msg : messages) { for (ConversationMessageHeader msg : messages) {
if (msg.isLocal()) assertTrue(msg.isSeen()); if (msg.isLocal()) assertTrue(msg.isSeen());
} }
} }
@@ -1302,9 +1303,9 @@ public class IntroductionIntegrationTest
private IntroductionRequest getIntroductionRequest(DatabaseComponent db, private IntroductionRequest getIntroductionRequest(DatabaseComponent db,
IntroductionManager manager, ContactId contactId) IntroductionManager manager, ContactId contactId)
throws DbException { throws DbException {
Collection<PrivateMessageHeader> messages = db.transactionWithResult( Collection<ConversationMessageHeader> messages = db.transactionWithResult(
true, txn -> manager.getMessageHeaders(txn, contactId)); true, txn -> manager.getMessageHeaders(txn, contactId));
for (PrivateMessageHeader im : messages) { for (ConversationMessageHeader im : messages) {
if (im instanceof IntroductionRequest) { if (im instanceof IntroductionRequest) {
return (IntroductionRequest) im; return (IntroductionRequest) im;
} }

View File

@@ -24,6 +24,7 @@ import org.junit.Test;
import javax.inject.Inject; import javax.inject.Inject;
import static java.util.Collections.emptyList;
import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH; import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH; import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
import static org.briarproject.bramble.api.record.Record.MAX_RECORD_PAYLOAD_BYTES; import static org.briarproject.bramble.api.record.Record.MAX_RECORD_PAYLOAD_BYTES;
@@ -58,7 +59,7 @@ public class MessageSizeIntegrationTest extends BriarTestCase {
long timestamp = Long.MAX_VALUE; long timestamp = Long.MAX_VALUE;
String text = getRandomString(MAX_PRIVATE_MESSAGE_TEXT_LENGTH); String text = getRandomString(MAX_PRIVATE_MESSAGE_TEXT_LENGTH);
PrivateMessage message = privateMessageFactory.createPrivateMessage( PrivateMessage message = privateMessageFactory.createPrivateMessage(
groupId, timestamp, text); groupId, timestamp, text, emptyList());
// Check the size of the serialised message // Check the size of the serialised message
int length = message.getMessage().getRawLength(); int length = message.getMessage().getRawLength();
assertTrue(length > UniqueId.LENGTH + 8 assertTrue(length > UniqueId.LENGTH + 8

View File

@@ -41,6 +41,7 @@ import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import static java.util.Collections.emptyList;
import static org.briarproject.bramble.api.transport.TransportConstants.TAG_LENGTH; import static org.briarproject.bramble.api.transport.TransportConstants.TAG_LENGTH;
import static org.briarproject.bramble.test.TestPluginConfigModule.MAX_LATENCY; import static org.briarproject.bramble.test.TestPluginConfigModule.MAX_LATENCY;
import static org.briarproject.bramble.test.TestPluginConfigModule.TRANSPORT_ID; import static org.briarproject.bramble.test.TestPluginConfigModule.TRANSPORT_ID;
@@ -121,7 +122,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
PrivateMessageFactory privateMessageFactory = PrivateMessageFactory privateMessageFactory =
device.getPrivateMessageFactory(); device.getPrivateMessageFactory();
PrivateMessage message = privateMessageFactory.createPrivateMessage( PrivateMessage message = privateMessageFactory.createPrivateMessage(
groupId, System.currentTimeMillis(), "Hi!"); groupId, System.currentTimeMillis(), "Hi!", emptyList());
messagingManager.addLocalMessage(message); messagingManager.addLocalMessage(message);
} }

View File

@@ -4,6 +4,7 @@ import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.sync.Group; import org.briarproject.bramble.api.sync.Group;
import org.briarproject.bramble.test.TestDatabaseModule; import org.briarproject.bramble.test.TestDatabaseModule;
import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.client.ProtocolStateException;
import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.messaging.PrivateMessageHeader; import org.briarproject.briar.api.messaging.PrivateMessageHeader;
import org.briarproject.briar.api.privategroup.GroupMessage; import org.briarproject.briar.api.privategroup.GroupMessage;
import org.briarproject.briar.api.privategroup.PrivateGroup; import org.briarproject.briar.api.privategroup.PrivateGroup;
@@ -91,7 +92,7 @@ public class GroupInvitationIntegrationTest
assertEquals(privateGroup0.getName(), item.getName()); assertEquals(privateGroup0.getName(), item.getName());
assertFalse(item.isSubscribed()); assertFalse(item.isSubscribed());
Collection<PrivateMessageHeader> messages = Collection<ConversationMessageHeader> messages =
db1.transactionWithResult(true, txn -> groupInvitationManager1 db1.transactionWithResult(true, txn -> groupInvitationManager1
.getMessageHeaders(txn, contactId0From1)); .getMessageHeaders(txn, contactId0From1));
assertEquals(1, messages.size()); assertEquals(1, messages.size());
@@ -118,12 +119,12 @@ public class GroupInvitationIntegrationTest
groupInvitationManager1 groupInvitationManager1
.respondToInvitation(contactId0From1, privateGroup0, false); .respondToInvitation(contactId0From1, privateGroup0, false);
Collection<PrivateMessageHeader> messages = Collection<ConversationMessageHeader> messages =
db1.transactionWithResult(true, txn -> groupInvitationManager1 db1.transactionWithResult(true, txn -> groupInvitationManager1
.getMessageHeaders(txn, contactId0From1)); .getMessageHeaders(txn, contactId0From1));
assertEquals(2, messages.size()); assertEquals(2, messages.size());
boolean foundResponse = false; boolean foundResponse = false;
for (PrivateMessageHeader m : messages) { for (ConversationMessageHeader m : messages) {
if (m instanceof GroupInvitationResponse) { if (m instanceof GroupInvitationResponse) {
foundResponse = true; foundResponse = true;
GroupInvitationResponse response = (GroupInvitationResponse) m; GroupInvitationResponse response = (GroupInvitationResponse) m;
@@ -140,7 +141,7 @@ public class GroupInvitationIntegrationTest
.getMessageHeaders(txn, contactId1From0)); .getMessageHeaders(txn, contactId1From0));
assertEquals(2, messages.size()); assertEquals(2, messages.size());
foundResponse = false; foundResponse = false;
for (PrivateMessageHeader m : messages) { for (ConversationMessageHeader m : messages) {
if (m instanceof GroupInvitationResponse) { if (m instanceof GroupInvitationResponse) {
foundResponse = true; foundResponse = true;
GroupInvitationResponse response = (GroupInvitationResponse) m; GroupInvitationResponse response = (GroupInvitationResponse) m;
@@ -168,12 +169,12 @@ public class GroupInvitationIntegrationTest
groupInvitationManager1 groupInvitationManager1
.respondToInvitation(contactId0From1, privateGroup0, true); .respondToInvitation(contactId0From1, privateGroup0, true);
Collection<PrivateMessageHeader> messages = Collection<ConversationMessageHeader> messages =
db1.transactionWithResult(true, txn -> groupInvitationManager1 db1.transactionWithResult(true, txn -> groupInvitationManager1
.getMessageHeaders(txn, contactId0From1)); .getMessageHeaders(txn, contactId0From1));
assertEquals(2, messages.size()); assertEquals(2, messages.size());
boolean foundResponse = false; boolean foundResponse = false;
for (PrivateMessageHeader m : messages) { for (ConversationMessageHeader m : messages) {
if (m instanceof GroupInvitationResponse) { if (m instanceof GroupInvitationResponse) {
foundResponse = true; foundResponse = true;
GroupInvitationResponse response = (GroupInvitationResponse) m; GroupInvitationResponse response = (GroupInvitationResponse) m;
@@ -194,7 +195,7 @@ public class GroupInvitationIntegrationTest
.getMessageHeaders(txn, contactId1From0)); .getMessageHeaders(txn, contactId1From0));
assertEquals(2, messages.size()); assertEquals(2, messages.size());
foundResponse = false; foundResponse = false;
for (PrivateMessageHeader m : messages) { for (ConversationMessageHeader m : messages) {
if (m instanceof GroupInvitationResponse) { if (m instanceof GroupInvitationResponse) {
foundResponse = true; foundResponse = true;
GroupInvitationResponse response = (GroupInvitationResponse) m; GroupInvitationResponse response = (GroupInvitationResponse) m;
@@ -226,9 +227,10 @@ public class GroupInvitationIntegrationTest
// 1 has one unread message // 1 has one unread message
Group g0 = groupInvitationManager1.getContactGroup(contact0From1); Group g0 = groupInvitationManager1.getContactGroup(contact0From1);
assertGroupCount(messageTracker1, g0.getId(), 1, 1, timestamp); assertGroupCount(messageTracker1, g0.getId(), 1, 1, timestamp);
PrivateMessageHeader m = db1.transactionWithResult(true, ConversationMessageHeader m = db1.transactionWithResult(true,
txn -> groupInvitationManager1.getMessageHeaders(txn, contactId0From1) txn -> groupInvitationManager1
.iterator().next()); .getMessageHeaders(txn, contactId0From1).iterator()
.next());
groupInvitationManager1 groupInvitationManager1
.respondToInvitation(contactId0From1, privateGroup0, true); .respondToInvitation(contactId0From1, privateGroup0, true);

View File

@@ -24,7 +24,7 @@ import org.briarproject.bramble.test.BrambleMockTestCase;
import org.briarproject.bramble.test.TestUtils; import org.briarproject.bramble.test.TestUtils;
import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.messaging.PrivateMessageHeader; import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.privategroup.PrivateGroup; import org.briarproject.briar.api.privategroup.PrivateGroup;
import org.briarproject.briar.api.privategroup.PrivateGroupFactory; import org.briarproject.briar.api.privategroup.PrivateGroupFactory;
import org.briarproject.briar.api.privategroup.PrivateGroupManager; import org.briarproject.briar.api.privategroup.PrivateGroupManager;
@@ -696,10 +696,10 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
oneOf(db).getMessageStatus(txn, contactId, messageId2); oneOf(db).getMessageStatus(txn, contactId, messageId2);
}}); }});
Collection<PrivateMessageHeader> messages = Collection<ConversationMessageHeader> messages =
groupInvitationManager.getMessageHeaders(txn, contactId); groupInvitationManager.getMessageHeaders(txn, contactId);
assertEquals(2, messages.size()); assertEquals(2, messages.size());
for (PrivateMessageHeader m : messages) { for (ConversationMessageHeader m : messages) {
assertEquals(contactGroup.getId(), m.getGroupId()); assertEquals(contactGroup.getId(), m.getGroupId());
if (m.getId().equals(message.getId())) { if (m.getId().equals(message.getId())) {
assertTrue(m instanceof GroupInvitationRequest); assertTrue(m instanceof GroupInvitationRequest);

View File

@@ -18,7 +18,7 @@ import org.briarproject.briar.api.blog.BlogManager;
import org.briarproject.briar.api.blog.BlogSharingManager; import org.briarproject.briar.api.blog.BlogSharingManager;
import org.briarproject.briar.api.blog.event.BlogInvitationRequestReceivedEvent; import org.briarproject.briar.api.blog.event.BlogInvitationRequestReceivedEvent;
import org.briarproject.briar.api.blog.event.BlogInvitationResponseReceivedEvent; import org.briarproject.briar.api.blog.event.BlogInvitationResponseReceivedEvent;
import org.briarproject.briar.api.messaging.PrivateMessageHeader; import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.test.BriarIntegrationTest; import org.briarproject.briar.test.BriarIntegrationTest;
import org.briarproject.briar.test.BriarIntegrationTestComponent; import org.briarproject.briar.test.BriarIntegrationTestComponent;
import org.briarproject.briar.test.DaggerBriarIntegrationTestComponent; import org.briarproject.briar.test.DaggerBriarIntegrationTestComponent;
@@ -146,12 +146,12 @@ public class BlogSharingIntegrationTest
assertTrue(blogManager1.getBlogs().contains(blog2)); assertTrue(blogManager1.getBlogs().contains(blog2));
// invitee has one invitation message from sharer // invitee has one invitation message from sharer
Collection<PrivateMessageHeader> list = db1.transactionWithResult(true, Collection<ConversationMessageHeader> list =
txn -> blogSharingManager1 db1.transactionWithResult(true, txn -> blogSharingManager1
.getMessageHeaders(txn, contactId0From1)); .getMessageHeaders(txn, contactId0From1));
assertEquals(2, list.size()); assertEquals(2, list.size());
// check other things are alright with the message // check other things are alright with the message
for (PrivateMessageHeader m : list) { for (ConversationMessageHeader m : list) {
if (m instanceof BlogInvitationRequest) { if (m instanceof BlogInvitationRequest) {
BlogInvitationRequest invitation = (BlogInvitationRequest) m; BlogInvitationRequest invitation = (BlogInvitationRequest) m;
assertEquals(blog2, invitation.getNameable()); assertEquals(blog2, invitation.getNameable());
@@ -220,11 +220,12 @@ public class BlogSharingIntegrationTest
assertTrue(blogManager1.getBlogs().contains(rssBlog)); assertTrue(blogManager1.getBlogs().contains(rssBlog));
// invitee has one invitation message from sharer // invitee has one invitation message from sharer
Collection<PrivateMessageHeader> list = db1.transactionWithResult(true, Collection<ConversationMessageHeader> list =
txn -> blogSharingManager1.getMessageHeaders(txn, contactId0From1)); db1.transactionWithResult(true, txn -> blogSharingManager1
.getMessageHeaders(txn, contactId0From1));
assertEquals(2, list.size()); assertEquals(2, list.size());
// check other things are alright with the message // check other things are alright with the message
for (PrivateMessageHeader m : list) { for (ConversationMessageHeader m : list) {
if (m instanceof BlogInvitationRequest) { if (m instanceof BlogInvitationRequest) {
BlogInvitationRequest invitation = (BlogInvitationRequest) m; BlogInvitationRequest invitation = (BlogInvitationRequest) m;
assertEquals(rssBlog, invitation.getNameable()); assertEquals(rssBlog, invitation.getNameable());
@@ -282,11 +283,12 @@ public class BlogSharingIntegrationTest
assertEquals(0, blogSharingManager1.getInvitations().size()); assertEquals(0, blogSharingManager1.getInvitations().size());
// invitee has one invitation message from sharer and one response // invitee has one invitation message from sharer and one response
Collection<PrivateMessageHeader> list = db1.transactionWithResult(true, Collection<ConversationMessageHeader> list =
txn -> blogSharingManager1.getMessageHeaders(txn, contactId0From1)); db1.transactionWithResult(true, txn -> blogSharingManager1
.getMessageHeaders(txn, contactId0From1));
assertEquals(2, list.size()); assertEquals(2, list.size());
// check things are alright with the message // check things are alright with the message
for (PrivateMessageHeader m : list) { for (ConversationMessageHeader m : list) {
if (m instanceof BlogInvitationRequest) { if (m instanceof BlogInvitationRequest) {
BlogInvitationRequest invitation = (BlogInvitationRequest) m; BlogInvitationRequest invitation = (BlogInvitationRequest) m;
assertEquals(blog2, invitation.getNameable()); assertEquals(blog2, invitation.getNameable());
@@ -389,7 +391,7 @@ public class BlogSharingIntegrationTest
assertTrue(contacts.contains(contact0From1)); assertTrue(contacts.contains(contact0From1));
// make sure 1 knows that they have blog2 already // make sure 1 knows that they have blog2 already
Collection<PrivateMessageHeader> messages = Collection<ConversationMessageHeader> messages =
db1.transactionWithResult(true, txn -> blogSharingManager1 db1.transactionWithResult(true, txn -> blogSharingManager1
.getMessageHeaders(txn, contactId0From1)); .getMessageHeaders(txn, contactId0From1));
assertEquals(2, messages.size()); assertEquals(2, messages.size());

View File

@@ -12,6 +12,7 @@ import org.briarproject.bramble.api.sync.Group;
import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.test.TestDatabaseModule; import org.briarproject.bramble.test.TestDatabaseModule;
import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.forum.Forum; import org.briarproject.briar.api.forum.Forum;
import org.briarproject.briar.api.forum.ForumInvitationRequest; import org.briarproject.briar.api.forum.ForumInvitationRequest;
import org.briarproject.briar.api.forum.ForumInvitationResponse; import org.briarproject.briar.api.forum.ForumInvitationResponse;
@@ -129,11 +130,12 @@ public class ForumSharingIntegrationTest
assertEquals(1, forumManager1.getForums().size()); assertEquals(1, forumManager1.getForums().size());
// invitee has one invitation message from sharer // invitee has one invitation message from sharer
Collection<PrivateMessageHeader> list = db1.transactionWithResult(true, Collection<ConversationMessageHeader> list =
txn -> forumSharingManager1.getMessageHeaders(txn, contactId0From1)); db1.transactionWithResult(true, txn -> forumSharingManager1
.getMessageHeaders(txn, contactId0From1));
assertEquals(2, list.size()); assertEquals(2, list.size());
// check other things are alright with the forum message // check other things are alright with the forum message
for (PrivateMessageHeader m : list) { for (ConversationMessageHeader m : list) {
if (m instanceof ForumInvitationRequest) { if (m instanceof ForumInvitationRequest) {
ForumInvitationRequest invitation = (ForumInvitationRequest) m; ForumInvitationRequest invitation = (ForumInvitationRequest) m;
assertTrue(invitation.wasAnswered()); assertTrue(invitation.wasAnswered());
@@ -185,11 +187,12 @@ public class ForumSharingIntegrationTest
assertEquals(0, forumSharingManager1.getInvitations().size()); assertEquals(0, forumSharingManager1.getInvitations().size());
// invitee has one invitation message from sharer and one response // invitee has one invitation message from sharer and one response
Collection<PrivateMessageHeader> list = db1.transactionWithResult(true, Collection<ConversationMessageHeader> list =
txn -> forumSharingManager1.getMessageHeaders(txn, contactId0From1)); db1.transactionWithResult(true, txn -> forumSharingManager1
.getMessageHeaders(txn, contactId0From1));
assertEquals(2, list.size()); assertEquals(2, list.size());
// check things are alright with the forum message // check things are alright with the forum message
for (PrivateMessageHeader m : list) { for (ConversationMessageHeader m : list) {
if (m instanceof ForumInvitationRequest) { if (m instanceof ForumInvitationRequest) {
ForumInvitationRequest invitation = (ForumInvitationRequest) m; ForumInvitationRequest invitation = (ForumInvitationRequest) m;
assertEquals(forum0, invitation.getNameable()); assertEquals(forum0, invitation.getNameable());
@@ -733,9 +736,9 @@ public class ForumSharingIntegrationTest
// get invitation MessageId for later // get invitation MessageId for later
MessageId invitationId = null; MessageId invitationId = null;
Collection<PrivateMessageHeader> list = db1.transactionWithResult(true, Collection<ConversationMessageHeader> list = db1.transactionWithResult(true,
txn -> forumSharingManager1.getMessageHeaders(txn, contactId0From1)); txn -> forumSharingManager1.getMessageHeaders(txn, contactId0From1));
for (PrivateMessageHeader m : list) { for (ConversationMessageHeader m : list) {
if (m instanceof ForumInvitationRequest) { if (m instanceof ForumInvitationRequest) {
invitationId = m.getId(); invitationId = m.getId();
} }

View File

@@ -195,7 +195,7 @@ it will send a JSON object to connected websocket clients:
"timestamp": 1537389146088, "timestamp": 1537389146088,
"type": "PrivateMessage" "type": "PrivateMessage"
}, },
"name": "PrivateMessageReceivedEvent", "name": "ConversationMessageReceivedEvent",
"type": "event" "type": "event"
} }
``` ```

View File

@@ -1,13 +1,41 @@
package org.briarproject.briar.headless.event package org.briarproject.briar.headless.event
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent 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.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 PrivateMessageReceivedEvent<*>.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

@@ -15,13 +15,17 @@ import org.briarproject.bramble.api.system.Clock
import org.briarproject.bramble.util.StringUtils.utf8IsTooLong import org.briarproject.bramble.util.StringUtils.utf8IsTooLong
import org.briarproject.briar.api.blog.BlogInvitationRequest import org.briarproject.briar.api.blog.BlogInvitationRequest
import org.briarproject.briar.api.blog.BlogInvitationResponse import org.briarproject.briar.api.blog.BlogInvitationResponse
import org.briarproject.briar.api.conversation.ConversationManager
import org.briarproject.briar.api.conversation.ConversationMessageVisitor
import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent
import org.briarproject.briar.api.forum.ForumInvitationRequest import org.briarproject.briar.api.forum.ForumInvitationRequest
import org.briarproject.briar.api.forum.ForumInvitationResponse import org.briarproject.briar.api.forum.ForumInvitationResponse
import org.briarproject.briar.api.introduction.IntroductionRequest import org.briarproject.briar.api.introduction.IntroductionRequest
import org.briarproject.briar.api.introduction.IntroductionResponse import org.briarproject.briar.api.introduction.IntroductionResponse
import org.briarproject.briar.api.messaging.*
import org.briarproject.briar.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_TEXT_LENGTH import org.briarproject.briar.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_TEXT_LENGTH
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent import org.briarproject.briar.api.messaging.MessagingManager
import org.briarproject.briar.api.messaging.PrivateMessageFactory
import org.briarproject.briar.api.messaging.PrivateMessageHeader
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse
import org.briarproject.briar.headless.event.WebSocketController import org.briarproject.briar.headless.event.WebSocketController
@@ -34,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 = "PrivateMessageReceivedEvent" internal const val EVENT_CONVERSATION_MESSAGE = "ConversationMessageReceivedEvent"
@Immutable @Immutable
@Singleton @Singleton
@@ -69,7 +73,7 @@ constructor(
val group = messagingManager.getContactGroup(contact) val group = messagingManager.getContactGroup(contact)
val now = clock.currentTimeMillis() val now = clock.currentTimeMillis()
val m = privateMessageFactory.createPrivateMessage(group.id, now, message) val m = privateMessageFactory.createPrivateMessage(group.id, now, message, emptyList())
messagingManager.addLocalMessage(m) messagingManager.addLocalMessage(m)
return ctx.json(m.output(contact.id, message)) return ctx.json(m.output(contact.id, message))
@@ -77,9 +81,14 @@ constructor(
override fun eventOccurred(e: Event) { override fun eventOccurred(e: Event) {
when (e) { when (e) {
is PrivateMessageReceivedEvent<*> -> 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())
}
} }
} }
} }
@@ -97,7 +106,7 @@ constructor(
private class JsonVisitor( private class JsonVisitor(
private val contactId: ContactId, private val contactId: ContactId,
private val messagingManager: MessagingManager private val messagingManager: MessagingManager
) : PrivateMessageVisitor<JsonDict> { ) : ConversationMessageVisitor<JsonDict> {
override fun visitPrivateMessageHeader(h: PrivateMessageHeader) = override fun visitPrivateMessageHeader(h: PrivateMessageHeader) =
h.output(contactId, messagingManager.getMessageText(h.id)) h.output(contactId, messagingManager.getMessageText(h.id))

View File

@@ -1,12 +1,12 @@
package org.briarproject.briar.headless.messaging 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.messaging.PrivateMessage import org.briarproject.briar.api.messaging.PrivateMessage
import org.briarproject.briar.api.messaging.PrivateMessageHeader import org.briarproject.briar.api.messaging.PrivateMessageHeader
import org.briarproject.briar.headless.json.JsonDict import org.briarproject.briar.headless.json.JsonDict
internal fun PrivateMessageHeader.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,
@@ -17,12 +17,20 @@ internal fun PrivateMessageHeader.output(contactId: ContactId) = JsonDict(
"groupId" to groupId.bytes "groupId" to groupId.bytes
) )
internal fun PrivateMessageHeader.output(contactId: ContactId, text: String?): JsonDict { internal fun ConversationMessageHeader.output(contactId: ContactId, text: String?): JsonDict {
val dict = output(contactId) val dict = output(contactId)
dict["text"] = text dict["text"] = text
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

@@ -2,16 +2,16 @@ 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.blog.BlogInvitationRequest import org.briarproject.briar.api.blog.BlogInvitationRequest
import org.briarproject.briar.api.conversation.ConversationMessageHeader
import org.briarproject.briar.api.conversation.ConversationRequest
import org.briarproject.briar.api.forum.ForumInvitationRequest import org.briarproject.briar.api.forum.ForumInvitationRequest
import org.briarproject.briar.api.introduction.IntroductionRequest import org.briarproject.briar.api.introduction.IntroductionRequest
import org.briarproject.briar.api.messaging.PrivateMessageHeader
import org.briarproject.briar.api.messaging.PrivateRequest
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest
import org.briarproject.briar.api.sharing.InvitationRequest import org.briarproject.briar.api.sharing.InvitationRequest
import org.briarproject.briar.headless.json.JsonDict import org.briarproject.briar.headless.json.JsonDict
internal fun PrivateRequest<*>.output(contactId: ContactId): JsonDict { internal fun ConversationRequest<*>.output(contactId: ContactId): JsonDict {
val dict = (this as PrivateMessageHeader).output(contactId, text) val dict = (this as ConversationMessageHeader).output(contactId, text)
dict.putAll( dict.putAll(
"sessionId" to sessionId.bytes, "sessionId" to sessionId.bytes,
"name" to name, "name" to name,
@@ -21,7 +21,7 @@ internal fun PrivateRequest<*>.output(contactId: ContactId): JsonDict {
} }
internal fun IntroductionRequest.output(contactId: ContactId): JsonDict { internal fun IntroductionRequest.output(contactId: ContactId): JsonDict {
val dict = (this as PrivateRequest<*>).output(contactId) val dict = (this as ConversationRequest<*>).output(contactId)
dict.putAll( dict.putAll(
"type" to "IntroductionRequest", "type" to "IntroductionRequest",
"alreadyContact" to isContact "alreadyContact" to isContact
@@ -30,7 +30,7 @@ internal fun IntroductionRequest.output(contactId: ContactId): JsonDict {
} }
internal fun InvitationRequest<*>.output(contactId: ContactId): JsonDict { internal fun InvitationRequest<*>.output(contactId: ContactId): JsonDict {
val dict = (this as PrivateRequest<*>).output(contactId) val dict = (this as ConversationRequest<*>).output(contactId)
dict["canBeOpened"] = canBeOpened() dict["canBeOpened"] = canBeOpened()
return dict return dict
} }

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.messaging.PrivateResponse
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 PrivateResponse.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()
@@ -21,7 +21,7 @@ internal fun PrivateResponse.output(contactId: ContactId): JsonDict {
} }
internal fun IntroductionResponse.output(contactId: ContactId): JsonDict { internal fun IntroductionResponse.output(contactId: ContactId): JsonDict {
val dict = (this as PrivateResponse).output(contactId) val dict = (this as ConversationResponse).output(contactId)
dict.putAll( dict.putAll(
"type" to "IntroductionResponse", "type" to "IntroductionResponse",
"introducedAuthor" to introducedAuthor.output(), "introducedAuthor" to introducedAuthor.output(),
@@ -31,7 +31,7 @@ internal fun IntroductionResponse.output(contactId: ContactId): JsonDict {
} }
internal fun InvitationResponse.output(contactId: ContactId): JsonDict { internal fun InvitationResponse.output(contactId: ContactId): JsonDict {
val dict = (this as PrivateResponse).output(contactId) val dict = (this as ConversationResponse).output(contactId)
dict["shareableId"] = shareableId.bytes dict["shareableId"] = shareableId.bytes
return dict return dict
} }

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
@@ -21,9 +28,9 @@ internal class WebSocketControllerTest : ControllerTest() {
private val controller = WebSocketControllerImpl(ImmediateExecutor()) private val controller = WebSocketControllerImpl(ImmediateExecutor())
private val header = private val header =
PrivateMessageHeader(message.id, group.id, timestamp, true, true, true, true) 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,17 +62,49 @@ 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",
"name": "PrivateMessageReceivedEvent", "name": "ConversationMessageReceivedEvent",
"data": ${toJson(header.output(contact.id, text))} "data": ${toJson(header.output(contact.id, text))}
} }
""" """

View File

@@ -14,9 +14,13 @@ import org.briarproject.bramble.test.ImmediateExecutor
import org.briarproject.bramble.test.TestUtils.getRandomId import org.briarproject.bramble.test.TestUtils.getRandomId
import org.briarproject.bramble.util.StringUtils.getRandomString import org.briarproject.bramble.util.StringUtils.getRandomString
import org.briarproject.briar.api.client.SessionId import org.briarproject.briar.api.client.SessionId
import org.briarproject.briar.api.conversation.ConversationManager
import org.briarproject.briar.api.introduction.IntroductionRequest import org.briarproject.briar.api.introduction.IntroductionRequest
import org.briarproject.briar.api.messaging.*
import org.briarproject.briar.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_TEXT_LENGTH import org.briarproject.briar.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_TEXT_LENGTH
import org.briarproject.briar.api.messaging.MessagingManager
import org.briarproject.briar.api.messaging.PrivateMessage
import org.briarproject.briar.api.messaging.PrivateMessageFactory
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.event.WebSocketController import org.briarproject.briar.headless.event.WebSocketController
@@ -46,7 +50,7 @@ internal class MessagingControllerImplTest : ControllerTest() {
) )
private val header = private val header =
PrivateMessageHeader(message.id, group.id, timestamp, true, true, true, true) PrivateMessageHeader(message.id, group.id, timestamp, true, true, true, true, emptyList())
private val sessionId = SessionId(getRandomId()) private val sessionId = SessionId(getRandomId())
private val privateMessage = PrivateMessage(message) private val privateMessage = PrivateMessage(message)
@@ -75,10 +79,10 @@ internal class MessagingControllerImplTest : ControllerTest() {
} }
@Test @Test
fun emptyList() { fun testEmptyList() {
every { ctx.pathParam("contactId") } returns contact.id.int.toString() every { ctx.pathParam("contactId") } returns contact.id.int.toString()
every { contactManager.getContact(contact.id) } returns contact every { contactManager.getContact(contact.id) } returns contact
every { conversationManager.getMessageHeaders(contact.id) } returns emptyList<PrivateMessageHeader>() every { conversationManager.getMessageHeaders(contact.id) } returns emptyList()
every { ctx.json(emptyList<Any>()) } returns ctx every { ctx.json(emptyList<Any>()) } returns ctx
controller.list(ctx) controller.list(ctx)
@@ -106,7 +110,8 @@ internal class MessagingControllerImplTest : ControllerTest() {
privateMessageFactory.createPrivateMessage( privateMessageFactory.createPrivateMessage(
group.id, group.id,
timestamp, timestamp,
text text,
emptyList()
) )
} returns privateMessage } returns privateMessage
every { messagingManager.addLocalMessage(privateMessage) } just runs every { messagingManager.addLocalMessage(privateMessage) } just runs
@@ -156,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)
} }