Fix message info screen updates.

This commit is contained in:
Sagar
2025-04-17 23:49:22 +05:30
committed by Cody Henthorne
parent 619d2997f6
commit 479632d6a8
4 changed files with 74 additions and 24 deletions

View File

@@ -41,6 +41,7 @@ import org.signal.storageservice.protos.groups.local.DecryptedGroupChange;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.emoji.EmojiProvider;
import org.thoughtcrime.securesms.components.emoji.parsing.EmojiParser;
import org.thoughtcrime.securesms.components.transfercontrols.TransferControlView;
import org.thoughtcrime.securesms.database.MessageTypes;
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
@@ -55,6 +56,7 @@ import org.thoughtcrime.securesms.emoji.EmojiSource;
import org.thoughtcrime.securesms.emoji.JumboEmoji;
import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.mms.Slide;
import org.thoughtcrime.securesms.profiles.ProfileName;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
@@ -853,6 +855,17 @@ public abstract class MessageRecord extends DisplayRecord {
return false;
}
public boolean isAttachmentInExpectedState(int expectedTransferState) {
if (this instanceof MmsMessageRecord) {
List<Slide> slides = ((MmsMessageRecord) this).getSlideDeck().getSlides();
if (slides.isEmpty()) {
return false;
}
return TransferControlView.getTransferState(slides) == expectedTransferState;
}
return false;
}
public static final class InviteAddState {
private final boolean invited;

View File

@@ -9,17 +9,21 @@ import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import org.signal.core.util.concurrent.SignalExecutors;
import org.thoughtcrime.securesms.components.transfercontrols.TransferControlView;
import org.thoughtcrime.securesms.conversation.ConversationMessage.ConversationMessageFactory;
import org.thoughtcrime.securesms.database.AttachmentTable;
import org.thoughtcrime.securesms.database.DatabaseObserver;
import org.thoughtcrime.securesms.database.GroupTable;
import org.thoughtcrime.securesms.database.GroupReceiptTable;
import org.thoughtcrime.securesms.database.GroupTable;
import org.thoughtcrime.securesms.database.NoSuchMessageException;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
import org.thoughtcrime.securesms.database.model.MessageId;
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
import org.thoughtcrime.securesms.dependencies.AppDependencies;
import org.thoughtcrime.securesms.mms.Slide;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.whispersystems.signalservice.api.push.DistributionId;
@@ -122,7 +126,7 @@ public final class MessageDetailsRepository {
recipients.add(new RecipientDeliveryStatus(messageRecord,
recipient,
getStatusFor(info.getStatus(), messageRecord.isPending(), recipientFailure),
getStatusFor(messageRecord, info.getStatus(), messageRecord.isPending(), recipientFailure),
info.isUnidentified(),
info.getTimestamp(),
failure,
@@ -158,24 +162,44 @@ public final class MessageDetailsRepository {
}
private @NonNull RecipientDeliveryStatus.Status getStatusFor(MessageRecord messageRecord) {
if (messageRecord.isViewed()) return RecipientDeliveryStatus.Status.VIEWED;
if (messageRecord.hasReadReceipt()) return RecipientDeliveryStatus.Status.READ;
if (messageRecord.isDelivered()) return RecipientDeliveryStatus.Status.DELIVERED;
if (messageRecord.isSent()) return RecipientDeliveryStatus.Status.SENT;
if (messageRecord.isPending()) return RecipientDeliveryStatus.Status.PENDING;
if (messageRecord.isViewed()) {
return RecipientDeliveryStatus.Status.VIEWED;
} else if (messageRecord.hasReadReceipt()) {
return RecipientDeliveryStatus.Status.READ;
} else if (messageRecord.isDelivered()) {
return RecipientDeliveryStatus.Status.DELIVERED;
} else if (messageRecord.isSent()) {
return RecipientDeliveryStatus.Status.SENT;
} else if (messageRecord.isAttachmentInExpectedState(AttachmentTable.TRANSFER_PROGRESS_FAILED) || (!(messageRecord instanceof MmsMessageRecord) && messageRecord.hasFailedWithNetworkFailures())) {
return RecipientDeliveryStatus.Status.UNKNOWN;
} else if (messageRecord.isAttachmentInExpectedState(AttachmentTable.TRANSFER_PROGRESS_STARTED) || messageRecord.isPending()) {
return RecipientDeliveryStatus.Status.PENDING;
}
return RecipientDeliveryStatus.Status.UNKNOWN;
}
private @NonNull RecipientDeliveryStatus.Status getStatusFor(int groupStatus, boolean pending, boolean failed) {
if (groupStatus == GroupReceiptTable.STATUS_READ) return RecipientDeliveryStatus.Status.READ;
else if (groupStatus == GroupReceiptTable.STATUS_DELIVERED) return RecipientDeliveryStatus.Status.DELIVERED;
else if (groupStatus == GroupReceiptTable.STATUS_UNDELIVERED && failed) return RecipientDeliveryStatus.Status.UNKNOWN;
else if (groupStatus == GroupReceiptTable.STATUS_UNDELIVERED && !pending) return RecipientDeliveryStatus.Status.SENT;
else if (groupStatus == GroupReceiptTable.STATUS_UNDELIVERED) return RecipientDeliveryStatus.Status.PENDING;
else if (groupStatus == GroupReceiptTable.STATUS_UNKNOWN) return RecipientDeliveryStatus.Status.UNKNOWN;
else if (groupStatus == GroupReceiptTable.STATUS_VIEWED) return RecipientDeliveryStatus.Status.VIEWED;
else if (groupStatus == GroupReceiptTable.STATUS_SKIPPED) return RecipientDeliveryStatus.Status.SKIPPED;
private @NonNull RecipientDeliveryStatus.Status getStatusFor(MessageRecord messageRecord, int groupStatus, boolean pending, boolean failed) {
if (groupStatus == GroupReceiptTable.STATUS_READ) {
return RecipientDeliveryStatus.Status.READ;
} else if (groupStatus == GroupReceiptTable.STATUS_DELIVERED) {
return RecipientDeliveryStatus.Status.DELIVERED;
} else if (groupStatus == GroupReceiptTable.STATUS_UNDELIVERED && failed) {
return RecipientDeliveryStatus.Status.UNKNOWN;
} else if (messageRecord.isAttachmentInExpectedState(AttachmentTable.TRANSFER_PROGRESS_FAILED) || (!(messageRecord instanceof MmsMessageRecord) && messageRecord.hasFailedWithNetworkFailures())) {
return RecipientDeliveryStatus.Status.UNKNOWN;
} else if (groupStatus == GroupReceiptTable.STATUS_UNDELIVERED && !pending) {
return RecipientDeliveryStatus.Status.SENT;
} else if (messageRecord.isAttachmentInExpectedState(AttachmentTable.TRANSFER_PROGRESS_STARTED) || groupStatus == GroupReceiptTable.STATUS_UNDELIVERED) {
return RecipientDeliveryStatus.Status.PENDING;
} else if (groupStatus == GroupReceiptTable.STATUS_UNKNOWN) {
return RecipientDeliveryStatus.Status.UNKNOWN;
} else if (groupStatus == GroupReceiptTable.STATUS_VIEWED) {
return RecipientDeliveryStatus.Status.VIEWED;
} else if (groupStatus == GroupReceiptTable.STATUS_SKIPPED) {
return RecipientDeliveryStatus.Status.SKIPPED;
}
throw new AssertionError();
}
}

View File

@@ -24,8 +24,6 @@ import com.bumptech.glide.RequestManager;
import org.signal.core.util.concurrent.SignalExecutors;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.attachments.Attachment;
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
import org.thoughtcrime.securesms.components.transfercontrols.TransferControlView;
import org.thoughtcrime.securesms.conversation.ConversationItem;
import org.thoughtcrime.securesms.conversation.ConversationMessage;
@@ -165,11 +163,7 @@ final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements G
}
private boolean isMmsFailedWithState(MessageRecord messageRecord, int expectedTransferState) {
if (messageRecord instanceof MmsMessageRecord) {
List<Slide> slides = ((MmsMessageRecord) messageRecord).getSlideDeck().getSlides();
return TransferControlView.getTransferState(slides) == expectedTransferState && messageRecord.isOutgoing();
}
return false;
return messageRecord.isAttachmentInExpectedState(expectedTransferState) && messageRecord.isOutgoing();
}
private boolean isPermanentFailed(MessageRecord messageRecord) {

View File

@@ -10,9 +10,15 @@ import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.badges.BadgeImageView;
import org.thoughtcrime.securesms.components.AvatarImageView;
import org.thoughtcrime.securesms.components.FromTextView;
import org.thoughtcrime.securesms.components.transfercontrols.TransferControlView;
import org.thoughtcrime.securesms.database.AttachmentTable;
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
import org.thoughtcrime.securesms.mms.Slide;
import org.thoughtcrime.securesms.util.DateUtils;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import java.util.List;
import java.util.Locale;
final class RecipientViewHolder extends RecyclerView.ViewHolder {
@@ -51,7 +57,7 @@ final class RecipientViewHolder extends RecyclerView.ViewHolder {
conflictButton.setVisibility(View.VISIBLE);
error.setText(itemView.getContext().getString(R.string.message_details_recipient__new_safety_number));
conflictButton.setOnClickListener(unused -> callbacks.onErrorClicked(data.getMessageRecord()));
} else if ((data.getNetworkFailure() != null && !data.getMessageRecord().isPending()) || (!data.getMessageRecord().getToRecipient().isPushGroup() && data.getMessageRecord().isFailed())) {
} else if (isFailed(data)) {
timestamp.setVisibility(View.GONE);
error.setVisibility(View.VISIBLE);
conflictButton.setVisibility(View.GONE);
@@ -69,4 +75,17 @@ final class RecipientViewHolder extends RecyclerView.ViewHolder {
}
}
}
private boolean isFailed(RecipientDeliveryStatus data) {
if (data.getDeliveryStatus() == RecipientDeliveryStatus.Status.PENDING) {
return false;
}
MessageRecord messageRecord = data.getMessageRecord();
if (messageRecord.isAttachmentInExpectedState(AttachmentTable.TRANSFER_PROGRESS_FAILED)) {
return true;
}
return (data.getNetworkFailure() != null && !data.getMessageRecord().isPending()) || (!data.getMessageRecord().getToRecipient().isPushGroup() && data.getMessageRecord().isFailed());
}
}