diff --git a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt
index 9f5f39200..d0ba5800c 100644
--- a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt
+++ b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt
@@ -406,6 +406,27 @@ class ChatMessagesListAdapter(
totalSize -= itemSize
}
+ val reaction = chatMessage.ownReaction
+ if (reaction != null) {
+ when (reaction.body) {
+ AppUtils.getString(R.string.emoji_love) -> {
+ popupView.heartSelected = true
+ }
+ AppUtils.getString(R.string.emoji_laughing) -> {
+ popupView.laughingSelected = true
+ }
+ AppUtils.getString(R.string.emoji_surprised) -> {
+ popupView.surprisedSelected = true
+ }
+ AppUtils.getString(R.string.emoji_thumbs_up) -> {
+ popupView.thumbsUpSelected = true
+ }
+ AppUtils.getString(R.string.emoji_tear) -> {
+ popupView.cryingSelected = true
+ }
+ }
+ }
+
// When using WRAP_CONTENT instead of real size, fails to place the
// popup window above if not enough space is available below
val popupWindow = PopupWindow(
@@ -467,11 +488,21 @@ class ChatMessagesListAdapter(
private fun reactToMessage(reaction: String) {
val chatMessage = binding.data?.chatMessage
if (chatMessage != null) {
- Log.i(
- "[Chat Message Data] Reacting to message [$chatMessage] with [$reaction] emoji"
- )
- val reactionMessage = chatMessage.createReaction(reaction)
- reactionMessage.send()
+ val ownReaction = chatMessage.ownReaction
+ if (ownReaction != null && ownReaction.body == reaction) {
+ Log.i(
+ "[Chat Message Data] Removing our reaction to message [$chatMessage] (previously [$reaction])"
+ )
+ // Empty string means remove existing reaction
+ val reactionMessage = chatMessage.createReaction("")
+ reactionMessage.send()
+ } else {
+ Log.i(
+ "[Chat Message Data] Reacting to message [$chatMessage] with [$reaction] emoji"
+ )
+ val reactionMessage = chatMessage.createReaction(reaction)
+ reactionMessage.send()
+ }
}
}
diff --git a/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageData.kt b/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageData.kt
index 0f7f4eeff..f4d27b5dc 100644
--- a/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageData.kt
+++ b/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageData.kt
@@ -28,6 +28,7 @@ import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R
import org.linphone.contact.ContactsUpdatedListenerStub
import org.linphone.contact.GenericContactData
+import org.linphone.core.Address
import org.linphone.core.ChatMessage
import org.linphone.core.ChatMessageListenerStub
import org.linphone.core.ChatMessageReaction
@@ -95,6 +96,13 @@ class ChatMessageData(val chatMessage: ChatMessage) : GenericContactData(chatMes
)
updateReactionsList()
}
+
+ override fun onReactionRemoved(message: ChatMessage, address: Address) {
+ Log.i(
+ "[Chat Message Data] [${address.asStringUriOnly()}] removed it's previous reaction"
+ )
+ updateReactionsList()
+ }
}
private val contactsListener = object : ContactsUpdatedListenerStub() {
diff --git a/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageReactionsListData.kt b/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageReactionsListData.kt
index b6c8688f9..820195087 100644
--- a/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageReactionsListData.kt
+++ b/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageReactionsListData.kt
@@ -20,6 +20,7 @@
package org.linphone.activities.main.chat.data
import androidx.lifecycle.MutableLiveData
+import org.linphone.core.Address
import org.linphone.core.ChatMessage
import org.linphone.core.ChatMessageListenerStub
import org.linphone.core.ChatMessageReaction
@@ -40,6 +41,13 @@ class ChatMessageReactionsListData(private val chatMessage: ChatMessage) {
)
updateReactionsList(message)
}
+
+ override fun onReactionRemoved(message: ChatMessage, address: Address) {
+ Log.i(
+ "[Chat Message Reactions List] Reaction removed by [${address.asStringUriOnly()}]"
+ )
+ updateReactionsList(message)
+ }
}
private var filter = ""
diff --git a/app/src/main/res/drawable/shape_own_reaction_background.xml b/app/src/main/res/drawable/shape_own_reaction_background.xml
new file mode 100644
index 000000000..9821f0651
--- /dev/null
+++ b/app/src/main/res/drawable/shape_own_reaction_background.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shape_transparent_reaction_background.xml b/app/src/main/res/drawable/shape_transparent_reaction_background.xml
new file mode 100644
index 000000000..15e76c3b7
--- /dev/null
+++ b/app/src/main/res/drawable/shape_transparent_reaction_background.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/chat_message_long_press_menu.xml b/app/src/main/res/layout/chat_message_long_press_menu.xml
index 37fa712e4..9869d74c3 100644
--- a/app/src/main/res/layout/chat_message_long_press_menu.xml
+++ b/app/src/main/res/layout/chat_message_long_press_menu.xml
@@ -46,6 +46,21 @@
+
+
+
+
+
+ android:layout_height="@dimen/chat_message_popup_item_height"
+ android:layout_marginTop="5dp">