From 2050ed93eb90139416b58f753aadc5e0583f2a2a Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 13 Sep 2022 13:12:43 +0200 Subject: [PATCH] When removing a meeting you organized, send a cancel ICS --- .../ConferenceSchedulingViewModel.kt | 20 +++------ .../ScheduledConferencesViewModel.kt | 44 +++++++++++++++++-- .../java/org/linphone/utils/LinphoneUtils.kt | 14 ++++++ 3 files changed, 61 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ConferenceSchedulingViewModel.kt b/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ConferenceSchedulingViewModel.kt index 889be946c..d69969ba9 100644 --- a/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ConferenceSchedulingViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ConferenceSchedulingViewModel.kt @@ -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? ) { - 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 diff --git a/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ScheduledConferencesViewModel.kt b/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ScheduledConferencesViewModel.kt index 7774c0c4b..ada01326b 100644 --- a/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ScheduledConferencesViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ScheduledConferencesViewModel.kt @@ -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>() val showTerminated = MutableLiveData() + 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? + ) { + 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 diff --git a/app/src/main/java/org/linphone/utils/LinphoneUtils.kt b/app/src/main/java/org/linphone/utils/LinphoneUtils.kt index 9d323dee1..13efcfa89 100644 --- a/app/src/main/java/org/linphone/utils/LinphoneUtils.kt +++ b/app/src/main/java/org/linphone/utils/LinphoneUtils.kt @@ -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