From cd3b9e14228052192a42a8bebdc6673a65b78442 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 8 Nov 2023 11:30:46 +0100 Subject: [PATCH] Various UI improvements --- .../chat/fragment/ConversationFragment.kt | 7 +++ .../chat/fragment/ConversationsFragment.kt | 27 ++++++++++-- .../ui/main/chat/model/ChatMessageModel.kt | 18 +++++--- .../ui/main/chat/model/ConversationModel.kt | 21 ++++++--- .../ui/main/chat/model/EventLogModel.kt | 6 ++- .../chat/viewmodel/ConversationViewModel.kt | 28 ++++++++---- .../meetings/fragment/MeetingsFragment.kt | 5 ++- .../main/res/layout/chat_bubble_incoming.xml | 2 +- .../chat_bubble_meeting_invite_content.xml | 6 +-- .../main/res/layout/chat_bubble_outgoing.xml | 2 +- app/src/main/res/layout/chat_list_cell.xml | 43 +++++++++++-------- .../main/res/navigation/main_nav_graph.xml | 12 ++++-- app/src/main/res/values/dimen.xml | 1 + app/src/main/res/values/strings.xml | 2 +- 14 files changed, 127 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt index f89855c12..6d628bc69 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt @@ -278,6 +278,13 @@ class ConversationFragment : GenericFragment() { } } + viewModel.conferenceToJoinEvent.observe(viewLifecycleOwner) { + it.consume { conferenceUri -> + Log.i("$TAG Requesting to go to waiting room for conference URI [$conferenceUri]") + sharedViewModel.goToMeetingWaitingRoomEvent.value = Event(conferenceUri) + } + } + binding.root.setKeyboardInsetListener { keyboardVisible -> if (keyboardVisible) { viewModel.isEmojiPickerOpen.value = false diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsFragment.kt index 10f542e0b..eca71afce 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsFragment.kt @@ -55,7 +55,10 @@ class ConversationsFragment : GenericFragment() { } override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { - if (findNavController().currentDestination?.id == R.id.startConversationFragment) { + if ( + findNavController().currentDestination?.id == R.id.startConversationFragment || + findNavController().currentDestination?.id == R.id.meetingWaitingRoomFragment + ) { // Holds fragment in place while new contact fragment slides over it return AnimationUtils.loadAnimation(activity, R.anim.hold) } @@ -115,9 +118,12 @@ class ConversationsFragment : GenericFragment() { sharedViewModel.showStartConversationEvent.observe(viewLifecycleOwner) { it.consume { - Log.i("$TAG Navigating to start conversation fragment") - val action = ConversationsFragmentDirections.actionConversationsFragmentToStartConversationFragment() - findNavController().navigate(action) + if (findNavController().currentDestination?.id == R.id.conversationsFragment) { + Log.i("$TAG Navigating to start conversation fragment") + val action = + ConversationsFragmentDirections.actionConversationsFragmentToStartConversationFragment() + findNavController().navigate(action) + } } } @@ -136,6 +142,19 @@ class ConversationsFragment : GenericFragment() { } } + sharedViewModel.goToMeetingWaitingRoomEvent.observe(viewLifecycleOwner) { + it.consume { uri -> + if (findNavController().currentDestination?.id == R.id.conversationsFragment) { + Log.i("$TAG Navigating to meeting waiting room fragment with URI [$uri]") + val action = + ConversationsFragmentDirections.actionConversationsFragmentToMeetingWaitingRoomFragment( + uri + ) + findNavController().navigate(action) + } + } + } + sharedViewModel.navigateToContactsEvent.observe(viewLifecycleOwner) { it.consume { if (findNavController().currentDestination?.id == R.id.conversationsFragment) { diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageModel.kt index f451d6f00..e41759df3 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageModel.kt @@ -52,7 +52,8 @@ class ChatMessageModel @WorkerThread constructor( val replyToMessageId: String?, val isGroupedWithPreviousOne: Boolean, val isGroupedWithNextOne: Boolean, - val onContentClicked: ((file: String) -> Unit)? = null + private val onContentClicked: ((file: String) -> Unit)? = null, + private val onJoinConferenceClicked: ((uri: String) -> Unit)? = null ) { companion object { private const val TAG = "[Chat Message Model]" @@ -207,8 +208,12 @@ class ChatMessageModel @WorkerThread constructor( fun joinConference() { coreContext.postOnCoreThread { if (::meetingConferenceUri.isInitialized) { - Log.i("$TAG Calling conference URI [${meetingConferenceUri.asStringUriOnly()}]") - coreContext.startCall(meetingConferenceUri) + val uri = meetingConferenceUri.asStringUriOnly() + coreContext.postOnMainThread { + onJoinConferenceClicked?.invoke(uri) + } + /*Log.i("$TAG Calling conference URI [${meetingConferenceUri.asStringUriOnly()}]") + coreContext.startCall(meetingConferenceUri)*/ } } } @@ -347,9 +352,12 @@ class ChatMessageModel @WorkerThread constructor( meetingDay.postValue(TimestampUtils.dayOfWeek(timestamp)) meetingDayNumber.postValue(TimestampUtils.dayOfMonth(timestamp)) - // TODO: fixme + var count = 0 + for (info in conferenceInfo.participantInfos) { + count += 1 + } meetingParticipants.postValue( - AppUtils.getFormattedString(R.string.conference_participants_list_title, "24") + AppUtils.getFormattedString(R.string.conference_participants_list_title, "$count") ) meetingFound.postValue(true) diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/ConversationModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/ConversationModel.kt index 4835a283a..741431e05 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/ConversationModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/ConversationModel.kt @@ -222,10 +222,22 @@ class ConversationModel @WorkerThread constructor(val chatRoom: ChatRoom) { @WorkerThread private fun updateLastMessageStatus(message: ChatMessage) { - val text = LinphoneUtils.getTextDescribingMessage(message) - lastMessageText.postValue(text) - val isOutgoing = message.isOutgoing + + val text = LinphoneUtils.getTextDescribingMessage(message) + if (isGroup && !isOutgoing) { + val fromAddress = message.fromAddress + val sender = coreContext.contactsManager.findContactByAddress(fromAddress) + val name = sender?.name ?: LinphoneUtils.getDisplayName(fromAddress) + val senderName = AppUtils.getFormattedString( + R.string.conversations_last_message_format, + name + ) + lastMessageText.postValue("$senderName $text") + } else { + lastMessageText.postValue(text) + } + isLastMessageOutgoing.postValue(isOutgoing) if (isOutgoing) { lastMessageIcon.postValue(LinphoneUtils.getChatIconResId(message.state)) @@ -258,8 +270,7 @@ class ConversationModel @WorkerThread constructor(val chatRoom: ChatRoom) { TimestampUtils.timeToString(chatRoom.lastUpdateTime) } TimestampUtils.isYesterday(timestamp) -> { - val time = TimestampUtils.timeToString(chatRoom.lastUpdateTime) - AppUtils.getFormattedString(R.string.conversation_yesterday_timestamp, time) + AppUtils.getString(R.string.yesterday) } else -> { TimestampUtils.toString(chatRoom.lastUpdateTime, onlyDate = true) diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/EventLogModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/EventLogModel.kt index d9bcba34a..44c441a26 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/EventLogModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/EventLogModel.kt @@ -31,7 +31,8 @@ class EventLogModel @WorkerThread constructor( isFromGroup: Boolean, isGroupedWithPreviousOne: Boolean, isGroupedWithNextOne: Boolean, - onContentClicked: ((file: String) -> Unit)? = null + onContentClicked: ((file: String) -> Unit)? = null, + onJoinConferenceClicked: ((uri: String) -> Unit)? = null ) { companion object { private const val TAG = "[Event Log Model]" @@ -68,7 +69,8 @@ class EventLogModel @WorkerThread constructor( chatMessage.replyMessageId, isGroupedWithPreviousOne, isGroupedWithNextOne, - onContentClicked + onContentClicked, + onJoinConferenceClicked ) } diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt index f0466949a..7c7e40fb1 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt @@ -90,6 +90,10 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } + val conferenceToJoinEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + val chatRoomFoundEvent = MutableLiveData>() lateinit var chatRoom: ChatRoom @@ -120,10 +124,14 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { avatarModel, LinphoneUtils.isChatRoomAGroup(chatRoom), group, - true - ) { file -> - fileToDisplayEvent.postValue(Event(file)) - } + true, + { file -> + fileToDisplayEvent.postValue(Event(file)) + }, + { conferenceUri -> + conferenceToJoinEvent.postValue(Event(conferenceUri)) + } + ) ) events.postValue(list) @@ -411,10 +419,14 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { avatar, groupChatRoom, index > 0, - index == groupedEventLogs.size - 1 - ) { file -> - fileToDisplayEvent.postValue(Event(file)) - } + index == groupedEventLogs.size - 1, + { file -> + fileToDisplayEvent.postValue(Event(file)) + }, + { conferenceUri -> + conferenceToJoinEvent.postValue(Event(conferenceUri)) + } + ) eventsList.add(model) index += 1 diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsFragment.kt index 3acdded19..c31a257c2 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsFragment.kt @@ -54,7 +54,10 @@ class MeetingsFragment : GenericFragment() { } override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { - if (findNavController().currentDestination?.id == R.id.scheduleMeetingFragment) { + if ( + findNavController().currentDestination?.id == R.id.scheduleMeetingFragment || + findNavController().currentDestination?.id == R.id.meetingWaitingRoomFragment + ) { // Holds fragment in place while new contact fragment slides over it return AnimationUtils.loadAnimation(activity, R.anim.hold) } diff --git a/app/src/main/res/layout/chat_bubble_incoming.xml b/app/src/main/res/layout/chat_bubble_incoming.xml index bb9d01de3..0a2be8173 100644 --- a/app/src/main/res/layout/chat_bubble_incoming.xml +++ b/app/src/main/res/layout/chat_bubble_incoming.xml @@ -140,7 +140,7 @@ diff --git a/app/src/main/res/layout/chat_bubble_outgoing.xml b/app/src/main/res/layout/chat_bubble_outgoing.xml index cf0b750d8..bbe287642 100644 --- a/app/src/main/res/layout/chat_bubble_outgoing.xml +++ b/app/src/main/res/layout/chat_bubble_outgoing.xml @@ -101,7 +101,7 @@ + + + app:constraint_referenced_ids="notifications_count, date_time, ephemeral, muted, last_sent_message_status" /> - - + app:layout_constraintEnd_toStartOf="@id/unread_count_right_border"/> + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="@id/name" + app:layout_constraintBottom_toBottomOf="@id/name" /> + + diff --git a/app/src/main/res/navigation/main_nav_graph.xml b/app/src/main/res/navigation/main_nav_graph.xml index b5f6862ba..a461b8a87 100644 --- a/app/src/main/res/navigation/main_nav_graph.xml +++ b/app/src/main/res/navigation/main_nav_graph.xml @@ -220,6 +220,12 @@ app:enterAnim="@anim/slide_in" app:popExitAnim="@anim/slide_out" app:launchSingleTop="true" /> + diff --git a/app/src/main/res/values/dimen.xml b/app/src/main/res/values/dimen.xml index d89cf515b..02aaab667 100644 --- a/app/src/main/res/values/dimen.xml +++ b/app/src/main/res/values/dimen.xml @@ -68,6 +68,7 @@ 30sp 88dp 150dp + 271dp 291dp 5dp 10dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fa6951c82..d6fb00d56 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -340,13 +340,13 @@ Incoming call for %s No conversation for the moment… + %s: Mark as read Mute Un-mute Call Delete conversation Leave the group - Yesterday at %s New conversation Search contact Create a group conversation