mirror of
https://github.com/oxen-io/session-android.git
synced 2025-12-30 23:36:32 +00:00
Add an 'All' tab to reaction details.
This commit is contained in:
@@ -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<ReactionEmojiCountAdapter.ViewHolder> {
|
||||
|
||||
private List<EmojiCount> 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<ReactionEmoji
|
||||
}
|
||||
|
||||
void updateData(@NonNull List<EmojiCount> 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<ReactionEmoji
|
||||
|
||||
if (newPosition == -1 && !newEmojiCount.isEmpty()) {
|
||||
selectedPosition = 0;
|
||||
onEmojiCountSelectedListener.onSelected(newEmojiCount.get(0));
|
||||
onEmojiCountSelectedListener.onSelected(null);
|
||||
} else {
|
||||
selectedPosition = newPosition;
|
||||
selectedPosition = newPosition + 1;
|
||||
}
|
||||
} else if (!newEmojiCount.isEmpty()) {
|
||||
selectedPosition = 0;
|
||||
onEmojiCountSelectedListener.onSelected(newEmojiCount.get(0));
|
||||
onEmojiCountSelectedListener.onSelected(null);
|
||||
}
|
||||
|
||||
this.emojiCountList = newEmojiCount;
|
||||
|
||||
this.totalCount = Stream.of(emojiCountList).reduce(0, (sum, e) -> sum + e.getCount());
|
||||
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@@ -59,7 +66,7 @@ final class ReactionEmojiCountAdapter extends RecyclerView.Adapter<ReactionEmoji
|
||||
public @NonNull ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.reactions_bottom_sheet_dialog_fragment_emoji_item, parent, false), position -> {
|
||||
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<ReactionEmoji
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
|
||||
holder.bind(emojiCountList.get(position), selectedPosition);
|
||||
if (position == 0) {
|
||||
holder.bind(null, totalCount, selectedPosition == position);
|
||||
} else {
|
||||
EmojiCount item = emojiCountList.get(position - 1);
|
||||
holder.bind(item.getEmoji(), item.getCount(), selectedPosition == position);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return emojiCountList.size();
|
||||
return 1 + emojiCountList.size();
|
||||
}
|
||||
|
||||
static final class ViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
private final Drawable selected;
|
||||
private final Drawable selectedBackground;
|
||||
private final EmojiTextView emojiView;
|
||||
private final TextView countView;
|
||||
|
||||
public ViewHolder(@NonNull View itemView, @NonNull OnViewHolderClickListener onClickListener) {
|
||||
ViewHolder(@NonNull View itemView, @NonNull OnViewHolderClickListener onClickListener) {
|
||||
super(itemView);
|
||||
emojiView = itemView.findViewById(R.id.reactions_bottom_view_emoji_item_emoji);
|
||||
countView = itemView.findViewById(R.id.reactions_bottom_view_emoji_item_text);
|
||||
selected = ThemeUtil.getThemedDrawable(itemView.getContext(), R.attr.reactions_bottom_dialog_fragment_emoji_selected);
|
||||
emojiView = itemView.findViewById(R.id.reactions_bottom_view_emoji_item_emoji);
|
||||
countView = itemView.findViewById(R.id.reactions_bottom_view_emoji_item_text );
|
||||
selectedBackground = ThemeUtil.getThemedDrawable(itemView.getContext(), R.attr.reactions_bottom_dialog_fragment_emoji_selected);
|
||||
|
||||
itemView.setOnClickListener(v -> 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<ReactionEmoji
|
||||
}
|
||||
|
||||
interface OnEmojiCountSelectedListener {
|
||||
void onSelected(@NonNull EmojiCount emojiCount);
|
||||
void onSelected(@Nullable String emoji);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.components.AvatarImageView;
|
||||
import org.thoughtcrime.securesms.mms.GlideApp;
|
||||
import org.thoughtcrime.securesms.reactions.ReactionsLoader.Reaction;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
import org.thoughtcrime.securesms.util.AvatarUtil;
|
||||
|
||||
@@ -19,9 +20,9 @@ import java.util.List;
|
||||
|
||||
final class ReactionRecipientsAdapter extends RecyclerView.Adapter<ReactionRecipientsAdapter.ViewHolder> {
|
||||
|
||||
private List<Recipient> data = Collections.emptyList();
|
||||
private List<Reaction> data = Collections.emptyList();
|
||||
|
||||
public void updateData(List<Recipient> newData) {
|
||||
public void updateData(List<Reaction> newData) {
|
||||
data = newData;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
@@ -48,21 +49,24 @@ final class ReactionRecipientsAdapter extends RecyclerView.Adapter<ReactionRecip
|
||||
|
||||
private final AvatarImageView avatar;
|
||||
private final TextView recipient;
|
||||
private final TextView emoji;
|
||||
|
||||
public ViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
|
||||
avatar = itemView.findViewById(R.id.reactions_bottom_view_recipient_avatar);
|
||||
recipient = itemView.findViewById(R.id.reactions_bottom_view_recipient_name);
|
||||
emoji = itemView.findViewById(R.id.reactions_bottom_view_recipient_emoji);
|
||||
}
|
||||
|
||||
void bind(Recipient recipient) {
|
||||
this.recipient.setText(recipient.getDisplayName(itemView.getContext()));
|
||||
void bind(@NonNull Reaction reaction) {
|
||||
this.recipient.setText(reaction.getSender().getDisplayName(itemView.getContext()));
|
||||
this.emoji.setText(reaction.getEmoji());
|
||||
|
||||
if (recipient.equals(Recipient.self())) {
|
||||
AvatarUtil.loadIconIntoImageView(recipient, avatar);
|
||||
if (reaction.getSender().equals(Recipient.self())) {
|
||||
AvatarUtil.loadIconIntoImageView(reaction.getSender(), avatar);
|
||||
} else {
|
||||
this.avatar.setAvatar(GlideApp.with(avatar), recipient, false);
|
||||
this.avatar.setAvatar(GlideApp.with(avatar), reaction.getSender(), false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,7 +88,7 @@ public final class ReactionsBottomSheetDialogFragment extends BottomSheetDialogF
|
||||
}
|
||||
|
||||
private void setUpEmojiRecyclerView() {
|
||||
emojiCountAdapter = new ReactionEmojiCountAdapter((emojiCount -> viewModel.setFilterEmoji(emojiCount.getEmoji())));
|
||||
emojiCountAdapter = new ReactionEmojiCountAdapter((emoji -> viewModel.setFilterEmoji(emoji)));
|
||||
emojiRecyclerView.setAdapter(emojiCountAdapter);
|
||||
}
|
||||
|
||||
|
||||
@@ -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<List<Recipient>> getRecipients() {
|
||||
public @NonNull LiveData<List<Reaction>> 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<List<EmojiCount>> getEmojiCounts() {
|
||||
|
||||
Reference in New Issue
Block a user