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

View file

@ -23,16 +23,21 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.activities.main.conference.data.ScheduledConferenceData
import org.linphone.core.ConferenceInfo
import org.linphone.core.Core
import org.linphone.core.CoreListenerStub
import org.linphone.core.*
import org.linphone.core.tools.Log
import org.linphone.utils.LinphoneUtils
class ScheduledConferencesViewModel : ViewModel() {
val conferences = MutableLiveData<ArrayList<ScheduledConferenceData>>()
val showTerminated = MutableLiveData<Boolean>()
private val conferenceScheduler: ConferenceScheduler by lazy {
val scheduler = coreContext.core.createConferenceScheduler()
scheduler.addListener(conferenceListener)
scheduler
}
private val listener = object : CoreListenerStub() {
override fun onConferenceInfoReceived(core: Core, conferenceInfo: ConferenceInfo) {
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 {
coreContext.core.addListener(listener)
@ -51,6 +83,7 @@ class ScheduledConferencesViewModel : ViewModel() {
override fun onCleared() {
coreContext.core.removeListener(listener)
conferences.value.orEmpty().forEach(ScheduledConferenceData::destroy)
super.onCleared()
}
@ -64,6 +97,11 @@ class ScheduledConferencesViewModel : ViewModel() {
conferenceInfoList.addAll(conferences.value.orEmpty())
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.destroy()
conferences.value = conferenceInfoList

View file

@ -140,6 +140,20 @@ class LinphoneUtils {
?: 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) {
if (eventLog.type == EventLog.Type.ConferenceChatMessage) {
val message = eventLog.chatMessage