Improve how the status of messages is indicated.

Remove the Toast that always says 'Message Sent' and show graphical
indicators instead that show either:
* message is waiting to be sent
* message was sent (or requested)
* message was delivered
This commit is contained in:
Torsten Grote
2015-12-08 11:42:11 -02:00
parent 18d566ecd2
commit 0a8c42b939
16 changed files with 60 additions and 17 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 284 B

After

Width:  |  Height:  |  Size: 479 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 323 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 238 B

After

Width:  |  Height:  |  Size: 313 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 392 B

After

Width:  |  Height:  |  Size: 627 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 443 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 683 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 969 B

View File

@@ -55,6 +55,7 @@ import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.MessageAddedEvent;
import org.briarproject.api.event.MessageExpiredEvent;
import org.briarproject.api.event.MessagesAckedEvent;
import org.briarproject.api.event.MessagesSentEvent;
import org.briarproject.api.messaging.Group;
import org.briarproject.api.messaging.GroupId;
import org.briarproject.api.messaging.Message;
@@ -384,25 +385,31 @@ implements EventListener, OnClickListener, OnItemClickListener {
} else if (e instanceof MessageExpiredEvent) {
LOG.info("Message expired, reloading");
loadHeaders();
} else if (e instanceof MessagesSentEvent) {
MessagesSentEvent m = (MessagesSentEvent) e;
if (m.getContactId().equals(contactId)) {
LOG.info("Messages sent");
markMessages(m.getMessageIds(), ConversationItem.State.SENT);
}
} else if (e instanceof MessagesAckedEvent) {
MessagesAckedEvent m = (MessagesAckedEvent) e;
if (m.getContactId().equals(contactId)) {
LOG.info("Messages acked");
markMessagesDelivered(m.getMessageIds());
markMessages(m.getMessageIds(), ConversationItem.State.DELIVERED);
}
}
}
private void markMessagesDelivered(final Collection<MessageId> acked) {
private void markMessages(final Collection<MessageId> messageIds, final ConversationItem.State state) {
runOnUiThread(new Runnable() {
public void run() {
Set<MessageId> ackedSet = new HashSet<MessageId>(acked);
Set<MessageId> messages = new HashSet<MessageId>(messageIds);
boolean changed = false;
int count = adapter.getCount();
for (int i = 0; i < count; i++) {
ConversationItem item = adapter.getItem(i);
if (ackedSet.contains(item.getHeader().getId())) {
item.setDelivered(true);
if (messages.contains(item.getHeader().getId())) {
item.setStatus(state);
changed = true;
}
}
@@ -417,7 +424,6 @@ implements EventListener, OnClickListener, OnItemClickListener {
long timestamp = System.currentTimeMillis();
timestamp = Math.max(timestamp, getMinTimestampForNewMessage());
createMessage(StringUtils.toUtf8(message), timestamp);
Toast.makeText(this, R.string.message_sent_toast, LENGTH_SHORT).show();
content.setText("");
hideSoftKeyboard();
}

View File

@@ -79,11 +79,16 @@ class ConversationAdapter extends ArrayAdapter<ConversationItem> {
footer.addView(new ElasticHorizontalSpace(ctx));
ImageView delivered = new ImageView(ctx);
delivered.setPadding(0, 0, pad, 0);
delivered.setImageResource(R.drawable.message_delivered);
if (!item.isDelivered()) delivered.setVisibility(INVISIBLE);
footer.addView(delivered);
ImageView status = new ImageView(ctx);
status.setPadding(0, 0, pad, 0);
if (item.getStatus() == ConversationItem.State.DELIVERED) {
status.setImageResource(R.drawable.message_delivered);
} else if (item.getStatus() == ConversationItem.State.SENT) {
status.setImageResource(R.drawable.message_sent);
} else {
status.setImageResource(R.drawable.message_stored);
}
footer.addView(status);
TextView date = new TextView(ctx);
date.setTextColor(res.getColor(R.color.private_message_date));

View File

@@ -5,14 +5,16 @@ import org.briarproject.api.db.MessageHeader;
// This class is not thread-safe
class ConversationItem {
public enum State { STORED, SENT, DELIVERED };
private final MessageHeader header;
private byte[] body;
private boolean delivered;
private State status;
ConversationItem(MessageHeader header) {
this.header = header;
body = null;
delivered = header.isDelivered();
status = header.isDelivered() ? State.DELIVERED : State.STORED;
}
MessageHeader getHeader() {
@@ -27,11 +29,11 @@ class ConversationItem {
this.body = body;
}
boolean isDelivered() {
return delivered;
State getStatus() {
return status;
}
void setDelivered(boolean delivered) {
this.delivered = delivered;
void setStatus(State state) {
this.status = state;
}
}

View File

@@ -0,0 +1,27 @@
package org.briarproject.api.event;
import java.util.Collection;
import org.briarproject.api.ContactId;
import org.briarproject.api.messaging.MessageId;
/** An event that is broadcast when messages are sent to a contact. */
public class MessagesSentEvent extends Event {
private final ContactId contactId;
private final Collection<MessageId> acked;
public MessagesSentEvent(ContactId contactId,
Collection<MessageId> acked) {
this.contactId = contactId;
this.acked = acked;
}
public ContactId getContactId() {
return contactId;
}
public Collection<MessageId> getMessageIds() {
return acked;
}
}

View File

@@ -52,6 +52,7 @@ import org.briarproject.api.event.MessageRequestedEvent;
import org.briarproject.api.event.MessageToAckEvent;
import org.briarproject.api.event.MessageToRequestEvent;
import org.briarproject.api.event.MessagesAckedEvent;
import org.briarproject.api.event.MessagesSentEvent;
import org.briarproject.api.event.RemoteRetentionTimeUpdatedEvent;
import org.briarproject.api.event.RemoteSubscriptionsUpdatedEvent;
import org.briarproject.api.event.RemoteTransportsUpdatedEvent;
@@ -380,6 +381,7 @@ DatabaseCleaner.Callback {
lock.writeLock().unlock();
}
if (messages.isEmpty()) return null;
if (!ids.isEmpty()) eventBus.broadcast(new MessagesSentEvent(c, ids));
return Collections.unmodifiableList(messages);
}
@@ -455,6 +457,7 @@ DatabaseCleaner.Callback {
lock.writeLock().unlock();
}
if (messages.isEmpty()) return null;
if (!ids.isEmpty()) eventBus.broadcast(new MessagesSentEvent(c, ids));
return Collections.unmodifiableList(messages);
}