From 2c8aaa215c1f460a7d7f8489d19073a34c702798 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 20 Oct 2016 16:34:11 -0200 Subject: [PATCH] Posting group messages takes previous message into account --- .../android/forum/ForumControllerImpl.java | 54 ++++++++++++---- .../conversation/GroupControllerImpl.java | 63 ++++++++++++++---- .../android/threaded/ThreadListActivity.java | 3 +- .../threaded/ThreadListController.java | 3 +- .../threaded/ThreadListControllerImpl.java | 64 ++----------------- 5 files changed, 100 insertions(+), 87 deletions(-) diff --git a/briar-android/src/org/briarproject/android/forum/ForumControllerImpl.java b/briar-android/src/org/briarproject/android/forum/ForumControllerImpl.java index a0b89b0ed..5da9ee98c 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumControllerImpl.java +++ b/briar-android/src/org/briarproject/android/forum/ForumControllerImpl.java @@ -3,6 +3,7 @@ package org.briarproject.android.forum; import android.support.annotation.Nullable; import org.briarproject.android.api.AndroidNotificationManager; +import org.briarproject.android.controller.handler.ResultExceptionHandler; import org.briarproject.android.threaded.ThreadListControllerImpl; import org.briarproject.api.clients.MessageTracker.GroupCount; import org.briarproject.api.crypto.CryptoExecutor; @@ -28,8 +29,11 @@ import java.util.logging.Logger; import javax.inject.Inject; -public class ForumControllerImpl extends - ThreadListControllerImpl +import static java.lang.Math.max; +import static java.util.logging.Level.WARNING; + +public class ForumControllerImpl + extends ThreadListControllerImpl implements ForumController { private static final Logger LOG = @@ -42,9 +46,9 @@ public class ForumControllerImpl extends LifecycleManager lifecycleManager, IdentityManager identityManager, @CryptoExecutor Executor cryptoExecutor, ForumManager forumManager, EventBus eventBus, - AndroidNotificationManager notificationManager, Clock clock) { + Clock clock, AndroidNotificationManager notificationManager) { super(dbExecutor, lifecycleManager, identityManager, cryptoExecutor, - eventBus, notificationManager, clock); + eventBus, clock, notificationManager); this.forumManager = forumManager; } @@ -94,16 +98,42 @@ public class ForumControllerImpl extends } @Override - protected long getLatestTimestamp() throws DbException { - GroupCount count = forumManager.getGroupCount(getGroupId()); - return count.getLatestMsgTime(); + public void createAndStoreMessage(final String body, + @Nullable final ForumItem parentItem, + final ResultExceptionHandler handler) { + runOnDbThread(new Runnable() { + @Override + public void run() { + try { + LocalAuthor author = identityManager.getLocalAuthor(); + GroupCount count = forumManager.getGroupCount(getGroupId()); + long timestamp = max(count.getLatestMsgTime() + 1, + clock.currentTimeMillis()); + MessageId parentId = parentItem != null ? + parentItem.getId() : null; + createMessage(body, timestamp, parentId, author, handler); + } catch (DbException e) { + if (LOG.isLoggable(WARNING)) + LOG.log(WARNING, e.toString(), e); + handler.onException(e); + } + } + }); } - @Override - protected ForumPost createLocalMessage(String body, long timestamp, - @Nullable MessageId parentId, LocalAuthor author) { - return forumManager.createLocalPost(getGroupId(), body, timestamp, - parentId, author); + private void createMessage(final String body, final long timestamp, + final @Nullable MessageId parentId, final LocalAuthor author, + final ResultExceptionHandler handler) { + cryptoExecutor.execute(new Runnable() { + @Override + public void run() { + LOG.info("Creating forum post..."); + ForumPost msg = forumManager + .createLocalPost(getGroupId(), body, timestamp, + parentId, author); + storePost(msg, body, handler); + } + }); } @Override diff --git a/briar-android/src/org/briarproject/android/privategroup/conversation/GroupControllerImpl.java b/briar-android/src/org/briarproject/android/privategroup/conversation/GroupControllerImpl.java index 24b2c6fb2..6b34d19cd 100644 --- a/briar-android/src/org/briarproject/android/privategroup/conversation/GroupControllerImpl.java +++ b/briar-android/src/org/briarproject/android/privategroup/conversation/GroupControllerImpl.java @@ -3,8 +3,8 @@ package org.briarproject.android.privategroup.conversation; import android.support.annotation.Nullable; import org.briarproject.android.api.AndroidNotificationManager; +import org.briarproject.android.controller.handler.ResultExceptionHandler; import org.briarproject.android.threaded.ThreadListControllerImpl; -import org.briarproject.api.clients.MessageTracker.GroupCount; import org.briarproject.api.crypto.CryptoExecutor; import org.briarproject.api.db.DatabaseExecutor; import org.briarproject.api.db.DbException; @@ -28,6 +28,9 @@ import java.util.logging.Logger; import javax.inject.Inject; +import static java.lang.Math.max; +import static java.util.logging.Level.WARNING; + public class GroupControllerImpl extends ThreadListControllerImpl implements GroupController { @@ -44,9 +47,9 @@ public class GroupControllerImpl extends @CryptoExecutor Executor cryptoExecutor, PrivateGroupManager privateGroupManager, GroupMessageFactory groupMessageFactory, EventBus eventBus, - AndroidNotificationManager notificationManager, Clock clock) { + Clock clock, AndroidNotificationManager notificationManager) { super(dbExecutor, lifecycleManager, identityManager, cryptoExecutor, - eventBus, notificationManager, clock); + eventBus, clock, notificationManager); this.privateGroupManager = privateGroupManager; this.groupMessageFactory = groupMessageFactory; } @@ -97,18 +100,52 @@ public class GroupControllerImpl extends } @Override - protected long getLatestTimestamp() throws DbException { - GroupCount count = privateGroupManager.getGroupCount(getGroupId()); - return count.getLatestMsgTime(); + public void createAndStoreMessage(final String body, + @Nullable final GroupMessageItem parentItem, + final ResultExceptionHandler handler) { + runOnDbThread(new Runnable() { + @Override + public void run() { + try { + LocalAuthor author = identityManager.getLocalAuthor(); + MessageId parentId = null; + MessageId previousMsgId = + privateGroupManager.getPreviousMsgId(getGroupId()); + // timestamp must be greater than the timestamps + // of the member's previous message... + long timestamp = privateGroupManager + .getMessageTimestamp(previousMsgId); + // ...and the parent post, if any + if (parentItem != null) { + timestamp = max(parentItem.getTimestamp(), timestamp); + parentId = parentItem.getId(); + } + timestamp = max(clock.currentTimeMillis(), timestamp + 1); + createMessage(body, timestamp, parentId, author, + previousMsgId, handler); + } catch (DbException e) { + if (LOG.isLoggable(WARNING)) + LOG.log(WARNING, e.toString(), e); + handler.onException(e); + } + } + }); } - @Override - protected GroupMessage createLocalMessage(String body, long timestamp, - @Nullable MessageId parentId, LocalAuthor author) { - MessageId previousMsgId = null; // TODO - return groupMessageFactory - .createGroupMessage(getGroupId(), timestamp, parentId, - author, body, previousMsgId); + private void createMessage(final String body, final long timestamp, + final @Nullable MessageId parentId, final LocalAuthor author, + final MessageId previousMsgId, + final ResultExceptionHandler handler) { + cryptoExecutor.execute(new Runnable() { + @Override + public void run() { + LOG.info("Creating group message..."); + GroupMessage msg = groupMessageFactory + .createGroupMessage(getGroupId(), timestamp, + parentId, author, body, previousMsgId); + storePost(msg, body, handler); + } + }); } @Override diff --git a/briar-android/src/org/briarproject/android/threaded/ThreadListActivity.java b/briar-android/src/org/briarproject/android/threaded/ThreadListActivity.java index a8eefd250..268fdcca9 100644 --- a/briar-android/src/org/briarproject/android/threaded/ThreadListActivity.java +++ b/briar-android/src/org/briarproject/android/threaded/ThreadListActivity.java @@ -249,8 +249,7 @@ public abstract class ThreadListActivity items); - void createAndStoreMessage(String body, @Nullable MessageId parentId, + void createAndStoreMessage(String body, @Nullable I parentItem, ResultExceptionHandler handler); void deleteNamedGroup(ResultExceptionHandler handler); diff --git a/briar-android/src/org/briarproject/android/threaded/ThreadListControllerImpl.java b/briar-android/src/org/briarproject/android/threaded/ThreadListControllerImpl.java index 4f348280e..d584d8704 100644 --- a/briar-android/src/org/briarproject/android/threaded/ThreadListControllerImpl.java +++ b/briar-android/src/org/briarproject/android/threaded/ThreadListControllerImpl.java @@ -2,7 +2,6 @@ package org.briarproject.android.threaded; import android.app.Activity; import android.support.annotation.CallSuper; -import android.support.annotation.Nullable; import org.briarproject.android.api.AndroidNotificationManager; import org.briarproject.android.controller.DbControllerImpl; @@ -18,7 +17,6 @@ import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventListener; import org.briarproject.api.event.GroupRemovedEvent; import org.briarproject.api.identity.IdentityManager; -import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.MessageId; @@ -43,12 +41,12 @@ public abstract class ThreadListControllerImpl bodyCache = new ConcurrentHashMap<>(); @@ -59,13 +57,13 @@ public abstract class ThreadListControllerImpl handler) { - runOnDbThread(new Runnable() { - @Override - public void run() { - try { - long now = System.currentTimeMillis(); - LocalAuthor author = identityManager.getLocalAuthor(); - long timestamp = getLatestTimestamp(); - timestamp = Math.max(timestamp, clock.currentTimeMillis()); - long duration = System.currentTimeMillis() - now; - if (LOG.isLoggable(INFO)) { - LOG.info("Loading identity and timestamp took " + - duration + " ms"); - } - createMessage(body, timestamp, parentId, author, handler); - } catch (DbException e) { - if (LOG.isLoggable(WARNING)) - LOG.log(WARNING, e.toString(), e); - handler.onException(e); - } - } - }); - } - - @DatabaseExecutor - protected abstract long getLatestTimestamp() throws DbException; - - private void createMessage(final String body, final long timestamp, - final @Nullable MessageId parentId, final LocalAuthor author, - final ResultExceptionHandler handler) { - cryptoExecutor.execute(new Runnable() { - @Override - public void run() { - long now = System.currentTimeMillis(); - M msg = createLocalMessage(body, timestamp, parentId, author); - long duration = System.currentTimeMillis() - now; - if (LOG.isLoggable(INFO)) - LOG.info("Creating message took " + duration + " ms"); - storePost(msg, body, handler); - } - }); - } - - @CryptoExecutor - protected abstract M createLocalMessage(String body, long timestamp, - @Nullable MessageId parentId, LocalAuthor author); - - private void storePost(final M msg, final String body, + protected void storePost(final M msg, final String body, final ResultExceptionHandler resultHandler) { runOnDbThread(new Runnable() { @Override