diff --git a/briar-api/src/main/java/org/briarproject/briar/api/client/MessageTracker.java b/briar-api/src/main/java/org/briarproject/briar/api/client/MessageTracker.java index 5d6418f0aceaf17b46714509ec96c881187a31f1..bd9cee3215e72979585ec6fa9429d538a3022f1e 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/client/MessageTracker.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/client/MessageTracker.java @@ -12,6 +12,12 @@ import javax.annotation.Nullable; @NotNullByDefault public interface MessageTracker { + /** + * Initializes the group count with zero messages, + * but uses the current time as latest message time for sorting. + */ + void initializeGroupCount(Transaction txn, GroupId g) throws DbException; + /** * Gets the number of visible and unread messages in the group * as well as the timestamp of the latest message diff --git a/briar-core/src/main/java/org/briarproject/briar/client/ConversationClientImpl.java b/briar-core/src/main/java/org/briarproject/briar/client/ConversationClientImpl.java index 4ba35c0205963dcd6ee6ff273a16df9155610580..9d12c5aba0180ea7556e4bd01890cdcd0c2ad0f0 100644 --- a/briar-core/src/main/java/org/briarproject/briar/client/ConversationClientImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/client/ConversationClientImpl.java @@ -31,6 +31,15 @@ public abstract class ConversationClientImpl extends BdfIncomingMessageHook this.messageTracker = messageTracker; } + /** + * Initializes the group count with zero messages, + * but uses the current time as latest message time for sorting. + */ + protected void initializeGroupCount(Transaction txn, GroupId g) + throws DbException { + messageTracker.initializeGroupCount(txn, g); + } + @Override public GroupCount getGroupCount(Transaction txn, ContactId contactId) throws DbException { diff --git a/briar-core/src/main/java/org/briarproject/briar/client/MessageTrackerImpl.java b/briar-core/src/main/java/org/briarproject/briar/client/MessageTrackerImpl.java index 18e034027c906507119141a3b5e99993f9f7429d..ef3fcb7023bedc848eb9e249aed1ffcca8cc11b7 100644 --- a/briar-core/src/main/java/org/briarproject/briar/client/MessageTrackerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/client/MessageTrackerImpl.java @@ -11,6 +11,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.bramble.api.system.Clock; import org.briarproject.briar.api.client.MessageTracker; import javax.annotation.Nullable; @@ -29,11 +30,22 @@ class MessageTrackerImpl implements MessageTracker { private final DatabaseComponent db; private final ClientHelper clientHelper; + private final Clock clock; @Inject - MessageTrackerImpl(DatabaseComponent db, ClientHelper clientHelper) { + MessageTrackerImpl(DatabaseComponent db, ClientHelper clientHelper, + Clock clock) { this.db = db; this.clientHelper = clientHelper; + this.clock = clock; + } + + @Override + public void initializeGroupCount(Transaction txn, GroupId g) + throws DbException { + long now = clock.currentTimeMillis(); + GroupCount groupCount = new GroupCount(0, 0, now); + storeGroupCount(txn, g, groupCount); } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java index 4f20d13a958bbd3d4e15ab4ed541bf63e5392ebe..2dbd584bef985d452c1ae741c45306ee613eaf49 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java @@ -93,6 +93,8 @@ class MessagingManagerImpl extends ConversationClientImpl } catch (FormatException e) { throw new AssertionError(e); } + // Initialize the group count with current time + initializeGroupCount(txn, g.getId()); } @Override diff --git a/briar-core/src/test/java/org/briarproject/briar/client/MessageTrackerTest.java b/briar-core/src/test/java/org/briarproject/briar/client/MessageTrackerTest.java index a7e8603202c358a92e625380282fbba3e35d619e..c46e3549602e5e683173a6c802ce87a238821dbb 100644 --- a/briar-core/src/test/java/org/briarproject/briar/client/MessageTrackerTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/client/MessageTrackerTest.java @@ -4,16 +4,22 @@ import org.briarproject.bramble.api.client.ClientHelper; import org.briarproject.bramble.api.data.BdfDictionary; import org.briarproject.bramble.api.data.BdfEntry; import org.briarproject.bramble.api.db.DatabaseComponent; +import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.MessageId; +import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.test.BrambleMockTestCase; import org.briarproject.bramble.test.TestUtils; import org.briarproject.briar.api.client.MessageTracker; import org.jmock.Expectations; -import org.junit.Assert; import org.junit.Test; +import static org.briarproject.briar.client.MessageTrackerConstants.GROUP_KEY_LATEST_MSG; +import static org.briarproject.briar.client.MessageTrackerConstants.GROUP_KEY_MSG_COUNT; import static org.briarproject.briar.client.MessageTrackerConstants.GROUP_KEY_STORED_MESSAGE_ID; +import static org.briarproject.briar.client.MessageTrackerConstants.GROUP_KEY_UNREAD_COUNT; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; public class MessageTrackerTest extends BrambleMockTestCase { @@ -21,13 +27,31 @@ public class MessageTrackerTest extends BrambleMockTestCase { protected final ClientHelper clientHelper = context.mock(ClientHelper.class); private final DatabaseComponent db = context.mock(DatabaseComponent.class); + private final Clock clock = context.mock(Clock.class); private final MessageId messageId = new MessageId(TestUtils.getRandomId()); private final MessageTracker messageTracker = - new MessageTrackerImpl(db, clientHelper); + new MessageTrackerImpl(db, clientHelper, clock); private final BdfDictionary dictionary = BdfDictionary.of( new BdfEntry(GROUP_KEY_STORED_MESSAGE_ID, messageId) ); + @Test + public void testInitializeGroupCount() throws Exception { + Transaction txn = new Transaction(null, false); + long now = 42L; + BdfDictionary dictionary = BdfDictionary.of( + new BdfEntry(GROUP_KEY_MSG_COUNT, 0), + new BdfEntry(GROUP_KEY_UNREAD_COUNT, 0), + new BdfEntry(GROUP_KEY_LATEST_MSG, now) + ); + context.checking(new Expectations() {{ + oneOf(clock).currentTimeMillis(); + will(returnValue(now)); + oneOf(clientHelper).mergeGroupMetadata(txn, groupId, dictionary); + }}); + messageTracker.initializeGroupCount(txn, groupId); + } + @Test public void testMessageStore() throws Exception { context.checking(new Expectations() {{ @@ -43,8 +67,8 @@ public class MessageTrackerTest extends BrambleMockTestCase { will(returnValue(dictionary)); }}); MessageId loadedId = messageTracker.loadStoredMessageId(groupId); - Assert.assertNotNull(loadedId); - Assert.assertTrue(messageId.equals(loadedId)); + assertNotNull(loadedId); + assertEquals(messageId, loadedId); } }