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 f41b3e13c..4ba10d3cb 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 @@ -22,12 +22,10 @@ package org.linphone.activities.main.chat.adapters import android.content.ClipData import android.content.ClipboardManager import android.content.Context +import android.view.Gravity import android.view.LayoutInflater -import android.view.MenuInflater -import android.view.MenuItem import android.view.ViewGroup -import androidx.appcompat.view.menu.MenuBuilder -import androidx.appcompat.view.menu.MenuPopupHelper +import android.widget.PopupWindow import androidx.databinding.DataBindingUtil import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData @@ -46,6 +44,8 @@ import org.linphone.core.Content import org.linphone.core.EventLog import org.linphone.databinding.ChatEventListCellBinding import org.linphone.databinding.ChatMessageListCellBinding +import org.linphone.databinding.ChatMessageLongPressMenuBindingImpl +import org.linphone.utils.AppUtils import org.linphone.utils.Event class ChatMessagesListAdapter( @@ -194,60 +194,69 @@ class ChatMessagesListAdapter( if (contextMenuDisabled) return setContextMenuClickListener { - val builder = MenuBuilder(root.context) - val popupMenu = MenuPopupHelper(root.context, builder, background) - popupMenu.setForceShowIcon(true) - MenuInflater(root.context).inflate(R.menu.chat_message_menu, builder) + val popupView: ChatMessageLongPressMenuBindingImpl = DataBindingUtil.inflate( + LayoutInflater.from(root.context), + R.layout.chat_message_long_press_menu, null, false + ) + val itemSize = AppUtils.getDimension(R.dimen.chat_message_popup_item_height).toInt() + var totalSize = itemSize * 6 if (chatMessage.chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()) || - chatMessage.state == ChatMessage.State.NotDelivered) { // No message id - builder.removeItem(R.id.chat_message_menu_imdn_infos) + chatMessage.state == ChatMessage.State.NotDelivered) { // No message id + popupView.imdnHidden = true + totalSize -= itemSize } if (chatMessage.state != ChatMessage.State.NotDelivered) { - builder.removeItem(R.id.chat_message_menu_resend) + popupView.resendHidden = true + totalSize -= itemSize } if (chatMessage.contents.find { content -> content.isText } == null) { - builder.removeItem(R.id.chat_message_menu_copy_text) + popupView.copyTextHidden = true + totalSize -= itemSize } if (chatMessage.isOutgoing || chatMessageViewModel.contact.value != null) { - builder.removeItem(R.id.chat_message_menu_add_to_contacts) + popupView.addToContactsHidden = true + totalSize -= itemSize } - builder.setCallback(object : MenuBuilder.Callback { - override fun onMenuModeChange(menu: MenuBuilder) {} + // 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(popupView.root, + AppUtils.getDimension(R.dimen.chat_message_popup_width).toInt(), + totalSize, + true + ) + // Elevation is for showing a shadow around the popup + popupWindow.elevation = 20f - override fun onMenuItemSelected(menu: MenuBuilder, item: MenuItem): Boolean { - return when (item.itemId) { - R.id.chat_message_menu_imdn_infos -> { - showImdnDeliveryFragment() - true - } - R.id.chat_message_menu_resend -> { - resendMessage() - true - } - R.id.chat_message_menu_copy_text -> { - copyTextToClipboard() - true - } - R.id.chat_message_forward_message -> { - forwardMessage() - true - } - R.id.chat_message_menu_delete_message -> { - deleteMessage() - true - } - R.id.chat_message_menu_add_to_contacts -> { - addSenderToContacts() - true - } - else -> false - } - } - }) + popupView.setResendClickListener { + resendMessage() + popupWindow.dismiss() + } + popupView.setCopyTextClickListener { + copyTextToClipboard() + popupWindow.dismiss() + } + popupView.setForwardClickListener { + forwardMessage() + popupWindow.dismiss() + } + popupView.setImdnClickListener { + showImdnDeliveryFragment() + popupWindow.dismiss() + } + popupView.setAddToContactsClickListener { + addSenderToContacts() + popupWindow.dismiss() + } + popupView.setDeleteClickListener { + deleteMessage() + popupWindow.dismiss() + } + + val gravity = if (chatMessage.isOutgoing) Gravity.END else Gravity.START + popupWindow.showAsDropDown(background, 0, 0, gravity or Gravity.TOP) - popupMenu.show() true } } diff --git a/app/src/main/java/org/linphone/utils/AudioRouteUtils.kt b/app/src/main/java/org/linphone/utils/AudioRouteUtils.kt index 047923c49..8ab500bf1 100644 --- a/app/src/main/java/org/linphone/utils/AudioRouteUtils.kt +++ b/app/src/main/java/org/linphone/utils/AudioRouteUtils.kt @@ -26,7 +26,7 @@ import org.linphone.core.tools.Log class AudioRouteUtils { companion object { - private fun routeAudioTo(types : List, call: Call? = null) { + private fun routeAudioTo(types: List, call: Call? = null) { val listSize = types.size val stringBuilder = StringBuilder() var index = 0 diff --git a/app/src/main/res/drawable-xhdpi/menu_delete.png b/app/src/main/res/drawable-xhdpi/menu_delete.png new file mode 100644 index 000000000..65d612aae Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/menu_delete.png differ 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 new file mode 100644 index 000000000..e781acbe3 --- /dev/null +++ b/app/src/main/res/layout/chat_message_long_press_menu.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/chat_message_menu.xml b/app/src/main/res/menu/chat_message_menu.xml deleted file mode 100644 index 491a0ef2c..000000000 --- a/app/src/main/res/menu/chat_message_menu.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/dimen.xml b/app/src/main/res/values/dimen.xml index f94b98273..987cdabb8 100644 --- a/app/src/main/res/values/dimen.xml +++ b/app/src/main/res/values/dimen.xml @@ -11,7 +11,7 @@ 30dp 600dp 200dp - 50dp + 45dp 60dp 60dp 40dp @@ -24,4 +24,6 @@ 20dp 3dp 60dp + 250dp + 50dp \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 89f0bb18b..145af9234 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -169,6 +169,14 @@ 8.3sp + +