mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-21 00:59:49 +01:00
Update chat colors.
This commit is contained in:
committed by
Greyson Parrelli
parent
36fe150678
commit
bcc5d485ab
@@ -14,6 +14,8 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
import org.thoughtcrime.securesms.PassphraseRequiredActivity;
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.color.MaterialColor;
|
||||
import org.thoughtcrime.securesms.conversation.colors.Colorizer;
|
||||
import org.thoughtcrime.securesms.conversation.colors.ColorizerView;
|
||||
import org.thoughtcrime.securesms.database.MmsSmsDatabase;
|
||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
||||
import org.thoughtcrime.securesms.giph.mp4.GiphyMp4PlaybackController;
|
||||
@@ -42,6 +44,7 @@ public final class MessageDetailsActivity extends PassphraseRequiredActivity {
|
||||
private GlideRequests glideRequests;
|
||||
private MessageDetailsViewModel viewModel;
|
||||
private MessageDetailsAdapter adapter;
|
||||
private Colorizer colorizer;
|
||||
|
||||
private DynamicTheme dynamicTheme = new DynamicTheme();
|
||||
|
||||
@@ -95,11 +98,15 @@ public final class MessageDetailsActivity extends PassphraseRequiredActivity {
|
||||
}
|
||||
|
||||
private void initializeList() {
|
||||
RecyclerView list = findViewById(R.id.message_details_list);
|
||||
adapter = new MessageDetailsAdapter(this, glideRequests);
|
||||
RecyclerView list = findViewById(R.id.message_details_list);
|
||||
ColorizerView colorizerView = findViewById(R.id.message_details_colorizer);
|
||||
|
||||
colorizer = new Colorizer(colorizerView);
|
||||
adapter = new MessageDetailsAdapter(this, glideRequests, colorizer);
|
||||
|
||||
list.setAdapter(adapter);
|
||||
list.setItemAnimator(null);
|
||||
colorizer.attachToRecyclerView(list);
|
||||
}
|
||||
|
||||
private void initializeViewModel() {
|
||||
@@ -116,6 +123,7 @@ public final class MessageDetailsActivity extends PassphraseRequiredActivity {
|
||||
adapter.submitList(convertToRows(details));
|
||||
}
|
||||
});
|
||||
viewModel.getRecipient().observe(this, recipient -> colorizer.onChatColorsChanged(recipient.getChatColors()));
|
||||
}
|
||||
|
||||
private void initializeVideoPlayer() {
|
||||
|
||||
@@ -12,6 +12,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.conversation.ConversationMessage;
|
||||
import org.thoughtcrime.securesms.conversation.colors.Colorizer;
|
||||
import org.thoughtcrime.securesms.mms.GlideRequests;
|
||||
|
||||
import java.util.List;
|
||||
@@ -22,12 +23,14 @@ final class MessageDetailsAdapter extends ListAdapter<MessageDetailsAdapter.Mess
|
||||
|
||||
private final LifecycleOwner lifecycleOwner;
|
||||
private final GlideRequests glideRequests;
|
||||
private final Colorizer colorizer;
|
||||
private boolean running;
|
||||
|
||||
MessageDetailsAdapter(@NonNull LifecycleOwner lifecycleOwner, @NonNull GlideRequests glideRequests) {
|
||||
MessageDetailsAdapter(@NonNull LifecycleOwner lifecycleOwner, @NonNull GlideRequests glideRequests, @NonNull Colorizer colorizer) {
|
||||
super(new MessageDetailsDiffer());
|
||||
this.lifecycleOwner = lifecycleOwner;
|
||||
this.glideRequests = glideRequests;
|
||||
this.colorizer = colorizer;
|
||||
this.running = true;
|
||||
}
|
||||
|
||||
@@ -35,7 +38,7 @@ final class MessageDetailsAdapter extends ListAdapter<MessageDetailsAdapter.Mess
|
||||
public @NonNull RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
switch (viewType) {
|
||||
case MessageDetailsViewState.MESSAGE_HEADER:
|
||||
return new MessageHeaderViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.message_details_header, parent, false), glideRequests);
|
||||
return new MessageHeaderViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.message_details_header, parent, false), glideRequests, colorizer);
|
||||
case MessageDetailsViewState.RECIPIENT_HEADER:
|
||||
return new RecipientHeaderViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.message_details_recipient_header, parent, false));
|
||||
case MessageDetailsViewState.RECIPIENT:
|
||||
|
||||
@@ -27,14 +27,14 @@ final class MessageDetailsViewModel extends ViewModel {
|
||||
messageDetails = Transformations.switchMap(messageRecord, repository::getMessageDetails);
|
||||
}
|
||||
|
||||
@NonNull LiveData<MaterialColor> getRecipientColor() {
|
||||
return Transformations.distinctUntilChanged(Transformations.map(recipient, Recipient::getColor));
|
||||
}
|
||||
|
||||
@NonNull LiveData<MessageDetails> getMessageDetails() {
|
||||
return messageDetails;
|
||||
}
|
||||
|
||||
@NonNull LiveData<Recipient> getRecipient() {
|
||||
return recipient;
|
||||
}
|
||||
|
||||
static final class Factory implements ViewModelProvider.Factory {
|
||||
|
||||
private final RecipientId recipientId;
|
||||
|
||||
@@ -3,9 +3,6 @@ package org.thoughtcrime.securesms.messagedetails;
|
||||
import android.content.ClipData;
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.Context;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewStub;
|
||||
@@ -16,19 +13,22 @@ import androidx.annotation.Nullable;
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.annimon.stream.Stream;
|
||||
import com.google.android.exoplayer2.source.MediaSource;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.signal.core.util.ThreadUtil;
|
||||
import org.signal.core.util.concurrent.SignalExecutors;
|
||||
import org.signal.core.util.logging.Log;
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.conversation.ClipProjectionDrawable;
|
||||
import org.thoughtcrime.securesms.conversation.ConversationItem;
|
||||
import org.thoughtcrime.securesms.conversation.ConversationMessage;
|
||||
import org.thoughtcrime.securesms.conversation.MaskDrawable;
|
||||
import org.thoughtcrime.securesms.conversation.colors.Colorizable;
|
||||
import org.thoughtcrime.securesms.conversation.colors.Colorizer;
|
||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
||||
import org.thoughtcrime.securesms.giph.mp4.GiphyMp4Playable;
|
||||
import org.thoughtcrime.securesms.giph.mp4.GiphyMp4PlaybackPolicyEnforcer;
|
||||
import org.thoughtcrime.securesms.giph.mp4.GiphyMp4Projection;
|
||||
import org.thoughtcrime.securesms.util.Projection;
|
||||
import org.thoughtcrime.securesms.mms.GlideRequests;
|
||||
import org.thoughtcrime.securesms.sms.MessageSender;
|
||||
import org.thoughtcrime.securesms.util.DateUtils;
|
||||
@@ -39,30 +39,34 @@ import org.whispersystems.libsignal.util.guava.Optional;
|
||||
import java.sql.Date;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
|
||||
final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements GiphyMp4Playable {
|
||||
private final TextView sentDate;
|
||||
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;
|
||||
private final ViewStub updateStub;
|
||||
private final ViewStub sentStub;
|
||||
private final ViewStub receivedStub;
|
||||
private final MaskDrawable maskDrawable;
|
||||
final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements GiphyMp4Playable, Colorizable {
|
||||
private final TextView sentDate;
|
||||
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;
|
||||
private final ViewStub updateStub;
|
||||
private final ViewStub sentStub;
|
||||
private final ViewStub receivedStub;
|
||||
private final ClipProjectionDrawable clipProjectionDrawable;
|
||||
private final Colorizer colorizer;
|
||||
|
||||
private GlideRequests glideRequests;
|
||||
private ConversationItem conversationItem;
|
||||
private ExpiresUpdater expiresUpdater;
|
||||
|
||||
MessageHeaderViewHolder(@NonNull View itemView, GlideRequests glideRequests) {
|
||||
MessageHeaderViewHolder(@NonNull View itemView, GlideRequests glideRequests, @NonNull Colorizer colorizer) {
|
||||
super(itemView);
|
||||
this.glideRequests = glideRequests;
|
||||
this.colorizer = colorizer;
|
||||
|
||||
sentDate = itemView.findViewById(R.id.message_details_header_sent_time);
|
||||
receivedDate = itemView.findViewById(R.id.message_details_header_received_time);
|
||||
@@ -77,8 +81,8 @@ final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements G
|
||||
sentStub = itemView.findViewById(R.id.message_details_header_message_view_sent_multimedia);
|
||||
receivedStub = itemView.findViewById(R.id.message_details_header_message_view_received_multimedia);
|
||||
|
||||
maskDrawable = new MaskDrawable(itemView.getBackground());
|
||||
itemView.setBackground(maskDrawable);
|
||||
clipProjectionDrawable = new ClipProjectionDrawable(itemView.getBackground());
|
||||
itemView.setBackground(clipProjectionDrawable);
|
||||
}
|
||||
|
||||
void bind(@NonNull LifecycleOwner lifecycleOwner, @Nullable ConversationMessage conversationMessage, boolean running) {
|
||||
@@ -117,7 +121,8 @@ final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements G
|
||||
false,
|
||||
false,
|
||||
new AttachmentMediaSourceFactory(conversationItem.getContext()),
|
||||
true);
|
||||
true,
|
||||
colorizer);
|
||||
}
|
||||
|
||||
private void bindErrorState(MessageRecord messageRecord) {
|
||||
@@ -213,14 +218,13 @@ final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements G
|
||||
@Override
|
||||
public void showProjectionArea() {
|
||||
conversationItem.showProjectionArea();
|
||||
maskDrawable.setMask(null);
|
||||
updateProjections();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hideProjectionArea() {
|
||||
conversationItem.hideProjectionArea();
|
||||
maskDrawable.setMask(conversationItem.getThumbnailMaskingRect((ViewGroup) itemView));
|
||||
maskDrawable.setCorners(conversationItem.getThumbnailCornerMask(itemView).getRadii());
|
||||
updateProjections();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -234,7 +238,7 @@ final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements G
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull GiphyMp4Projection getProjection(@NonNull RecyclerView recyclerview) {
|
||||
public @NonNull Projection getProjection(@NonNull ViewGroup recyclerview) {
|
||||
return conversationItem.getProjection(recyclerview);
|
||||
}
|
||||
|
||||
@@ -243,6 +247,26 @@ final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements G
|
||||
return conversationItem.canPlayContent();
|
||||
}
|
||||
|
||||
@NotNull @Override public List<Projection> getColorizerProjections() {
|
||||
List<Projection> projections = conversationItem.getColorizerProjections();
|
||||
updateProjections();
|
||||
return projections;
|
||||
}
|
||||
|
||||
private void updateProjections() {
|
||||
Set<Projection> projections = new HashSet<>();
|
||||
|
||||
if (canPlayContent()) {
|
||||
projections.add(conversationItem.getProjection((ViewGroup) itemView));
|
||||
}
|
||||
|
||||
projections.addAll(Stream.of(conversationItem.getColorizerProjections())
|
||||
.map(p -> Projection.translateFromRootToDescendantCoords(p, itemView))
|
||||
.toList());
|
||||
|
||||
clipProjectionDrawable.setProjections(projections);
|
||||
}
|
||||
|
||||
private class ExpiresUpdater implements Runnable {
|
||||
|
||||
private final long expireStartedTimestamp;
|
||||
|
||||
Reference in New Issue
Block a user