From 835ef02872e77bae092bbecd7a7746cf2f91d478 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Sun, 2 Feb 2020 00:15:59 -0500 Subject: [PATCH] Add an 'All' tab to reaction details. --- .../reactions/ReactionEmojiCountAdapter.java | 57 ++++++++++++------- .../reactions/ReactionRecipientsAdapter.java | 18 +++--- .../ReactionsBottomSheetDialogFragment.java | 2 +- .../reactions/ReactionsViewModel.java | 9 +-- ...ottom_sheet_dialog_fragment_emoji_item.xml | 7 ++- ...m_sheet_dialog_fragment_recipient_item.xml | 23 +++++++- app/src/main/res/layout/reactions_pill.xml | 6 +- app/src/main/res/values/strings.xml | 3 + 8 files changed, 84 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionEmojiCountAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionEmojiCountAdapter.java index b8e5389abc..1f52392a9c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionEmojiCountAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionEmojiCountAdapter.java @@ -7,8 +7,11 @@ import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; +import com.annimon.stream.Stream; + import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.emoji.EmojiTextView; import org.thoughtcrime.securesms.util.ThemeUtil; @@ -19,6 +22,7 @@ import java.util.List; final class ReactionEmojiCountAdapter extends RecyclerView.Adapter { private List emojiCountList = Collections.emptyList(); + private int totalCount = 0; private int selectedPosition = -1; private final OnEmojiCountSelectedListener onEmojiCountSelectedListener; @@ -28,9 +32,10 @@ final class ReactionEmojiCountAdapter extends RecyclerView.Adapter newEmojiCount) { - if (selectedPosition != -1) { - EmojiCount oldSelection = emojiCountList.get(selectedPosition); - int newPosition = -1; + if (selectedPosition != -1 && selectedPosition != 0) { + int emojiPosition = selectedPosition - 1; + EmojiCount oldSelection = emojiCountList.get(emojiPosition); + int newPosition = -1; for (int i = 0; i < newEmojiCount.size(); i++) { if (newEmojiCount.get(i).getEmoji().equals(oldSelection.getEmoji())) { @@ -41,17 +46,19 @@ final class ReactionEmojiCountAdapter extends RecyclerView.Adapter sum + e.getCount()); + notifyDataSetChanged(); } @@ -59,7 +66,7 @@ final class ReactionEmojiCountAdapter extends RecyclerView.Adapter { if (position != -1 && position != selectedPosition) { - onEmojiCountSelectedListener.onSelected(emojiCountList.get(position)); + onEmojiCountSelectedListener.onSelected(position == 0 ? null : emojiCountList.get(position - 1).getEmoji()); int oldPosition = selectedPosition; selectedPosition = position; @@ -72,33 +79,44 @@ final class ReactionEmojiCountAdapter extends RecyclerView.Adapter onClickListener.onClick(getAdapterPosition())); } - void bind(@NonNull EmojiCount emojiCount, int selectedPosition) { - emojiView.setText(emojiCount.getEmoji()); - countView.setText(String.valueOf(emojiCount.getCount())); - itemView.setBackground(getAdapterPosition() == selectedPosition ? selected : null); + void bind(@Nullable String emoji, int count, boolean selected) { + if (emoji != null) { + emojiView.setVisibility(View.VISIBLE); + emojiView.setText(emoji); + countView.setText(String.valueOf(count)); + } else { + emojiView.setVisibility(View.GONE); + countView.setText(itemView.getContext().getString(R.string.ReactionsBottomSheetDialogFragment_all, count)); + } + itemView.setBackground(selected ? selectedBackground : null); } } @@ -107,7 +125,6 @@ final class ReactionEmojiCountAdapter extends RecyclerView.Adapter { - private List data = Collections.emptyList(); + private List data = Collections.emptyList(); - public void updateData(List newData) { + public void updateData(List newData) { data = newData; notifyDataSetChanged(); } @@ -48,21 +49,24 @@ final class ReactionRecipientsAdapter extends RecyclerView.Adapter viewModel.setFilterEmoji(emojiCount.getEmoji()))); + emojiCountAdapter = new ReactionEmojiCountAdapter((emoji -> viewModel.setFilterEmoji(emoji))); emojiRecyclerView.setAdapter(emojiCountAdapter); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsViewModel.java index 710f3f697a..13cc681e53 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsViewModel.java @@ -9,9 +9,6 @@ import androidx.lifecycle.ViewModelProvider; import com.annimon.stream.Stream; -import org.thoughtcrime.securesms.recipients.Recipient; - -import java.util.Comparator; import java.util.List; import java.util.Map; @@ -26,12 +23,12 @@ public class ReactionsViewModel extends ViewModel { this.repository = repository; } - public @NonNull LiveData> getRecipients() { + public @NonNull LiveData> getRecipients() { return Transformations.switchMap(filterEmoji, emoji -> Transformations.map(repository.getReactions(), reactions -> Stream.of(reactions) - .filter(reaction -> reaction.getEmoji().equals(emoji)) - .map(Reaction::getSender).toList())); + .filter(reaction -> emoji == null || reaction.getEmoji().equals(emoji)) + .toList())); } public @NonNull LiveData> getEmojiCounts() { diff --git a/app/src/main/res/layout/reactions_bottom_sheet_dialog_fragment_emoji_item.xml b/app/src/main/res/layout/reactions_bottom_sheet_dialog_fragment_emoji_item.xml index 31f83dea5b..0fb6b51f66 100644 --- a/app/src/main/res/layout/reactions_bottom_sheet_dialog_fragment_emoji_item.xml +++ b/app/src/main/res/layout/reactions_bottom_sheet_dialog_fragment_emoji_item.xml @@ -5,7 +5,7 @@ android:layout_height="36dp" android:layout_marginStart="6dp" android:layout_marginTop="8dp" - android:layout_marginEnd="6dp" + android:layout_marginEnd="4dp" android:layout_marginBottom="8dp" android:gravity="center" android:orientation="horizontal"> @@ -14,6 +14,7 @@ android:id="@+id/reactions_bottom_view_emoji_item_emoji" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginEnd="2dp" android:gravity="center" android:includeFontPadding="false" android:textSize="22dp" @@ -25,12 +26,14 @@ android:id="@+id/reactions_bottom_view_emoji_item_text" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="4dp" + android:layout_marginStart="2dp" + android:layout_marginEnd="2dp" android:gravity="center" android:includeFontPadding="true" android:textColor="?title_text_color_primary" android:textSize="14dp" android:textStyle="bold" + android:textAllCaps="true" tools:ignore="SpUsage" tools:text="24" /> diff --git a/app/src/main/res/layout/reactions_bottom_sheet_dialog_fragment_recipient_item.xml b/app/src/main/res/layout/reactions_bottom_sheet_dialog_fragment_recipient_item.xml index dbe24e59f1..e0b416a8fb 100644 --- a/app/src/main/res/layout/reactions_bottom_sheet_dialog_fragment_recipient_item.xml +++ b/app/src/main/res/layout/reactions_bottom_sheet_dialog_fragment_recipient_item.xml @@ -1,5 +1,6 @@ - + + + \ No newline at end of file diff --git a/app/src/main/res/layout/reactions_pill.xml b/app/src/main/res/layout/reactions_pill.xml index ecc1417647..69fdb87116 100644 --- a/app/src/main/res/layout/reactions_pill.xml +++ b/app/src/main/res/layout/reactions_pill.xml @@ -15,7 +15,8 @@ android:id="@+id/reactions_pill_emoji" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textSize="16dp"/> + android:textSize="16dp" + tools:ignore="SpUsage" /> + tools:text="23" + tools:ignore="SpUsage" /> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 24e4fc9381..7de46fce9e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -667,6 +667,9 @@ Later Whoops, the Play Store app does not appear to be installed on your device. + + All %1$d + +%1$d