diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ConversationFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/ConversationFragment.kt index fe57f972b..eef364d6e 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/ConversationFragment.kt @@ -34,8 +34,8 @@ class ConversationFragment : ConversationFragment() { super.onViewCreated(view, savedInstanceState) Log.i("$TAG Creating an in-call ConversationFragment") - sendMessageViewModel.isInCallConversation.value = true - viewModel.isInCallConversation.value = true + sendMessageViewModel.isCallConversation.value = true + viewModel.isCallConversation.value = true binding.setBackClickListener { findNavController().popBackStack() 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 9567b507c..a625554dc 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 @@ -60,7 +60,7 @@ class ConversationViewModel @UiThread constructor() : AbstractConversationViewMo val showBackButton = MutableLiveData() - val isInCallConversation = MutableLiveData() + val isCallConversation = MutableLiveData() val avatarModel = MutableLiveData() diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt index 6c6ea5568..ebadf511a 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt @@ -88,7 +88,7 @@ class SendMessageInConversationViewModel @UiThread constructor() : GenericViewMo val isKeyboardOpen = MutableLiveData() - val isInCallConversation = MutableLiveData() + val isCallConversation = MutableLiveData() val isVoiceRecording = MutableLiveData() @@ -152,7 +152,7 @@ class SendMessageInConversationViewModel @UiThread constructor() : GenericViewMo isEmojiPickerOpen.value = false isPlayingVoiceRecord.value = false - isInCallConversation.value = false + isCallConversation.value = false maxNumberOfAttachmentsReached.value = false } diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/ConferenceConversationFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/ConferenceConversationFragment.kt new file mode 100644 index 000000000..cdd29d23e --- /dev/null +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/ConferenceConversationFragment.kt @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2010-2024 Belledonne Communications SARL. + * + * This file is part of linphone-android + * (see https://www.linphone.org). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.linphone.ui.main.history.fragment + +import android.os.Bundle +import android.view.View +import androidx.navigation.fragment.findNavController +import org.linphone.core.tools.Log +import org.linphone.ui.main.chat.fragment.ConversationFragment + +class ConferenceConversationFragment : ConversationFragment() { + companion object { + private const val TAG = "[Conference Conversation Fragment]" + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + Log.i("$TAG Creating a conference history ConversationFragment") + sendMessageViewModel.isCallConversation.value = true + viewModel.isCallConversation.value = true + + binding.setBackClickListener { + findNavController().popBackStack() + } + } +} diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryFragment.kt index c7f304bed..395ea84c4 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryFragment.kt @@ -160,6 +160,22 @@ class HistoryFragment : SlidingPaneChildFragment() { } } + viewModel.goToMeetingConversationEvent.observe(viewLifecycleOwner) { + it.consume { pair -> + val localAddress = pair.first + val remoteAddress = pair.second + if (findNavController().currentDestination?.id == R.id.historyFragment) { + Log.i("$TAG Going to meeting conversation [$localAddress][$remoteAddress]") + val action = + HistoryFragmentDirections.actionHistoryFragmentToConferenceConversationFragment( + localAddress, + remoteAddress + ) + findNavController().navigate(action) + } + } + } + viewModel.conferenceToJoinEvent.observe(viewLifecycleOwner) { it.consume { conferenceUri -> Log.i("$TAG Requesting to go to waiting room for conference URI [$conferenceUri]") diff --git a/app/src/main/java/org/linphone/ui/main/history/viewmodel/HistoryViewModel.kt b/app/src/main/java/org/linphone/ui/main/history/viewmodel/HistoryViewModel.kt index b3b39a9ff..26f45756f 100644 --- a/app/src/main/java/org/linphone/ui/main/history/viewmodel/HistoryViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/history/viewmodel/HistoryViewModel.kt @@ -56,12 +56,18 @@ class HistoryViewModel @UiThread constructor() : GenericViewModel() { val isConferenceCallLog = MutableLiveData() + val isChatRoomAvailable = MutableLiveData() + val callLogFoundEvent = MutableLiveData>() val chatRoomCreationErrorEvent: MutableLiveData> by lazy { MutableLiveData>() } + val goToMeetingConversationEvent: MutableLiveData>> by lazy { + MutableLiveData>>() + } + val goToConversationEvent: MutableLiveData>> by lazy { MutableLiveData>>() } @@ -76,6 +82,8 @@ class HistoryViewModel @UiThread constructor() : GenericViewModel() { private lateinit var address: Address + private var meetingChatRoom: ChatRoom? = null + private val chatRoomListener = object : ChatRoomListenerStub() { @WorkerThread override fun onStateChanged(chatRoom: ChatRoom, newState: ChatRoom.State?) { @@ -124,7 +132,15 @@ class HistoryViewModel @UiThread constructor() : GenericViewModel() { address = model.address callLogModel.postValue(model) - isConferenceCallLog.postValue(callLog.wasConference()) + val conference = callLog.wasConference() + isConferenceCallLog.postValue(conference) + meetingChatRoom = callLog.chatRoom + isChatRoomAvailable.postValue(meetingChatRoom != null) + if (conference) { + Log.i( + "$TAG Conference call log, chat room is ${ if (meetingChatRoom != null) "available" else "not available"}" + ) + } val peerAddress = callLog.remoteAddress val history = arrayListOf() @@ -172,6 +188,25 @@ class HistoryViewModel @UiThread constructor() : GenericViewModel() { } } + @UiThread + fun goToMeetingConversation() { + coreContext.postOnCoreThread { + val chatRoom = meetingChatRoom + if (chatRoom != null) { + goToMeetingConversationEvent.postValue( + Event( + Pair( + chatRoom.localAddress.asStringUriOnly(), + chatRoom.peerAddress.asStringUriOnly() + ) + ) + ) + } else { + Log.e("$TAG Failed to find chat room for current call log!") + } + } + } + @UiThread fun goToConversation() { coreContext.postOnCoreThread { core -> diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/ScheduleMeetingFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/ScheduleMeetingFragment.kt index db35c0643..c9aadeeac 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/ScheduleMeetingFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/ScheduleMeetingFragment.kt @@ -89,7 +89,9 @@ class ScheduleMeetingFragment : GenericMainFragment() { observeToastEvents(viewModel) val subject = args.subject - viewModel.subject.value = subject + if (subject.isNotEmpty()) { + viewModel.subject.value = subject + } val participants = args.participants if (!participants.isNullOrEmpty()) { diff --git a/app/src/main/res/layout/chat_conversation_fragment.xml b/app/src/main/res/layout/chat_conversation_fragment.xml index 9de550b1a..8e52ac4ea 100644 --- a/app/src/main/res/layout/chat_conversation_fragment.xml +++ b/app/src/main/res/layout/chat_conversation_fragment.xml @@ -73,7 +73,7 @@ android:padding="15dp" android:adjustViewBounds="true" android:onClick="@{backClickListener}" - android:visibility="@{viewModel.isInCallConversation || viewModel.showBackButton && !viewModel.searchBarVisible ? View.VISIBLE : View.GONE}" + android:visibility="@{viewModel.isCallConversation || viewModel.showBackButton && !viewModel.searchBarVisible ? View.VISIBLE : View.GONE}" android:src="@drawable/caret_left" android:contentDescription="@string/content_description_go_back_icon" app:tint="?attr/color_main1_500" @@ -87,7 +87,7 @@ android:layout_height="wrap_content" android:layout_marginTop="5dp" android:layout_marginBottom="5dp" - android:layout_marginStart="@{viewModel.isInCallConversation || viewModel.showBackButton ? @dimen/chat_conversation_header_avatar_start_margin_if_back_button : @dimen/chat_conversation_header_avatar_start_margin_if_no_back_button, default=@dimen/chat_conversation_header_avatar_start_margin_if_back_button}" + android:layout_marginStart="@{viewModel.isCallConversation || viewModel.showBackButton ? @dimen/chat_conversation_header_avatar_start_margin_if_back_button : @dimen/chat_conversation_header_avatar_start_margin_if_no_back_button, default=@dimen/chat_conversation_header_avatar_start_margin_if_back_button}" layout="@layout/contact_avatar" bind:model="@{viewModel.avatarModel}" app:layout_constraintStart_toEndOf="@id/back" @@ -171,7 +171,7 @@ android:adjustViewBounds="true" android:src="@drawable/dots_three_vertical" android:contentDescription="@string/content_description_show_popup_menu" - android:visibility="@{viewModel.isInCallConversation ? View.GONE : View.VISIBLE}" + android:visibility="@{viewModel.isCallConversation ? View.GONE : View.VISIBLE}" app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent" app:tint="?attr/color_main2_500"/> @@ -184,7 +184,7 @@ android:padding="15dp" android:src="@drawable/phone" android:contentDescription="@string/content_description_call_start" - android:visibility="@{viewModel.isInCallConversation || viewModel.isReadOnly || viewModel.searchBarVisible ? View.GONE : View.VISIBLE}" + android:visibility="@{viewModel.isCallConversation || viewModel.isReadOnly || viewModel.searchBarVisible ? View.GONE : View.VISIBLE}" app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toStartOf="@id/show_menu" app:tint="?attr/color_main2_500" /> diff --git a/app/src/main/res/layout/chat_conversation_send_area.xml b/app/src/main/res/layout/chat_conversation_send_area.xml index 703d8b0de..4509d11c5 100644 --- a/app/src/main/res/layout/chat_conversation_send_area.xml +++ b/app/src/main/res/layout/chat_conversation_send_area.xml @@ -33,7 +33,7 @@ android:id="@+id/extra_actions" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:visibility="@{viewModel.isVoiceRecording ? View.INVISIBLE : (viewModel.isKeyboardOpen || viewModel.isInCallConversation || !viewModel.isFileTransferServerAvailable) ? View.GONE : View.VISIBLE}" + android:visibility="@{viewModel.isVoiceRecording ? View.INVISIBLE : (viewModel.isKeyboardOpen || viewModel.isCallConversation || !viewModel.isFileTransferServerAvailable) ? View.GONE : View.VISIBLE}" app:constraint_referenced_ids="emoji_picker_toggle, capture_image" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 8d31bd894..7a4944fe8 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -324,6 +324,7 @@ Nommer l\'appel de groupe Nom de l\'appel de groupe Aucun appel dans votre historique… + Conversation Voulez-vous tout supprimer ? Tout votre historique d\'appels sera supprimé. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7108c6f25..7dd978a37 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -362,6 +362,7 @@ Set group call subject Group call subject No call for the moment… + Conversation Do you really want to delete all calls history? All calls will be removed from the history @@ -871,6 +872,7 @@ Delete this LDAP configuration Save LDAP configuration Plays the call recording + Go to conversation