From fa02ee1d3db2ef5dd0d038cb6f01ba543c6dfc43 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Wed, 16 Nov 2022 10:27:37 -0400 Subject: [PATCH] Skip re-emission of duplicate StoryPosts. --- .../stories/viewer/page/StoryPost.kt | 9 ++++++++ .../viewer/page/StoryViewerPageRepository.kt | 22 +++++++++++-------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryPost.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryPost.kt index dfec8f041d..d3358d2ffc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryPost.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryPost.kt @@ -6,6 +6,7 @@ import org.thoughtcrime.securesms.conversation.ConversationMessage import org.thoughtcrime.securesms.database.AttachmentDatabase import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.MediaUtil +import java.util.Objects /** * Each story is made up of a collection of posts @@ -44,5 +45,13 @@ data class StoryPost( abstract fun isVideo(): Boolean abstract fun isText(): Boolean + + override fun equals(other: Any?): Boolean { + return other != null && other::class.java == this::class.java && other.hashCode() == hashCode() + } + + override fun hashCode(): Int { + return Objects.hash(uri, isVideo(), isText(), transferState) + } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageRepository.kt index 9b7f0ff5f6..183193ea51 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageRepository.kt @@ -73,7 +73,7 @@ open class StoryViewerPageRepository(context: Context, private val storyViewStat } } - private fun getStoryPostFromRecord(recipientId: RecipientId, record: MessageRecord): Observable { + private fun getStoryPostFromRecord(recipientId: RecipientId, originalRecord: MessageRecord): Observable { return Observable.create { emitter -> fun refresh(record: MessageRecord) { val recipient = Recipient.resolved(recipientId) @@ -94,12 +94,14 @@ open class StoryViewerPageRepository(context: Context, private val storyViewStat emitter.onNext(story) } + val recordId = originalRecord.id + val threadId = originalRecord.threadId val recipient = Recipient.resolved(recipientId) val messageUpdateObserver = DatabaseObserver.MessageObserver { - if (it.mms && it.id == record.id) { + if (it.mms && it.id == recordId) { try { - val messageRecord = SignalDatabase.mms.getMessageRecord(record.id) + val messageRecord = SignalDatabase.mms.getMessageRecord(recordId) if (messageRecord.isRemoteDelete) { emitter.onComplete() } else { @@ -113,21 +115,21 @@ open class StoryViewerPageRepository(context: Context, private val storyViewStat val conversationObserver = DatabaseObserver.Observer { try { - refresh(SignalDatabase.mms.getMessageRecord(record.id)) + refresh(SignalDatabase.mms.getMessageRecord(recordId)) } catch (e: NoSuchMessageException) { Log.w(TAG, "Message deleted during content refresh.", e) } } - ApplicationDependencies.getDatabaseObserver().registerConversationObserver(record.threadId, conversationObserver) + ApplicationDependencies.getDatabaseObserver().registerConversationObserver(threadId, conversationObserver) ApplicationDependencies.getDatabaseObserver().registerMessageUpdateObserver(messageUpdateObserver) val messageInsertObserver = DatabaseObserver.MessageObserver { - refresh(SignalDatabase.mms.getMessageRecord(record.id)) + refresh(SignalDatabase.mms.getMessageRecord(recordId)) } if (recipient.isGroup) { - ApplicationDependencies.getDatabaseObserver().registerMessageInsertObserver(record.threadId, messageInsertObserver) + ApplicationDependencies.getDatabaseObserver().registerMessageInsertObserver(threadId, messageInsertObserver) } emitter.setCancellable { @@ -139,7 +141,7 @@ open class StoryViewerPageRepository(context: Context, private val storyViewStat } } - refresh(record) + refresh(originalRecord) } } @@ -150,7 +152,9 @@ open class StoryViewerPageRepository(context: Context, private val storyViewStat fun getStoryPostsFor(recipientId: RecipientId, isOutgoingOnly: Boolean): Observable> { return getStoryRecords(recipientId, isOutgoingOnly) .switchMap { records -> - val posts = records.map { getStoryPostFromRecord(recipientId, it) } + val posts: List> = records.map { + getStoryPostFromRecord(recipientId, it).distinctUntilChanged() + } if (posts.isEmpty()) { Observable.just(emptyList()) } else {