Move setReadFlag() from ConversationClient to ConversationManager

This commit is contained in:
Sebastian Kürten
2021-03-23 06:41:37 +01:00
committed by Torsten Grote
parent 0bf10a827f
commit a923c1151c
9 changed files with 30 additions and 28 deletions

View File

@@ -246,7 +246,7 @@ public class ConversationViewModel extends DbViewModel
runOnDbThread(() -> { runOnDbThread(() -> {
try { try {
long start = now(); long start = now();
messagingManager.setReadFlag(g, m, true); conversationManager.setReadFlag(g, m, true);
logDuration(LOG, "Marking read", start); logDuration(LOG, "Marking read", start);
} catch (DbException e) { } catch (DbException e) {
logException(LOG, WARNING, e); logException(LOG, WARNING, e);

View File

@@ -47,6 +47,9 @@ public interface ConversationManager {
*/ */
GroupCount getGroupCount(Transaction txn, ContactId c) throws DbException; GroupCount getGroupCount(Transaction txn, ContactId c) throws DbException;
void setReadFlag(GroupId g, MessageId m, boolean read)
throws DbException;
/** /**
* Returns a timestamp for an outgoing message, which is later than the * Returns a timestamp for an outgoing message, which is later than the
* timestamp of any message in the conversation with the given contact. * timestamp of any message in the conversation with the given contact.
@@ -83,9 +86,6 @@ public interface ConversationManager {
GroupCount getGroupCount(Transaction txn, ContactId c) GroupCount getGroupCount(Transaction txn, ContactId c)
throws DbException; throws DbException;
void setReadFlag(GroupId g, MessageId m, boolean read)
throws DbException;
/** /**
* Deletes all messages associated with the given contact. * Deletes all messages associated with the given contact.
*/ */

View File

@@ -10,7 +10,6 @@ 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.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
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.conversation.ConversationManager.ConversationClient; import org.briarproject.briar.api.conversation.ConversationManager.ConversationClient;
@@ -39,10 +38,4 @@ public abstract class ConversationClientImpl extends BdfIncomingMessageHook
return messageTracker.getGroupCount(txn, groupId); return messageTracker.getGroupCount(txn, groupId);
} }
@Override
public void setReadFlag(GroupId g, MessageId m, boolean read)
throws DbException {
db.transaction(false, txn ->
messageTracker.setReadFlag(txn, g, m, read));
}
} }

View File

@@ -5,8 +5,10 @@ import org.briarproject.bramble.api.db.DatabaseComponent;
import org.briarproject.bramble.api.db.DbException; 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.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.system.Clock;
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.conversation.ConversationManager; import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.conversation.ConversationMessageHeader; import org.briarproject.briar.api.conversation.ConversationMessageHeader;
@@ -28,12 +30,15 @@ import static java.lang.Math.max;
class ConversationManagerImpl implements ConversationManager { class ConversationManagerImpl implements ConversationManager {
private final DatabaseComponent db; private final DatabaseComponent db;
private final MessageTracker messageTracker;
private final Clock clock; private final Clock clock;
private final Set<ConversationClient> clients; private final Set<ConversationClient> clients;
@Inject @Inject
ConversationManagerImpl(DatabaseComponent db, Clock clock) { ConversationManagerImpl(DatabaseComponent db, MessageTracker messageTracker,
Clock clock) {
this.db = db; this.db = db;
this.messageTracker = messageTracker;
this.clock = clock; this.clock = clock;
clients = new CopyOnWriteArraySet<>(); clients = new CopyOnWriteArraySet<>();
} }
@@ -81,6 +86,15 @@ class ConversationManagerImpl implements ConversationManager {
return new GroupCount(msgCount, unreadCount, latestTime); return new GroupCount(msgCount, unreadCount, latestTime);
} }
@Override
public void setReadFlag(GroupId g, MessageId m, boolean read)
throws DbException {
db.transaction(false, txn -> {
boolean wasRead = messageTracker.setReadFlag(txn, g, m, read);
if (read && !wasRead) db.startCleanupTimer(txn, m);
});
}
@Override @Override
public long getTimestampForOutgoingMessage(Transaction txn, ContactId c) public long getTimestampForOutgoingMessage(Transaction txn, ContactId c)
throws DbException { throws DbException {

View File

@@ -126,15 +126,6 @@ class MessagingManagerImpl implements MessagingManager, IncomingMessageHook,
return messageTracker.getGroupCount(txn, groupId); return messageTracker.getGroupCount(txn, groupId);
} }
@Override
public void setReadFlag(GroupId g, MessageId m, boolean read)
throws DbException {
db.transaction(false, txn -> {
boolean wasRead = messageTracker.setReadFlag(txn, g, m, read);
if (read && !wasRead) db.startCleanupTimer(txn, m);
});
}
@Override @Override
public void onDatabaseOpened(Transaction txn) throws DbException { public void onDatabaseOpened(Transaction txn) throws DbException {
// Create a local group to indicate that we've set this client up // Create a local group to indicate that we've set this client up

View File

@@ -10,9 +10,9 @@ import org.briarproject.bramble.system.TimeTravelModule;
import org.briarproject.bramble.test.TestDatabaseConfigModule; import org.briarproject.bramble.test.TestDatabaseConfigModule;
import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.autodelete.AutoDeleteManager;
import org.briarproject.briar.api.client.MessageTracker.GroupCount; import org.briarproject.briar.api.client.MessageTracker.GroupCount;
import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.conversation.ConversationManager.ConversationClient; import org.briarproject.briar.api.conversation.ConversationManager.ConversationClient;
import org.briarproject.briar.api.conversation.ConversationMessageHeader; import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.messaging.MessagingManager;
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;
@@ -124,11 +124,12 @@ public abstract class AbstractAutoDeleteTest extends
protected void markMessageRead(BriarIntegrationTestComponent component, protected void markMessageRead(BriarIntegrationTestComponent component,
Contact contact, MessageId messageId) throws Exception { Contact contact, MessageId messageId) throws Exception {
MessagingManager messagingManager = component.getMessagingManager(); ConversationManager conversationManager =
component.getConversationManager();
ConversationClient conversationClient = ConversationClient conversationClient =
getConversationClient(component); getConversationClient(component);
GroupId groupId = conversationClient.getContactGroup(contact).getId(); GroupId groupId = conversationClient.getContactGroup(contact).getId();
messagingManager.setReadFlag(groupId, messageId, true); conversationManager.setReadFlag(groupId, messageId, true);
waitForEvents(component); waitForEvents(component);
} }

View File

@@ -5,6 +5,7 @@ import org.briarproject.bramble.api.sync.Group;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.test.TestDatabaseConfigModule; import org.briarproject.bramble.test.TestDatabaseConfigModule;
import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.client.ProtocolStateException;
import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.conversation.ConversationMessageHeader; import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.conversation.DeletionResult; import org.briarproject.briar.api.conversation.DeletionResult;
import org.briarproject.briar.api.privategroup.GroupMessage; import org.briarproject.briar.api.privategroup.GroupMessage;
@@ -41,6 +42,7 @@ public class GroupInvitationIntegrationTest
private PrivateGroupManager groupManager0, groupManager1; private PrivateGroupManager groupManager0, groupManager1;
private GroupInvitationManager groupInvitationManager0, private GroupInvitationManager groupInvitationManager0,
groupInvitationManager1; groupInvitationManager1;
private ConversationManager conversationManager1;
private Group g1From0, g0From1; private Group g1From0, g0From1;
@Before @Before
@@ -52,6 +54,7 @@ public class GroupInvitationIntegrationTest
groupManager1 = c1.getPrivateGroupManager(); groupManager1 = c1.getPrivateGroupManager();
groupInvitationManager0 = c0.getGroupInvitationManager(); groupInvitationManager0 = c0.getGroupInvitationManager();
groupInvitationManager1 = c1.getGroupInvitationManager(); groupInvitationManager1 = c1.getGroupInvitationManager();
conversationManager1 = c1.getConversationManager();
g1From0 = groupInvitationManager0.getContactGroup(contact1From0); g1From0 = groupInvitationManager0.getContactGroup(contact1From0);
g0From1 = groupInvitationManager1.getContactGroup(contact0From1); g0From1 = groupInvitationManager1.getContactGroup(contact0From1);
@@ -302,7 +305,7 @@ public class GroupInvitationIntegrationTest
assertGroupCount(messageTracker1, g0.getId(), 2, 1); assertGroupCount(messageTracker1, g0.getId(), 2, 1);
// now all messages should be read // now all messages should be read
groupInvitationManager1.setReadFlag(g0.getId(), m.getId(), true); conversationManager1.setReadFlag(g0.getId(), m.getId(), true);
assertGroupCount(messageTracker1, g0.getId(), 2, 0); assertGroupCount(messageTracker1, g0.getId(), 2, 0);
sync1To0(1, true); sync1To0(1, true);

View File

@@ -11,9 +11,9 @@ import org.briarproject.bramble.api.db.DatabaseExecutor
import org.briarproject.bramble.api.db.NoSuchContactException import org.briarproject.bramble.api.db.NoSuchContactException
import org.briarproject.bramble.api.event.Event import org.briarproject.bramble.api.event.Event
import org.briarproject.bramble.api.event.EventListener import org.briarproject.bramble.api.event.EventListener
import org.briarproject.bramble.api.sync.MessageId
import org.briarproject.bramble.api.sync.event.MessagesAckedEvent import org.briarproject.bramble.api.sync.event.MessagesAckedEvent
import org.briarproject.bramble.api.sync.event.MessagesSentEvent import org.briarproject.bramble.api.sync.event.MessagesSentEvent
import org.briarproject.bramble.api.sync.MessageId
import org.briarproject.bramble.api.system.Clock 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
@@ -92,7 +92,7 @@ constructor(
val messageIdString = ctx.getFromJson(objectMapper, "messageId") val messageIdString = ctx.getFromJson(objectMapper, "messageId")
val messageId = deserializeMessageId(messageIdString) val messageId = deserializeMessageId(messageIdString)
messagingManager.setReadFlag(groupId, messageId, true) conversationManager.setReadFlag(groupId, messageId, true)
return ctx.json(messageIdString) return ctx.json(messageIdString)
} }

View File

@@ -220,7 +220,7 @@ internal class MessagingControllerImplTest : ControllerTest() {
every { messagingManager.getContactGroup(contact).id } returns group.id every { messagingManager.getContactGroup(contact).id } returns group.id
every { ctx.getFromJson(objectMapper, "messageId") } returns messageIdString every { ctx.getFromJson(objectMapper, "messageId") } returns messageIdString
every { Base64.decode(messageIdString) } returns message.id.bytes every { Base64.decode(messageIdString) } returns message.id.bytes
every { messagingManager.setReadFlag(group.id, message.id, true) } just Runs every { conversationManager.setReadFlag(group.id, message.id, true) } just Runs
every { ctx.json(messageIdString) } returns ctx every { ctx.json(messageIdString) } returns ctx
controller.markMessageRead(ctx) controller.markMessageRead(ctx)