kopia lustrzana https://github.com/ryukoposting/Signal-Android
Send viewed receipts for stories.
rodzic
bd58c91d2c
commit
b35ef0bb4d
|
@ -81,7 +81,6 @@ import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||||
import org.thoughtcrime.securesms.util.Util;
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
import org.whispersystems.libsignal.util.Pair;
|
import org.whispersystems.libsignal.util.Pair;
|
||||||
import org.whispersystems.libsignal.util.guava.Optional;
|
import org.whispersystems.libsignal.util.guava.Optional;
|
||||||
import org.whispersystems.signalservice.api.push.ACI;
|
|
||||||
import org.whispersystems.signalservice.api.push.ServiceId;
|
import org.whispersystems.signalservice.api.push.ServiceId;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -650,8 +649,8 @@ public class MmsDatabase extends MessageDatabase {
|
||||||
@Override
|
@Override
|
||||||
public long getUnreadStoryCount() {
|
public long getUnreadStoryCount() {
|
||||||
String[] columns = new String[]{"COUNT(*)"};
|
String[] columns = new String[]{"COUNT(*)"};
|
||||||
String where = IS_STORY_CLAUSE + " AND NOT (" + getOutgoingTypeClause() + ") AND " + READ_RECEIPT_COUNT + " = ?";
|
String where = IS_STORY_CLAUSE + " AND NOT (" + getOutgoingTypeClause() + ") AND " + VIEWED_RECEIPT_COUNT + " = 0";
|
||||||
String[] whereArgs = SqlUtil.buildArgs(1, 0, 0);
|
String[] whereArgs = SqlUtil.buildArgs(1, 0);
|
||||||
|
|
||||||
try (Cursor cursor = getReadableDatabase().query(TABLE_NAME, columns, where, whereArgs, null, null, null, null)) {
|
try (Cursor cursor = getReadableDatabase().query(TABLE_NAME, columns, where, whereArgs, null, null, null, null)) {
|
||||||
return cursor != null && cursor.moveToFirst() ? cursor.getInt(0) : 0;
|
return cursor != null && cursor.moveToFirst() ? cursor.getInt(0) : 0;
|
||||||
|
@ -1165,20 +1164,20 @@ public class MmsDatabase extends MessageDatabase {
|
||||||
@Override
|
@Override
|
||||||
public List<MarkedMessageInfo> setMessagesReadSince(long threadId, long sinceTimestamp) {
|
public List<MarkedMessageInfo> setMessagesReadSince(long threadId, long sinceTimestamp) {
|
||||||
if (sinceTimestamp == -1) {
|
if (sinceTimestamp == -1) {
|
||||||
return setMessagesRead(THREAD_ID + " = ? AND (" + READ + " = 0 OR (" + REACTIONS_UNREAD + " = 1 AND (" + getOutgoingTypeClause() + ")))", new String[] {String.valueOf(threadId)});
|
return setMessagesRead(THREAD_ID + " = ? AND " + IS_STORY + " = 0 AND " + PARENT_STORY_ID + " = 0 AND (" + READ + " = 0 OR (" + REACTIONS_UNREAD + " = 1 AND (" + getOutgoingTypeClause() + ")))", new String[] {String.valueOf(threadId)});
|
||||||
} else {
|
} else {
|
||||||
return setMessagesRead(THREAD_ID + " = ? AND (" + READ + " = 0 OR (" + REACTIONS_UNREAD + " = 1 AND ( " + getOutgoingTypeClause() + " ))) AND " + DATE_RECEIVED + " <= ?", new String[]{String.valueOf(threadId), String.valueOf(sinceTimestamp)});
|
return setMessagesRead(THREAD_ID + " = ? AND " + IS_STORY + " = 0 AND " + PARENT_STORY_ID + " = 0 AND (" + READ + " = 0 OR (" + REACTIONS_UNREAD + " = 1 AND ( " + getOutgoingTypeClause() + " ))) AND " + DATE_RECEIVED + " <= ?", new String[]{String.valueOf(threadId), String.valueOf(sinceTimestamp)});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<MarkedMessageInfo> setEntireThreadRead(long threadId) {
|
public List<MarkedMessageInfo> setEntireThreadRead(long threadId) {
|
||||||
return setMessagesRead(THREAD_ID + " = ?", new String[] {String.valueOf(threadId)});
|
return setMessagesRead(THREAD_ID + " = ? AND " + IS_STORY + " = 0 AND " + PARENT_STORY_ID + " = 0", new String[] {String.valueOf(threadId)});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<MarkedMessageInfo> setAllMessagesRead() {
|
public List<MarkedMessageInfo> setAllMessagesRead() {
|
||||||
return setMessagesRead(READ + " = 0 OR (" + REACTIONS_UNREAD + " = 1 AND (" + getOutgoingTypeClause() + "))", null);
|
return setMessagesRead(IS_STORY+ " = 0 AND " + PARENT_STORY_ID + " = 0 AND (" + READ + " = 0 OR (" + REACTIONS_UNREAD + " = 1 AND (" + getOutgoingTypeClause() + ")))", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<MarkedMessageInfo> setMessagesRead(String where, String[] arguments) {
|
private List<MarkedMessageInfo> setMessagesRead(String where, String[] arguments) {
|
||||||
|
|
|
@ -114,7 +114,7 @@ public class MultiDeviceReadUpdateJob extends BaseJob {
|
||||||
|
|
||||||
for (SerializableSyncMessageId messageId : messageIds) {
|
for (SerializableSyncMessageId messageId : messageIds) {
|
||||||
Recipient recipient = Recipient.resolved(RecipientId.from(messageId.recipientId));
|
Recipient recipient = Recipient.resolved(RecipientId.from(messageId.recipientId));
|
||||||
if (!recipient.isGroup() && recipient.isMaybeRegistered()) {
|
if (!recipient.isGroup() && !recipient.isDistributionList() && recipient.isMaybeRegistered()) {
|
||||||
readMessages.add(new ReadMessage(RecipientUtil.toSignalServiceAddress(context, recipient), messageId.timestamp));
|
readMessages.add(new ReadMessage(RecipientUtil.toSignalServiceAddress(context, recipient), messageId.timestamp));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -166,6 +166,11 @@ public class SendReadReceiptJob extends BaseJob {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (recipient.isDistributionList()) {
|
||||||
|
Log.w(TAG, "Refusing to send receipts to distribution list");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (recipient.isUnregistered()) {
|
if (recipient.isUnregistered()) {
|
||||||
Log.w(TAG, recipient.getId() + " not registered!");
|
Log.w(TAG, recipient.getId() + " not registered!");
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -66,7 +66,7 @@ class StoriesLandingRepository(context: Context) {
|
||||||
fun refresh() {
|
fun refresh() {
|
||||||
val itemData = StoriesLandingItemData(
|
val itemData = StoriesLandingItemData(
|
||||||
storyRecipient = sender,
|
storyRecipient = sender,
|
||||||
hasUnreadStory = messageRecords.any { it.readReceiptCount == 0 && !it.isOutgoing },
|
hasUnreadStory = messageRecords.any { it.viewedReceiptCount == 0 && !it.isOutgoing },
|
||||||
hasReplies = messageRecords.any { SignalDatabase.mms.getNumberOfStoryReplies(it.id) > 0 },
|
hasReplies = messageRecords.any { SignalDatabase.mms.getNumberOfStoryReplies(it.id) > 0 },
|
||||||
hasRepliesFromSelf = messageRecords.any { SignalDatabase.mms.hasSelfReplyInStory(it.id) },
|
hasRepliesFromSelf = messageRecords.any { SignalDatabase.mms.hasSelfReplyInStory(it.id) },
|
||||||
isHidden = Recipient.resolved(messageRecords.first().recipient.id).shouldHideStory(),
|
isHidden = Recipient.resolved(messageRecords.first().recipient.id).shouldHideStory(),
|
||||||
|
|
|
@ -9,9 +9,12 @@ import org.thoughtcrime.securesms.conversation.ConversationMessage
|
||||||
import org.thoughtcrime.securesms.database.DatabaseObserver
|
import org.thoughtcrime.securesms.database.DatabaseObserver
|
||||||
import org.thoughtcrime.securesms.database.NoSuchMessageException
|
import org.thoughtcrime.securesms.database.NoSuchMessageException
|
||||||
import org.thoughtcrime.securesms.database.SignalDatabase
|
import org.thoughtcrime.securesms.database.SignalDatabase
|
||||||
|
import org.thoughtcrime.securesms.database.model.MessageId
|
||||||
import org.thoughtcrime.securesms.database.model.MessageRecord
|
import org.thoughtcrime.securesms.database.model.MessageRecord
|
||||||
import org.thoughtcrime.securesms.database.model.MmsMessageRecord
|
import org.thoughtcrime.securesms.database.model.MmsMessageRecord
|
||||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
||||||
|
import org.thoughtcrime.securesms.jobs.MultiDeviceViewedUpdateJob
|
||||||
|
import org.thoughtcrime.securesms.jobs.SendViewedReceiptJob
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient
|
import org.thoughtcrime.securesms.recipients.Recipient
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId
|
import org.thoughtcrime.securesms.recipients.RecipientId
|
||||||
|
|
||||||
|
@ -130,9 +133,23 @@ class StoryViewerPageRepository(context: Context) {
|
||||||
}.subscribeOn(Schedulers.io())
|
}.subscribeOn(Schedulers.io())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun markRead(storyPost: StoryPost) {
|
fun markViewed(storyPost: StoryPost) {
|
||||||
// TODO [stories] -- Implementation
|
if (!storyPost.conversationMessage.messageRecord.isOutgoing) {
|
||||||
SignalExecutors.BOUNDED.execute {
|
SignalExecutors.BOUNDED.execute {
|
||||||
|
val markedMessageInfo = SignalDatabase.mms.setIncomingMessageViewed(storyPost.id)
|
||||||
|
if (markedMessageInfo != null) {
|
||||||
|
ApplicationDependencies.getDatabaseObserver().notifyConversationListListeners()
|
||||||
|
ApplicationDependencies.getJobManager().add(
|
||||||
|
SendViewedReceiptJob(
|
||||||
|
markedMessageInfo.threadId,
|
||||||
|
storyPost.sender.id,
|
||||||
|
markedMessageInfo.syncMessageId.timetamp,
|
||||||
|
MessageId(storyPost.id, true)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
MultiDeviceViewedUpdateJob.enqueue(listOf(markedMessageInfo.syncMessageId))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,6 +82,7 @@ class StoryViewerPageViewModel(
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setSelectedPostIndex(index: Int) {
|
fun setSelectedPostIndex(index: Int) {
|
||||||
|
repository.markViewed(getPostAt(index))
|
||||||
store.update {
|
store.update {
|
||||||
it.copy(
|
it.copy(
|
||||||
selectedPostIndex = index,
|
selectedPostIndex = index,
|
||||||
|
|
Ładowanie…
Reference in New Issue