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 039edb0dc6..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_unidentified_delivery.webp and /dev/null differ 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 1158b60d47..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_unidentified_delivery.webp and /dev/null differ 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 b4f6968b7a..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_unidentified_delivery.webp and /dev/null differ 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 34f9d02ec3..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_unidentified_delivery.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_unidentified_delivery.webp b/app/src/main/res/drawable-xxxhdpi/ic_unidentified_delivery.webp deleted file mode 100644 index ec5ecc48fb..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_unidentified_delivery.webp and /dev/null differ 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"/>