Using newly added MWI API to only show the notification bar for the concerned account + call voicemail when clicking on it

This commit is contained in:
Sylvain Berfini 2025-12-15 13:07:14 +01:00
parent 00b8e59ade
commit 965b159139

View file

@ -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!")
}
}
}