diff --git a/src/main/java/org/thoughtcrime/securesms/reactions/ReactionRecipientItem.java b/src/main/java/org/thoughtcrime/securesms/reactions/ReactionRecipientItem.java index e2e8d7b5d..872c73681 100644 --- a/src/main/java/org/thoughtcrime/securesms/reactions/ReactionRecipientItem.java +++ b/src/main/java/org/thoughtcrime/securesms/reactions/ReactionRecipientItem.java @@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.reactions; import android.content.Context; import android.util.AttributeSet; +import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; @@ -23,6 +24,7 @@ public class ReactionRecipientItem extends LinearLayout { private TextView reactionView; private int contactId; + private String reaction; public ReactionRecipientItem(Context context) { super(context); @@ -44,6 +46,7 @@ public class ReactionRecipientItem extends LinearLayout { public void bind(@NonNull GlideRequests glideRequests, int contactId, String reaction) { this.contactId = contactId; + this.reaction = reaction; DcContact dcContact = DcHelper.getContext(getContext()).getContact(contactId); Recipient recipient = new Recipient(getContext(), dcContact); this.contactPhotoImage.setAvatar(glideRequests, recipient, false); @@ -58,4 +61,12 @@ public class ReactionRecipientItem extends LinearLayout { public int getContactId() { return contactId; } + + public String getReaction() { + return reaction; + } + + public View getReactionView() { + return reactionView; + } } diff --git a/src/main/java/org/thoughtcrime/securesms/reactions/ReactionRecipientsAdapter.java b/src/main/java/org/thoughtcrime/securesms/reactions/ReactionRecipientsAdapter.java index d86cf473e..4c6c6de5f 100644 --- a/src/main/java/org/thoughtcrime/securesms/reactions/ReactionRecipientsAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/reactions/ReactionRecipientsAdapter.java @@ -47,6 +47,11 @@ public class ReactionRecipientsAdapter extends RecyclerView.Adapter clickListener.onItemClick(getView()); } }); + ((ReactionRecipientItem) itemView).getReactionView().setOnClickListener(view -> { + if (clickListener != null) { + clickListener.onReactionClick(getView()); + } + }); } public ReactionRecipientItem getView() { @@ -93,6 +98,7 @@ public class ReactionRecipientsAdapter extends RecyclerView.Adapter public interface ItemClickListener { void onItemClick(ReactionRecipientItem item); + void onReactionClick(ReactionRecipientItem item); } public void changeData(ArrayList> contactsReactions) { diff --git a/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsDetailsFragment.java b/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsDetailsFragment.java index 5d098cd16..5de76bbb2 100644 --- a/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsDetailsFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsDetailsFragment.java @@ -17,6 +17,7 @@ import com.b44t.messenger.DcContact; import com.b44t.messenger.DcContext; import com.b44t.messenger.DcEvent; import com.b44t.messenger.rpc.Reactions; +import com.b44t.messenger.rpc.Rpc; import com.b44t.messenger.rpc.RpcException; import org.thoughtcrime.securesms.ProfileActivity; @@ -114,6 +115,39 @@ public class ReactionsDetailsFragment extends DialogFragment implements DcEventC requireContext().startActivity(intent); } + private String getSelfReaction(Rpc rpc, int accId) { + String result = null; + try { + final Reactions reactions = rpc.getMsgReactions(accId, msgId); + if (reactions != null) { + final Map reactionsByContact = reactions.getReactionsByContact(); + final String [] selfReactions = reactionsByContact.get(DcContact.DC_CONTACT_ID_SELF); + if (selfReactions != null && selfReactions.length > 0) { + result = selfReactions[0]; + } + } + } catch(RpcException e) { + e.printStackTrace(); + } + return result; + } + + private void sendReaction(final String reaction) { + Rpc rpc = DcHelper.getRpc(requireActivity()); + DcContext dcContext = DcHelper.getContext(requireActivity()); + int accId = dcContext.getAccountId(); + + try { + if (reaction == null || reaction.equals(getSelfReaction(rpc, accId))) { + rpc.sendReaction(accId, msgId, ""); + } else { + rpc.sendReaction(accId, msgId, reaction); + } + } catch(Exception e) { + e.printStackTrace(); + } + } + private class ListClickListener implements ReactionRecipientsAdapter.ItemClickListener { @Override @@ -124,6 +158,12 @@ public class ReactionsDetailsFragment extends DialogFragment implements DcEventC openConversation(contactId); } } + + @Override + public void onReactionClick(ReactionRecipientItem item) { + sendReaction(item.getReaction()); + ReactionsDetailsFragment.this.dismiss(); + } } } diff --git a/src/main/res/layout/reaction_recipient_item.xml b/src/main/res/layout/reaction_recipient_item.xml index 28af8a785..f121beaf6 100644 --- a/src/main/res/layout/reaction_recipient_item.xml +++ b/src/main/res/layout/reaction_recipient_item.xml @@ -50,8 +50,9 @@