kopia lustrzana https://github.com/ryukoposting/Signal-Android
Process incomming story views even if read receipts are disabled.
rodzic
c359b0134a
commit
972ab9b368
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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());
|
||||
|
|
Ładowanie…
Reference in New Issue