Update chat colors.

This commit is contained in:
Alex Hart
2021-05-03 11:34:41 -03:00
committed by Greyson Parrelli
parent 36fe150678
commit bcc5d485ab
164 changed files with 5817 additions and 1476 deletions

View File

@@ -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() {

View File

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

View File

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

View File

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