make message status persistent and initialize it from database

This commit is contained in:
Torsten Grote
2015-12-10 10:59:10 -02:00
parent 0a8c42b939
commit aa7d7642bf
6 changed files with 39 additions and 24 deletions

View File

@@ -8,7 +8,6 @@ import static android.view.View.GONE;
import static android.view.View.VISIBLE; import static android.view.View.VISIBLE;
import static android.widget.LinearLayout.HORIZONTAL; import static android.widget.LinearLayout.HORIZONTAL;
import static android.widget.LinearLayout.VERTICAL; 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.INFO;
import static java.util.logging.Level.WARNING; import static java.util.logging.Level.WARNING;
import static org.briarproject.android.contact.ReadPrivateMessageActivity.RESULT_PREV_NEXT; 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.DatabaseComponent;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
import org.briarproject.api.db.MessageHeader; import org.briarproject.api.db.MessageHeader;
import org.briarproject.api.db.MessageHeader.State;
import org.briarproject.api.db.NoSuchContactException; import org.briarproject.api.db.NoSuchContactException;
import org.briarproject.api.db.NoSuchMessageException; import org.briarproject.api.db.NoSuchMessageException;
import org.briarproject.api.db.NoSuchSubscriptionException; import org.briarproject.api.db.NoSuchSubscriptionException;
@@ -77,7 +77,6 @@ import android.widget.ImageButton;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.ListView; import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
public class ConversationActivity extends BriarActivity public class ConversationActivity extends BriarActivity
implements EventListener, OnClickListener, OnItemClickListener { implements EventListener, OnClickListener, OnItemClickListener {
@@ -389,18 +388,18 @@ implements EventListener, OnClickListener, OnItemClickListener {
MessagesSentEvent m = (MessagesSentEvent) e; MessagesSentEvent m = (MessagesSentEvent) e;
if (m.getContactId().equals(contactId)) { if (m.getContactId().equals(contactId)) {
LOG.info("Messages sent"); LOG.info("Messages sent");
markMessages(m.getMessageIds(), ConversationItem.State.SENT); markMessages(m.getMessageIds(), State.SENT);
} }
} else if (e instanceof MessagesAckedEvent) { } else if (e instanceof MessagesAckedEvent) {
MessagesAckedEvent m = (MessagesAckedEvent) e; MessagesAckedEvent m = (MessagesAckedEvent) e;
if (m.getContactId().equals(contactId)) { if (m.getContactId().equals(contactId)) {
LOG.info("Messages acked"); 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() { runOnUiThread(new Runnable() {
public void run() { public void run() {
Set<MessageId> messages = new HashSet<MessageId>(messageIds); Set<MessageId> messages = new HashSet<MessageId>(messageIds);

View File

@@ -13,6 +13,7 @@ import org.briarproject.R;
import org.briarproject.android.util.ElasticHorizontalSpace; import org.briarproject.android.util.ElasticHorizontalSpace;
import org.briarproject.android.util.LayoutUtils; import org.briarproject.android.util.LayoutUtils;
import org.briarproject.api.db.MessageHeader; import org.briarproject.api.db.MessageHeader;
import org.briarproject.api.db.MessageHeader.State;
import org.briarproject.util.StringUtils; import org.briarproject.util.StringUtils;
import android.content.Context; import android.content.Context;
@@ -81,9 +82,9 @@ class ConversationAdapter extends ArrayAdapter<ConversationItem> {
ImageView status = new ImageView(ctx); ImageView status = new ImageView(ctx);
status.setPadding(0, 0, pad, 0); status.setPadding(0, 0, pad, 0);
if (item.getStatus() == ConversationItem.State.DELIVERED) { if (item.getStatus() == State.DELIVERED) {
status.setImageResource(R.drawable.message_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); status.setImageResource(R.drawable.message_sent);
} else { } else {
status.setImageResource(R.drawable.message_stored); status.setImageResource(R.drawable.message_stored);

View File

@@ -1,12 +1,11 @@
package org.briarproject.android.contact; package org.briarproject.android.contact;
import org.briarproject.api.db.MessageHeader; import org.briarproject.api.db.MessageHeader;
import org.briarproject.api.db.MessageHeader.State;
// This class is not thread-safe // This class is not thread-safe
class ConversationItem { class ConversationItem {
public enum State { STORED, SENT, DELIVERED };
private final MessageHeader header; private final MessageHeader header;
private byte[] body; private byte[] body;
private State status; private State status;
@@ -14,7 +13,7 @@ class ConversationItem {
ConversationItem(MessageHeader header) { ConversationItem(MessageHeader header) {
this.header = header; this.header = header;
body = null; body = null;
status = header.isDelivered() ? State.DELIVERED : State.STORED; status = header.getStatus();
} }
MessageHeader getHeader() { MessageHeader getHeader() {

View File

@@ -6,17 +6,20 @@ import org.briarproject.api.messaging.MessageId;
public class MessageHeader { public class MessageHeader {
public enum State { STORED, SENT, DELIVERED };
private final MessageId id, parent; private final MessageId id, parent;
private final GroupId groupId; private final GroupId groupId;
private final Author author; private final Author author;
private final Author.Status authorStatus; private final Author.Status authorStatus;
private final String contentType; private final String contentType;
private final long timestamp; 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, public MessageHeader(MessageId id, MessageId parent, GroupId groupId,
Author author, Author.Status authorStatus, String contentType, 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.id = id;
this.parent = parent; this.parent = parent;
this.groupId = groupId; this.groupId = groupId;
@@ -26,7 +29,7 @@ public class MessageHeader {
this.timestamp = timestamp; this.timestamp = timestamp;
this.local = local; this.local = local;
this.read = read; this.read = read;
this.delivered = delivered; this.status = status;
} }
/** Returns the message's unique identifier. */ /** 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 * Returns message status. (This only applies to locally generated private messages.)
* locally generated private messages.)
*/ */
public boolean isDelivered() { public State getStatus() {
return delivered; return status;
} }
} }

View File

@@ -9,12 +9,12 @@ import org.briarproject.api.messaging.MessageId;
public class MessagesSentEvent extends Event { public class MessagesSentEvent extends Event {
private final ContactId contactId; private final ContactId contactId;
private final Collection<MessageId> acked; private final Collection<MessageId> messageIds;
public MessagesSentEvent(ContactId contactId, public MessagesSentEvent(ContactId contactId,
Collection<MessageId> acked) { Collection<MessageId> messageIds) {
this.contactId = contactId; this.contactId = contactId;
this.acked = acked; this.messageIds = messageIds;
} }
public ContactId getContactId() { public ContactId getContactId() {
@@ -22,6 +22,6 @@ public class MessagesSentEvent extends Event {
} }
public Collection<MessageId> getMessageIds() { public Collection<MessageId> getMessageIds() {
return acked; return messageIds;
} }
} }

View File

@@ -44,6 +44,7 @@ import org.briarproject.api.TransportProperties;
import org.briarproject.api.db.DbClosedException; import org.briarproject.api.db.DbClosedException;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
import org.briarproject.api.db.MessageHeader; import org.briarproject.api.db.MessageHeader;
import org.briarproject.api.db.MessageHeader.State;
import org.briarproject.api.messaging.Group; import org.briarproject.api.messaging.Group;
import org.briarproject.api.messaging.GroupId; import org.briarproject.api.messaging.GroupId;
import org.briarproject.api.messaging.Message; import org.briarproject.api.messaging.Message;
@@ -1452,7 +1453,7 @@ abstract class JdbcDatabase implements Database<Connection> {
if (rs.next()) throw new DbException(); if (rs.next()) throw new DbException();
// Get the message headers // Get the message headers
sql = "SELECT m.messageId, parentId, m.groupId, contentType," sql = "SELECT m.messageId, parentId, m.groupId, contentType,"
+ " timestamp, local, read, seen" + " timestamp, local, read, seen, s.txCount"
+ " FROM messages AS m" + " FROM messages AS m"
+ " JOIN groups AS g" + " JOIN groups AS g"
+ " ON m.groupId = g.groupId" + " ON m.groupId = g.groupId"
@@ -1478,8 +1479,15 @@ abstract class JdbcDatabase implements Database<Connection> {
boolean read = rs.getBoolean(7); boolean read = rs.getBoolean(7);
boolean seen = rs.getBoolean(8); boolean seen = rs.getBoolean(8);
Author author = local ? localAuthor : remoteAuthor; 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, headers.add(new MessageHeader(id, parent, groupId, author,
VERIFIED, contentType, timestamp, local, read, seen)); VERIFIED, contentType, timestamp, local, read, status));
} }
rs.close(); rs.close();
ps.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, public Collection<MessageHeader> getMessageHeaders(Connection txn,
GroupId g) throws DbException { GroupId g) throws DbException {
PreparedStatement ps = null; PreparedStatement ps = null;
@@ -1669,12 +1681,14 @@ abstract class JdbcDatabase implements Database<Connection> {
boolean read = rs.getBoolean(9); boolean read = rs.getBoolean(9);
boolean isSelf = rs.getBoolean(10); boolean isSelf = rs.getBoolean(10);
boolean isContact = rs.getBoolean(11); boolean isContact = rs.getBoolean(11);
Author.Status status; Author.Status status;
if (author == null) status = ANONYMOUS; if (author == null) status = ANONYMOUS;
else if (isSelf || isContact) status = VERIFIED; else if (isSelf || isContact) status = VERIFIED;
else status = UNKNOWN; else status = UNKNOWN;
headers.add(new MessageHeader(id, parent, g, author, status, headers.add(new MessageHeader(id, parent, g, author, status,
contentType, timestamp, local, read, false)); contentType, timestamp, local, read, State.STORED));
} }
rs.close(); rs.close();
ps.close(); ps.close();