Merge branch 'message-tracked-event' into 'master'

Implement and use new message tracked event

See merge request briar/briar!1541
This commit is contained in:
akwizgran
2021-11-12 11:35:59 +00:00
23 changed files with 187 additions and 118 deletions

View File

@@ -128,7 +128,7 @@ public interface ClientHelper {
* group.
*/
ContactId getContactId(Transaction txn, GroupId contactGroupId)
throws DbException, FormatException;
throws DbException;
/**
* Stores the given contact ID in the group metadata of the given contact

View File

@@ -40,10 +40,10 @@ public class ContactListItem extends ContactItem
item.unread, item.timestamp);
}
ContactListItem(ContactListItem item, ConversationMessageHeader h) {
ContactListItem(ContactListItem item, long timestamp, boolean read) {
this(item.getContact(), item.getAuthorInfo(), item.isConnected(), false,
h.isRead() ? item.unread : item.unread + 1,
Math.max(h.getTimestamp(), item.timestamp));
read ? item.unread : item.unread + 1,
Math.max(timestamp, item.timestamp));
}
/**

View File

@@ -28,6 +28,7 @@ import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent;
import org.briarproject.briar.api.conversation.event.ConversationMessageTrackedEvent;
import org.briarproject.briar.api.identity.AuthorInfo;
import org.briarproject.briar.api.identity.AuthorManager;
@@ -131,13 +132,14 @@ public class ContactsViewModel extends DbViewModel implements EventListener {
} else if (e instanceof ContactRemovedEvent) {
LOG.info("Contact removed, removing item");
removeItem(((ContactRemovedEvent) e).getContactId());
} else if (e instanceof ConversationMessageReceivedEvent) {
LOG.info("Conversation message received, updating item");
ConversationMessageReceivedEvent<?> p =
(ConversationMessageReceivedEvent<?>) e;
ConversationMessageHeader h = p.getMessageHeader();
updateItem(p.getContactId(), item -> new ContactListItem(item, h),
true);
} else if (e instanceof ConversationMessageTrackedEvent) {
LOG.info("Conversation message tracked, updating item");
ConversationMessageTrackedEvent p =
(ConversationMessageTrackedEvent) e;
long timestamp = p.getTimestamp();
boolean read = p.getRead();
updateItem(p.getContactId(),
item -> new ContactListItem(item, timestamp, read), true);
} else if (e instanceof AvatarUpdatedEvent) {
AvatarUpdatedEvent a = (AvatarUpdatedEvent) e;
updateItem(a.getContactId(), item -> new ContactListItem(item,

View File

@@ -6,6 +6,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.api.conversation.ConversationManager;
import javax.annotation.Nullable;
@@ -32,16 +33,28 @@ public interface MessageTracker {
/**
* Updates the group count for the given incoming message.
* <p>
* For messages that are part of a conversation (private chat),
* use the corresponding function inside
* {@link ConversationManager} instead.
*/
void trackIncomingMessage(Transaction txn, Message m) throws DbException;
/**
* Updates the group count for the given outgoing message.
* <p>
* For messages that are part of a conversation (private chat),
* use the corresponding function inside
* {@link ConversationManager} instead.
*/
void trackOutgoingMessage(Transaction txn, Message m) throws DbException;
/**
* Updates the group count for the given message.
* <p>
* For messages that are part of a conversation (private chat),
* use the corresponding function inside
* {@link ConversationManager} instead.
*/
void trackMessage(Transaction txn, GroupId g, long timestamp, boolean read)
throws DbException;

View File

@@ -7,6 +7,7 @@ import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.Group;
import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.api.client.MessageTracker.GroupCount;
import org.briarproject.briar.api.messaging.MessagingManager;
@@ -47,6 +48,27 @@ public interface ConversationManager {
*/
GroupCount getGroupCount(Transaction txn, ContactId c) throws DbException;
/**
* Updates the group count for the given incoming private conversation message
* and broadcasts a corresponding event.
*/
void trackIncomingMessage(Transaction txn, Message m)
throws DbException;
/**
* Updates the group count for the given outgoing private conversation message
* and broadcasts a corresponding event.
*/
void trackOutgoingMessage(Transaction txn, Message m)
throws DbException;
/**
* Updates the group count for the given private conversation message
* and broadcasts a corresponding event.
*/
void trackMessage(Transaction txn, GroupId g, long timestamp, boolean read)
throws DbException;
void setReadFlag(GroupId g, MessageId m, boolean read)
throws DbException;

View File

@@ -0,0 +1,41 @@
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.bramble.api.sync.Message;
import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import javax.annotation.concurrent.Immutable;
/**
* An event that is broadcast when a new conversation message is tracked.
* Allows the UI to update the conversation's group count.
*/
@Immutable
@NotNullByDefault
public class ConversationMessageTrackedEvent extends Event {
private final long timestamp;
private final boolean read;
private final ContactId contactId;
public ConversationMessageTrackedEvent(long timestamp,
boolean read, ContactId contactId) {
this.timestamp = timestamp;
this.read = read;
this.contactId = contactId;
}
public long getTimestamp() {
return timestamp;
}
public boolean getRead() {
return read;
}
public ContactId getContactId() {
return contactId;
}
}

View File

@@ -1,11 +1,14 @@
package org.briarproject.briar.conversation;
import org.briarproject.bramble.api.client.ClientHelper;
import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.db.DatabaseComponent;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.briar.api.client.MessageTracker;
@@ -13,6 +16,7 @@ import org.briarproject.briar.api.client.MessageTracker.GroupCount;
import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.conversation.DeletionResult;
import org.briarproject.briar.api.conversation.event.ConversationMessageTrackedEvent;
import java.util.ArrayList;
import java.util.Collection;
@@ -32,14 +36,16 @@ class ConversationManagerImpl implements ConversationManager {
private final DatabaseComponent db;
private final MessageTracker messageTracker;
private final Clock clock;
private final ClientHelper clientHelper;
private final Set<ConversationClient> clients;
@Inject
ConversationManagerImpl(DatabaseComponent db, MessageTracker messageTracker,
Clock clock) {
Clock clock, ClientHelper clientHelper) {
this.db = db;
this.messageTracker = messageTracker;
this.clock = clock;
this.clientHelper = clientHelper;
clients = new CopyOnWriteArraySet<>();
}
@@ -86,6 +92,36 @@ class ConversationManagerImpl implements ConversationManager {
return new GroupCount(msgCount, unreadCount, latestTime);
}
@Override
public void trackIncomingMessage(Transaction txn, Message m)
throws DbException {
messageTracker.trackIncomingMessage(txn, m);
Event e = new ConversationMessageTrackedEvent(
m.getTimestamp(), false,
clientHelper.getContactId(txn, m.getGroupId()));
txn.attach(e);
}
@Override
public void trackOutgoingMessage(Transaction txn, Message m)
throws DbException {
messageTracker.trackOutgoingMessage(txn, m);
Event e = new ConversationMessageTrackedEvent(
m.getTimestamp(), true,
clientHelper.getContactId(txn, m.getGroupId()));
txn.attach(e);
}
@Override
public void trackMessage(Transaction txn, GroupId g, long timestamp,
boolean read)
throws DbException {
messageTracker.trackMessage(txn, g, timestamp, read);
Event e = new ConversationMessageTrackedEvent(
timestamp, read, clientHelper.getContactId(txn, g));
txn.attach(e);
}
@Override
public void setReadFlag(GroupId g, MessageId m, boolean read)
throws DbException {

View File

@@ -100,7 +100,7 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
long timestamp, Author author, @Nullable String text)
throws DbException {
Message m;
ContactId c = getContactId(txn, s.getContactGroupId());
ContactId c = clientHelper.getContactId(txn, s.getContactGroupId());
if (contactSupportsAutoDeletion(txn, c)) {
long timer = autoDeleteManager.getAutoDeleteTimer(txn, c,
timestamp);
@@ -125,7 +125,7 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
Map<TransportId, TransportProperties> transportProperties,
boolean visible) throws DbException {
Message m;
ContactId c = getContactId(txn, s.getContactGroupId());
ContactId c = clientHelper.getContactId(txn, s.getContactGroupId());
if (contactSupportsAutoDeletion(txn, c)) {
long timer = autoDeleteManager.getAutoDeleteTimer(txn, c,
timestamp);
@@ -152,7 +152,7 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
boolean visible, boolean isAutoDecline) throws DbException {
if (!visible && isAutoDecline) throw new IllegalArgumentException();
Message m;
ContactId c = getContactId(txn, s.getContactGroupId());
ContactId c = clientHelper.getContactId(txn, s.getContactGroupId());
if (contactSupportsAutoDeletion(txn, c)) {
long timer = autoDeleteManager.getAutoDeleteTimer(txn, c,
timestamp);
@@ -276,26 +276,17 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
long getTimestampForOutgoingMessage(Transaction txn, GroupId contactGroupId)
throws DbException {
ContactId c = getContactId(txn, contactGroupId);
ContactId c = clientHelper.getContactId(txn, contactGroupId);
return conversationManager.getTimestampForOutgoingMessage(txn, c);
}
void receiveAutoDeleteTimer(Transaction txn, AbstractIntroductionMessage m)
throws DbException {
ContactId c = getContactId(txn, m.getGroupId());
ContactId c = clientHelper.getContactId(txn, m.getGroupId());
autoDeleteManager.receiveAutoDeleteTimer(txn, c, m.getAutoDeleteTimer(),
m.getTimestamp());
}
private ContactId getContactId(Transaction txn, GroupId contactGroupId)
throws DbException {
try {
return clientHelper.getContactId(txn, contactGroupId);
} catch (FormatException e) {
throw new DbException(e);
}
}
private boolean contactSupportsAutoDeletion(Transaction txn, ContactId c)
throws DbException {
int minorVersion = clientVersioningManager.getClientMinorVersion(txn, c,

View File

@@ -266,7 +266,7 @@ class IntroduceeProtocolEngine
addSessionId(txn, m.getMessageId(), s.getSessionId());
// Track the incoming message
messageTracker
conversationManager
.trackMessage(txn, m.getGroupId(), m.getTimestamp(), false);
// Receive the auto-delete timer
@@ -307,7 +307,7 @@ class IntroduceeProtocolEngine
Message sent = sendAcceptMessage(txn, s, localTimestamp, publicKey,
localTimestamp, transportProperties, true);
// Track the message
messageTracker.trackOutgoingMessage(txn, sent);
conversationManager.trackOutgoingMessage(txn, sent);
// Determine the next state
switch (s.getState()) {
@@ -338,7 +338,7 @@ class IntroduceeProtocolEngine
sendDeclineMessage(txn, s, localTimestamp, true, isAutoDecline);
// Track the message
messageTracker.trackOutgoingMessage(txn, sent);
conversationManager.trackOutgoingMessage(txn, sent);
// Move to the START or LOCAL_DECLINED state, if still awaiting response
IntroduceeState state =
@@ -382,7 +382,7 @@ class IntroduceeProtocolEngine
markMessageVisibleInUi(txn, m.getMessageId());
// Track the incoming message
messageTracker
conversationManager
.trackMessage(txn, m.getGroupId(), m.getTimestamp(), false);
// Receive the auto-delete timer

View File

@@ -40,6 +40,7 @@ import static org.briarproject.briar.introduction.IntroducerState.A_DECLINED;
import static org.briarproject.briar.introduction.IntroducerState.B_DECLINED;
import static org.briarproject.briar.introduction.IntroducerState.START;
@Immutable
@NotNullByDefault
class IntroducerProtocolEngine
@@ -231,8 +232,8 @@ class IntroducerProtocolEngine
Message sentB = sendRequestMessage(txn, s.getIntroduceeB(),
localTimestamp, s.getIntroduceeA().author, text);
// Track the messages
messageTracker.trackOutgoingMessage(txn, sentA);
messageTracker.trackOutgoingMessage(txn, sentB);
conversationManager.trackOutgoingMessage(txn, sentA);
conversationManager.trackOutgoingMessage(txn, sentB);
// Move to the AWAIT_RESPONSES state
Introducee introduceeA = new Introducee(s.getIntroduceeA(), sentA);
Introducee introduceeB = new Introducee(s.getIntroduceeB(), sentB);
@@ -260,7 +261,7 @@ class IntroducerProtocolEngine
// Mark the response visible in the UI
markMessageVisibleInUi(txn, m.getMessageId());
// Track the incoming message
messageTracker
conversationManager
.trackMessage(txn, m.getGroupId(), m.getTimestamp(), false);
// Receive the auto-delete timer
receiveAutoDeleteTimer(txn, m);
@@ -323,7 +324,7 @@ class IntroducerProtocolEngine
// Mark the response visible in the UI
markMessageVisibleInUi(txn, m.getMessageId());
// Track the incoming message
messageTracker
conversationManager
.trackMessage(txn, m.getGroupId(), m.getTimestamp(), false);
// Receive the auto-delete timer
receiveAutoDeleteTimer(txn, m);
@@ -378,7 +379,7 @@ class IntroducerProtocolEngine
// Mark the response visible in the UI
markMessageVisibleInUi(txn, m.getMessageId());
// Track the incoming message
messageTracker
conversationManager
.trackMessage(txn, m.getGroupId(), m.getTimestamp(), false);
// Receive the auto-delete timer
receiveAutoDeleteTimer(txn, m);
@@ -433,7 +434,7 @@ class IntroducerProtocolEngine
// Mark the response visible in the UI
markMessageVisibleInUi(txn, m.getMessageId());
// Track the incoming message
messageTracker
conversationManager
.trackMessage(txn, m.getGroupId(), m.getTimestamp(), false);
// Receive the auto-delete timer
receiveAutoDeleteTimer(txn, m);

View File

@@ -34,6 +34,7 @@ import org.briarproject.briar.api.autodelete.AutoDeleteManager;
import org.briarproject.briar.api.autodelete.event.ConversationMessagesDeletedEvent;
import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.client.MessageTracker.GroupCount;
import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.conversation.ConversationManager.ConversationClient;
import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.conversation.DeletionResult;
@@ -96,6 +97,7 @@ class MessagingManagerImpl implements MessagingManager, IncomingMessageHook,
private final DatabaseComponent db;
private final ClientHelper clientHelper;
private final MetadataParser metadataParser;
private final ConversationManager conversationManager;
private final MessageTracker messageTracker;
private final ClientVersioningManager clientVersioningManager;
private final ContactGroupFactory contactGroupFactory;
@@ -107,12 +109,14 @@ class MessagingManagerImpl implements MessagingManager, IncomingMessageHook,
ClientHelper clientHelper,
ClientVersioningManager clientVersioningManager,
MetadataParser metadataParser,
ConversationManager conversationManager,
MessageTracker messageTracker,
ContactGroupFactory contactGroupFactory,
AutoDeleteManager autoDeleteManager) {
this.db = db;
this.clientHelper = clientHelper;
this.metadataParser = metadataParser;
this.conversationManager = conversationManager;
this.messageTracker = messageTracker;
this.clientVersioningManager = clientVersioningManager;
this.contactGroupFactory = contactGroupFactory;
@@ -214,7 +218,7 @@ class MessagingManagerImpl implements MessagingManager, IncomingMessageHook,
PrivateMessageReceivedEvent event =
new PrivateMessageReceivedEvent(header, contactId);
txn.attach(event);
messageTracker.trackIncomingMessage(txn, m);
conversationManager.trackIncomingMessage(txn, m);
if (timer != NO_AUTO_DELETE_TIMER) {
db.setCleanupTimerDuration(txn, m.getId(), timer);
}
@@ -324,7 +328,7 @@ class MessagingManagerImpl implements MessagingManager, IncomingMessageHook,
if (timer != NO_AUTO_DELETE_TIMER) {
db.setCleanupTimerDuration(txn, m.getMessage().getId(), timer);
}
messageTracker.trackOutgoingMessage(txn, m.getMessage());
conversationManager.trackOutgoingMessage(txn, m.getMessage());
} catch (FormatException e) {
throw new AssertionError(e);
}

View File

@@ -19,7 +19,6 @@ import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.versioning.ClientVersioningManager;
import org.briarproject.briar.api.autodelete.AutoDeleteManager;
import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.privategroup.GroupMessage;
@@ -52,7 +51,7 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
protected final ClientHelper clientHelper;
protected final PrivateGroupManager privateGroupManager;
protected final PrivateGroupFactory privateGroupFactory;
protected final MessageTracker messageTracker;
protected final ConversationManager conversationManager;
private final ClientVersioningManager clientVersioningManager;
private final GroupMessageFactory groupMessageFactory;
@@ -60,7 +59,6 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
private final MessageParser messageParser;
private final MessageEncoder messageEncoder;
private final AutoDeleteManager autoDeleteManager;
private final ConversationManager conversationManager;
private final Clock clock;
AbstractProtocolEngine(
@@ -73,7 +71,6 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
IdentityManager identityManager,
MessageParser messageParser,
MessageEncoder messageEncoder,
MessageTracker messageTracker,
AutoDeleteManager autoDeleteManager,
ConversationManager conversationManager,
Clock clock) {
@@ -86,7 +83,6 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
this.identityManager = identityManager;
this.messageParser = messageParser;
this.messageEncoder = messageEncoder;
this.messageTracker = messageTracker;
this.autoDeleteManager = autoDeleteManager;
this.conversationManager = conversationManager;
this.clock = clock;
@@ -129,7 +125,7 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
throw new DbException(e); // Invalid group descriptor
}
Message m;
ContactId c = getContactId(txn, s.getContactGroupId());
ContactId c = clientHelper.getContactId(txn, s.getContactGroupId());
if (contactSupportsAutoDeletion(txn, c)) {
m = messageEncoder.encodeInviteMessage(s.getContactGroupId(),
privateGroup.getId(), timestamp, privateGroup.getName(),
@@ -157,7 +153,7 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
long localTimestamp = visibleInUi
? getTimestampForVisibleMessage(txn, s)
: getTimestampForInvisibleMessage(s);
ContactId c = getContactId(txn, s.getContactGroupId());
ContactId c = clientHelper.getContactId(txn, s.getContactGroupId());
if (contactSupportsAutoDeletion(txn, c)) {
// Set auto-delete timer if manually accepting an invitation
long timer = NO_AUTO_DELETE_TIMER;
@@ -195,7 +191,7 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
long localTimestamp = visibleInUi
? getTimestampForVisibleMessage(txn, s)
: getTimestampForInvisibleMessage(s);
ContactId c = getContactId(txn, s.getContactGroupId());
ContactId c = clientHelper.getContactId(txn, s.getContactGroupId());
if (contactSupportsAutoDeletion(txn, c)) {
// Set auto-delete timer if declining an invitation
long timer = NO_AUTO_DELETE_TIMER;
@@ -309,7 +305,7 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
*/
long getTimestampForVisibleMessage(Transaction txn, S s)
throws DbException {
ContactId c = getContactId(txn, s.getContactGroupId());
ContactId c = clientHelper.getContactId(txn, s.getContactGroupId());
long conversationTimestamp =
conversationManager.getTimestampForOutgoingMessage(txn, c);
return max(conversationTimestamp, getSessionTimestamp(s) + 1);
@@ -333,7 +329,7 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
void receiveAutoDeleteTimer(Transaction txn,
DeletableGroupInvitationMessage m) throws DbException {
ContactId c = getContactId(txn, m.getContactGroupId());
ContactId c = clientHelper.getContactId(txn, m.getContactGroupId());
autoDeleteManager.receiveAutoDeleteTimer(txn, c, m.getAutoDeleteTimer(),
m.getTimestamp());
}
@@ -359,15 +355,6 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
}
}
private ContactId getContactId(Transaction txn, GroupId contactGroupId)
throws DbException {
try {
return clientHelper.getContactId(txn, contactGroupId);
} catch (FormatException e) {
throw new DbException(e);
}
}
private boolean contactSupportsAutoDeletion(Transaction txn, ContactId c)
throws DbException {
int minorVersion = clientVersioningManager.getClientMinorVersion(txn, c,

View File

@@ -12,7 +12,6 @@ import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.versioning.ClientVersioningManager;
import org.briarproject.briar.api.autodelete.AutoDeleteManager;
import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.client.ProtocolStateException;
import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.conversation.ConversationManager;
@@ -49,13 +48,12 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
IdentityManager identityManager,
MessageParser messageParser,
MessageEncoder messageEncoder,
MessageTracker messageTracker,
AutoDeleteManager autoDeleteManager,
ConversationManager conversationManager,
Clock clock) {
super(db, clientHelper, clientVersioningManager, privateGroupManager,
privateGroupFactory, groupMessageFactory, identityManager,
messageParser, messageEncoder, messageTracker,
messageParser, messageEncoder,
autoDeleteManager, conversationManager, clock);
}
@@ -162,7 +160,7 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
Message sent = sendInviteMessage(txn, s, text, timestamp, signature,
autoDeleteTimer);
// Track the message
messageTracker.trackOutgoingMessage(txn, sent);
conversationManager.trackOutgoingMessage(txn, sent);
// Move to the INVITED state
long localTimestamp =
max(timestamp, getTimestampForVisibleMessage(txn, s));
@@ -199,7 +197,7 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
// Mark the response visible in the UI
markMessageVisibleInUi(txn, m.getId());
// Track the message
messageTracker.trackMessage(txn, m.getContactGroupId(),
conversationManager.trackMessage(txn, m.getContactGroupId(),
m.getTimestamp(), false);
// Receive the auto-delete timer
receiveAutoDeleteTimer(txn, m);
@@ -226,7 +224,7 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
// Mark the response visible in the UI
markMessageVisibleInUi(txn, m.getId());
// Track the message
messageTracker.trackMessage(txn, m.getContactGroupId(),
conversationManager.trackMessage(txn, m.getContactGroupId(),
m.getTimestamp(), false);
// Receive the auto-delete timer
receiveAutoDeleteTimer(txn, m);

View File

@@ -14,7 +14,6 @@ import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.versioning.ClientVersioningManager;
import org.briarproject.briar.api.autodelete.AutoDeleteManager;
import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.client.ProtocolStateException;
import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.conversation.ConversationManager;
@@ -53,13 +52,12 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> {
IdentityManager identityManager,
MessageParser messageParser,
MessageEncoder messageEncoder,
MessageTracker messageTracker,
AutoDeleteManager autoDeleteManager,
ConversationManager conversationManager,
Clock clock) {
super(db, clientHelper, clientVersioningManager, privateGroupManager,
privateGroupFactory, groupMessageFactory, identityManager,
messageParser, messageEncoder, messageTracker,
messageParser, messageEncoder,
autoDeleteManager, conversationManager, clock);
}
@@ -188,7 +186,7 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> {
// Send a JOIN message
Message sent = sendJoinMessage(txn, s, true);
// Track the message
messageTracker.trackOutgoingMessage(txn, sent);
conversationManager.trackOutgoingMessage(txn, sent);
try {
// Subscribe to the private group
subscribeToPrivateGroup(txn, inviteId);
@@ -212,7 +210,7 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> {
// Send a LEAVE message
Message sent = sendLeaveMessage(txn, s, true, isAutoDecline);
// Track the message
messageTracker.trackOutgoingMessage(txn, sent);
conversationManager.trackOutgoingMessage(txn, sent);
// Move to the START state
return new InviteeSession(s.getContactGroupId(), s.getPrivateGroupId(),
sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(),
@@ -249,7 +247,7 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> {
markMessageVisibleInUi(txn, m.getId());
markMessageAvailableToAnswer(txn, m.getId(), true);
// Track the message
messageTracker.trackMessage(txn, m.getContactGroupId(),
conversationManager.trackMessage(txn, m.getContactGroupId(),
m.getTimestamp(), false);
// Receive the auto-delete timer
receiveAutoDeleteTimer(txn, m);

View File

@@ -13,7 +13,6 @@ import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.versioning.ClientVersioningManager;
import org.briarproject.briar.api.autodelete.AutoDeleteManager;
import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.client.ProtocolStateException;
import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.privategroup.GroupMessageFactory;
@@ -48,13 +47,12 @@ class PeerProtocolEngine extends AbstractProtocolEngine<PeerSession> {
IdentityManager identityManager,
MessageParser messageParser,
MessageEncoder messageEncoder,
MessageTracker messageTracker,
AutoDeleteManager autoDeleteManager,
ConversationManager conversationManager,
Clock clock) {
super(db, clientHelper, clientVersioningManager, privateGroupManager,
privateGroupFactory, groupMessageFactory, identityManager,
messageParser, messageEncoder, messageTracker,
messageParser, messageEncoder,
autoDeleteManager, conversationManager, clock);
}

View File

@@ -7,7 +7,6 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.versioning.ClientVersioningManager;
import org.briarproject.briar.api.autodelete.AutoDeleteManager;
import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.privategroup.GroupMessageFactory;
import org.briarproject.briar.api.privategroup.PrivateGroupFactory;
@@ -29,7 +28,6 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
private final IdentityManager identityManager;
private final MessageParser messageParser;
private final MessageEncoder messageEncoder;
private final MessageTracker messageTracker;
private final AutoDeleteManager autoDeleteManager;
private final ConversationManager conversationManager;
private final Clock clock;
@@ -45,7 +43,6 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
IdentityManager identityManager,
MessageParser messageParser,
MessageEncoder messageEncoder,
MessageTracker messageTracker,
AutoDeleteManager autoDeleteManager,
ConversationManager conversationManager,
Clock clock) {
@@ -58,7 +55,6 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
this.identityManager = identityManager;
this.messageParser = messageParser;
this.messageEncoder = messageEncoder;
this.messageTracker = messageTracker;
this.autoDeleteManager = autoDeleteManager;
this.conversationManager = conversationManager;
this.clock = clock;
@@ -69,7 +65,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
return new CreatorProtocolEngine(db, clientHelper,
clientVersioningManager, privateGroupManager,
privateGroupFactory, groupMessageFactory, identityManager,
messageParser, messageEncoder, messageTracker,
messageParser, messageEncoder,
autoDeleteManager, conversationManager, clock);
}
@@ -78,7 +74,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
return new InviteeProtocolEngine(db, clientHelper,
clientVersioningManager, privateGroupManager,
privateGroupFactory, groupMessageFactory, identityManager,
messageParser, messageEncoder, messageTracker,
messageParser, messageEncoder,
autoDeleteManager, conversationManager, clock);
}
@@ -87,7 +83,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
return new PeerProtocolEngine(db, clientHelper,
clientVersioningManager, privateGroupManager,
privateGroupFactory, groupMessageFactory, identityManager,
messageParser, messageEncoder, messageTracker,
messageParser, messageEncoder,
autoDeleteManager, conversationManager, clock);
}
}

View File

@@ -19,7 +19,6 @@ import org.briarproject.briar.api.blog.BlogManager;
import org.briarproject.briar.api.blog.BlogSharingManager;
import org.briarproject.briar.api.blog.event.BlogInvitationRequestReceivedEvent;
import org.briarproject.briar.api.blog.event.BlogInvitationResponseReceivedEvent;
import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.conversation.ConversationRequest;
@@ -41,14 +40,13 @@ class BlogProtocolEngineImpl extends ProtocolEngineImpl<Blog> {
ClientVersioningManager clientVersioningManager,
MessageEncoder messageEncoder,
MessageParser<Blog> messageParser,
MessageTracker messageTracker,
AutoDeleteManager autoDeleteManager,
ConversationManager conversationManager,
Clock clock,
BlogManager blogManager,
InvitationFactory<Blog, BlogInvitationResponse> invitationFactory) {
super(db, clientHelper, clientVersioningManager, messageEncoder,
messageParser, messageTracker, autoDeleteManager,
messageParser, autoDeleteManager,
conversationManager, clock, BlogSharingManager.CLIENT_ID,
BlogSharingManager.MAJOR_VERSION, BlogManager.CLIENT_ID,
BlogManager.MAJOR_VERSION);

View File

@@ -13,7 +13,6 @@ import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.versioning.ClientVersioningManager;
import org.briarproject.briar.api.autodelete.AutoDeleteManager;
import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.conversation.ConversationRequest;
import org.briarproject.briar.api.forum.Forum;
@@ -41,14 +40,13 @@ class ForumProtocolEngineImpl extends ProtocolEngineImpl<Forum> {
ClientVersioningManager clientVersioningManager,
MessageEncoder messageEncoder,
MessageParser<Forum> messageParser,
MessageTracker messageTracker,
AutoDeleteManager autoDeleteManager,
ConversationManager conversationManager,
Clock clock,
ForumManager forumManager,
InvitationFactory<Forum, ForumInvitationResponse> invitationFactory) {
super(db, clientHelper, clientVersioningManager, messageEncoder,
messageParser, messageTracker, autoDeleteManager,
messageParser, autoDeleteManager,
conversationManager, clock, ForumSharingManager.CLIENT_ID,
ForumSharingManager.MAJOR_VERSION, ForumManager.CLIENT_ID,
ForumManager.MAJOR_VERSION);

View File

@@ -19,7 +19,6 @@ import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.versioning.ClientVersioningManager;
import org.briarproject.briar.api.autodelete.AutoDeleteManager;
import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.client.ProtocolStateException;
import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.sharing.Shareable;
@@ -58,7 +57,6 @@ abstract class ProtocolEngineImpl<S extends Shareable>
private final ClientVersioningManager clientVersioningManager;
private final MessageEncoder messageEncoder;
private final MessageTracker messageTracker;
private final AutoDeleteManager autoDeleteManager;
private final ConversationManager conversationManager;
private final Clock clock;
@@ -71,7 +69,6 @@ abstract class ProtocolEngineImpl<S extends Shareable>
ClientVersioningManager clientVersioningManager,
MessageEncoder messageEncoder,
MessageParser<S> messageParser,
MessageTracker messageTracker,
AutoDeleteManager autoDeleteManager,
ConversationManager conversationManager,
Clock clock,
@@ -84,7 +81,6 @@ abstract class ProtocolEngineImpl<S extends Shareable>
this.clientVersioningManager = clientVersioningManager;
this.messageEncoder = messageEncoder;
this.messageParser = messageParser;
this.messageTracker = messageTracker;
this.autoDeleteManager = autoDeleteManager;
this.conversationManager = conversationManager;
this.clock = clock;
@@ -116,7 +112,7 @@ abstract class ProtocolEngineImpl<S extends Shareable>
// Send an INVITE message
Message sent = sendInviteMessage(txn, s, text);
// Track the message
messageTracker.trackOutgoingMessage(txn, sent);
conversationManager.trackOutgoingMessage(txn, sent);
// Make the shareable visible to the contact
try {
setShareableVisibility(txn, s, VISIBLE);
@@ -140,7 +136,7 @@ abstract class ProtocolEngineImpl<S extends Shareable>
}
Message m;
long localTimestamp = getTimestampForVisibleMessage(txn, s);
ContactId c = getContactId(txn, s.getContactGroupId());
ContactId c = clientHelper.getContactId(txn, s.getContactGroupId());
if (contactSupportsAutoDeletion(txn, c)) {
long timer = autoDeleteManager.getAutoDeleteTimer(txn, c,
localTimestamp);
@@ -190,7 +186,7 @@ abstract class ProtocolEngineImpl<S extends Shareable>
// Send a ACCEPT message
Message sent = sendAcceptMessage(txn, s);
// Track the message
messageTracker.trackOutgoingMessage(txn, sent);
conversationManager.trackOutgoingMessage(txn, sent);
try {
// Add and subscribe to the shareable
addShareable(txn, inviteId);
@@ -212,7 +208,7 @@ abstract class ProtocolEngineImpl<S extends Shareable>
throws DbException {
Message m;
long localTimestamp = getTimestampForVisibleMessage(txn, s);
ContactId c = getContactId(txn, s.getContactGroupId());
ContactId c = clientHelper.getContactId(txn, s.getContactGroupId());
if (contactSupportsAutoDeletion(txn, c)) {
long timer = autoDeleteManager.getAutoDeleteTimer(txn, c,
localTimestamp);
@@ -260,7 +256,7 @@ abstract class ProtocolEngineImpl<S extends Shareable>
// Send a DECLINE message
Message sent = sendDeclineMessage(txn, s, isAutoDecline);
// Track the message
messageTracker.trackOutgoingMessage(txn, sent);
conversationManager.trackOutgoingMessage(txn, sent);
// Move to the START state
return new Session(START, s.getContactGroupId(), s.getShareableId(),
sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(),
@@ -271,7 +267,7 @@ abstract class ProtocolEngineImpl<S extends Shareable>
boolean isAutoDecline) throws DbException {
Message m;
long localTimestamp = getTimestampForVisibleMessage(txn, s);
ContactId c = getContactId(txn, s.getContactGroupId());
ContactId c = clientHelper.getContactId(txn, s.getContactGroupId());
if (contactSupportsAutoDeletion(txn, c)) {
long timer = autoDeleteManager.getAutoDeleteTimer(txn, c,
localTimestamp);
@@ -380,7 +376,7 @@ abstract class ProtocolEngineImpl<S extends Shareable>
markMessageVisibleInUi(txn, m.getId());
markMessageAvailableToAnswer(txn, m.getId(), available);
// Track the message
messageTracker.trackMessage(txn, m.getContactGroupId(),
conversationManager.trackMessage(txn, m.getContactGroupId(),
m.getTimestamp(), false);
// Receive the auto-delete timer
receiveAutoDeleteTimer(txn, m);
@@ -407,7 +403,7 @@ abstract class ProtocolEngineImpl<S extends Shareable>
markMessageVisibleInUi(txn, m.getId());
markMessageAvailableToAnswer(txn, m.getId(), false);
// Track the message
messageTracker.trackMessage(txn, m.getContactGroupId(),
conversationManager.trackMessage(txn, m.getContactGroupId(),
m.getTimestamp(), false);
// Receive the auto-delete timer
receiveAutoDeleteTimer(txn, m);
@@ -456,7 +452,7 @@ abstract class ProtocolEngineImpl<S extends Shareable>
// Mark the response visible in the UI
markMessageVisibleInUi(txn, m.getId());
// Track the message
messageTracker.trackMessage(txn, m.getContactGroupId(),
conversationManager.trackMessage(txn, m.getContactGroupId(),
m.getTimestamp(), false);
// Receive the auto-delete timer
receiveAutoDeleteTimer(txn, m);
@@ -511,7 +507,7 @@ abstract class ProtocolEngineImpl<S extends Shareable>
// Mark the response visible in the UI
markMessageVisibleInUi(txn, m.getId());
// Track the message
messageTracker.trackMessage(txn, m.getContactGroupId(),
conversationManager.trackMessage(txn, m.getContactGroupId(),
m.getTimestamp(), false);
// Receive the auto-delete timer
receiveAutoDeleteTimer(txn, m);
@@ -734,7 +730,7 @@ abstract class ProtocolEngineImpl<S extends Shareable>
*/
private long getTimestampForVisibleMessage(Transaction txn, Session s)
throws DbException {
ContactId c = getContactId(txn, s.getContactGroupId());
ContactId c = clientHelper.getContactId(txn, s.getContactGroupId());
long conversationTimestamp =
conversationManager.getTimestampForOutgoingMessage(txn, c);
return max(conversationTimestamp, getSessionTimestamp(s) + 1);
@@ -758,20 +754,11 @@ abstract class ProtocolEngineImpl<S extends Shareable>
private void receiveAutoDeleteTimer(Transaction txn,
DeletableSharingMessage m) throws DbException {
ContactId c = getContactId(txn, m.getContactGroupId());
ContactId c = clientHelper.getContactId(txn, m.getContactGroupId());
autoDeleteManager.receiveAutoDeleteTimer(txn, c, m.getAutoDeleteTimer(),
m.getTimestamp());
}
private ContactId getContactId(Transaction txn, GroupId contactGroupId)
throws DbException {
try {
return clientHelper.getContactId(txn, contactGroupId);
} catch (FormatException e) {
throw new DbException(e);
}
}
private boolean contactSupportsAutoDeletion(Transaction txn, ContactId c)
throws DbException {
int minorVersion = clientVersioningManager.getClientMinorVersion(txn, c,

View File

@@ -60,7 +60,6 @@ abstract class AbstractProtocolEngineTest extends BrambleMockTestCase {
context.mock(GroupMessageFactory.class);
final IdentityManager identityManager = context.mock(IdentityManager.class);
final MessageEncoder messageEncoder = context.mock(MessageEncoder.class);
final MessageTracker messageTracker = context.mock(MessageTracker.class);
final AutoDeleteManager autoDeleteManager =
context.mock(AutoDeleteManager.class);
final ConversationManager conversationManager =
@@ -264,7 +263,7 @@ abstract class AbstractProtocolEngineTest extends BrambleMockTestCase {
void expectTrackUnreadMessage(long timestamp) throws Exception {
context.checking(new Expectations() {{
oneOf(messageTracker).trackMessage(txn, contactGroupId, timestamp,
oneOf(conversationManager).trackMessage(txn, contactGroupId, timestamp,
false);
}});
}

View File

@@ -24,7 +24,7 @@ public class CreatorProtocolEngineTest extends AbstractProtocolEngineTest {
new CreatorProtocolEngine(db, clientHelper, clientVersioningManager,
privateGroupManager, privateGroupFactory,
groupMessageFactory, identityManager, messageParser,
messageEncoder, messageTracker, autoDeleteManager,
messageEncoder, autoDeleteManager,
conversationManager, clock);
private CreatorSession getDefaultSession(CreatorState state) {
@@ -76,7 +76,7 @@ public class CreatorProtocolEngineTest extends AbstractProtocolEngineTest {
will(returnValue(privateGroupGroup));
oneOf(privateGroupFactory).parsePrivateGroup(privateGroupGroup);
will(returnValue(privateGroup));
oneOf(messageTracker).trackOutgoingMessage(txn, message);
oneOf(conversationManager).trackOutgoingMessage(txn, message);
}});
expectSendInviteMessage(text);
}

View File

@@ -43,7 +43,7 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest {
new InviteeProtocolEngine(db, clientHelper, clientVersioningManager,
privateGroupManager, privateGroupFactory,
groupMessageFactory, identityManager, messageParser,
messageEncoder, messageTracker, autoDeleteManager,
messageEncoder, autoDeleteManager,
conversationManager, clock);
private final LocalAuthor localAuthor = getLocalAuthor();
@@ -148,7 +148,7 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest {
}});
expectSendJoinMessage(properJoinMessage, true);
context.checking(new Expectations() {{
oneOf(messageTracker).trackOutgoingMessage(txn, message);
oneOf(conversationManager).trackOutgoingMessage(txn, message);
oneOf(messageParser).getInviteMessage(txn, lastRemoteMessageId);
will(returnValue(inviteMessage));
oneOf(privateGroupFactory)
@@ -219,7 +219,7 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest {
expectMarkMessageAvailableToAnswer(lastRemoteMessageId, false);
expectSendLeaveMessage(true);
context.checking(new Expectations() {{
oneOf(messageTracker).trackOutgoingMessage(txn, message);
oneOf(conversationManager).trackOutgoingMessage(txn, message);
}});
InviteeSession session = getDefaultSession(INVITED);

View File

@@ -27,7 +27,7 @@ public class PeerProtocolEngineTest extends AbstractProtocolEngineTest {
new PeerProtocolEngine(db, clientHelper, clientVersioningManager,
privateGroupManager, privateGroupFactory,
groupMessageFactory, identityManager, messageParser,
messageEncoder, messageTracker, autoDeleteManager,
messageEncoder, autoDeleteManager,
conversationManager, clock);
private PeerSession getDefaultSession(PeerState state) {