From a3d72fc06c24b6e633635912e96a2689a7c5e600 Mon Sep 17 00:00:00 2001 From: Lucio Maciel Date: Mon, 30 Aug 2021 17:52:46 -0300 Subject: [PATCH] Update message details UI. --- app/src/main/AndroidManifest.xml | 3 +- .../securesms/database/MmsDatabase.java | 11 +- .../securesms/database/MmsSmsDatabase.java | 11 +- .../securesms/database/SmsDatabase.java | 8 +- .../database/model/InMemoryMessageRecord.java | 3 +- .../database/model/MediaMmsMessageRecord.java | 7 +- .../database/model/MessageRecord.java | 12 +- .../database/model/MmsMessageRecord.java | 7 +- .../model/NotificationMmsMessageRecord.java | 4 +- .../database/model/SmsMessageRecord.java | 4 +- .../messagedetails/MessageDetails.java | 4 +- .../MessageDetailsActivity.java | 9 +- .../MessageDetailsRepository.java | 4 +- .../MessageHeaderViewHolder.java | 38 ++++-- .../ic_unidentified_delivery.webp | Bin 238 -> 0 bytes .../ic_unidentified_delivery.webp | Bin 146 -> 0 bytes .../ic_unidentified_delivery.webp | Bin 198 -> 0 bytes .../ic_unidentified_delivery.webp | Bin 302 -> 0 bytes .../ic_unidentified_delivery.webp | Bin 334 -> 0 bytes .../res/drawable/ic_unidentified_delivery.xml | 9 ++ .../res/layout/message_details_activity.xml | 47 ++++++- .../res/layout/message_details_header.xml | 120 +++++------------- .../res/layout/message_details_recipient.xml | 47 ++++--- .../message_details_recipient_header.xml | 15 ++- .../unidentified_delivery_learn_more.xml | 3 +- app/src/main/res/values/strings.xml | 8 +- app/src/main/res/values/styles.xml | 2 +- 27 files changed, 206 insertions(+), 170 deletions(-) delete mode 100644 app/src/main/res/drawable-hdpi/ic_unidentified_delivery.webp delete mode 100644 app/src/main/res/drawable-mdpi/ic_unidentified_delivery.webp delete mode 100644 app/src/main/res/drawable-xhdpi/ic_unidentified_delivery.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_unidentified_delivery.webp delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_unidentified_delivery.webp create mode 100644 app/src/main/res/drawable/ic_unidentified_delivery.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9ae3193a46..df67249166 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -318,7 +318,8 @@ + android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" + android:theme="@style/Signal.DayNight.NoActionBar" /> getMismatchedIdentities(String document) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java index 2e46bbb882..65337763c4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java @@ -104,7 +104,8 @@ public class MmsSmsDatabase extends Database { MmsSmsColumns.REMOTE_DELETED, MmsDatabase.MENTIONS_SELF, MmsSmsColumns.NOTIFIED_TIMESTAMP, - MmsSmsColumns.VIEWED_RECEIPT_COUNT}; + MmsSmsColumns.VIEWED_RECEIPT_COUNT, + MmsSmsColumns.RECEIPT_TIMESTAMP}; private static final String SNIPPET_QUERY = "SELECT " + MmsSmsColumns.ID + ", 0 AS " + TRANSPORT + ", " + SmsDatabase.TYPE + " AS " + MmsSmsColumns.NORMALIZED_TYPE + ", " + SmsDatabase.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " FROM " + SmsDatabase.TABLE_NAME + " " + "WHERE " + MmsSmsColumns.THREAD_ID + " = ? AND " + SmsDatabase.TYPE + " NOT IN (" + SmsDatabase.Types.PROFILE_CHANGE_TYPE + ", " + SmsDatabase.Types.GV1_MIGRATION_TYPE + ") " + @@ -679,7 +680,8 @@ public class MmsSmsDatabase extends Database { MmsSmsColumns.REMOTE_DELETED, MmsDatabase.MENTIONS_SELF, MmsSmsColumns.NOTIFIED_TIMESTAMP, - MmsSmsColumns.VIEWED_RECEIPT_COUNT}; + MmsSmsColumns.VIEWED_RECEIPT_COUNT, + MmsSmsColumns.RECEIPT_TIMESTAMP}; String[] smsProjection = {SmsDatabase.DATE_SENT + " AS " + MmsSmsColumns.NORMALIZED_DATE_SENT, SmsDatabase.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED, @@ -712,7 +714,8 @@ public class MmsSmsDatabase extends Database { MmsSmsColumns.REMOTE_DELETED, MmsDatabase.MENTIONS_SELF, MmsSmsColumns.NOTIFIED_TIMESTAMP, - MmsSmsColumns.VIEWED_RECEIPT_COUNT}; + MmsSmsColumns.VIEWED_RECEIPT_COUNT, + MmsSmsColumns.RECEIPT_TIMESTAMP}; SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder(); SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder(); @@ -774,6 +777,7 @@ public class MmsSmsDatabase extends Database { mmsColumnsPresent.add(MmsDatabase.MENTIONS_SELF); mmsColumnsPresent.add(MmsSmsColumns.NOTIFIED_TIMESTAMP); mmsColumnsPresent.add(MmsSmsColumns.VIEWED_RECEIPT_COUNT); + mmsColumnsPresent.add(MmsSmsColumns.RECEIPT_TIMESTAMP); Set smsColumnsPresent = new HashSet<>(); smsColumnsPresent.add(MmsSmsColumns.ID); @@ -801,6 +805,7 @@ public class MmsSmsDatabase extends Database { smsColumnsPresent.add(SmsDatabase.REACTIONS_LAST_SEEN); smsColumnsPresent.add(MmsDatabase.REMOTE_DELETED); smsColumnsPresent.add(MmsSmsColumns.NOTIFIED_TIMESTAMP); + smsColumnsPresent.add(MmsSmsColumns.RECEIPT_TIMESTAMP); String mmsGroupBy = includeAttachments ? MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID : null; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java index aae4f85a77..863c5b8e60 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -146,7 +146,7 @@ public class SmsDatabase extends MessageDatabase { REPLY_PATH_PRESENT, SUBJECT, BODY, SERVICE_CENTER, DELIVERY_RECEIPT_COUNT, MISMATCHED_IDENTITIES, SUBSCRIPTION_ID, EXPIRES_IN, EXPIRE_STARTED, NOTIFIED, READ_RECEIPT_COUNT, UNIDENTIFIED, REACTIONS, REACTIONS_UNREAD, REACTIONS_LAST_SEEN, - REMOTE_DELETED, NOTIFIED_TIMESTAMP + REMOTE_DELETED, NOTIFIED_TIMESTAMP, RECEIPT_TIMESTAMP }; private static final long IGNORABLE_TYPESMASK_WHEN_COUNTING = Types.END_SESSION_BIT | Types.KEY_EXCHANGE_IDENTITY_UPDATE_BIT | Types.KEY_EXCHANGE_IDENTITY_VERIFIED_BIT; @@ -1591,7 +1591,8 @@ public class SmsDatabase extends MessageDatabase { false, Collections.emptyList(), false, - 0); + 0, + -1); } } @@ -1638,6 +1639,7 @@ public class SmsDatabase extends MessageDatabase { boolean remoteDelete = cursor.getInt(cursor.getColumnIndexOrThrow(SmsDatabase.REMOTE_DELETED)) == 1; List reactions = parseReactions(cursor); long notifiedTimestamp = CursorUtil.requireLong(cursor, NOTIFIED_TIMESTAMP); + long receiptTimestamp = CursorUtil.requireLong(cursor, RECEIPT_TIMESTAMP); if (!TextSecurePreferences.isReadReceiptsEnabled(context)) { readReceiptCount = 0; @@ -1653,7 +1655,7 @@ public class SmsDatabase extends MessageDatabase { threadId, status, mismatches, subscriptionId, expiresIn, expireStarted, readReceiptCount, unidentified, reactions, remoteDelete, - notifiedTimestamp); + notifiedTimestamp, receiptTimestamp); } private List getMismatches(String document) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/InMemoryMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/InMemoryMessageRecord.java index 4a49a86879..147b17f3c2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/InMemoryMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/InMemoryMessageRecord.java @@ -50,7 +50,8 @@ public class InMemoryMessageRecord extends MessageRecord { Collections.emptyList(), false, 0, - 0); + 0, + -1); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java index d90fe3d58e..1d66145c98 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java @@ -86,12 +86,13 @@ public class MediaMmsMessageRecord extends MmsMessageRecord { boolean remoteDelete, boolean mentionsSelf, long notifiedTimestamp, - int viewedReceiptCount) + int viewedReceiptCount, + long receiptTimestamp) { super(id, body, conversationRecipient, individualRecipient, recipientDeviceId, dateSent, dateReceived, dateServer, threadId, Status.STATUS_NONE, deliveryReceiptCount, mailbox, mismatches, failures, subscriptionId, expiresIn, expireStarted, viewOnce, slideDeck, - readReceiptCount, quote, contacts, linkPreviews, unidentified, reactions, remoteDelete, notifiedTimestamp, viewedReceiptCount); + readReceiptCount, quote, contacts, linkPreviews, unidentified, reactions, remoteDelete, notifiedTimestamp, viewedReceiptCount, receiptTimestamp); this.partCount = partCount; this.mentionsSelf = mentionsSelf; } @@ -143,7 +144,7 @@ public class MediaMmsMessageRecord extends MmsMessageRecord { return new MediaMmsMessageRecord(getId(), getRecipient(), getIndividualRecipient(), getRecipientDeviceId(), getDateSent(), getDateReceived(), getServerTimestamp(), getDeliveryReceiptCount(), getThreadId(), getBody(), slideDeck, getPartCount(), getType(), getIdentityKeyMismatches(), getNetworkFailures(), getSubscriptionId(), getExpiresIn(), getExpireStarted(), isViewOnce(), getReadReceiptCount(), quote, contacts, linkPreviews, isUnidentified(), getReactions(), isRemoteDelete(), mentionsSelf, - getNotifiedTimestamp(), getViewedReceiptCount()); + getNotifiedTimestamp(), getViewedReceiptCount(), getReceiptTimestamp()); } private static @NonNull List updateContacts(@NonNull List contacts, @NonNull Map attachmentIdMap) { 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 6acb2e1858..544b1475f0 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 @@ -87,6 +87,7 @@ public abstract class MessageRecord extends DisplayRecord { private final long serverTimestamp; private final boolean remoteDelete; private final long notifiedTimestamp; + private final long receiptTimestamp; MessageRecord(long id, String body, Recipient conversationRecipient, Recipient individualRecipient, int recipientDeviceId, @@ -97,7 +98,7 @@ public abstract class MessageRecord extends DisplayRecord { int subscriptionId, long expiresIn, long expireStarted, int readReceiptCount, boolean unidentified, @NonNull List reactions, boolean remoteDelete, long notifiedTimestamp, - int viewedReceiptCount) + int viewedReceiptCount, long receiptTimestamp) { super(body, conversationRecipient, dateSent, dateReceived, threadId, deliveryStatus, deliveryReceiptCount, type, @@ -115,6 +116,7 @@ public abstract class MessageRecord extends DisplayRecord { this.serverTimestamp = dateServer; this.remoteDelete = remoteDelete; this.notifiedTimestamp = notifiedTimestamp; + this.receiptTimestamp = receiptTimestamp; } public abstract boolean isMms(); @@ -580,6 +582,14 @@ public abstract class MessageRecord extends DisplayRecord { return notifiedTimestamp; } + public long getReceiptTimestamp() { + if (!isOutgoing()) { + return getDateSent(); + } else { + return receiptTimestamp; + } + } + public static final class InviteAddState { private final boolean invited; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java index 996b1f79a1..92b28b8b3b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java @@ -34,9 +34,12 @@ public abstract class MmsMessageRecord extends MessageRecord { @Nullable Quote quote, @NonNull List contacts, @NonNull List linkPreviews, boolean unidentified, @NonNull List reactions, boolean remoteDelete, long notifiedTimestamp, - int viewedReceiptCount) + int viewedReceiptCount, long receiptTimestamp) { - super(id, body, conversationRecipient, individualRecipient, recipientDeviceId, dateSent, dateReceived, dateServer, threadId, deliveryStatus, deliveryReceiptCount, type, mismatches, networkFailures, subscriptionId, expiresIn, expireStarted, readReceiptCount, unidentified, reactions, remoteDelete, notifiedTimestamp, viewedReceiptCount); + super(id, body, conversationRecipient, individualRecipient, recipientDeviceId, + dateSent, dateReceived, dateServer, threadId, deliveryStatus, deliveryReceiptCount, + type, mismatches, networkFailures, subscriptionId, expiresIn, expireStarted, readReceiptCount, + unidentified, reactions, remoteDelete, notifiedTimestamp, viewedReceiptCount, receiptTimestamp); this.slideDeck = slideDeck; this.quote = quote; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java index c0b2504738..74881c7547 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java @@ -52,13 +52,13 @@ public class NotificationMmsMessageRecord extends MmsMessageRecord { long threadId, byte[] contentLocation, long messageSize, long expiry, int status, byte[] transactionId, long mailbox, int subscriptionId, SlideDeck slideDeck, int readReceiptCount, - int viewedReceiptCount) + int viewedReceiptCount, long receiptTimestamp) { super(id, "", conversationRecipient, individualRecipient, recipientDeviceId, dateSent, dateReceived, -1, threadId, Status.STATUS_NONE, deliveryReceiptCount, mailbox, new LinkedList<>(), new LinkedList<>(), subscriptionId, 0, 0, false, slideDeck, readReceiptCount, null, Collections.emptyList(), Collections.emptyList(), false, - Collections.emptyList(), false, 0, viewedReceiptCount); + Collections.emptyList(), false, 0, viewedReceiptCount, receiptTimestamp); this.contentLocation = contentLocation; this.messageSize = messageSize; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java index 8bd6956274..7435185de3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java @@ -51,12 +51,12 @@ public class SmsMessageRecord extends MessageRecord { int subscriptionId, long expiresIn, long expireStarted, int readReceiptCount, boolean unidentified, @NonNull List reactions, boolean remoteDelete, - long notifiedTimestamp) + long notifiedTimestamp, long receiptTimestamp) { super(id, body, recipient, individualRecipient, recipientDeviceId, dateSent, dateReceived, dateServer, threadId, status, deliveryReceiptCount, type, mismatches, new LinkedList<>(), subscriptionId, - expiresIn, expireStarted, readReceiptCount, unidentified, reactions, remoteDelete, notifiedTimestamp, 0); + expiresIn, expireStarted, readReceiptCount, unidentified, reactions, remoteDelete, notifiedTimestamp, 0, receiptTimestamp); } public long getType() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetails.java b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetails.java index bce082298a..9196daf6d2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetails.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetails.java @@ -36,7 +36,9 @@ final class MessageDetails { notSent = new TreeSet<>(RECIPIENT_COMPARATOR); viewed = new TreeSet<>(RECIPIENT_COMPARATOR); - if (conversationMessage.getMessageRecord().isOutgoing()) { + if (conversationMessage.getMessageRecord().getRecipient().isSelf()) { + read.addAll(recipients); + } else if (conversationMessage.getMessageRecord().isOutgoing()) { for (RecipientDeliveryStatus status : recipients) { switch (status.getDeliveryStatus()) { case UNKNOWN: diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsActivity.java b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsActivity.java index 29adf9e5ae..2f9a3b045c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsActivity.java @@ -4,14 +4,17 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.MenuItem; +import android.view.View; import android.widget.FrameLayout; import androidx.annotation.NonNull; +import androidx.appcompat.widget.Toolbar; import androidx.lifecycle.ViewModelProviders; import androidx.recyclerview.widget.RecyclerView; import org.thoughtcrime.securesms.PassphraseRequiredActivity; import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.components.recyclerview.ToolbarShadowAnimationHelper; import org.thoughtcrime.securesms.conversation.colors.Colorizer; import org.thoughtcrime.securesms.conversation.colors.ColorizerView; import org.thoughtcrime.securesms.conversation.ui.error.SafetyNumberChangeDialog; @@ -25,6 +28,7 @@ import org.thoughtcrime.securesms.messagedetails.MessageDetailsViewModel.Factory import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.RecipientId; +import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; import java.util.ArrayList; @@ -43,7 +47,7 @@ public final class MessageDetailsActivity extends PassphraseRequiredActivity { private MessageDetailsAdapter adapter; private Colorizer colorizer; - private DynamicTheme dynamicTheme = new DynamicTheme(); + private DynamicTheme dynamicTheme = new DynamicNoActionBarTheme(); public static @NonNull Intent getIntentForMessageDetails(@NonNull Context context, @NonNull MessageRecord message, @NonNull RecipientId recipientId, long threadId) { Intent intent = new Intent(context, MessageDetailsActivity.class); @@ -97,12 +101,14 @@ public final class MessageDetailsActivity extends PassphraseRequiredActivity { private void initializeList() { RecyclerView list = findViewById(R.id.message_details_list); ColorizerView colorizerView = findViewById(R.id.message_details_colorizer); + View toolbarShadow = findViewById(R.id.toolbar_shadow); colorizer = new Colorizer(colorizerView); adapter = new MessageDetailsAdapter(this, glideRequests, colorizer, this::onErrorClicked); list.setAdapter(adapter); list.setItemAnimator(null); + list.addOnScrollListener(new ToolbarShadowAnimationHelper(toolbarShadow)); colorizer.attachToRecyclerView(list); } @@ -133,6 +139,7 @@ public final class MessageDetailsActivity extends PassphraseRequiredActivity { } private void initializeActionBar() { + setSupportActionBar(findViewById(R.id.toolbar)); requireSupportActionBar().setDisplayHomeAsUpEnabled(true); requireSupportActionBar().setTitle(R.string.AndroidManifest__message_details); } 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 18e541d096..8a8c78b501 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsRepository.java @@ -51,7 +51,7 @@ final class MessageDetailsRepository { messageRecord.getRecipient(), getStatusFor(messageRecord), messageRecord.isUnidentified(), - -1, + messageRecord.getReceiptTimestamp(), getNetworkFailure(messageRecord, messageRecord.getRecipient()), getKeyMismatchFailure(messageRecord, messageRecord.getRecipient()))); } else { @@ -65,7 +65,7 @@ final class MessageDetailsRepository { recipient, RecipientDeliveryStatus.Status.UNKNOWN, false, - -1, + messageRecord.getReceiptTimestamp(), getNetworkFailure(messageRecord, recipient), getKeyMismatchFailure(messageRecord, recipient))); } 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 854a123aa9..6519d06c81 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageHeaderViewHolder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageHeaderViewHolder.java @@ -3,6 +3,9 @@ package org.thoughtcrime.securesms.messagedetails; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.style.StyleSpan; import android.view.View; import android.view.ViewGroup; import android.view.ViewStub; @@ -48,8 +51,6 @@ final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements G private final TextView receivedDate; private final TextView expiresIn; private final TextView transport; - private final View expiresGroup; - private final View receivedGroup; private final TextView errorText; private final View resendButton; private final View messageMetadata; @@ -70,9 +71,7 @@ final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements G sentDate = itemView.findViewById(R.id.message_details_header_sent_time); receivedDate = itemView.findViewById(R.id.message_details_header_received_time); - receivedGroup = itemView.findViewById(R.id.message_details_header_received_group); expiresIn = itemView.findViewById(R.id.message_details_header_expires_in); - expiresGroup = itemView.findViewById(R.id.message_details_header_expires_group); transport = itemView.findViewById(R.id.message_details_header_transport); errorText = itemView.findViewById(R.id.message_details_header_error_text); resendButton = itemView.findViewById(R.id.message_details_header_resend_button); @@ -152,26 +151,26 @@ final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements G receivedDate.setOnLongClickListener(null); if (messageRecord.isPending() || messageRecord.isFailed()) { - sentDate.setText("-"); - receivedGroup.setVisibility(View.GONE); + sentDate.setText(formatBoldString(R.string.message_details_header__sent, "-")); + receivedDate.setVisibility(View.GONE); } else { Locale dateLocale = Locale.getDefault(); SimpleDateFormat dateFormatter = DateUtils.getDetailedDateFormatter(itemView.getContext(), dateLocale); - sentDate.setText(dateFormatter.format(new Date(messageRecord.getDateSent()))); + sentDate.setText(formatBoldString(R.string.message_details_header__sent, dateFormatter.format(new Date(messageRecord.getDateSent())))); sentDate.setOnLongClickListener(v -> { copyToClipboard(String.valueOf(messageRecord.getDateSent())); return true; }); if (messageRecord.getDateReceived() != messageRecord.getDateSent() && !messageRecord.isOutgoing()) { - receivedDate.setText(dateFormatter.format(new Date(messageRecord.getDateReceived()))); + receivedDate.setText(formatBoldString(R.string.message_details_header__received, dateFormatter.format(new Date(messageRecord.getDateReceived())))); receivedDate.setOnLongClickListener(v -> { copyToClipboard(String.valueOf(messageRecord.getDateReceived())); return true; }); - receivedGroup.setVisibility(View.VISIBLE); + receivedDate.setVisibility(View.VISIBLE); } else { - receivedGroup.setVisibility(View.GONE); + receivedDate.setVisibility(View.GONE); } } } @@ -183,11 +182,11 @@ final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements G } if (messageRecord.getExpiresIn() <= 0 || messageRecord.getExpireStarted() <= 0) { - expiresGroup.setVisibility(View.GONE); + expiresIn.setVisibility(View.GONE); return; } - expiresGroup.setVisibility(View.VISIBLE); + expiresIn.setVisibility(View.VISIBLE); if (running) { expiresUpdater = new ExpiresUpdater(messageRecord); ThreadUtil.runOnMain(expiresUpdater); @@ -208,7 +207,18 @@ final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements G transportText = itemView.getContext().getString(R.string.ConversationFragment_sms); } - transport.setText(transportText); + transport.setText(formatBoldString(R.string.message_details_header__via, transportText)); + } + + private CharSequence formatBoldString(int boldTextRes, CharSequence otherText) { + SpannableStringBuilder builder = new SpannableStringBuilder(); + StyleSpan boldSpan = new StyleSpan(android.graphics.Typeface.BOLD); + CharSequence boldText = itemView.getContext().getString(boldTextRes); + + builder.append(boldText).append(" ").append(otherText); + builder.setSpan(boldSpan, 0, boldText.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + + return builder; } private void copyToClipboard(String text) { @@ -286,7 +296,7 @@ final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements G int expirationTime = Math.max((int) (remaining / 1000), 1); String duration = ExpirationUtil.getExpirationDisplayValue(itemView.getContext(), expirationTime); - expiresIn.setText(duration); + expiresIn.setText(formatBoldString(R.string.message_details_header__disappears, duration)); if (running && expirationTime > 1) { ThreadUtil.runOnMainDelayed(this, 500); diff --git a/app/src/main/res/drawable-hdpi/ic_unidentified_delivery.webp b/app/src/main/res/drawable-hdpi/ic_unidentified_delivery.webp deleted file mode 100644 index 039edb0dc6da26a042911665b0e6fde960437bee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238 zcmVT-3IrP1f_14_?EHAQ0j#*opj~h>}5~PU6 zt>d0iE274|?Ha>aUc-3+L}RIltZxm+9ziL>9NN9pG#^{Lfz>O)Xe?(`TXYDIB}JGc oY1+c*d*qm<{npwarq~a%M*w318pHU|tH$PTEgA#k2u3~rp^7+c*#H0l diff --git a/app/src/main/res/drawable-mdpi/ic_unidentified_delivery.webp b/app/src/main/res/drawable-mdpi/ic_unidentified_delivery.webp deleted file mode 100644 index 1158b60d475458e7d218e1be553f58e9436f7109..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmV;D0B!$LNk&GB00012MM6+kP&iC}0000l6Tk!zzcByvKmQ6NNitKXw~YW?VBm1j z!5~yL7;FeWHV^?04GRnf4T9rFk`yTy4(pi8e_N+(j{gz;p8&pab#r~}k@IU-ip!46 z%~9z*S+wdnj`*bZl=cG-(z4hASVY;6Ek%}mU(?zm>bjuzN%e9w6OWDp42A=L5w$}- AbpQYW diff --git a/app/src/main/res/drawable-xhdpi/ic_unidentified_delivery.webp b/app/src/main/res/drawable-xhdpi/ic_unidentified_delivery.webp deleted file mode 100644 index b4f6968b7ada98fd8b259f15f9559256526023bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198 zcmV;%06G6sNk&G#00012MM6+kP&iDn0000lC%_31A2I*)KmQ8bHc~^!d=CLQ0wEwM z1P(>Q&~P*efs4e)N8%xH;Al7!ih#htU=RqdB-vJz32qN};%EP>d`a%b;V+{96ToL4 zQd!gBl**nu$@B9Gsq8NGCe=ffEA$Zgf{4yO>5Rv?PI!#-2#~MgIN&k%J(?xq*kMci zeX2E&Q7kdoTe3MF<=b?dV!~02OR%RtjZ!2Y2fb&0Az_< A9{>OV diff --git a/app/src/main/res/drawable-xxhdpi/ic_unidentified_delivery.webp b/app/src/main/res/drawable-xxhdpi/ic_unidentified_delivery.webp deleted file mode 100644 index 34f9d02ec30f284bb564ab6259b11c308d7a25b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302 zcmV+}0nz?aNk&E{0RRA3MM6+kP&iB(0RR9mJHQSQ-$9UVQ-A4ar zjM@1)K-x&ryzd-73&>;;W|+PqW3EO|n4R7|W~X%pAAd_#KSx%oQ&mneJAX%TGYI3p z_u-q54|wNc@`~9RJVH}6?>oRcw-EUo@O%knQKp_^KoNlf1cgBqLm(6vg)samzTLw^LklAm1PciX4TR!^ zo_6QfO#w-gBt=dxid)RgEoKdgA^-oVf$o|-3Ctq;KLPkj?R>(>iFc-4L4$>}w`P^~^O`3UKgQt>w2}qPY%mJW~n<;3y7(*Qdw{$XqmV*wYeD9!I z!}|ubJg=afHQSXgAVB;mcQep(H32PWBWT*TqaFgmWRN`sY}MB`w7jiD%hNKnJkCSQ z?KI-VZ+1D3pfud*bOcO g{SHhfhU$`J6-ic+OuQQJ3N3|$^NEhcJN*9$09pf=z5oCK diff --git a/app/src/main/res/drawable/ic_unidentified_delivery.xml b/app/src/main/res/drawable/ic_unidentified_delivery.xml new file mode 100644 index 0000000000..92259e9db2 --- /dev/null +++ b/app/src/main/res/drawable/ic_unidentified_delivery.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/message_details_activity.xml b/app/src/main/res/layout/message_details_activity.xml index f8fce17f33..480ad87283 100644 --- a/app/src/main/res/layout/message_details_activity.xml +++ b/app/src/main/res/layout/message_details_activity.xml @@ -1,14 +1,32 @@ - + android:background="@color/signal_background_primary"> + + + android:layout_width="0dp" + android:layout_height="0dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/toolbar" /> - \ No newline at end of file + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/message_details_header.xml b/app/src/main/res/layout/message_details_header.xml index 4cf98ed392..f6ea063455 100644 --- a/app/src/main/res/layout/message_details_header.xml +++ b/app/src/main/res/layout/message_details_header.xml @@ -11,14 +11,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:paddingStart="16dp" android:paddingTop="24dp" - android:paddingEnd="16dp" - android:paddingBottom="24dp"> + android:paddingBottom="32dp"> + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp"> + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/dsl_settings_gutter" + android:layout_marginEnd="@dimen/dsl_settings_gutter" + tools:visibility="visible"> - - - - - - - - - - - - - + + diff --git a/app/src/main/res/layout/message_details_recipient.xml b/app/src/main/res/layout/message_details_recipient.xml index 8fe1be7e17..ae5fcbc4b3 100644 --- a/app/src/main/res/layout/message_details_recipient.xml +++ b/app/src/main/res/layout/message_details_recipient.xml @@ -11,14 +11,17 @@ + android:paddingTop="12dp" + android:paddingBottom="12dp" + android:paddingStart="@dimen/dsl_settings_gutter" + android:paddingEnd="@dimen/dsl_settings_gutter"> + app:layout_constraintBottom_toTopOf="@+id/message_details_recipient_error_description" + style="@style/Signal.Text.Body"/> + app:layout_constraintBottom_toBottomOf="parent" + style="@style/Signal.Text.Preview"/>