When removing a meeting you organized, send a cancel ICS

This commit is contained in:
Sylvain Berfini 2022-09-13 13:12:43 +02:00
parent 795ee0d40c
commit 2050ed93eb
3 changed files with 61 additions and 17 deletions

View file

@ -77,10 +77,10 @@ class ConferenceSchedulingViewModel : ContactsSelectionViewModel() {
private val listener = object : ConferenceSchedulerListenerStub() { private val listener = object : ConferenceSchedulerListenerStub() {
override fun onStateChanged( override fun onStateChanged(
conferenceScheduler: ConferenceScheduler, conferenceScheduler: ConferenceScheduler,
state: ConferenceSchedulerState state: ConferenceScheduler.State
) { ) {
Log.i("[Conference Creation] Conference scheduler state is $state") Log.i("[Conference Creation] Conference scheduler state is $state")
if (state == ConferenceSchedulerState.Ready) { if (state == ConferenceScheduler.State.Ready) {
val conferenceAddress = conferenceScheduler.info?.uri val conferenceAddress = conferenceScheduler.info?.uri
Log.i("[Conference Creation] Conference info created, address will be ${conferenceAddress?.asStringUriOnly()}") Log.i("[Conference Creation] Conference info created, address will be ${conferenceAddress?.asStringUriOnly()}")
conferenceAddress ?: return conferenceAddress ?: return
@ -90,21 +90,12 @@ class ConferenceSchedulingViewModel : ContactsSelectionViewModel() {
if (scheduleForLater.value == true && sendInviteViaChat.value == true) { if (scheduleForLater.value == true && sendInviteViaChat.value == true) {
// Send conference info even when conf is not scheduled for later // Send conference info even when conf is not scheduled for later
// as the conference server doesn't invite participants automatically // as the conference server doesn't invite participants automatically
val chatRoomParams = coreContext.core.createDefaultChatRoomParams() val chatRoomParams = LinphoneUtils.getConferenceInvitationsChatRoomParams()
chatRoomParams.isGroupEnabled = false
if (LinphoneUtils.isEndToEndEncryptedChatAvailable()) {
chatRoomParams.backend = ChatRoomBackend.FlexisipChat
chatRoomParams.isEncryptionEnabled = true
} else {
chatRoomParams.backend = ChatRoomBackend.Basic
chatRoomParams.isEncryptionEnabled = false
}
chatRoomParams.subject = subject.value
conferenceScheduler.sendInvitations(chatRoomParams) conferenceScheduler.sendInvitations(chatRoomParams)
} else { } else {
// Will be done in coreListener // Will be done in coreListener
} }
} else if (state == ConferenceSchedulerState.Error) { } else if (state == ConferenceScheduler.State.Error) {
Log.e("[Conference Creation] Failed to create conference!") Log.e("[Conference Creation] Failed to create conference!")
conferenceCreationInProgress.value = false conferenceCreationInProgress.value = false
onMessageToNotifyEvent.value = Event(R.string.conference_creation_failed) onMessageToNotifyEvent.value = Event(R.string.conference_creation_failed)
@ -115,7 +106,6 @@ class ConferenceSchedulingViewModel : ContactsSelectionViewModel() {
conferenceScheduler: ConferenceScheduler, conferenceScheduler: ConferenceScheduler,
failedInvitations: Array<out Address>? failedInvitations: Array<out Address>?
) { ) {
Log.i("[Conference Creation] Conference information successfully sent to all participants")
conferenceCreationInProgress.value = false conferenceCreationInProgress.value = false
if (failedInvitations?.isNotEmpty() == true) { if (failedInvitations?.isNotEmpty() == true) {
@ -123,6 +113,8 @@ class ConferenceSchedulingViewModel : ContactsSelectionViewModel() {
Log.e("[Conference Creation] Conference information wasn't sent to participant ${address.asStringUriOnly()}") Log.e("[Conference Creation] Conference information wasn't sent to participant ${address.asStringUriOnly()}")
} }
onMessageToNotifyEvent.value = Event(R.string.conference_schedule_info_not_sent_to_participant) onMessageToNotifyEvent.value = Event(R.string.conference_schedule_info_not_sent_to_participant)
} else {
Log.i("[Conference Creation] Conference information successfully sent to all participants")
} }
val conferenceAddress = conferenceScheduler.info?.uri val conferenceAddress = conferenceScheduler.info?.uri

View file

@ -23,16 +23,21 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.activities.main.conference.data.ScheduledConferenceData import org.linphone.activities.main.conference.data.ScheduledConferenceData
import org.linphone.core.ConferenceInfo import org.linphone.core.*
import org.linphone.core.Core
import org.linphone.core.CoreListenerStub
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
import org.linphone.utils.LinphoneUtils
class ScheduledConferencesViewModel : ViewModel() { class ScheduledConferencesViewModel : ViewModel() {
val conferences = MutableLiveData<ArrayList<ScheduledConferenceData>>() val conferences = MutableLiveData<ArrayList<ScheduledConferenceData>>()
val showTerminated = MutableLiveData<Boolean>() val showTerminated = MutableLiveData<Boolean>()
private val conferenceScheduler: ConferenceScheduler by lazy {
val scheduler = coreContext.core.createConferenceScheduler()
scheduler.addListener(conferenceListener)
scheduler
}
private val listener = object : CoreListenerStub() { private val listener = object : CoreListenerStub() {
override fun onConferenceInfoReceived(core: Core, conferenceInfo: ConferenceInfo) { override fun onConferenceInfoReceived(core: Core, conferenceInfo: ConferenceInfo) {
Log.i("[Scheduled Conferences] New conference info received") Log.i("[Scheduled Conferences] New conference info received")
@ -40,6 +45,33 @@ class ScheduledConferencesViewModel : ViewModel() {
} }
} }
private val conferenceListener = object : ConferenceSchedulerListenerStub() {
override fun onStateChanged(
conferenceScheduler: ConferenceScheduler,
state: ConferenceScheduler.State
) {
Log.i("[Scheduled Conferences] Conference scheduler state is $state")
if (state == ConferenceScheduler.State.Ready) {
Log.i("[Scheduled Conferences] Conference ${conferenceScheduler.info?.subject} cancelled")
val chatRoomParams = LinphoneUtils.getConferenceInvitationsChatRoomParams()
conferenceScheduler.sendInvitations(chatRoomParams) // Send cancel ICS
}
}
override fun onInvitationsSent(
conferenceScheduler: ConferenceScheduler,
failedInvitations: Array<out Address>?
) {
if (failedInvitations?.isNotEmpty() == true) {
for (address in failedInvitations) {
Log.e("[Scheduled Conferences] Conference cancelled ICS wasn't sent to participant ${address.asStringUriOnly()}")
}
} else {
Log.i("[Scheduled Conferences] Conference cancelled ICS successfully sent to all participants")
}
}
}
init { init {
coreContext.core.addListener(listener) coreContext.core.addListener(listener)
@ -51,6 +83,7 @@ class ScheduledConferencesViewModel : ViewModel() {
override fun onCleared() { override fun onCleared() {
coreContext.core.removeListener(listener) coreContext.core.removeListener(listener)
conferences.value.orEmpty().forEach(ScheduledConferenceData::destroy) conferences.value.orEmpty().forEach(ScheduledConferenceData::destroy)
super.onCleared() super.onCleared()
} }
@ -64,6 +97,11 @@ class ScheduledConferencesViewModel : ViewModel() {
conferenceInfoList.addAll(conferences.value.orEmpty()) conferenceInfoList.addAll(conferences.value.orEmpty())
conferenceInfoList.remove(data) conferenceInfoList.remove(data)
if (data.conferenceInfo.state != ConferenceInfo.State.Cancelled && data.canEdit.value == true) {
Log.i("[Scheduled Conferences] Cancelling conference ${data.conferenceInfo.subject}")
conferenceScheduler.cancelConference(data.conferenceInfo)
}
data.delete() data.delete()
data.destroy() data.destroy()
conferences.value = conferenceInfoList conferences.value = conferenceInfoList

View file

@ -140,6 +140,20 @@ class LinphoneUtils {
?: core.createChatRoom(params, defaultAccount?.params?.identityAddress, participants) ?: core.createChatRoom(params, defaultAccount?.params?.identityAddress, participants)
} }
fun getConferenceInvitationsChatRoomParams(): ChatRoomParams {
val chatRoomParams = coreContext.core.createDefaultChatRoomParams()
chatRoomParams.isGroupEnabled = false
if (isEndToEndEncryptedChatAvailable()) {
chatRoomParams.backend = ChatRoomBackend.FlexisipChat
chatRoomParams.isEncryptionEnabled = true
} else {
chatRoomParams.backend = ChatRoomBackend.Basic
chatRoomParams.isEncryptionEnabled = false
}
chatRoomParams.subject = "Meeting invitation" // Won't be used
return chatRoomParams
}
fun deleteFilesAttachedToEventLog(eventLog: EventLog) { fun deleteFilesAttachedToEventLog(eventLog: EventLog) {
if (eventLog.type == EventLog.Type.ConferenceChatMessage) { if (eventLog.type == EventLog.Type.ConferenceChatMessage) {
val message = eventLog.chatMessage val message = eventLog.chatMessage