From 965b159139112618cccfe7dfe4ef942d223fb429 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 15 Dec 2025 13:07:14 +0100 Subject: [PATCH] Using newly added MWI API to only show the notification bar for the concerned account + call voicemail when clicking on it --- .../ui/main/viewmodel/MainViewModel.kt | 82 +++++++++++++++---- 1 file changed, 65 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt index afb627542..1891ba0cf 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt @@ -126,6 +126,8 @@ class MainViewModel private var nonDefaultAccountNotificationsCount = 0 + private var mwiNewMessages = false + private val coreListener = object : CoreListenerStub() { @WorkerThread override fun onGlobalStateChanged(core: Core, state: GlobalState?, message: String) { @@ -302,6 +304,14 @@ class MainViewModel ) addAlert(DEFAULT_ACCOUNT_DISABLED, label) } + + val mwi = account.latestReceivedMessageWaitingIndication + if (mwi != null) { + parseMwiEvent(mwi) + } else { + removeAlert(MWI_MESSAGES_WAITING) + mwiNewMessages = false + } } computeNonDefaultAccountNotificationsCount() @@ -334,23 +344,10 @@ class MainViewModel event: org.linphone.core.Event, mwi: MessageWaitingIndication ) { - if (mwi.hasMessageWaiting()) { - val summaries = mwi.summaries - Log.i( - "$TAG MWI NOTIFY received, messages are waiting ([${summaries.size}] summaries)" - ) - if (summaries.isNotEmpty()) { - val summary = summaries.first() - val label = AppUtils.getStringWithPlural( - R.plurals.mwi_messages_are_waiting, - summary.nbNew, - summary.nbNew.toString() - ) - addAlert(MWI_MESSAGES_WAITING, label) - } - } else { - Log.i("$TAG MWI NOTIFY received, no message is waiting") - removeAlert(MWI_MESSAGES_WAITING) + val address = mwi.accountAddress + val defaultAccountAddress = core.defaultAccount?.params?.identityAddress + if (defaultAccountAddress != null && address?.weakEqual(defaultAccountAddress) == true) { + parseMwiEvent(mwi) } } } @@ -394,6 +391,12 @@ class MainViewModel if (defaultAccount.state == RegistrationState.Ok && !firstAccountRegistered) { triggerNativeAddressBookImport() } + + mwiNewMessages = false + val mwi = defaultAccount.latestReceivedMessageWaitingIndication + if (mwi != null) { + parseMwiEvent(mwi) + } } } @@ -479,6 +482,10 @@ class MainViewModel askFullScreenIntentPermissionEvent.value = Event(true) } else if (!Compatibility.isPostNotificationsPermissionGranted(coreContext.context)) { askPostNotificationsPermissionEvent.value = Event(true) + } else if (mwiNewMessages) { + coreContext.postOnCoreThread { + callVoiceMail() + } } else { openDrawerEvent.value = Event(true) } @@ -715,4 +722,45 @@ class MainViewModel removeAlert(SEND_NOTIFICATIONS_PERMISSION_NOT_GRANTED) } } + + @WorkerThread + private fun parseMwiEvent(mwi: MessageWaitingIndication) { + if (mwi.hasMessageWaiting()) { + val summaries = mwi.summaries + Log.i( + "$TAG [MWI] Messages are waiting ([${summaries.size}] summaries)" + ) + if (summaries.isNotEmpty()) { + val summary = summaries.first() + val label = AppUtils.getStringWithPlural( + R.plurals.mwi_messages_are_waiting, + summary.nbNew, + summary.nbNew.toString() + ) + Log.i("$TAG [MWI] Showing alert with [${summary.nbNew}] new message(s)") + addAlert(MWI_MESSAGES_WAITING, label) + mwiNewMessages = true + } + } else { + Log.i("$TAG [MWI] No message is waiting") + removeAlert(MWI_MESSAGES_WAITING) + mwiNewMessages = false + } + } + + @WorkerThread + private fun callVoiceMail() { + val defaultAccount = LinphoneUtils.getDefaultAccount() + if (defaultAccount != null) { + val voiceMailUri = defaultAccount.params.voicemailAddress + if (voiceMailUri != null) { + Log.i("$TAG [MWI] Starting call to voicemail address [${voiceMailUri.asStringUriOnly()}]") + coreContext.startCall(voiceMailUri) + } else { + Log.e("$TAG [MWI] Can't call voicemail, no URI configured in account params!") + } + } else { + Log.e("$TAG [MWI] Can't call voicemail, no default account found!") + } + } }