Skip re-emission of duplicate StoryPosts.
This commit is contained in:
parent
4908e39308
commit
fa02ee1d3d
2 changed files with 22 additions and 9 deletions
|
@ -6,6 +6,7 @@ import org.thoughtcrime.securesms.conversation.ConversationMessage
|
||||||
import org.thoughtcrime.securesms.database.AttachmentDatabase
|
import org.thoughtcrime.securesms.database.AttachmentDatabase
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient
|
import org.thoughtcrime.securesms.recipients.Recipient
|
||||||
import org.thoughtcrime.securesms.util.MediaUtil
|
import org.thoughtcrime.securesms.util.MediaUtil
|
||||||
|
import java.util.Objects
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Each story is made up of a collection of posts
|
* Each story is made up of a collection of posts
|
||||||
|
@ -44,5 +45,13 @@ data class StoryPost(
|
||||||
abstract fun isVideo(): Boolean
|
abstract fun isVideo(): Boolean
|
||||||
|
|
||||||
abstract fun isText(): 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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,7 @@ open class StoryViewerPageRepository(context: Context, private val storyViewStat
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getStoryPostFromRecord(recipientId: RecipientId, record: MessageRecord): Observable<StoryPost> {
|
private fun getStoryPostFromRecord(recipientId: RecipientId, originalRecord: MessageRecord): Observable<StoryPost> {
|
||||||
return Observable.create { emitter ->
|
return Observable.create { emitter ->
|
||||||
fun refresh(record: MessageRecord) {
|
fun refresh(record: MessageRecord) {
|
||||||
val recipient = Recipient.resolved(recipientId)
|
val recipient = Recipient.resolved(recipientId)
|
||||||
|
@ -94,12 +94,14 @@ open class StoryViewerPageRepository(context: Context, private val storyViewStat
|
||||||
emitter.onNext(story)
|
emitter.onNext(story)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val recordId = originalRecord.id
|
||||||
|
val threadId = originalRecord.threadId
|
||||||
val recipient = Recipient.resolved(recipientId)
|
val recipient = Recipient.resolved(recipientId)
|
||||||
|
|
||||||
val messageUpdateObserver = DatabaseObserver.MessageObserver {
|
val messageUpdateObserver = DatabaseObserver.MessageObserver {
|
||||||
if (it.mms && it.id == record.id) {
|
if (it.mms && it.id == recordId) {
|
||||||
try {
|
try {
|
||||||
val messageRecord = SignalDatabase.mms.getMessageRecord(record.id)
|
val messageRecord = SignalDatabase.mms.getMessageRecord(recordId)
|
||||||
if (messageRecord.isRemoteDelete) {
|
if (messageRecord.isRemoteDelete) {
|
||||||
emitter.onComplete()
|
emitter.onComplete()
|
||||||
} else {
|
} else {
|
||||||
|
@ -113,21 +115,21 @@ open class StoryViewerPageRepository(context: Context, private val storyViewStat
|
||||||
|
|
||||||
val conversationObserver = DatabaseObserver.Observer {
|
val conversationObserver = DatabaseObserver.Observer {
|
||||||
try {
|
try {
|
||||||
refresh(SignalDatabase.mms.getMessageRecord(record.id))
|
refresh(SignalDatabase.mms.getMessageRecord(recordId))
|
||||||
} catch (e: NoSuchMessageException) {
|
} catch (e: NoSuchMessageException) {
|
||||||
Log.w(TAG, "Message deleted during content refresh.", e)
|
Log.w(TAG, "Message deleted during content refresh.", e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ApplicationDependencies.getDatabaseObserver().registerConversationObserver(record.threadId, conversationObserver)
|
ApplicationDependencies.getDatabaseObserver().registerConversationObserver(threadId, conversationObserver)
|
||||||
ApplicationDependencies.getDatabaseObserver().registerMessageUpdateObserver(messageUpdateObserver)
|
ApplicationDependencies.getDatabaseObserver().registerMessageUpdateObserver(messageUpdateObserver)
|
||||||
|
|
||||||
val messageInsertObserver = DatabaseObserver.MessageObserver {
|
val messageInsertObserver = DatabaseObserver.MessageObserver {
|
||||||
refresh(SignalDatabase.mms.getMessageRecord(record.id))
|
refresh(SignalDatabase.mms.getMessageRecord(recordId))
|
||||||
}
|
}
|
||||||
|
|
||||||
if (recipient.isGroup) {
|
if (recipient.isGroup) {
|
||||||
ApplicationDependencies.getDatabaseObserver().registerMessageInsertObserver(record.threadId, messageInsertObserver)
|
ApplicationDependencies.getDatabaseObserver().registerMessageInsertObserver(threadId, messageInsertObserver)
|
||||||
}
|
}
|
||||||
|
|
||||||
emitter.setCancellable {
|
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<List<StoryPost>> {
|
fun getStoryPostsFor(recipientId: RecipientId, isOutgoingOnly: Boolean): Observable<List<StoryPost>> {
|
||||||
return getStoryRecords(recipientId, isOutgoingOnly)
|
return getStoryRecords(recipientId, isOutgoingOnly)
|
||||||
.switchMap { records ->
|
.switchMap { records ->
|
||||||
val posts = records.map { getStoryPostFromRecord(recipientId, it) }
|
val posts: List<Observable<StoryPost>> = records.map {
|
||||||
|
getStoryPostFromRecord(recipientId, it).distinctUntilChanged()
|
||||||
|
}
|
||||||
if (posts.isEmpty()) {
|
if (posts.isEmpty()) {
|
||||||
Observable.just(emptyList())
|
Observable.just(emptyList())
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Reference in a new issue