kopia lustrzana https://github.com/ryukoposting/Signal-Android
Handle early read receipt sync messages.
rodzic
f57e06677b
commit
1fad4d4f65
|
@ -556,6 +556,19 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
|
||||||
public long getTimetamp() {
|
public long getTimetamp() {
|
||||||
return timetamp;
|
return timetamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
final SyncMessageId that = (SyncMessageId) o;
|
||||||
|
return timetamp == that.timetamp && Objects.equals(recipientId, that.recipientId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(recipientId, timetamp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ExpirationInfo {
|
public static class ExpirationInfo {
|
||||||
|
|
|
@ -534,12 +534,16 @@ public class MmsSmsDatabase extends Database {
|
||||||
SignalDatabase.mms().updateViewedStories(syncMessageIds);
|
SignalDatabase.mms().updateViewedStories(syncMessageIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTimestampRead(@NonNull Recipient senderRecipient, @NonNull List<ReadMessage> readMessages, long proposedExpireStarted, @NonNull Map<Long, Long> threadToLatestRead) {
|
/**
|
||||||
|
* @return Unhandled ids
|
||||||
|
*/
|
||||||
|
public Collection<SyncMessageId> setTimestampRead(@NonNull Recipient senderRecipient, @NonNull List<ReadMessage> readMessages, long proposedExpireStarted, @NonNull Map<Long, Long> threadToLatestRead) {
|
||||||
SQLiteDatabase db = getWritableDatabase();
|
SQLiteDatabase db = getWritableDatabase();
|
||||||
|
|
||||||
List<Pair<Long, Long>> expiringText = new LinkedList<>();
|
List<Pair<Long, Long>> expiringText = new LinkedList<>();
|
||||||
List<Pair<Long, Long>> expiringMedia = new LinkedList<>();
|
List<Pair<Long, Long>> expiringMedia = new LinkedList<>();
|
||||||
Set<Long> updatedThreads = new HashSet<>();
|
Set<Long> updatedThreads = new HashSet<>();
|
||||||
|
Collection<SyncMessageId> unhandled = new LinkedList<>();
|
||||||
|
|
||||||
db.beginTransaction();
|
db.beginTransaction();
|
||||||
try {
|
try {
|
||||||
|
@ -556,6 +560,10 @@ public class MmsSmsDatabase extends Database {
|
||||||
|
|
||||||
updatedThreads.addAll(textResult.threads);
|
updatedThreads.addAll(textResult.threads);
|
||||||
updatedThreads.addAll(mediaResult.threads);
|
updatedThreads.addAll(mediaResult.threads);
|
||||||
|
|
||||||
|
if (textResult.threads.isEmpty() && mediaResult.threads.isEmpty()) {
|
||||||
|
unhandled.add(new SyncMessageId(senderRecipient.getId(), readMessage.getTimestamp()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (long threadId : updatedThreads) {
|
for (long threadId : updatedThreads) {
|
||||||
|
@ -581,6 +589,8 @@ public class MmsSmsDatabase extends Database {
|
||||||
for (long threadId : updatedThreads) {
|
for (long threadId : updatedThreads) {
|
||||||
notifyConversationListeners(threadId);
|
notifyConversationListeners(threadId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return unhandled;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getQuotedMessagePosition(long threadId, long quoteId, @NonNull RecipientId recipientId) {
|
public int getQuotedMessagePosition(long threadId, long quoteId, @NonNull RecipientId recipientId) {
|
||||||
|
|
|
@ -332,9 +332,9 @@ public final class MessageContentProcessor {
|
||||||
|
|
||||||
if (syncMessage.getSent().isPresent()) handleSynchronizeSentMessage(content, syncMessage.getSent().get(), senderRecipient);
|
if (syncMessage.getSent().isPresent()) handleSynchronizeSentMessage(content, syncMessage.getSent().get(), senderRecipient);
|
||||||
else if (syncMessage.getRequest().isPresent()) handleSynchronizeRequestMessage(syncMessage.getRequest().get(), content.getTimestamp());
|
else if (syncMessage.getRequest().isPresent()) handleSynchronizeRequestMessage(syncMessage.getRequest().get(), content.getTimestamp());
|
||||||
else if (syncMessage.getRead().isPresent()) handleSynchronizeReadMessage(syncMessage.getRead().get(), content.getTimestamp(), senderRecipient);
|
else if (syncMessage.getRead().isPresent()) handleSynchronizeReadMessage(content, syncMessage.getRead().get(), content.getTimestamp(), senderRecipient);
|
||||||
else if (syncMessage.getViewed().isPresent()) handleSynchronizeViewedMessage(syncMessage.getViewed().get(), content.getTimestamp());
|
else if (syncMessage.getViewed().isPresent()) handleSynchronizeViewedMessage(syncMessage.getViewed().get(), content.getTimestamp());
|
||||||
else if (syncMessage.getViewOnceOpen().isPresent()) handleSynchronizeViewOnceOpenMessage(syncMessage.getViewOnceOpen().get(), content.getTimestamp());
|
else if (syncMessage.getViewOnceOpen().isPresent()) handleSynchronizeViewOnceOpenMessage(content, syncMessage.getViewOnceOpen().get(), content.getTimestamp());
|
||||||
else if (syncMessage.getVerified().isPresent()) handleSynchronizeVerifiedMessage(syncMessage.getVerified().get());
|
else if (syncMessage.getVerified().isPresent()) handleSynchronizeVerifiedMessage(syncMessage.getVerified().get());
|
||||||
else if (syncMessage.getStickerPackOperations().isPresent()) handleSynchronizeStickerPackOperation(syncMessage.getStickerPackOperations().get(), content.getTimestamp());
|
else if (syncMessage.getStickerPackOperations().isPresent()) handleSynchronizeStickerPackOperation(syncMessage.getStickerPackOperations().get(), content.getTimestamp());
|
||||||
else if (syncMessage.getConfiguration().isPresent()) handleSynchronizeConfigurationMessage(syncMessage.getConfiguration().get(), content.getTimestamp());
|
else if (syncMessage.getConfiguration().isPresent()) handleSynchronizeConfigurationMessage(syncMessage.getConfiguration().get(), content.getTimestamp());
|
||||||
|
@ -1295,13 +1295,16 @@ public final class MessageContentProcessor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleSynchronizeReadMessage(@NonNull List<ReadMessage> readMessages, long envelopeTimestamp, @NonNull Recipient senderRecipient)
|
private void handleSynchronizeReadMessage(@NonNull SignalServiceContent content,
|
||||||
|
@NonNull List<ReadMessage> readMessages,
|
||||||
|
long envelopeTimestamp,
|
||||||
|
@NonNull Recipient senderRecipient)
|
||||||
{
|
{
|
||||||
log(envelopeTimestamp, "Synchronize read message. Count: " + readMessages.size() + ", Timestamps: " + Stream.of(readMessages).map(ReadMessage::getTimestamp).toList());
|
log(envelopeTimestamp, "Synchronize read message. Count: " + readMessages.size() + ", Timestamps: " + Stream.of(readMessages).map(ReadMessage::getTimestamp).toList());
|
||||||
|
|
||||||
Map<Long, Long> threadToLatestRead = new HashMap<>();
|
Map<Long, Long> threadToLatestRead = new HashMap<>();
|
||||||
|
|
||||||
SignalDatabase.mmsSms().setTimestampRead(senderRecipient, readMessages, envelopeTimestamp, threadToLatestRead);
|
Collection<SyncMessageId> unhandled = SignalDatabase.mmsSms().setTimestampRead(senderRecipient, readMessages, envelopeTimestamp, threadToLatestRead);
|
||||||
|
|
||||||
List<MessageDatabase.MarkedMessageInfo> markedMessages = SignalDatabase.threads().setReadSince(threadToLatestRead, false);
|
List<MessageDatabase.MarkedMessageInfo> markedMessages = SignalDatabase.threads().setReadSince(threadToLatestRead, false);
|
||||||
|
|
||||||
|
@ -1310,6 +1313,17 @@ public final class MessageContentProcessor {
|
||||||
MarkReadReceiver.process(context, markedMessages);
|
MarkReadReceiver.process(context, markedMessages);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (SyncMessageId id : unhandled) {
|
||||||
|
warn(String.valueOf(content.getTimestamp()), "[handleSynchronizeReadMessage] Could not find matching message! timestamp: " + id.getTimetamp() + " author: " + id.getRecipientId());
|
||||||
|
if (!processingEarlyContent) {
|
||||||
|
ApplicationDependencies.getEarlyMessageCache().store(id.getRecipientId(), id.getTimetamp(), content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unhandled.size() > 0 && !processingEarlyContent) {
|
||||||
|
PushProcessEarlyMessagesJob.enqueue();
|
||||||
|
}
|
||||||
|
|
||||||
MessageNotifier messageNotifier = ApplicationDependencies.getMessageNotifier();
|
MessageNotifier messageNotifier = ApplicationDependencies.getMessageNotifier();
|
||||||
messageNotifier.setLastDesktopActivityTimestamp(envelopeTimestamp);
|
messageNotifier.setLastDesktopActivityTimestamp(envelopeTimestamp);
|
||||||
messageNotifier.cancelDelayedNotifications();
|
messageNotifier.cancelDelayedNotifications();
|
||||||
|
@ -1336,7 +1350,7 @@ public final class MessageContentProcessor {
|
||||||
messageNotifier.updateNotification(context);
|
messageNotifier.updateNotification(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleSynchronizeViewOnceOpenMessage(@NonNull ViewOnceOpenMessage openMessage, long envelopeTimestamp) {
|
private void handleSynchronizeViewOnceOpenMessage(@NonNull SignalServiceContent content, @NonNull ViewOnceOpenMessage openMessage, long envelopeTimestamp) {
|
||||||
log(envelopeTimestamp, "Handling a view-once open for message: " + openMessage.getTimestamp());
|
log(envelopeTimestamp, "Handling a view-once open for message: " + openMessage.getTimestamp());
|
||||||
|
|
||||||
RecipientId author = Recipient.externalPush(openMessage.getSender()).getId();
|
RecipientId author = Recipient.externalPush(openMessage.getSender()).getId();
|
||||||
|
@ -1347,6 +1361,11 @@ public final class MessageContentProcessor {
|
||||||
SignalDatabase.attachments().deleteAttachmentFilesForViewOnceMessage(record.getId());
|
SignalDatabase.attachments().deleteAttachmentFilesForViewOnceMessage(record.getId());
|
||||||
} else {
|
} else {
|
||||||
warn(String.valueOf(envelopeTimestamp), "Got a view-once open message for a message we don't have!");
|
warn(String.valueOf(envelopeTimestamp), "Got a view-once open message for a message we don't have!");
|
||||||
|
|
||||||
|
if (!processingEarlyContent) {
|
||||||
|
ApplicationDependencies.getEarlyMessageCache().store(author, timestamp, content);
|
||||||
|
PushProcessEarlyMessagesJob.enqueue();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageNotifier messageNotifier = ApplicationDependencies.getMessageNotifier();
|
MessageNotifier messageNotifier = ApplicationDependencies.getMessageNotifier();
|
||||||
|
@ -2302,9 +2321,9 @@ public final class MessageContentProcessor {
|
||||||
SignalDatabase.mmsSms().updateViewedStories(handled);
|
SignalDatabase.mmsSms().updateViewedStories(handled);
|
||||||
|
|
||||||
for (SyncMessageId id : unhandled) {
|
for (SyncMessageId id : unhandled) {
|
||||||
warn(String.valueOf(content.getTimestamp()), "[handleViewedReceipt] Could not find matching message! timestamp: " + id.getTimetamp() + " author: " + senderRecipient.getId());
|
warn(String.valueOf(content.getTimestamp()), "[handleViewedReceipt] Could not find matching message! timestamp: " + id.getTimetamp() + " author: " + id.getRecipientId());
|
||||||
if (!processingEarlyContent) {
|
if (!processingEarlyContent) {
|
||||||
ApplicationDependencies.getEarlyMessageCache().store(senderRecipient.getId(), id.getTimetamp(), content);
|
ApplicationDependencies.getEarlyMessageCache().store(id.getRecipientId(), id.getTimetamp(), content);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2327,7 +2346,7 @@ public final class MessageContentProcessor {
|
||||||
Collection<SyncMessageId> unhandled = SignalDatabase.mmsSms().incrementDeliveryReceiptCounts(ids, System.currentTimeMillis());
|
Collection<SyncMessageId> unhandled = SignalDatabase.mmsSms().incrementDeliveryReceiptCounts(ids, System.currentTimeMillis());
|
||||||
|
|
||||||
for (SyncMessageId id : unhandled) {
|
for (SyncMessageId id : unhandled) {
|
||||||
warn(String.valueOf(content.getTimestamp()), "[handleDeliveryReceipt] Could not find matching message! timestamp: " + id.getTimetamp() + " author: " + senderRecipient.getId());
|
warn(String.valueOf(content.getTimestamp()), "[handleDeliveryReceipt] Could not find matching message! timestamp: " + id.getTimetamp() + " author: " + id.getRecipientId());
|
||||||
// Early delivery receipts are special-cased in the database methods
|
// Early delivery receipts are special-cased in the database methods
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2357,9 +2376,9 @@ public final class MessageContentProcessor {
|
||||||
Collection<SyncMessageId> unhandled = SignalDatabase.mmsSms().incrementReadReceiptCounts(ids, content.getTimestamp());
|
Collection<SyncMessageId> unhandled = SignalDatabase.mmsSms().incrementReadReceiptCounts(ids, content.getTimestamp());
|
||||||
|
|
||||||
for (SyncMessageId id : unhandled) {
|
for (SyncMessageId id : unhandled) {
|
||||||
warn(String.valueOf(content.getTimestamp()), "[handleReadReceipt] Could not find matching message! timestamp: " + id.getTimetamp() + " author: " + senderRecipient.getId());
|
warn(String.valueOf(content.getTimestamp()), "[handleReadReceipt] Could not find matching message! timestamp: " + id.getTimetamp() + " author: " + id.getRecipientId());
|
||||||
if (!processingEarlyContent) {
|
if (!processingEarlyContent) {
|
||||||
ApplicationDependencies.getEarlyMessageCache().store(senderRecipient.getId(), id.getTimetamp(), content);
|
ApplicationDependencies.getEarlyMessageCache().store(id.getRecipientId(), id.getTimetamp(), content);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue