Display new contacts at the top of the contact list

by initializing their latest message time with the current time
This commit is contained in:
Torsten Grote
2019-03-21 10:51:17 -03:00
parent f5ef87b34b
commit ce52a36db1
5 changed files with 58 additions and 5 deletions

View File

@@ -12,6 +12,12 @@ import javax.annotation.Nullable;
@NotNullByDefault @NotNullByDefault
public interface MessageTracker { 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 * Gets the number of visible and unread messages in the group
* as well as the timestamp of the latest message * as well as the timestamp of the latest message

View File

@@ -31,6 +31,15 @@ public abstract class ConversationClientImpl extends BdfIncomingMessageHook
this.messageTracker = messageTracker; 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 @Override
public GroupCount getGroupCount(Transaction txn, ContactId contactId) public GroupCount getGroupCount(Transaction txn, ContactId contactId)
throws DbException { throws DbException {

View File

@@ -11,6 +11,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.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.api.system.Clock;
import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.MessageTracker;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -29,11 +30,22 @@ class MessageTrackerImpl implements MessageTracker {
private final DatabaseComponent db; private final DatabaseComponent db;
private final ClientHelper clientHelper; private final ClientHelper clientHelper;
private final Clock clock;
@Inject @Inject
MessageTrackerImpl(DatabaseComponent db, ClientHelper clientHelper) { MessageTrackerImpl(DatabaseComponent db, ClientHelper clientHelper,
Clock clock) {
this.db = db; this.db = db;
this.clientHelper = clientHelper; 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 @Override

View File

@@ -93,6 +93,8 @@ class MessagingManagerImpl extends ConversationClientImpl
} catch (FormatException e) { } catch (FormatException e) {
throw new AssertionError(e); throw new AssertionError(e);
} }
// Initialize the group count with current time
initializeGroupCount(txn, g.getId());
} }
@Override @Override

View File

@@ -4,16 +4,22 @@ import org.briarproject.bramble.api.client.ClientHelper;
import org.briarproject.bramble.api.data.BdfDictionary; import org.briarproject.bramble.api.data.BdfDictionary;
import org.briarproject.bramble.api.data.BdfEntry; import org.briarproject.bramble.api.data.BdfEntry;
import org.briarproject.bramble.api.db.DatabaseComponent; 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.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.test.BrambleMockTestCase; 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.jmock.Expectations; import org.jmock.Expectations;
import org.junit.Assert;
import org.junit.Test; 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_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 { public class MessageTrackerTest extends BrambleMockTestCase {
@@ -21,13 +27,31 @@ public class MessageTrackerTest extends BrambleMockTestCase {
protected final ClientHelper clientHelper = protected final ClientHelper clientHelper =
context.mock(ClientHelper.class); context.mock(ClientHelper.class);
private final DatabaseComponent db = context.mock(DatabaseComponent.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 MessageId messageId = new MessageId(TestUtils.getRandomId());
private final MessageTracker messageTracker = private final MessageTracker messageTracker =
new MessageTrackerImpl(db, clientHelper); new MessageTrackerImpl(db, clientHelper, clock);
private final BdfDictionary dictionary = BdfDictionary.of( private final BdfDictionary dictionary = BdfDictionary.of(
new BdfEntry(GROUP_KEY_STORED_MESSAGE_ID, messageId) 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 @Test
public void testMessageStore() throws Exception { public void testMessageStore() throws Exception {
context.checking(new Expectations() {{ context.checking(new Expectations() {{
@@ -43,8 +67,8 @@ public class MessageTrackerTest extends BrambleMockTestCase {
will(returnValue(dictionary)); will(returnValue(dictionary));
}}); }});
MessageId loadedId = messageTracker.loadStoredMessageId(groupId); MessageId loadedId = messageTracker.loadStoredMessageId(groupId);
Assert.assertNotNull(loadedId); assertNotNull(loadedId);
Assert.assertTrue(messageId.equals(loadedId)); assertEquals(messageId, loadedId);
} }
} }