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">