Compute ConversationItem dates in the background.

This commit is contained in:
Alex Hart 2023-08-18 14:19:26 -03:00 committed by Cody Henthorne
parent 4494d8652d
commit f4df37da23
5 changed files with 26 additions and 11 deletions

View file

@ -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);
}
/**

View file

@ -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) {

View file

@ -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,

View file

@ -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,

View file

@ -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<Model : MappingModel<Model>>(
} 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)
}