From f59e10d82ca14e430f154f367139f3210bf02a07 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 18 Nov 2020 14:00:14 -0500 Subject: [PATCH] Fix read/unread conversation list colors. --- .../conversation/ConversationUpdateItem.java | 3 +- .../ConversationListItem.java | 62 ++++++++++--------- .../database/model/LiveUpdateMessage.java | 11 ++-- 3 files changed, 41 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java index 4f8d0b17e..3ed9b79af 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java @@ -10,6 +10,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LiveData; import androidx.lifecycle.Observer; @@ -109,7 +110,7 @@ public final class ConversationUpdateItem extends LinearLayout observeSender(lifecycleOwner, messageRecord.getIndividualRecipient()); UpdateDescription updateDescription = Objects.requireNonNull(messageRecord.getUpdateDisplayBody(getContext())); - LiveData liveUpdateMessage = LiveUpdateMessage.fromMessageDescription(getContext(), updateDescription); + LiveData liveUpdateMessage = LiveUpdateMessage.fromMessageDescription(getContext(), updateDescription, ContextCompat.getColor(getContext(), R.color.conversation_item_update_text_color)); LiveData spannableMessage = loading(liveUpdateMessage); present(conversationMessage, nextMessageRecord); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java index f8d566116..eeb369cb9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java @@ -29,6 +29,7 @@ import android.view.View; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; @@ -185,14 +186,14 @@ public final class ConversationListItem extends RelativeLayout this.subjectView.setTypeface(thread.isRead() ? LIGHT_TYPEFACE : BOLD_TYPEFACE); this.subjectView.setTextColor(thread.isRead() ? ContextCompat.getColor(getContext(), R.color.signal_text_secondary) - : ContextCompat.getColor(getContext(), R.color.signal_inverse_primary)); + : ContextCompat.getColor(getContext(), R.color.signal_text_primary)); if (thread.getDate() > 0) { CharSequence date = DateUtils.getBriefRelativeTimeSpanString(getContext(), locale, thread.getDate()); dateView.setText(date); dateView.setTypeface(thread.isRead() ? LIGHT_TYPEFACE : BOLD_TYPEFACE); - dateView.setTextColor(thread.isRead() ? ContextCompat.getColor(getContext(), R.color.signal_icon_tint_secondary) - : ContextCompat.getColor(getContext(), R.color.signal_inverse_primary)); + dateView.setTextColor(thread.isRead() ? ContextCompat.getColor(getContext(), R.color.signal_text_secondary) + : ContextCompat.getColor(getContext(), R.color.signal_text_primary)); } if (thread.isArchived()) { @@ -426,46 +427,49 @@ public final class ConversationListItem extends RelativeLayout } private static @NonNull LiveData getThreadDisplayBody(@NonNull Context context, @NonNull ThreadRecord thread) { + int defaultTint = thread.isRead() ? ContextCompat.getColor(context, R.color.signal_text_secondary) + : ContextCompat.getColor(context, R.color.signal_text_primary); + if (!thread.isMessageRequestAccepted()) { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_message_request)); + return emphasisAdded(context, context.getString(R.string.ThreadRecord_message_request), defaultTint); } else if (SmsDatabase.Types.isGroupUpdate(thread.getType())) { if (thread.getRecipient().isPushV2Group()) { - return emphasisAdded(context, MessageRecord.getGv2ChangeDescription(context, thread.getBody())); + return emphasisAdded(context, MessageRecord.getGv2ChangeDescription(context, thread.getBody()), defaultTint); } else { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_group_updated)); + return emphasisAdded(context, context.getString(R.string.ThreadRecord_group_updated), defaultTint); } } else if (SmsDatabase.Types.isGroupQuit(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_left_the_group)); + return emphasisAdded(context, context.getString(R.string.ThreadRecord_left_the_group), defaultTint); } else if (SmsDatabase.Types.isKeyExchangeType(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.ConversationListItem_key_exchange_message)); + return emphasisAdded(context, context.getString(R.string.ConversationListItem_key_exchange_message), defaultTint); } else if (SmsDatabase.Types.isFailedDecryptType(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.MessageDisplayHelper_bad_encrypted_message)); + return emphasisAdded(context, context.getString(R.string.MessageDisplayHelper_bad_encrypted_message), defaultTint); } else if (SmsDatabase.Types.isNoRemoteSessionType(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.MessageDisplayHelper_message_encrypted_for_non_existing_session)); + return emphasisAdded(context, context.getString(R.string.MessageDisplayHelper_message_encrypted_for_non_existing_session), defaultTint); } else if (SmsDatabase.Types.isEndSessionType(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_secure_session_reset)); + return emphasisAdded(context, context.getString(R.string.ThreadRecord_secure_session_reset), defaultTint); } else if (MmsSmsColumns.Types.isLegacyType(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.MessageRecord_message_encrypted_with_a_legacy_protocol_version_that_is_no_longer_supported)); + return emphasisAdded(context, context.getString(R.string.MessageRecord_message_encrypted_with_a_legacy_protocol_version_that_is_no_longer_supported), defaultTint); } else if (MmsSmsColumns.Types.isDraftMessageType(thread.getType())) { String draftText = context.getString(R.string.ThreadRecord_draft); - return emphasisAdded(context, draftText + " " + thread.getBody()); + return emphasisAdded(context, draftText + " " + thread.getBody(), defaultTint); } else if (SmsDatabase.Types.isOutgoingAudioCall(thread.getType()) || SmsDatabase.Types.isOutgoingVideoCall(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_called)); + return emphasisAdded(context, context.getString(R.string.ThreadRecord_called), defaultTint); } else if (SmsDatabase.Types.isIncomingAudioCall(thread.getType()) || SmsDatabase.Types.isIncomingVideoCall(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_called_you)); + return emphasisAdded(context, context.getString(R.string.ThreadRecord_called_you), defaultTint); } else if (SmsDatabase.Types.isMissedAudioCall(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_missed_audio_call)); + return emphasisAdded(context, context.getString(R.string.ThreadRecord_missed_audio_call), defaultTint); } else if (SmsDatabase.Types.isMissedVideoCall(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_missed_video_call)); + return emphasisAdded(context, context.getString(R.string.ThreadRecord_missed_video_call), defaultTint); } else if (SmsDatabase.Types.isJoinedType(thread.getType())) { return emphasisAdded(recipientToStringAsync(thread.getRecipient().getId(), r -> new SpannableString(context.getString(R.string.ThreadRecord_s_is_on_signal, r.getDisplayName(context))))); } else if (SmsDatabase.Types.isExpirationTimerUpdate(thread.getType())) { int seconds = (int)(thread.getExpiresIn() / 1000); if (seconds <= 0) { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_disappearing_messages_disabled)); + return emphasisAdded(context, context.getString(R.string.ThreadRecord_disappearing_messages_disabled), defaultTint); } String time = ExpirationUtil.getExpirationDisplayValue(context, seconds); - return emphasisAdded(context, context.getString(R.string.ThreadRecord_disappearing_message_time_updated_to_s, time)); + return emphasisAdded(context, context.getString(R.string.ThreadRecord_disappearing_message_time_updated_to_s, time), defaultTint); } else if (SmsDatabase.Types.isIdentityUpdate(thread.getType())) { return emphasisAdded(recipientToStringAsync(thread.getRecipient().getId(), r -> { if (r.isGroup()) { @@ -475,19 +479,19 @@ public final class ConversationListItem extends RelativeLayout } })); } else if (SmsDatabase.Types.isIdentityVerified(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_you_marked_verified)); + return emphasisAdded(context, context.getString(R.string.ThreadRecord_you_marked_verified), defaultTint); } else if (SmsDatabase.Types.isIdentityDefault(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_you_marked_unverified)); + return emphasisAdded(context, context.getString(R.string.ThreadRecord_you_marked_unverified), defaultTint); } else if (SmsDatabase.Types.isUnsupportedMessageType(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_message_could_not_be_processed)); + return emphasisAdded(context, context.getString(R.string.ThreadRecord_message_could_not_be_processed), defaultTint); } else if (SmsDatabase.Types.isProfileChange(thread.getType())) { - return emphasisAdded(context, ""); + return emphasisAdded(context, "", defaultTint); } else { ThreadDatabase.Extra extra = thread.getExtra(); if (extra != null && extra.isViewOnce()) { - return emphasisAdded(context, getViewOnceDescription(context, thread.getContentType())); + return emphasisAdded(context, getViewOnceDescription(context, thread.getContentType()), defaultTint); } else if (extra != null && extra.isRemoteDelete()) { - return emphasisAdded(context, context.getString(thread.isOutgoing() ? R.string.ThreadRecord_you_deleted_this_message : R.string.ThreadRecord_this_message_was_deleted)); + return emphasisAdded(context, context.getString(thread.isOutgoing() ? R.string.ThreadRecord_you_deleted_this_message : R.string.ThreadRecord_this_message_was_deleted), defaultTint); } else { return LiveDataUtil.just(new SpannableString(removeNewlines(thread.getBody()))); } @@ -506,12 +510,12 @@ public final class ConversationListItem extends RelativeLayout } } - private static @NonNull LiveData emphasisAdded(@NonNull Context context, @NonNull String string) { - return emphasisAdded(context, UpdateDescription.staticDescription(string, 0)); + private static @NonNull LiveData emphasisAdded(@NonNull Context context, @NonNull String string, @ColorInt int defaultTint) { + return emphasisAdded(context, UpdateDescription.staticDescription(string, 0), defaultTint); } - private static @NonNull LiveData emphasisAdded(@NonNull Context context, @NonNull UpdateDescription description) { - return emphasisAdded(LiveUpdateMessage.fromMessageDescription(context, description)); + private static @NonNull LiveData emphasisAdded(@NonNull Context context, @NonNull UpdateDescription description, @ColorInt int defaultTint) { + return emphasisAdded(LiveUpdateMessage.fromMessageDescription(context, description, defaultTint)); } private static @NonNull LiveData emphasisAdded(@NonNull LiveData description) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/LiveUpdateMessage.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/LiveUpdateMessage.java index 45437a6a6..22200dac4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/LiveUpdateMessage.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/LiveUpdateMessage.java @@ -8,6 +8,7 @@ import android.text.SpannableString; import android.text.SpannableStringBuilder; import androidx.annotation.AnyThread; +import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.lifecycle.LiveData; @@ -32,9 +33,9 @@ public final class LiveUpdateMessage { * recreates the string asynchronously when they change. */ @AnyThread - public static LiveData fromMessageDescription(@NonNull Context context, @NonNull UpdateDescription updateDescription) { + public static LiveData fromMessageDescription(@NonNull Context context, @NonNull UpdateDescription updateDescription, @ColorInt int defaultTint) { if (updateDescription.isStringStatic()) { - return LiveDataUtil.just(toSpannable(context, updateDescription, updateDescription.getStaticString())); + return LiveDataUtil.just(toSpannable(context, updateDescription, updateDescription.getStaticString(), defaultTint)); } List> allMentionedRecipients = Stream.of(updateDescription.getMentioned()) @@ -44,7 +45,7 @@ public final class LiveUpdateMessage { LiveData mentionedRecipientChangeStream = allMentionedRecipients.isEmpty() ? LiveDataUtil.just(new Object()) : LiveDataUtil.merge(allMentionedRecipients); - return LiveDataUtil.mapAsync(mentionedRecipientChangeStream, event -> toSpannable(context, updateDescription, updateDescription.getString())); + return LiveDataUtil.mapAsync(mentionedRecipientChangeStream, event -> toSpannable(context, updateDescription, updateDescription.getString(), defaultTint)); } /** @@ -56,13 +57,13 @@ public final class LiveUpdateMessage { return LiveDataUtil.mapAsync(Recipient.live(recipientId).getLiveData(), createStringInBackground); } - private static @NonNull Spannable toSpannable(@NonNull Context context, @NonNull UpdateDescription updateDescription, @NonNull String string) { + private static @NonNull Spannable toSpannable(@NonNull Context context, @NonNull UpdateDescription updateDescription, @NonNull String string, @ColorInt int defaultTint) { boolean isDarkTheme = ThemeUtil.isDarkTheme(context); int drawableResource = updateDescription.getIconResource(); int tint = isDarkTheme ? updateDescription.getDarkTint() : updateDescription.getLightTint(); if (tint == 0) { - tint = ContextCompat.getColor(context, R.color.conversation_item_update_text_color); + tint = defaultTint; } if (drawableResource == 0) {