From 58ec0e7abb53196632c82ba658ba43c65b556e38 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Sat, 2 Dec 2023 16:18:41 +0100 Subject: [PATCH] Fixed & improved a few things related to chat --- .../notifications/NotificationsManager.kt | 44 +++++++------------ .../chat/adapter/MessageBottomSheetAdapter.kt | 4 +- .../fragment/ConversationsListFragment.kt | 15 ++++--- .../main/chat/model/MessageDeliveryModel.kt | 9 ---- .../java/org/linphone/utils/ShortcutUtils.kt | 26 ++++++----- .../main/res/navigation/chat_nav_graph.xml | 3 ++ .../main/res/navigation/main_nav_graph.xml | 1 + 7 files changed, 47 insertions(+), 55 deletions(-) diff --git a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt index a92c80000..c57635992 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt +++ b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt @@ -42,11 +42,6 @@ import androidx.core.app.Person import androidx.core.app.RemoteInput import androidx.core.content.LocusIdCompat import androidx.navigation.NavDeepLinkBuilder -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.SupervisorJob -import kotlinx.coroutines.async -import kotlinx.coroutines.launch import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R @@ -94,8 +89,6 @@ class NotificationsManager @MainThread constructor(private val context: Context) private const val MISSED_CALL_ID = 10 } - private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) - private val notificationManager: NotificationManagerCompat by lazy { NotificationManagerCompat.from(context) } @@ -152,7 +145,7 @@ class NotificationsManager @MainThread constructor(private val context: Context) Log.i("$TAG Received ${messages.size} aggregated messages") if (corePreferences.disableChat) return - val id = LinphoneUtils.getChatRoomId(chatRoom.localAddress, chatRoom.peerAddress) + val id = LinphoneUtils.getChatRoomId(chatRoom) if (id == currentlyDisplayedChatRoomId) { Log.i( "$TAG Do not notify received messages for currently displayed conversation [$id]" @@ -172,13 +165,8 @@ class NotificationsManager @MainThread constructor(private val context: Context) Log.i( "$TAG Ensure conversation shortcut exists for notification" ) - scope.launch { - val shortcuts = async { - ShortcutUtils.createShortcutsToChatRooms(context) - } - shortcuts.await() - showChatRoomNotification(chatRoom, messages) - } + ShortcutUtils.createShortcutsToChatRooms(context) + showChatRoomNotification(chatRoom, messages) } } @@ -199,7 +187,7 @@ class NotificationsManager @MainThread constructor(private val context: Context) ) if (corePreferences.disableChat) return - val id = LinphoneUtils.getChatRoomId(chatRoom.localAddress, chatRoom.peerAddress) + val id = LinphoneUtils.getChatRoomId(chatRoom) if (id == currentlyDisplayedChatRoomId) { Log.i( "$TAG Do not notify received reaction for currently displayed conversation [$id]" @@ -234,7 +222,7 @@ class NotificationsManager @MainThread constructor(private val context: Context) if (corePreferences.disableChat) return if (chatRoom.muted) { - val id = LinphoneUtils.getChatRoomId(chatRoom.localAddress, chatRoom.peerAddress) + val id = LinphoneUtils.getChatRoomId(chatRoom) Log.i("$TAG Conversation $id has been muted") return } @@ -384,9 +372,7 @@ class NotificationsManager @MainThread constructor(private val context: Context) Log.i("$TAG Core has been started") core.addListener(coreListener) - scope.launch { - ShortcutUtils.createShortcutsToChatRooms(context) - } + ShortcutUtils.createShortcutsToChatRooms(context) } @WorkerThread @@ -512,6 +498,7 @@ class NotificationsManager @MainThread constructor(private val context: Context) } } + @WorkerThread private fun getNotifiableForRoom(chatRoom: ChatRoom): Notifiable { val address = chatRoom.peerAddress.asStringUriOnly() var notifiable: Notifiable? = chatNotificationsMap[address] @@ -521,14 +508,14 @@ class NotificationsManager @MainThread constructor(private val context: Context) notifiable.localIdentity = chatRoom.localAddress.asStringUriOnly() notifiable.remoteAddress = chatRoom.peerAddress.asStringUriOnly() - chatNotificationsMap[address] = notifiable - if (chatRoom.hasCapability(ChatRoom.Capabilities.OneToOne.toInt())) { notifiable.isGroup = false } else { notifiable.isGroup = true notifiable.groupTitle = chatRoom.subject } + + chatNotificationsMap[address] = notifiable } return notifiable } @@ -545,11 +532,14 @@ class NotificationsManager @MainThread constructor(private val context: Context) updated = true } - if (chatRoom.hasCapability(ChatRoom.Capabilities.OneToOne.toInt())) { - notifiable.isGroup = false - } else { - notifiable.isGroup = true - notifiable.groupTitle = chatRoom.subject + if (!chatRoom.hasCapability(ChatRoom.Capabilities.OneToOne.toInt())) { + if (chatRoom.subject != notifiable.groupTitle) { + Log.i( + "$TAG Updating notification subject from [${notifiable.groupTitle}] to [${chatRoom.subject}]" + ) + notifiable.groupTitle = chatRoom.subject + updated = true + } } if (!updated) { Log.w("$TAG No changes made to notifiable, do not display it again") diff --git a/app/src/main/java/org/linphone/ui/main/chat/adapter/MessageBottomSheetAdapter.kt b/app/src/main/java/org/linphone/ui/main/chat/adapter/MessageBottomSheetAdapter.kt index 96f0b77d7..7721d2e44 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/adapter/MessageBottomSheetAdapter.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/adapter/MessageBottomSheetAdapter.kt @@ -48,14 +48,14 @@ class MessageBottomSheetAdapter : ListAdapter() val subject: String - val icon: IconCompat - if (chatRoom.hasCapability(ChatRoom.Capabilities.Basic.toInt())) { + val icon: IconCompat = if (chatRoom.hasCapability( + ChatRoom.Capabilities.Basic.toInt() + ) + ) { val contact = coreContext.contactsManager.findContactByAddress(peerAddress) val person = contact?.getPerson() @@ -95,7 +97,7 @@ class ShortcutUtils { } subject = contact?.name ?: LinphoneUtils.getDisplayName(peerAddress) - icon = person?.icon ?: AvatarGenerator(context).setInitials( + person?.icon ?: AvatarGenerator(context).setInitials( AppUtils.getInitials(subject) ).buildIcon() } else if (chatRoom.hasCapability(ChatRoom.Capabilities.OneToOne.toInt()) && chatRoom.participants.isNotEmpty()) { @@ -108,11 +110,14 @@ class ShortcutUtils { } subject = contact?.name ?: LinphoneUtils.getDisplayName(address) - icon = person?.icon ?: AvatarGenerator(context).setInitials( + person?.icon ?: AvatarGenerator(context).setInitials( AppUtils.getInitials(subject) ).buildIcon() } else { - val list = arrayListOf() + subject = chatRoom.subject.orEmpty() + IconCompat.createWithResource(context, R.drawable.users_three) + // TODO FIXME: use generated chat room avatar + /*val list = arrayListOf() for (participant in chatRoom.participants) { val contact = coreContext.contactsManager.findContactByAddress(participant.address) @@ -125,15 +130,16 @@ class ShortcutUtils { } } } - subject = chatRoom.subject.orEmpty() - icon = if (list.isNotEmpty()) { + AvatarGenerator(context).setInitials(subject).buildIcon() + if (list.isNotEmpty()) { val iconSize = AppUtils.getDimension(R.dimen.avatar_list_cell_size).toInt() + IconCompat.createWithAdaptiveBitmap( ImageUtils.getBitmapFromMultipleAvatars(context, iconSize, list) ) } else { AvatarGenerator(context).setInitials(subject).buildIcon() - } + }*/ } val persons = arrayOfNulls(personsList.size) diff --git a/app/src/main/res/navigation/chat_nav_graph.xml b/app/src/main/res/navigation/chat_nav_graph.xml index 80744b3f8..810cdb45f 100644 --- a/app/src/main/res/navigation/chat_nav_graph.xml +++ b/app/src/main/res/navigation/chat_nav_graph.xml @@ -25,6 +25,7 @@