BindingAdapters.java

  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}