From f4df37da237663d15a4c6837f6c852754094ddee Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Fri, 18 Aug 2023 14:19:26 -0300 Subject: [PATCH] Compute ConversationItem dates in the background. --- .../conversation/ConversationMessage.java | 20 +++++++++++++++++-- .../conversation/v2/ConversationFragment.kt | 4 ++-- .../conversation/v2/ConversationRepository.kt | 6 +++--- .../conversation/v2/ConversationViewModel.kt | 2 +- .../v2/items/V2ConversationItemViewHolder.kt | 5 ++--- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java index d79c182c15..e58987ce62 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java @@ -16,15 +16,18 @@ import org.thoughtcrime.securesms.database.BodyRangeUtil; import org.thoughtcrime.securesms.database.MentionUtil; import org.thoughtcrime.securesms.database.NoSuchMessageException; import org.thoughtcrime.securesms.database.SignalDatabase; +import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord; import org.thoughtcrime.securesms.database.model.Mention; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList; import org.thoughtcrime.securesms.recipients.Recipient; +import org.thoughtcrime.securesms.util.DateUtils; import org.thoughtcrime.securesms.util.MessageRecordUtil; import java.security.MessageDigest; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.Objects; /** @@ -43,6 +46,7 @@ public class ConversationMessage { @NonNull private final Recipient threadRecipient; private final boolean hasBeenQuoted; @Nullable private final MessageRecord originalMessage; + @NonNull private final String formattedDate; private ConversationMessage(@NonNull MessageRecord messageRecord, @Nullable CharSequence body, @@ -50,7 +54,8 @@ public class ConversationMessage { boolean hasBeenQuoted, @Nullable MessageStyler.Result styleResult, @NonNull Recipient threadRecipient, - @Nullable MessageRecord originalMessage) + @Nullable MessageRecord originalMessage, + @NonNull String formattedDate) { this.messageRecord = messageRecord; this.hasBeenQuoted = hasBeenQuoted; @@ -58,6 +63,7 @@ public class ConversationMessage { this.styleResult = styleResult != null ? styleResult : MessageStyler.Result.none(); this.threadRecipient = threadRecipient; this.originalMessage = originalMessage; + this.formattedDate = formattedDate; if (body != null) { this.body = SpannableString.valueOf(body); @@ -90,6 +96,11 @@ public class ConversationMessage { return hasBeenQuoted; } + @NonNull + public String getFormattedDate() { + return formattedDate; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -194,13 +205,18 @@ public class ConversationMessage { } } + String formattedDate = MessageRecordUtil.isScheduled(messageRecord) ? DateUtils.getOnlyTimeString(context, Locale.getDefault(), ((MediaMmsMessageRecord) messageRecord).getScheduledDate()) + : DateUtils.getSimpleRelativeTimeSpanString(context, Locale.getDefault(), messageRecord.getTimestamp()); + + return new ConversationMessage(messageRecord, styledAndMentionBody != null ? styledAndMentionBody : mentionsUpdate != null ? mentionsUpdate.getBody() : body, mentionsUpdate != null ? mentionsUpdate.getMentions() : null, hasBeenQuoted, styleResult, threadRecipient, - originalMessage); + originalMessage, + formattedDate); } /** diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index 2cd7347edc..31effb5bb1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -395,7 +395,7 @@ class ConversationFragment : ConversationViewModel( threadId = args.threadId, requestedStartingPosition = args.startingPosition, - repository = ConversationRepository(context = requireContext(), isInBubble = args.conversationScreenType == ConversationScreenType.BUBBLE), + repository = ConversationRepository(localContext = requireContext(), isInBubble = args.conversationScreenType == ConversationScreenType.BUBBLE), recipientRepository = conversationRecipientRepository, messageRequestRepository = messageRequestRepository, scheduledMessagesRepository = ScheduledMessagesRepository() @@ -1035,7 +1035,7 @@ class ConversationFragment : getVoiceNoteMediaController().voiceNotePlaybackState.observe(viewLifecycleOwner, inputPanel.playbackStateObserver) - val conversationUpdateTick = ConversationUpdateTick { adapter.updateTimestamps() } + val conversationUpdateTick = ConversationUpdateTick { viewModel.pagingController.onDataInvalidated() } viewLifecycleOwner.lifecycle.addObserver(conversationUpdateTick) if (args.conversationScreenType.isInPopup) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt index b9a00bb494..a17b0dbc3a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt @@ -106,7 +106,7 @@ import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds class ConversationRepository( - context: Context, + private val localContext: Context, private val isInBubble: Boolean ) { @@ -114,7 +114,7 @@ class ConversationRepository( private val TAG = Log.tag(ConversationRepository::class.java) } - private val applicationContext = context.applicationContext + private val applicationContext = localContext.applicationContext private val oldConversationRepository = org.thoughtcrime.securesms.conversation.ConversationRepository() /** @@ -139,7 +139,7 @@ class ConversationRepository( val messageRequestData = metadata.messageRequestData val dataSource = ConversationDataSource( - applicationContext, + localContext, threadId, messageRequestData, metadata.showUniversalExpireTimerMessage, diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt index d45257acfb..2343145e2d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt @@ -74,7 +74,7 @@ import kotlin.time.Duration */ class ConversationViewModel( val threadId: Long, - requestedStartingPosition: Int, + private val requestedStartingPosition: Int, private val repository: ConversationRepository, recipientRepository: ConversationRecipientRepository, messageRequestRepository: MessageRequestRepository, diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemViewHolder.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemViewHolder.kt index 9757eb3700..680fb36596 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemViewHolder.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemViewHolder.kt @@ -40,7 +40,6 @@ import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.util.DateUtils import org.thoughtcrime.securesms.util.InterceptableLongClickCopyLinkSpan import org.thoughtcrime.securesms.util.LongClickMovementMethod import org.thoughtcrime.securesms.util.PlaceholderURLSpan @@ -532,9 +531,9 @@ class V2TextOnlyViewHolder>( } else if (record.isRateLimited) { binding.conversationItemFooterDate.setText(R.string.ConversationItem_send_paused) } else if (record.isScheduled()) { - binding.conversationItemFooterDate.text = (DateUtils.getOnlyTimeString(getContext(), Locale.getDefault(), (record as MediaMmsMessageRecord).scheduledDate)) + binding.conversationItemFooterDate.text = conversationMessage.formattedDate } else { - var date = DateUtils.getSimpleRelativeTimeSpanString(context, Locale.getDefault(), record.timestamp) + var date = conversationMessage.formattedDate if (conversationContext.displayMode != ConversationItemDisplayMode.DETAILED && record is MediaMmsMessageRecord && record.isEditMessage()) { date = getContext().getString(R.string.ConversationItem_edited_timestamp_footer, date) }