1package eu.siacs.conversations.ui;
2
3import android.view.View;
4import android.view.ViewGroup;
5import android.util.TypedValue;
6
7import com.google.android.material.chip.Chip;
8import com.google.android.material.chip.ChipGroup;
9import com.google.android.material.color.MaterialColors;
10import com.google.common.collect.Collections2;
11import com.google.common.collect.ImmutableSet;
12
13import eu.siacs.conversations.R;
14import eu.siacs.conversations.entities.Reaction;
15
16import java.util.Collection;
17import java.util.List;
18import java.util.Locale;
19import java.util.Map;
20import java.util.function.Consumer;
21
22public class BindingAdapters {
23
24 public static void setReactionsOnReceived(
25 final ChipGroup chipGroup,
26 final Reaction.Aggregated reactions,
27 final Consumer<Collection<String>> onModifiedReactions,
28 final Runnable addReaction) {
29 setReactions(chipGroup, reactions, true, onModifiedReactions, addReaction);
30 }
31
32 public static void setReactionsOnSent(
33 final ChipGroup chipGroup,
34 final Reaction.Aggregated reactions,
35 final Consumer<Collection<String>> onModifiedReactions) {
36 setReactions(chipGroup, reactions, false, onModifiedReactions, null);
37 }
38
39 private static void setReactions(
40 final ChipGroup chipGroup,
41 final Reaction.Aggregated aggregated,
42 final boolean onReceived,
43 final Consumer<Collection<String>> onModifiedReactions,
44 final Runnable addReaction) {
45 final var context = chipGroup.getContext();
46 final var size = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 35, context.getResources().getDisplayMetrics());
47 final var corner = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 35, context.getResources().getDisplayMetrics());
48 final var layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, size);
49 final List<Map.Entry<String, Integer>> reactions = aggregated.reactions;
50 if (reactions == null || reactions.isEmpty()) {
51 chipGroup.setVisibility(View.GONE);
52 } else {
53 chipGroup.removeAllViews();
54 chipGroup.setVisibility(View.VISIBLE);
55 for (final Map.Entry<String, Integer> reaction : reactions) {
56 final var emoji = reaction.getKey();
57 final var count = reaction.getValue();
58 final Chip chip = new Chip(chipGroup.getContext());
59 //chip.setEnsureMinTouchTargetSize(false);
60 chip.setChipMinHeight(size-32.0f);
61 chip.ensureAccessibleTouchTarget(size);
62 chip.setChipStartPadding(0.0f);
63 chip.setChipEndPadding(0.0f);
64 chip.setChipCornerRadius(corner);
65 chip.setLayoutParams(layoutParams);
66 if (count == 1) {
67 chip.setText(emoji);
68 } else {
69 chip.setText(String.format(Locale.ENGLISH, "%s %d", emoji, count));
70 }
71 final boolean oneOfOurs = aggregated.ourReactions.contains(emoji);
72 // received = surface; sent = surface high matches bubbles
73 if (oneOfOurs) {
74 chip.setChipBackgroundColor(
75 MaterialColors.getColorStateListOrNull(
76 context,
77 com.google.android.material.R.attr
78 .colorSurfaceContainerHighest));
79 } else {
80 chip.setChipBackgroundColor(
81 MaterialColors.getColorStateListOrNull(
82 context,
83 com.google.android.material.R.attr.colorSurfaceContainerLow));
84 }
85 chip.setOnClickListener(
86 v -> {
87 if (oneOfOurs) {
88 onModifiedReactions.accept(
89 ImmutableSet.copyOf(
90 Collections2.filter(
91 aggregated.ourReactions,
92 r -> !r.equals(emoji))));
93 } else {
94 onModifiedReactions.accept(
95 new ImmutableSet.Builder<String>()
96 .addAll(aggregated.ourReactions)
97 .add(emoji)
98 .build());
99 }
100 });
101 chipGroup.addView(chip);
102 }
103 if (addReaction != null) {
104 final Chip chip = new Chip(chipGroup.getContext());
105 chip.setChipMinHeight(size-32.0f);
106 chip.ensureAccessibleTouchTarget(size);
107 chip.setLayoutParams(layoutParams);
108 chip.setChipCornerRadius(corner);
109 chip.setChipIconResource(R.drawable.ic_add_reaction_24dp);
110 //chip.setChipStrokeColor(
111 // MaterialColors.getColorStateListOrNull(
112 // chipGroup.getContext(),
113 // com.google.android.material.R.attr.colorTertiary));
114 chip.setChipBackgroundColor(
115 MaterialColors.getColorStateListOrNull(
116 chipGroup.getContext(),
117 com.google.android.material.R.attr.colorSurfaceContainerLow));
118 chip.setChipIconTint(
119 MaterialColors.getColorStateListOrNull(
120 chipGroup.getContext(),
121 com.google.android.material.R.attr.colorOnSurface));
122 //chip.setEnsureMinTouchTargetSize(false);
123 chip.setTextEndPadding(0.0f);
124 chip.setTextStartPadding(0.0f);
125 chip.setOnClickListener(v -> addReaction.run());
126 chipGroup.addView(chip);
127 }
128 }
129 }
130}