diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java index 9281d1d572dc84b39986765aa337d2911ace2004..828ef3b9fb882ce958bffee1c4973d77f4d0ab24 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java @@ -8,7 +8,6 @@ import static android.view.View.GONE; import static android.view.View.VISIBLE; import static android.widget.LinearLayout.HORIZONTAL; import static android.widget.LinearLayout.VERTICAL; -import static android.widget.Toast.LENGTH_SHORT; import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; import static org.briarproject.android.contact.ReadPrivateMessageActivity.RESULT_PREV_NEXT; @@ -45,6 +44,7 @@ import org.briarproject.api.crypto.CryptoExecutor; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; import org.briarproject.api.db.MessageHeader; +import org.briarproject.api.db.MessageHeader.State; import org.briarproject.api.db.NoSuchContactException; import org.briarproject.api.db.NoSuchMessageException; import org.briarproject.api.db.NoSuchSubscriptionException; @@ -77,7 +77,6 @@ import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; -import android.widget.Toast; public class ConversationActivity extends BriarActivity implements EventListener, OnClickListener, OnItemClickListener { @@ -389,18 +388,18 @@ implements EventListener, OnClickListener, OnItemClickListener { MessagesSentEvent m = (MessagesSentEvent) e; if (m.getContactId().equals(contactId)) { LOG.info("Messages sent"); - markMessages(m.getMessageIds(), ConversationItem.State.SENT); + markMessages(m.getMessageIds(), State.SENT); } } else if (e instanceof MessagesAckedEvent) { MessagesAckedEvent m = (MessagesAckedEvent) e; if (m.getContactId().equals(contactId)) { LOG.info("Messages acked"); - markMessages(m.getMessageIds(), ConversationItem.State.DELIVERED); + markMessages(m.getMessageIds(), State.DELIVERED); } } } - private void markMessages(final Collection<MessageId> messageIds, final ConversationItem.State state) { + private void markMessages(final Collection<MessageId> messageIds, final State state) { runOnUiThread(new Runnable() { public void run() { Set<MessageId> messages = new HashSet<MessageId>(messageIds); diff --git a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java index ca85ac94432267a9a8d76cf38c508432ca9fb947..f78f4bb682d100ed3259b623257554101f1704f4 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java @@ -13,6 +13,7 @@ import org.briarproject.R; import org.briarproject.android.util.ElasticHorizontalSpace; import org.briarproject.android.util.LayoutUtils; import org.briarproject.api.db.MessageHeader; +import org.briarproject.api.db.MessageHeader.State; import org.briarproject.util.StringUtils; import android.content.Context; @@ -81,9 +82,9 @@ class ConversationAdapter extends ArrayAdapter<ConversationItem> { ImageView status = new ImageView(ctx); status.setPadding(0, 0, pad, 0); - if (item.getStatus() == ConversationItem.State.DELIVERED) { + if (item.getStatus() == State.DELIVERED) { status.setImageResource(R.drawable.message_delivered); - } else if (item.getStatus() == ConversationItem.State.SENT) { + } else if (item.getStatus() == State.SENT) { status.setImageResource(R.drawable.message_sent); } else { status.setImageResource(R.drawable.message_stored); diff --git a/briar-android/src/org/briarproject/android/contact/ConversationItem.java b/briar-android/src/org/briarproject/android/contact/ConversationItem.java index abf29ba7abec725c0c5516c0ed78a57e72c8c779..ac5637e16400a26946fb9f3a72a67ce8b984d7a1 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationItem.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationItem.java @@ -1,12 +1,11 @@ package org.briarproject.android.contact; import org.briarproject.api.db.MessageHeader; +import org.briarproject.api.db.MessageHeader.State; // This class is not thread-safe class ConversationItem { - public enum State { STORED, SENT, DELIVERED }; - private final MessageHeader header; private byte[] body; private State status; @@ -14,7 +13,7 @@ class ConversationItem { ConversationItem(MessageHeader header) { this.header = header; body = null; - status = header.isDelivered() ? State.DELIVERED : State.STORED; + status = header.getStatus(); } MessageHeader getHeader() { diff --git a/briar-api/src/org/briarproject/api/db/MessageHeader.java b/briar-api/src/org/briarproject/api/db/MessageHeader.java index 779e4cfa0edccba03ee05ec22fda7b1fbb4de035..c500971eb145cc0a5a8c27f0a8a0acfcfdce0d5d 100644 --- a/briar-api/src/org/briarproject/api/db/MessageHeader.java +++ b/briar-api/src/org/briarproject/api/db/MessageHeader.java @@ -6,17 +6,20 @@ import org.briarproject.api.messaging.MessageId; public class MessageHeader { + public enum State { STORED, SENT, DELIVERED }; + private final MessageId id, parent; private final GroupId groupId; private final Author author; private final Author.Status authorStatus; private final String contentType; private final long timestamp; - private final boolean local, read, delivered; + private final boolean local, read; + private final State status; public MessageHeader(MessageId id, MessageId parent, GroupId groupId, Author author, Author.Status authorStatus, String contentType, - long timestamp, boolean local, boolean read, boolean delivered) { + long timestamp, boolean local, boolean read, State status) { this.id = id; this.parent = parent; this.groupId = groupId; @@ -26,7 +29,7 @@ public class MessageHeader { this.timestamp = timestamp; this.local = local; this.read = read; - this.delivered = delivered; + this.status = status; } /** Returns the message's unique identifier. */ @@ -82,10 +85,9 @@ public class MessageHeader { } /** - * Returns true if the message has been delivered. (This only applies to - * locally generated private messages.) + * Returns message status. (This only applies to locally generated private messages.) */ - public boolean isDelivered() { - return delivered; + public State getStatus() { + return status; } } diff --git a/briar-api/src/org/briarproject/api/event/MessagesSentEvent.java b/briar-api/src/org/briarproject/api/event/MessagesSentEvent.java index 9444ada5a1516937032152efbab9a7cab1916ddc..a70b7a872d4160bb5ad3a32fbe96788b0fc4e6ca 100644 --- a/briar-api/src/org/briarproject/api/event/MessagesSentEvent.java +++ b/briar-api/src/org/briarproject/api/event/MessagesSentEvent.java @@ -9,12 +9,12 @@ import org.briarproject.api.messaging.MessageId; public class MessagesSentEvent extends Event { private final ContactId contactId; - private final Collection<MessageId> acked; + private final Collection<MessageId> messageIds; public MessagesSentEvent(ContactId contactId, - Collection<MessageId> acked) { + Collection<MessageId> messageIds) { this.contactId = contactId; - this.acked = acked; + this.messageIds = messageIds; } public ContactId getContactId() { @@ -22,6 +22,6 @@ public class MessagesSentEvent extends Event { } public Collection<MessageId> getMessageIds() { - return acked; + return messageIds; } } diff --git a/briar-core/src/org/briarproject/db/JdbcDatabase.java b/briar-core/src/org/briarproject/db/JdbcDatabase.java index 61add5a157129243f071b603f4ccf27045000727..4ac27fd6ac7c2203ccc3113408191762c1d35fcb 100644 --- a/briar-core/src/org/briarproject/db/JdbcDatabase.java +++ b/briar-core/src/org/briarproject/db/JdbcDatabase.java @@ -44,6 +44,7 @@ import org.briarproject.api.TransportProperties; import org.briarproject.api.db.DbClosedException; import org.briarproject.api.db.DbException; import org.briarproject.api.db.MessageHeader; +import org.briarproject.api.db.MessageHeader.State; import org.briarproject.api.messaging.Group; import org.briarproject.api.messaging.GroupId; import org.briarproject.api.messaging.Message; @@ -1452,7 +1453,7 @@ abstract class JdbcDatabase implements Database<Connection> { if (rs.next()) throw new DbException(); // Get the message headers sql = "SELECT m.messageId, parentId, m.groupId, contentType," - + " timestamp, local, read, seen" + + " timestamp, local, read, seen, s.txCount" + " FROM messages AS m" + " JOIN groups AS g" + " ON m.groupId = g.groupId" @@ -1478,8 +1479,15 @@ abstract class JdbcDatabase implements Database<Connection> { boolean read = rs.getBoolean(7); boolean seen = rs.getBoolean(8); Author author = local ? localAuthor : remoteAuthor; + + // initialize message status + State status; + if (seen) status = State.DELIVERED; + else if (rs.getInt(9) > 0) status = State.SENT; + else status = State.STORED; + headers.add(new MessageHeader(id, parent, groupId, author, - VERIFIED, contentType, timestamp, local, read, seen)); + VERIFIED, contentType, timestamp, local, read, status)); } rs.close(); ps.close(); @@ -1631,6 +1639,10 @@ abstract class JdbcDatabase implements Database<Connection> { } } + /** + * This method is used to get group messages. + * The message status won't be used. + */ public Collection<MessageHeader> getMessageHeaders(Connection txn, GroupId g) throws DbException { PreparedStatement ps = null; @@ -1669,12 +1681,14 @@ abstract class JdbcDatabase implements Database<Connection> { boolean read = rs.getBoolean(9); boolean isSelf = rs.getBoolean(10); boolean isContact = rs.getBoolean(11); + Author.Status status; if (author == null) status = ANONYMOUS; else if (isSelf || isContact) status = VERIFIED; else status = UNKNOWN; + headers.add(new MessageHeader(id, parent, g, author, status, - contentType, timestamp, local, read, false)); + contentType, timestamp, local, read, State.STORED)); } rs.close(); ps.close();