Process incomming story views even if read receipts are disabled.

fork-5.53.8
Cody Henthorne 2022-03-31 09:51:31 -04:00
rodzic c359b0134a
commit 972ab9b368
5 zmienionych plików z 65 dodań i 6 usunięć

Wyświetl plik

@ -122,6 +122,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
public abstract void markIncomingNotificationReceived(long threadId);
public abstract Set<MessageUpdate> incrementReceiptCount(SyncMessageId messageId, long timestamp, @NonNull ReceiptType receiptType);
public abstract Set<MessageUpdate> incrementStoryReceiptCount(SyncMessageId messageId, long timestamp, @NonNull ReceiptType receiptType);
abstract @NonNull MmsSmsDatabase.TimestampReadResult setTimestampRead(SyncMessageId messageId, long proposedExpireStarted, @NonNull Map<Long, Long> threadToLatestRead);
public abstract List<MarkedMessageInfo> setEntireThreadRead(long threadId);
public abstract List<MarkedMessageInfo> setMessagesReadSince(long threadId, long timestamp);

Wyświetl plik

@ -932,7 +932,17 @@ public class MmsDatabase extends MessageDatabase {
}
}
String columnName = receiptType.getColumnName();
messageUpdates.addAll(incrementStoryReceiptCount(messageId, timestamp, receiptType));
return messageUpdates;
}
@Override
public Set<MessageUpdate> incrementStoryReceiptCount(SyncMessageId messageId, long timestamp, @NonNull ReceiptType receiptType) {
SQLiteDatabase database = databaseHelper.getSignalWritableDatabase();
Set<MessageUpdate> messageUpdates = new HashSet<>();
String columnName = receiptType.getColumnName();
for (MessageId storyMessageId : SignalDatabase.storySends().getStoryMessagesFor(messageId)) {
database.execSQL("UPDATE " + TABLE_NAME + " SET " +
columnName + " = " + columnName + " + 1, " +
@ -2461,7 +2471,7 @@ public class MmsDatabase extends MessageDatabase {
if (!TextSecurePreferences.isReadReceiptsEnabled(context)) {
readReceiptCount = 0;
if (MmsSmsColumns.Types.isOutgoingMessageType(box)) {
if (MmsSmsColumns.Types.isOutgoingMessageType(box) && !storyType.isStory()) {
viewedReceiptCount = 0;
}
}

Wyświetl plik

@ -401,6 +401,40 @@ public class MmsSmsDatabase extends Database {
return incrementReceiptCount(syncMessageId, timestamp, MessageDatabase.ReceiptType.VIEWED);
}
public @NonNull Collection<SyncMessageId> incrementViewedStoryReceiptCounts(@NonNull List<SyncMessageId> syncMessageIds, long timestamp) {
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
Set<MessageUpdate> messageUpdates = new HashSet<>();
Collection<SyncMessageId> unhandled = new HashSet<>();
db.beginTransaction();
try {
for (SyncMessageId id : syncMessageIds) {
Set<MessageUpdate> updates = incrementStoryReceiptCountInternal(id, timestamp, MessageDatabase.ReceiptType.VIEWED);
if (updates.size() > 0) {
messageUpdates.addAll(updates);
} else {
unhandled.add(id);
}
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
for (MessageUpdate update : messageUpdates) {
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(update.getMessageId());
ApplicationDependencies.getDatabaseObserver().notifyVerboseConversationListeners(Collections.singleton(update.getThreadId()));
}
if (messageUpdates.size() > 0) {
notifyConversationListListeners();
}
}
return unhandled;
}
/**
* Wraps a single receipt update in a transaction and triggers the proper updates.
*
@ -488,6 +522,13 @@ public class MmsSmsDatabase extends Database {
return messageUpdates;
}
/**
* Doesn't do any transactions or updates, so we can re-use the method safely.
*/
private @NonNull Set<MessageUpdate> incrementStoryReceiptCountInternal(@NonNull SyncMessageId syncMessageId, long timestamp, @NonNull MessageDatabase.ReceiptType receiptType) {
return SignalDatabase.mms().incrementStoryReceiptCount(syncMessageId, timestamp, receiptType);
}
public void setTimestampRead(@NonNull Recipient senderRecipient, @NonNull List<ReadMessage> readMessages, long proposedExpireStarted, @NonNull Map<Long, Long> threadToLatestRead) {
SQLiteDatabase db = getWritableDatabase();

Wyświetl plik

@ -529,6 +529,11 @@ public class SmsDatabase extends MessageDatabase {
}
}
@Override
public Set<MessageUpdate> incrementStoryReceiptCount(SyncMessageId messageId, long timestamp, @NonNull ReceiptType receiptType) {
throw new UnsupportedOperationException();
}
@Override
@NonNull MmsSmsDatabase.TimestampReadResult setTimestampRead(SyncMessageId messageId, long proposedExpireStarted, @NonNull Map<Long, Long> threadToLatestRead) {
SQLiteDatabase database = databaseHelper.getSignalWritableDatabase();

Wyświetl plik

@ -2129,19 +2129,21 @@ public final class MessageContentProcessor {
@NonNull SignalServiceReceiptMessage message,
@NonNull Recipient senderRecipient)
{
if (!TextSecurePreferences.isReadReceiptsEnabled(context)) {
boolean shouldOnlyProcessStories = FeatureFlags.stories() && !SignalStore.storyValues().isFeatureDisabled() && !TextSecurePreferences.isReadReceiptsEnabled(context);
if (!TextSecurePreferences.isReadReceiptsEnabled(context) && !shouldOnlyProcessStories) {
log("Ignoring viewed receipts for IDs: " + Util.join(message.getTimestamps(), ", "));
return;
}
log(TAG, "Processing viewed receipts. Sender: " + senderRecipient.getId() + ", Device: " + content.getSenderDevice() + ", Timestamps: " + Util.join(message.getTimestamps(), ", "));
log(TAG, "Processing viewed receipts. Sender: " + senderRecipient.getId() + ", Device: " + content.getSenderDevice() + ", Only Stories: " + shouldOnlyProcessStories + ", Timestamps: " + Util.join(message.getTimestamps(), ", "));
List<SyncMessageId> ids = Stream.of(message.getTimestamps())
.map(t -> new SyncMessageId(senderRecipient.getId(), t))
.toList();
Collection<SyncMessageId> unhandled = SignalDatabase.mmsSms()
.incrementViewedReceiptCounts(ids, content.getTimestamp());
Collection<SyncMessageId> unhandled = shouldOnlyProcessStories ? SignalDatabase.mmsSms().incrementViewedStoryReceiptCounts(ids, content.getTimestamp())
: SignalDatabase.mmsSms().incrementViewedReceiptCounts(ids, content.getTimestamp());
for (SyncMessageId id : unhandled) {
warn(String.valueOf(content.getTimestamp()), "[handleViewedReceipt] Could not find matching message! timestamp: " + id.getTimetamp() + " author: " + senderRecipient.getId());