mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-21 09:20:19 +01:00
Update message details UI.
This commit is contained in:
committed by
Greyson Parrelli
parent
f5a6d61362
commit
a3d72fc06c
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user