From 0a8c42b939bd1f2369027d7cb0c858f0451515b7 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 8 Dec 2015 11:42:11 -0200 Subject: [PATCH 1/2] 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 --- .../res/drawable-hdpi/message_delivered.png | Bin 284 -> 479 bytes .../res/drawable-hdpi/message_sent.png | Bin 0 -> 284 bytes .../res/drawable-hdpi/message_stored.png | Bin 0 -> 323 bytes .../res/drawable-mdpi/message_delivered.png | Bin 238 -> 313 bytes .../res/drawable-mdpi/message_sent.png | Bin 0 -> 238 bytes .../res/drawable-mdpi/message_stored.png | Bin 0 -> 237 bytes .../res/drawable-xhdpi/message_delivered.png | Bin 392 -> 627 bytes .../res/drawable-xhdpi/message_sent.png | Bin 0 -> 392 bytes .../res/drawable-xhdpi/message_stored.png | Bin 0 -> 443 bytes .../res/drawable-xxhdpi/message_stored.png | Bin 0 -> 683 bytes .../res/drawable-xxxhdpi/message_stored.png | Bin 0 -> 969 bytes .../android/contact/ConversationActivity.java | 18 ++++++++---- .../android/contact/ConversationAdapter.java | 15 ++++++---- .../android/contact/ConversationItem.java | 14 +++++---- .../api/event/MessagesSentEvent.java | 27 ++++++++++++++++++ .../db/DatabaseComponentImpl.java | 3 ++ 16 files changed, 60 insertions(+), 17 deletions(-) create mode 100644 briar-android/res/drawable-hdpi/message_sent.png create mode 100644 briar-android/res/drawable-hdpi/message_stored.png create mode 100644 briar-android/res/drawable-mdpi/message_sent.png create mode 100644 briar-android/res/drawable-mdpi/message_stored.png create mode 100644 briar-android/res/drawable-xhdpi/message_sent.png create mode 100644 briar-android/res/drawable-xhdpi/message_stored.png create mode 100644 briar-android/res/drawable-xxhdpi/message_stored.png create mode 100644 briar-android/res/drawable-xxxhdpi/message_stored.png create mode 100644 briar-api/src/org/briarproject/api/event/MessagesSentEvent.java diff --git a/briar-android/res/drawable-hdpi/message_delivered.png b/briar-android/res/drawable-hdpi/message_delivered.png index 6edef05a95505d6e4605621b5975f179b331c04e..efade63916a2f36a74400bf378d587a763b690a6 100644 GIT binary patch delta 461 zcmV;;0W$ua0^b9W9Df0qa1Cw%000SaNLh0L01FcU01FcV0GgZ_0004zNklY5RD;fs#w^lNYGLRMQr^I(ZYY>?@8$&u(S^O0}4unfY^wQA|la3j7Z{p%gi#_ z+go#_xx$0t-p#)G*nM+sr4oDEy^V(R1Jt7oT^*2e1^djWNq?e_yjx5P8>S;>TSfkX z)N8Os7VT(J-PN2h*n1y#c)I)WHCx@n(b}lA;+oFW3+sFsUIH zx3!$bh4)eN04H_gXgTgLke`F;aFT4N%LPx#)=5M`R7l6|l)nxEK@f+(lTd0TDv?zvC{E!$cnF<)o@u=Uuc5$nB;@ExXpks0 zS6t5CKTdbQZg-RK+eu~y%9P0yQPU7Llki=oKzJS415&skfS-b6GyLWh3~zg`e=Dp4 zQPTpBaqyo6qNWEN0)`d-ArLifQPa%`Ujt{L83(sjFavg?W|RSb0Xm-RKa)Na6-h1>`^sgtB7Ut2Et7Vy#fgUqEIF3PkhL zOeV3@k|!>IBSR!%Rw81>Y4SRf#<72!RuwGg1lbW3f>+Z9TELRczH5^18?!i VKJ0vVY&ie`002ovPDHLkV1gf|fCB&k literal 0 HcmV?d00001 diff --git a/briar-android/res/drawable-mdpi/message_delivered.png b/briar-android/res/drawable-mdpi/message_delivered.png index 1f3807209e1db00dc0b3f07fa5f2fd0e2bd813ad..938c50d909e9dfbf0e931632a4a6282f6fe922b4 100644 GIT binary patch delta 294 zcmV+>0onfU0l5N@9Df05^w0MI000SaNLh0L01FcU01FcV0GgZ_0002%Nkl zfPtx(6!yb8U6}yC;%vV1u6-qL4U!%7)ArxXQ6B`4Gv1E zz+5100K^wSG|-F2)O9rdOapq-7TGos9~_s208rs1pc*G2wtxl-f)A7wMKcx72g)r4 z;&VXE4b_Ok2M04yk_Sky1!9nE+<=%9h;IQgNL(5iD0Ae3nSoEMlqW}N^07*qoM6N<$f+G@Y&;S4c delta 218 zcmV<0044vq0`38j9De{G^Z#K00004VQb$4nuFf3k0001}Nkl_b$34DNq(SF^Pn@|<@z!TU3^M9IUI*_@j0pY7B U(?v8ZKL7v#07*qoM6N<$f{}n=tpET3 diff --git a/briar-android/res/drawable-mdpi/message_sent.png b/briar-android/res/drawable-mdpi/message_sent.png new file mode 100644 index 0000000000000000000000000000000000000000..1f3807209e1db00dc0b3f07fa5f2fd0e2bd813ad GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|R(QHNhFF|_ zI@zA62g)CC+VjS9U%Jc mfbb2*&-JrXttRYT!T4~s`ej!WZF``b89ZJ6T-G@yGywpZJz$Uk literal 0 HcmV?d00001 diff --git a/briar-android/res/drawable-mdpi/message_stored.png b/briar-android/res/drawable-mdpi/message_stored.png new file mode 100644 index 0000000000000000000000000000000000000000..01858ffc64ddf763b244d301acaa33657a5ea3d5 GIT binary patch literal 237 zcmVj8>MMpen{*ASLB?y1l(IDlLTGC9jbFD%~W6R^+a!&9xKjE`__{n zXIF_W11D`L$;jNS8kPal#!n0e;0ElM3|b{P;H2CI*tAM$H8EogoSDaGHWBPG*2rTV nt>n*(lucHza*5TS>1(_I)3qE34-Hbm00000NkvXXu0mjf|HEDa literal 0 HcmV?d00001 diff --git a/briar-android/res/drawable-xhdpi/message_delivered.png b/briar-android/res/drawable-xhdpi/message_delivered.png index a40d4d94c0fca5e85e08ce21f3ce99f8c74ceeea..99109113666357edda634c9bbcb9ebd2048e68a8 100644 GIT binary patch delta 610 zcmV-o0-gPc1M>us9De}>eM({g000SaNLh0L01FcU01FcV0GgZ_0006dNklf}MqL3m;hM zIoFwGa&wbiF+z$B3_Ck}&&;`J@4Y+8WUBpEkGsFzb2_j``hQJ==)(1`DqNvO;69_D=)Bsi+#3l~DGaNu;!l&LZg4QswD4m{eQv z=V0fUW?LwA3y_`vG_ATwOKnv;>&KF#w6GUllhAAE1I+|vPdsz7vH{_I(IbT%gCDu9C7-_9>tNTFl^@<{&Vs)X&U zkHxhY%K%^=kP1HV!7c#?t-wx&n)L~Og$=_9cD`0twz`>I0z4d)WQ^wod}Y8V{xl;E zlm!OlVLUPk91@?E%fKZXu)1U?n6y9Qz&;yy4<^(4z<>I|!D%p6p#BxWGG2r&_)KkF zo4=aQMmnS=B;_}D-0UlMP9^c067UM=aXK8z=C*~SIG@#o01B@o*R0Ig77oU(+>QVe z^x`rB+X3r)BUvzRp0lN#fw2?G0ed0&g7MIMRt0#FuECl?<_uT%MEpY#j7zWdr@~6c z@2&XPVp|tB0E>vApp6sz3>&R5<1vkgX6(m;-(;`g5kQx)DHz*KHhg_B8|N$dRpFol wK06TUK#Yw*kGvMw2vmwEnQ=NMRlrx^8u}T9$6h%)Y zjiq2=y3x{N8Y|IYVZg>#&|h$V!9>w-nAV7mKVX?ALBvXA2qM@_r;RAs1k%_{AS|=V zjM;3VbIWCibMJd^-z+30CH)s^BbwTXlkD?_lHjMnIdD{G00000NkvXXu0mjf$Bm^U diff --git a/briar-android/res/drawable-xhdpi/message_sent.png b/briar-android/res/drawable-xhdpi/message_sent.png new file mode 100644 index 0000000000000000000000000000000000000000..a40d4d94c0fca5e85e08ce21f3ce99f8c74ceeea GIT binary patch literal 392 zcmV;30eAk1P)Px$LP$#B#otDVY<=MVj3&aU}3<xY+hjZ_HZ{I8=B_;hAX(O82h?DH|g_7W> zz&UVHx&a420|vlGsRlCeJtgg9_MJ*e@GT!4pgIR|6=(vjNy+DC0JsK@rX?@jfHqOxrFzD0Tlw|?0000N0{~a2Jj%jUsGPgvb{m%#Tm8d(vrc4|Zqw zFh=*Jl`P-Qo0+@0nb}!r(V|5PWWWfR02ja<$bpqzIdBEc>^&cVt+iMxumhX|H^6=1 zx&cmrw@+?0&*RwC;d2%lRbu3@j5EF4q$H)TH6tn5SN6Kn_fSF)#$Wm^k0E zzlZkP)ZSaib8dAd#Vg=Pjlunn*)UrF%E#K z6S8;mY5+$UGS9?EXeNZlO64gWI21fHAECJr z8Y-2ia9~&P%zcDp+;x@8Q#jBSJh_k1N(gDUekmNt1kcJxs0jz&D>+mSG!a58OjjG) zN2x+6)kpjh_$|1Wz!&_hy8MW*e1uY^Q82~mm}+zO3)u6JSEbQZg{+Ksn0e8?Sl@xy z56GzsS*ljT1y@-8!`>w`h9gX2Wi^r$54dTU#gids-1>38ya7{ zar_s(p@H}!?**n$@@T7<`kyJMd5aJPW(c>NI5gmp1bIJ3WZ z?X|Ux*UQ*vLk~F0=wqH#$|I&G({n9i4*CAD#zQ`dkYm=bJfmaQ7A-a%{{gUj`-YR= RkU0PV002ovPDHLkV1i!`GmQWM literal 0 HcmV?d00001 diff --git a/briar-android/res/drawable-xxxhdpi/message_stored.png b/briar-android/res/drawable-xxxhdpi/message_stored.png new file mode 100644 index 0000000000000000000000000000000000000000..b3833bc3e76f11b4abe7f1a487bb87025f003075 GIT binary patch literal 969 zcmV;)12+7LP)8bfQ6H)-tJg1EBP#N9vMhkF-f zGqZc|-kHtD-4Etv+54Su&fJ+fbLLzYSYUw#7RZhzyoXIZ#1lNje%YR47Z30mZj{el zYOLT>e1|rA=vQn#yuu!CmRy$xYxo*(RPXS(_8MQ|`V{+78*BI$XVP_ixSc7c&rCUD z8Taw0d>tQd9o#K#Uns8OXZ6H)@e+qPDBEHATel|Hb6m~d%LvvL3)MK0r+9&Fe1z5r z&Q|%K?edw^3j8PdAZgDk;5Ocl5!S|+SZ!cuwd81zvDH=VI8(uG{5?WUrxZPEr0b$p za&|`8{mT@bux|9oA1QW&Tv)^L2>V?br^8k8Ip4!$(+OBsup=H={VK!4xU5)|VvF2X zYJ(N9CB8^Lmw1c3A2HN(F`XY^OZ-i^m&(Yy;z7>i2{}Jjh##~j>&8w*TSuaZ@tcT& zBa_ehpN6=ayhSVG3*(apyeLLL6x(++8?}@UP-+Qnk!Kpd1&;!xeZ`*K1gRZBp(&*G z(WHbc!bjS+=0Q#l2egDE#y2LMs<#4UDMp_>4j}#(+?s@JFF5E21xpfvw8~TbijtN_RTsZ z4+8{U>5jNL9nccaEIp`0vKt_HnNVa-2T*7o*1uba;8}p+FrmQQ4mfgN|I<1I`vHQ3 zgaUIr;J|tP`*jGW?SNYIvjQ4BVA@llhaVO9hbho_3glh{V@K?+VjpjsT5G%r=H3RE z6&ag90(ScN1)ogFon#x#9S99@MKLn5+}9s#wAo`29cjZ$|zbONqVKU|Y?V6s?PEiWK*#Xf%0JlzeINNfEp5%9a)<9pdqqfjd3|INAIRIH22rzj4zPbF&hOECo)!!jVqBk_CGF>8DOr9 zqz0JlGPwaJDU{qWzEE<*B`A~}AXTaCkxN)AJHSO2OV89t6>EyHdG5;PhcUMwOblag rKbZ+(_@k*^bMVpB0t+m#z|7-cs~f*?lyfk$00000NkvXXu0mjfuBgXF literal 0 HcmV?d00001 diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java index 2375da4a8..9281d1d57 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java @@ -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 acked) { + private void markMessages(final Collection messageIds, final ConversationItem.State state) { runOnUiThread(new Runnable() { public void run() { - Set ackedSet = new HashSet(acked); + Set messages = new HashSet(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(); } diff --git a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java index 14699ab72..ca85ac944 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java @@ -79,11 +79,16 @@ class ConversationAdapter extends ArrayAdapter { 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)); diff --git a/briar-android/src/org/briarproject/android/contact/ConversationItem.java b/briar-android/src/org/briarproject/android/contact/ConversationItem.java index c1959f0c5..abf29ba7a 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationItem.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationItem.java @@ -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; } } diff --git a/briar-api/src/org/briarproject/api/event/MessagesSentEvent.java b/briar-api/src/org/briarproject/api/event/MessagesSentEvent.java new file mode 100644 index 000000000..9444ada5a --- /dev/null +++ b/briar-api/src/org/briarproject/api/event/MessagesSentEvent.java @@ -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 acked; + + public MessagesSentEvent(ContactId contactId, + Collection acked) { + this.contactId = contactId; + this.acked = acked; + } + + public ContactId getContactId() { + return contactId; + } + + public Collection getMessageIds() { + return acked; + } +} diff --git a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java index 32467764e..fbf81fe6b 100644 --- a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java +++ b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java @@ -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); } From aa7d7642bfa312004957b29ccf730b28a85a461c Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 10 Dec 2015 10:59:10 -0200 Subject: [PATCH 2/2] make message status persistent and initialize it from database --- .../android/contact/ConversationActivity.java | 9 ++++----- .../android/contact/ConversationAdapter.java | 5 +++-- .../android/contact/ConversationItem.java | 5 ++--- .../briarproject/api/db/MessageHeader.java | 16 ++++++++------- .../api/event/MessagesSentEvent.java | 8 ++++---- .../src/org/briarproject/db/JdbcDatabase.java | 20 ++++++++++++++++--- 6 files changed, 39 insertions(+), 24 deletions(-) diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java index 9281d1d57..828ef3b9f 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 messageIds, final ConversationItem.State state) { + private void markMessages(final Collection messageIds, final State state) { runOnUiThread(new Runnable() { public void run() { Set messages = new HashSet(messageIds); diff --git a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java index ca85ac944..f78f4bb68 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 { 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 abf29ba7a..ac5637e16 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 779e4cfa0..c500971eb 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 9444ada5a..a70b7a872 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 acked; + private final Collection messageIds; public MessagesSentEvent(ContactId contactId, - Collection acked) { + Collection messageIds) { this.contactId = contactId; - this.acked = acked; + this.messageIds = messageIds; } public ContactId getContactId() { @@ -22,6 +22,6 @@ public class MessagesSentEvent extends Event { } public Collection 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 61add5a15..4ac27fd6a 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 { 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 { 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 { } } + /** + * This method is used to get group messages. + * The message status won't be used. + */ public Collection getMessageHeaders(Connection txn, GroupId g) throws DbException { PreparedStatement ps = null; @@ -1669,12 +1681,14 @@ abstract class JdbcDatabase implements Database { 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();