Skip to content

Commit 40dac2d

Browse files
committed
Honor synced read messages from sibling devices
Update the unread index and count in both the database and all views
1 parent cb16021 commit 40dac2d

File tree

2 files changed

+68
-1
lines changed

2 files changed

+68
-1
lines changed

Signal-Windows.Lib/IncomingMessages.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using libsignalservice;
22
using libsignalservice.crypto;
33
using libsignalservice.messages;
4+
using libsignalservice.messages.multidevice;
45
using libsignalservice.push;
56
using libsignalservice.util;
67
using Microsoft.Extensions.Logging;
@@ -154,7 +155,14 @@ private void HandleMessage(SignalServiceEnvelope envelope)
154155
var readMessages = content.SynchronizeMessage.getRead().ForceGetValue();
155156
foreach (var readMessage in readMessages)
156157
{
157-
//TODO
158+
try
159+
{
160+
HandleReadMessage(readMessage);
161+
}
162+
catch(Exception e)
163+
{
164+
Logger.LogError("HandleReadMessage failed: {0}\n{1}", e.Message, e.StackTrace);
165+
}
158166
}
159167
}
160168
} //TODO callmessages
@@ -164,6 +172,11 @@ private void HandleMessage(SignalServiceEnvelope envelope)
164172
}
165173
}
166174

175+
private void HandleReadMessage(ReadMessage readMessage)
176+
{
177+
SignalDBContext.UpdateMessageRead(readMessage);
178+
}
179+
167180
private void HandleExpirationUpdateMessage(SignalServiceEnvelope envelope, SignalServiceContent content, SignalServiceDataMessage message, bool isSync, long timestamp)
168181
{
169182
SignalMessageDirection type;

Signal-Windows.Lib/Storage/DB.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using libsignal.util;
55
using libsignalservice;
66
using libsignalservice.messages;
7+
using libsignalservice.messages.multidevice;
78
using libsignalservice.push;
89
using libsignalservice.util;
910
using Microsoft.EntityFrameworkCore;
@@ -985,6 +986,59 @@ public static void UpdateExpiresInLocked(SignalConversation thread, uint exp)
985986
}
986987
}
987988

989+
internal static void UpdateMessageRead(ReadMessage readMessage)
990+
{
991+
SignalConversation conversation;
992+
lock (DBLock)
993+
{
994+
using (var ctx = new SignalDBContext())
995+
{
996+
var message = ctx.Messages
997+
.Where(m => m.ComposedTimestamp == readMessage.getTimestamp())
998+
.Single(); //TODO care about early reads sometime
999+
conversation = GetSignalConversation(ctx, message.ThreadId);
1000+
var currentLastSeenMessage = ctx.Messages
1001+
.Where(m => m.ThreadId == conversation.ThreadId)
1002+
.Skip((int) conversation.LastSeenMessageIndex-1)
1003+
.Take(1)
1004+
.Single();
1005+
if (message.Id > currentLastSeenMessage.Id)
1006+
{
1007+
var diff = ctx.Messages
1008+
.Where(m => m.ThreadId == conversation.ThreadId && m.Id <= message.Id && m.Id > currentLastSeenMessage.Id)
1009+
.Count();
1010+
conversation.LastSeenMessageIndex += diff;
1011+
conversation.UnreadCount -= (uint) diff;
1012+
ctx.SaveChanges();
1013+
}
1014+
}
1015+
}
1016+
SignalLibHandle.Instance.DispatchAddOrUpdateConversation(conversation, null);
1017+
}
1018+
1019+
private static SignalConversation GetSignalConversation(SignalDBContext ctx, string threadid)
1020+
{
1021+
SignalConversation conversation;
1022+
if (!threadid.EndsWith("="))
1023+
{
1024+
conversation = ctx.Contacts
1025+
.Where(contact => threadid == contact.ThreadId)
1026+
.Include(c => c.LastMessage)
1027+
.ThenInclude(m => m.Content)
1028+
.SingleOrDefault();
1029+
}
1030+
else
1031+
{
1032+
conversation = ctx.Groups
1033+
.Where(g => threadid == g.ThreadId)
1034+
.Include(g => g.GroupMemberships)
1035+
.ThenInclude(gm => gm.Contact)
1036+
.Include(g => g.LastMessage)
1037+
.ThenInclude(m => m.Content)
1038+
.SingleOrDefault();
1039+
}
1040+
return conversation;
1041+
}
9881042

9891043
internal static SignalConversation UpdateMessageRead(long index, SignalConversation conversation)
9901044
{

0 commit comments

Comments
 (0)