From 556dc0d1ec4ab5eaf92b1fdb5f7a921719523e1d Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Fri, 25 Mar 2022 09:24:52 -0300 Subject: [PATCH] Show story rings for self and if you sent a story to a group. --- .../securesms/database/MmsDatabase.java | 4 +-- .../securesms/database/RecipientDatabase.kt | 12 +++++++++ .../database/model/StoryViewState.kt | 25 +++++++++++++++++++ .../landing/StoriesLandingRepository.kt | 23 ++++++----------- 4 files changed, 47 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java index a81c7fe881..bb66310760 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -36,6 +36,8 @@ import net.zetetic.database.sqlcipher.SQLiteStatement; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import org.signal.core.util.CursorUtil; +import org.signal.core.util.SqlUtil; import org.signal.core.util.logging.Log; import org.signal.libsignal.protocol.util.Pair; import org.thoughtcrime.securesms.attachments.Attachment; @@ -79,10 +81,8 @@ import org.thoughtcrime.securesms.revealable.ViewOnceUtil; import org.thoughtcrime.securesms.sms.IncomingTextMessage; import org.thoughtcrime.securesms.sms.OutgoingTextMessage; import org.thoughtcrime.securesms.stories.Stories; -import org.signal.core.util.CursorUtil; import org.thoughtcrime.securesms.util.JsonUtils; import org.thoughtcrime.securesms.util.MediaUtil; -import org.signal.core.util.SqlUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.signalservice.api.push.ServiceId; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt index 445bcefd67..ae68576ee9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt @@ -11,6 +11,7 @@ import com.google.protobuf.ByteString import com.google.protobuf.InvalidProtocolBufferException import net.zetetic.database.sqlcipher.SQLiteConstraintException import org.signal.core.util.Bitmask +import org.signal.core.util.CursorUtil import org.signal.core.util.SqlUtil import org.signal.core.util.logging.Log import org.signal.core.util.optionalBlob @@ -599,6 +600,17 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : ).recipientId } + fun getDistributionListRecipientIds(): List { + val recipientIds = mutableListOf() + readableDatabase.query(TABLE_NAME, arrayOf(ID), "$DISTRIBUTION_LIST_ID is not NULL", null, null, null, null).use { cursor -> + while (cursor != null && cursor.moveToNext()) { + recipientIds.add(RecipientId.from(CursorUtil.requireLong(cursor, ID))) + } + } + + return recipientIds + } + fun getOrInsertFromGroupId(groupId: GroupId): RecipientId { var existing = getByGroupId(groupId) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/StoryViewState.kt b/app/src/main/java/org/thoughtcrime/securesms/database/model/StoryViewState.kt index e3158d6d1b..078a1a54d4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/StoryViewState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/StoryViewState.kt @@ -5,6 +5,7 @@ import io.reactivex.rxjava3.schedulers.Schedulers import org.thoughtcrime.securesms.database.DatabaseObserver import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.dependencies.ApplicationDependencies +import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId /** @@ -18,6 +19,30 @@ enum class StoryViewState { companion object { @JvmStatic fun getForRecipientId(recipientId: RecipientId): Observable { + if (recipientId.equals(Recipient.self().id)) { + return Observable.fromCallable { + SignalDatabase.recipients.getDistributionListRecipientIds() + }.flatMap { ids -> + Observable.combineLatest(ids.map { getState(it) }) { combined -> + if (combined.isEmpty()) { + NONE + } else { + val results = combined.toList() as List + when { + results.any { it == UNVIEWED } -> UNVIEWED + results.any { it == VIEWED } -> VIEWED + else -> NONE + } + } + } + } + } else { + return getState(recipientId) + } + } + + @JvmStatic + private fun getState(recipientId: RecipientId): Observable { return Observable.create { emitter -> fun refresh() { emitter.onNext(SignalDatabase.mms.getStoryViewState(recipientId)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingRepository.kt index bbd260c54e..5a904ddd95 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingRepository.kt @@ -70,11 +70,11 @@ class StoriesLandingRepository(context: Context) { } private fun createStoriesLandingItemData(sender: Recipient, messageRecords: List): Observable { - return Observable.create { emitter -> + val itemDataObservable = Observable.create { emitter -> fun refresh(sender: Recipient) { val itemData = StoriesLandingItemData( storyRecipient = sender, - storyViewState = getStoryViewState(messageRecords), + storyViewState = StoryViewState.NONE, hasReplies = messageRecords.any { SignalDatabase.mms.getNumberOfStoryReplies(it.id) > 0 }, hasRepliesFromSelf = messageRecords.any { SignalDatabase.mms.hasSelfReplyInStory(it.id) }, isHidden = sender.shouldHideStory(), @@ -106,6 +106,12 @@ class StoriesLandingRepository(context: Context) { refresh(sender) } + + val storyViewedStateObservable = StoryViewState.getForRecipientId(if (sender.isMyStory) Recipient.self().id else sender.id) + + return Observable.combineLatest(itemDataObservable, storyViewedStateObservable) { data, state -> + data.copy(storyViewState = state) + } } fun setHideStory(recipientId: RecipientId, hideStory: Boolean): Completable { @@ -113,17 +119,4 @@ class StoriesLandingRepository(context: Context) { SignalDatabase.recipients.setHideStory(recipientId, hideStory) }.subscribeOn(Schedulers.io()) } - - private fun getStoryViewState(messageRecords: List): StoryViewState { - val incoming = messageRecords.filterNot { it.isOutgoing } - if (incoming.isEmpty()) { - return StoryViewState.NONE - } - - if (incoming.any { it.viewedReceiptCount == 0 }) { - return StoryViewState.UNVIEWED - } - - return StoryViewState.VIEWED - } }