diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java index 715736960c..47416723e2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java @@ -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 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; diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsRepository.java b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsRepository.java index 30ac8eeb47..512cc5c073 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsRepository.java @@ -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(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageHeaderViewHolder.java b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageHeaderViewHolder.java index d788b49944..95ae247f0c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageHeaderViewHolder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageHeaderViewHolder.java @@ -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 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) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/RecipientViewHolder.java b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/RecipientViewHolder.java index 6a9cf28268..79d0a1ac91 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/RecipientViewHolder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/RecipientViewHolder.java @@ -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()); + } }