From 96dd77364e82dd118d6b540192643e80e96e9540 Mon Sep 17 00:00:00 2001 From: Michelle Tang Date: Tue, 15 Oct 2024 13:30:15 -0700 Subject: [PATCH] Update chat folder display list. --- .../securesms/components/FromTextView.java | 25 ++++++++++--- .../ConversationListAdapter.java | 37 +++++++++++++++---- .../ConversationListDataSource.java | 8 ++-- .../ConversationListFragment.java | 10 ++++- .../ConversationListItem.java | 20 ++++------ .../ConversationListSearchAdapter.kt | 3 +- .../conversationlist/model/Conversation.java | 1 + app/src/main/res/drawable/symbol_pin_16.xml | 10 +++++ .../conversation_list_item_folder_empty.xml | 25 +++++++++++++ .../layout/conversation_list_item_view.xml | 12 ------ app/src/main/res/values/strings.xml | 4 ++ 11 files changed, 110 insertions(+), 45 deletions(-) create mode 100644 app/src/main/res/drawable/symbol_pin_16.xml create mode 100644 app/src/main/res/layout/conversation_list_item_folder_empty.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java b/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java index b254011987..63eefb8ee6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java @@ -44,6 +44,10 @@ public class FromTextView extends SimpleEmojiTextView { } public void setText(Recipient recipient, @Nullable CharSequence fromString, @Nullable CharSequence suffix, boolean asThread, boolean showSelfAsYou) { + setText(recipient, fromString, suffix, asThread, showSelfAsYou, false); + } + + public void setText(Recipient recipient, @Nullable CharSequence fromString, @Nullable CharSequence suffix, boolean asThread, boolean showSelfAsYou, boolean isPinned) { SpannableStringBuilder builder = new SpannableStringBuilder(); if (asThread && recipient.isSelf() && showSelfAsYou) { @@ -66,25 +70,34 @@ public class FromTextView extends SimpleEmojiTextView { .append(SpanUtil.buildCenteredImageSpan(official)); } + if (recipient.isMuted()) { + builder.append(" ") + .append(SpanUtil.buildCenteredImageSpan(getMuted())); + } + setText(builder); if (recipient.isBlocked()) setCompoundDrawablesRelativeWithIntrinsicBounds(getBlocked(), null, null, null); - else if (recipient.isMuted()) setCompoundDrawablesRelativeWithIntrinsicBounds(getMuted(), null, null, null); + else if (isPinned) setCompoundDrawablesRelativeWithIntrinsicBounds(getPinned(), null, null, null); else setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0); } private Drawable getBlocked() { - return getDrawable(R.drawable.symbol_block_16); + return getDrawable(R.drawable.symbol_block_16, R.color.signal_icon_tint_secondary); } private Drawable getMuted() { - return getDrawable(R.drawable.ic_bell_disabled_16); + return getDrawable(R.drawable.ic_bell_disabled_16, R.color.signal_icon_tint_secondary); } - private Drawable getDrawable(@DrawableRes int drawable) { + private Drawable getPinned() { + return getDrawable(R.drawable.symbol_pin_16, R.color.signal_colorOnSurface); + } + + private Drawable getDrawable(@DrawableRes int drawable, int colorRes) { Drawable mutedDrawable = ContextUtil.requireDrawable(getContext(), drawable); - mutedDrawable.setBounds(0, 0, ViewUtil.dpToPx(18), ViewUtil.dpToPx(18)); - DrawableUtil.tint(mutedDrawable, ContextCompat.getColor(getContext(), R.color.signal_icon_tint_secondary)); + mutedDrawable.setBounds(0, 0, ViewUtil.dpToPx(16), ViewUtil.dpToPx(16)); + DrawableUtil.tint(mutedDrawable, ContextCompat.getColor(getContext(), colorRes)); return mutedDrawable; } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListAdapter.java index 3e065e3430..17b29dfcf2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListAdapter.java @@ -38,6 +38,7 @@ class ConversationListAdapter extends ListAdapter typingSet = new HashSet<>(); + private final LifecycleOwner lifecycleOwner; + private final RequestManager requestManager; + private final OnConversationClickListener onConversationClickListener; + private final ClearFilterViewHolder.OnClearFilterClickListener onClearFilterClicked; + private final EmptyFolderViewHolder.OnFolderSettingsClickListener onFolderSettingsClicked; + private final Set typingSet = new HashSet<>(); - private PagingController pagingController; + private ConversationSet selectedConversations = new ConversationSet(); + private PagingController pagingController; protected ConversationListAdapter(@NonNull LifecycleOwner lifecycleOwner, @NonNull RequestManager requestManager, @NonNull OnConversationClickListener onConversationClickListener, - @NonNull ClearFilterViewHolder.OnClearFilterClickListener onClearFilterClicked) + @NonNull ClearFilterViewHolder.OnClearFilterClickListener onClearFilterClicked, + @NonNull EmptyFolderViewHolder.OnFolderSettingsClickListener onFolderSettingsClicked) { super(new ConversationDiffCallback()); @@ -65,6 +68,7 @@ class ConversationListAdapter extends ListAdapter listener.onFolderSettingsClick()); + } + + interface OnFolderSettingsClickListener { + void onFolderSettingsClick(); + } + } + interface OnConversationClickListener { void onConversationClick(@NonNull Conversation conversation); boolean onConversationLongClick(@NonNull Conversation conversation, @NonNull View view); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListDataSource.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListDataSource.java index 5d4181dd83..05e5bb2a04 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListDataSource.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListDataSource.java @@ -110,12 +110,14 @@ abstract class ConversationListDataSource implements PagedDataSource new CharacterStyle[] { new ForegroundColorSpan(ContextCompat.getColor(getContext(), R.color.signal_colorOnSurface)), SpanUtil.getBoldSpan() }; @@ -215,7 +214,7 @@ public final class ConversationListItem extends ConstraintLayout implements Bind @NonNull Set typingThreads, @NonNull ConversationSet selectedConversations) { - bindThread(lifecycleOwner, thread, glideRequests, locale, typingThreads, selectedConversations, null, false); + bindThread(lifecycleOwner, thread, glideRequests, locale, typingThreads, selectedConversations, null, false, true); } public void bindThread(@NonNull LifecycleOwner lifecycleOwner, @@ -225,7 +224,8 @@ public final class ConversationListItem extends ConstraintLayout implements Bind @NonNull Set typingThreads, @NonNull ConversationSet selectedConversations, @Nullable String highlightSubstring, - boolean appendSystemContactIcon) + boolean appendSystemContactIcon, + boolean showPinned) { this.threadId = thread.getThreadId(); this.requestManager = requestManager; @@ -250,9 +250,9 @@ public final class ConversationListItem extends ConstraintLayout implements Bind if (highlightSubstring != null) { String name = recipient.get().isSelf() ? getContext().getString(R.string.note_to_self) : recipient.get().getDisplayName(getContext()); - this.fromView.setText(recipient.get(), SearchUtil.getHighlightedSpan(locale, searchStyleFactory, name, highlightSubstring, SearchUtil.MATCH_ALL), suffix); + this.fromView.setText(recipient.get(), SearchUtil.getHighlightedSpan(locale, searchStyleFactory, name, highlightSubstring, SearchUtil.MATCH_ALL), suffix, true, false, showPinned && thread.isPinned()); } else { - this.fromView.setText(recipient.get(), suffix); + this.fromView.setText(recipient.get(), recipient.get().getDisplayName(getContext()), suffix, true, false, showPinned && thread.isPinned()); } this.typingThreads = typingThreads; @@ -281,12 +281,6 @@ public final class ConversationListItem extends ConstraintLayout implements Bind this.archivedView.setVisibility(View.GONE); } - if (thread.isPinned()) { - this.pinnedView.setVisibility(View.VISIBLE); - } else { - this.pinnedView.setVisibility(View.GONE); - } - setStatusIcons(thread); setSelectedConversations(selectedConversations); setBadgeFromRecipient(recipient.get()); @@ -570,9 +564,9 @@ public final class ConversationListItem extends ConstraintLayout implements Bind } else { name = recipient.getDisplayName(getContext()); } - fromView.setText(recipient, SearchUtil.getHighlightedSpan(locale, searchStyleFactory, new SpannableString(name), highlightSubstring, SearchUtil.MATCH_ALL), null, thread != null); + fromView.setText(recipient, SearchUtil.getHighlightedSpan(locale, searchStyleFactory, new SpannableString(name), highlightSubstring, SearchUtil.MATCH_ALL), null, thread != null, false, thread != null && thread.isPinned()); } else { - fromView.setText(recipient); + fromView.setText(recipient, recipient.getDisplayName(getContext()), null, true, false, thread != null && thread.isPinned()); } contactPhotoImage.setAvatar(requestManager, recipient, !batchMode, false); setBadgeFromRecipient(recipient); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter.kt index 17c48c4169..11b61bbd1f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter.kt @@ -121,7 +121,8 @@ class ConversationListSearchAdapter( emptySet(), ConversationSet(), model.thread.query, - true + true, + false ) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/model/Conversation.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/model/Conversation.java index 42b78e5030..cbf359b096 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/model/Conversation.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/model/Conversation.java @@ -45,6 +45,7 @@ public class Conversation { ARCHIVED_FOOTER, CONVERSATION_FILTER_FOOTER, CONVERSATION_FILTER_EMPTY, + CHAT_FOLDER_EMPTY, EMPTY } } diff --git a/app/src/main/res/drawable/symbol_pin_16.xml b/app/src/main/res/drawable/symbol_pin_16.xml new file mode 100644 index 0000000000..48110ef2f9 --- /dev/null +++ b/app/src/main/res/drawable/symbol_pin_16.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/conversation_list_item_folder_empty.xml b/app/src/main/res/layout/conversation_list_item_folder_empty.xml new file mode 100644 index 0000000000..672a73b953 --- /dev/null +++ b/app/src/main/res/layout/conversation_list_item_folder_empty.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/app/src/main/res/layout/conversation_list_item_view.xml b/app/src/main/res/layout/conversation_list_item_view.xml index f0dda73420..6d2a4182e5 100644 --- a/app/src/main/res/layout/conversation_list_item_view.xml +++ b/app/src/main/res/layout/conversation_list_item_view.xml @@ -194,18 +194,6 @@ android:textColor="@color/signal_colorSurface" tools:visibility="gone" /> - - New chat Open Camera No chats yet.\nGet started by messaging a friend. + + No chats to display + + Folder settings