Update message details UI.

This commit is contained in:
Lucio Maciel
2021-08-30 17:52:46 -03:00
committed by Greyson Parrelli
parent f5a6d61362
commit a3d72fc06c
27 changed files with 206 additions and 170 deletions

View File

@@ -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:

View File

@@ -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);
}

View File

@@ -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)));
}

View File

@@ -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);