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"/>
@@ -85,14 +90,14 @@
android:id="@+id/message_details_recipient_ud_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="8dp"
- android:layout_marginEnd="4dp"
- android:src="@drawable/ic_unidentified_delivery"
- android:tint="@color/signal_text_secondary"
- app:layout_constraintStart_toEndOf="@+id/message_details_recipient_conflict_button"
- app:layout_constraintEnd_toEndOf="parent"
+ android:layout_marginStart="4dp"
+ android:layout_marginEnd="9dp"
+ app:srcCompat="@drawable/ic_unidentified_delivery"
+ android:tint="@color/signal_text_hint"
+ app:layout_constraintStart_toEndOf="@+id/message_details_recipient_name"
+ app:layout_constraintEnd_toStartOf="@+id/message_details_recipient_conflict_button"
app:layout_constraintTop_toTopOf="parent"
- app:layout_constraintBottom_toBottomOf="parent"/>
+ app:layout_constraintBottom_toBottomOf="parent" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/message_details_recipient_header.xml b/app/src/main/res/layout/message_details_recipient_header.xml
index 43277dd8fb..2e3c77528e 100644
--- a/app/src/main/res/layout/message_details_recipient_header.xml
+++ b/app/src/main/res/layout/message_details_recipient_header.xml
@@ -5,29 +5,30 @@
android:id="@+id/group_media_card"
style="@style/Widget.Signal.CardView.PreferenceRow"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="12dp">
+ android:layout_height="wrap_content">
+ android:paddingStart="@dimen/dsl_settings_gutter"
+ android:paddingTop="24dp"
+ android:paddingEnd="@dimen/dsl_settings_gutter"
+ android:paddingBottom="12dp">
diff --git a/app/src/main/res/layout/unidentified_delivery_learn_more.xml b/app/src/main/res/layout/unidentified_delivery_learn_more.xml
index e9e9b25e0e..10d3b0a9bc 100644
--- a/app/src/main/res/layout/unidentified_delivery_learn_more.xml
+++ b/app/src/main/res/layout/unidentified_delivery_learn_more.xml
@@ -1,6 +1,7 @@
Some issues need your attention.
- Sent
- Received
- Disappears
- Via
+ Sent:
+ Received:
+ Disappears:
+ Via:
Pending
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 9703e1d4a0..b0f78946bd 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -470,7 +470,7 @@