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 a9652e468..3e7033a92 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 @@ -94,6 +94,7 @@ import org.linphone.utils.hideKeyboard import org.linphone.utils.setKeyboardInsetListener import org.linphone.utils.showKeyboard import androidx.core.net.toUri +import androidx.lifecycle.observe @UiThread open class ConversationFragment : SlidingPaneChildFragment() { @@ -766,6 +767,19 @@ open class ConversationFragment : SlidingPaneChildFragment() { } } + viewModel.sipUriToCallEvent.observe(viewLifecycleOwner) { + it.consume { sipUri -> + if (messageLongPressViewModel.visible.value == true) return@consume + val address = coreContext.core.interpretUrl(sipUri, false) + if (address != null) { + Log.i("$TAG Starting audio call to parsed SIP URI [${address.asStringUriOnly()}]") + coreContext.startAudioCall(address) + } else { + Log.w("$TAG Failed to parse [$sipUri] as SIP URI") + } + } + } + viewModel.conferenceToJoinEvent.observe(viewLifecycleOwner) { it.consume { conferenceUri -> if (messageLongPressViewModel.visible.value == true) return@consume 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 257c50357..08b08dcb9 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 @@ -34,6 +34,7 @@ class EventLogModel isGroupedWithNextOne: Boolean = false, currentFilter: String = "", onContentClicked: ((fileModel: FileModel) -> Unit)? = null, + onSipUriClicked: ((uri: String) -> Unit)? = null, onJoinConferenceClicked: ((uri: String) -> Unit)? = null, onWebUrlClicked: ((url: String) -> Unit)? = null, onContactClicked: ((friendRefKey: String) -> Unit)? = null, @@ -86,6 +87,7 @@ class EventLogModel isGroupedWithNextOne, currentFilter, onContentClicked, + onSipUriClicked, onJoinConferenceClicked, onWebUrlClicked, onContactClicked, diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt index 6f7021f0f..904662abc 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt @@ -79,6 +79,7 @@ class MessageModel isGroupedWithNextOne: Boolean, private val currentFilter: String = "", private val onContentClicked: ((fileModel: FileModel) -> Unit)? = null, + private val onSipUriClicked: ((uri: String) -> Unit)? = null, private val onJoinConferenceClicked: ((uri: String) -> Unit)? = null, private val onWebUrlClicked: ((url: String) -> Unit)? = null, private val onContactClicked: ((friendRefKey: String) -> Unit)? = null, @@ -673,8 +674,8 @@ class MessageModel spannableBuilder.replace(start, end, "@$displayName") val span = PatternClickableSpan.StyledClickableSpan( - object : - SpannableClickedListener { + object : SpannableClickedListener { + @UiThread override fun onSpanClicked(text: String) { val friendRefKey = friend.refKey ?: "" Log.i( @@ -707,12 +708,7 @@ class MessageModel override fun onSpanClicked(text: String) { coreContext.postOnCoreThread { Log.i("$TAG Clicked on SIP URI: $text") - val address = coreContext.core.interpretUrl(text, false) - if (address != null) { - coreContext.startAudioCall(address) - } else { - Log.w("$TAG Failed to parse [$text] as SIP URI") - } + onSipUriClicked?.invoke(text) } } } @@ -722,6 +718,7 @@ class MessageModel HTTP_LINK_REGEXP ), object : SpannableClickedListener { + @UiThread override fun onSpanClicked(text: String) { Log.i("$TAG Clicked on web URL: $text") onWebUrlClicked?.invoke(text) 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 45c241ef7..4eacab00c 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 @@ -111,6 +111,10 @@ class ConversationViewModel MutableLiveData>() } + val sipUriToCallEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + val conferenceToJoinEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -763,25 +767,28 @@ class ConversationViewModel index > 0, index != groupedEventLogs.size - 1, searchFilter.value.orEmpty(), - { fileModel -> + { fileModel -> // onContentClicked fileToDisplayEvent.postValue(Event(fileModel)) }, - { conferenceUri -> + { sipUri -> // onSipUriClicked + sipUriToCallEvent.postValue(Event(sipUri)) + }, + { conferenceUri -> // onJoinConferenceClicked conferenceToJoinEvent.postValue(Event(conferenceUri)) }, - { url -> + { url -> // onWebUrlClicked openWebBrowserEvent.postValue(Event(url)) }, - { friendRefKey -> + { friendRefKey -> // onContactClicked contactToDisplayEvent.postValue(Event(friendRefKey)) }, - { redToast -> + { redToast -> // onRedToastToShow showRedToastEvent.postValue(Event(redToast)) }, - { id -> + { id -> // onVoiceRecordingPlaybackEnded voiceRecordPlaybackEndedEvent.postValue(Event(id)) }, - { filePath -> + { filePath -> // onFileToExportToNativeGallery viewModelScope.launch { withContext(Dispatchers.IO) { Log.i("$TAG Export file [$filePath] to Android's MediaStore")