Improved chat message long press popup

This commit is contained in:
Sylvain Berfini 2021-05-31 17:22:37 +02:00
parent 64f3808c9d
commit a0f02dbb08
7 changed files with 167 additions and 82 deletions

View file

@ -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
}
}

View file

@ -26,7 +26,7 @@ import org.linphone.core.tools.Log
class AudioRouteUtils {
companion object {
private fun routeAudioTo(types : List<AudioDevice.Type>, call: Call? = null) {
private fun routeAudioTo(types: List<AudioDevice.Type>, call: Call? = null) {
val listSize = types.size
val stringBuilder = StringBuilder()
var index = 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

View file

@ -0,0 +1,100 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="android.view.View" />
<variable
name="resendClickListener"
type="View.OnClickListener" />
<variable
name="copyTextClickListener"
type="View.OnClickListener" />
<variable
name="forwardClickListener"
type="View.OnClickListener" />
<variable
name="imdnClickListener"
type="View.OnClickListener" />
<variable
name="addToContactsClickListener"
type="View.OnClickListener" />
<variable
name="deleteClickListener"
type="View.OnClickListener" />
<variable
name="resendHidden"
type="Boolean" />
<variable
name="imdnHidden"
type="Boolean" />
<variable
name="copyTextHidden"
type="Boolean" />
<variable
name="addToContactsHidden"
type="Boolean" />
</data>
<LinearLayout
android:layout_width="@dimen/chat_message_popup_width"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="?attr/backgroundColor">
<TextView
android:layout_width="match_parent"
android:layout_height="@dimen/chat_message_popup_item_height"
android:visibility="@{resendHidden ? View.GONE : View.VISIBLE}"
android:onClick="@{resendClickListener}"
android:drawableRight="@drawable/chat_send_message"
style="@style/popup_item_font"
android:text="@string/chat_message_context_menu_resend" />
<TextView
android:layout_width="match_parent"
android:layout_height="@dimen/chat_message_popup_item_height"
android:visibility="@{copyTextHidden ? View.GONE : View.VISIBLE}"
android:onClick="@{copyTextClickListener}"
android:drawableRight="@drawable/menu_copy_text"
style="@style/popup_item_font"
android:text="@string/chat_message_context_menu_copy_text" />
<TextView
android:layout_width="match_parent"
android:layout_height="@dimen/chat_message_popup_item_height"
android:onClick="@{forwardClickListener}"
android:drawableRight="@drawable/menu_forward"
style="@style/popup_item_font"
android:text="@string/chat_message_context_menu_forward" />
<TextView
android:layout_width="match_parent"
android:layout_height="@dimen/chat_message_popup_item_height"
android:visibility="@{imdnHidden ? View.GONE : View.VISIBLE}"
android:onClick="@{imdnClickListener}"
android:drawableRight="@drawable/menu_imdn_info"
style="@style/popup_item_font"
android:text="@string/chat_message_context_menu_imdn_info" />
<TextView
android:layout_width="match_parent"
android:layout_height="@dimen/chat_message_popup_item_height"
android:visibility="@{addToContactsHidden ? View.GONE : View.VISIBLE}"
android:onClick="@{addToContactsClickListener}"
android:drawableRight="@drawable/menu_add_contact"
style="@style/popup_item_font"
android:text="@string/chat_message_context_menu_add_to_contacts" />
<TextView
android:layout_width="match_parent"
android:layout_height="@dimen/chat_message_popup_item_height"
android:onClick="@{deleteClickListener}"
android:drawableRight="@drawable/menu_delete"
android:drawableTint="@color/red_color"
style="@style/popup_item_font"
android:textColor="@color/red_color"
android:text="@string/chat_message_context_menu_delete" />
</LinearLayout>
</layout>

View file

@ -1,34 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/chat_message_menu_resend"
android:icon="@drawable/chat_send_message"
android:title="@string/chat_message_context_menu_resend" />
<item
android:id="@+id/chat_message_menu_copy_text"
android:icon="@drawable/menu_copy_text"
android:title="@string/chat_message_context_menu_copy_text" />
<item
android:id="@+id/chat_message_forward_message"
android:icon="@drawable/menu_forward"
android:title="@string/chat_message_context_menu_forward" />
<item
android:id="@+id/chat_message_menu_imdn_infos"
android:icon="@drawable/menu_imdn_info"
android:title="@string/chat_message_context_menu_imdn_info" />
<item
android:id="@+id/chat_message_menu_delete_message"
android:icon="@drawable/menu_delete"
android:title="@string/chat_message_context_menu_delete" />
<item
android:id="@+id/chat_message_menu_add_to_contacts"
android:icon="@drawable/menu_add_contact"
android:title="@string/chat_message_context_menu_add_to_contacts" />
</menu>

View file

@ -11,7 +11,7 @@
<dimen name="chat_message_bubble_file_icon_size">30dp</dimen>
<dimen name="chat_message_bubble_desired_height">600dp</dimen>
<dimen name="video_preview_max_size">200dp</dimen>
<dimen name="video_preview_pip_max_size">50dp</dimen>
<dimen name="video_preview_pip_max_size">45dp</dimen>
<dimen name="main_activity_tabs_fragment_size">60dp</dimen>
<dimen name="main_activity_top_bar_size">60dp</dimen>
<dimen name="status_fragment_size">40dp</dimen>
@ -24,4 +24,6 @@
<dimen name="field_button_size">20dp</dimen>
<dimen name="field_shape_margin">3dp</dimen>
<dimen name="call_overlay_size">60dp</dimen>
<dimen name="chat_message_popup_width">250dp</dimen>
<dimen name="chat_message_popup_item_height">50dp</dimen>
</resources>

View file

@ -169,6 +169,14 @@
<item name="android:lineSpacingExtra">8.3sp</item>
</style>
<style name="popup_item_font" parent="@android:style/TextAppearance.Medium">
<item name="android:textColor">?attr/primaryTextColor</item>
<item name="android:textSize">16sp</item>
<item name="android:gravity">center_vertical</item>
<item name="android:paddingLeft">20dp</item>
<item name="android:paddingRight">20dp</item>
</style>
<!-- Settings -->
<style name="settings_category_font" parent="@android:style/TextAppearance.Medium">