diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt
index b82ed7341..fe600d7e0 100644
--- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt
+++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt
@@ -36,9 +36,12 @@ import org.linphone.R
import org.linphone.core.tools.Log
import org.linphone.databinding.MeetingsListFragmentBinding
import org.linphone.ui.main.fragment.AbstractMainFragment
+import org.linphone.ui.main.history.model.ConfirmationDialogModel
import org.linphone.ui.main.meetings.adapter.MeetingsListAdapter
+import org.linphone.ui.main.meetings.model.MeetingModel
import org.linphone.ui.main.meetings.viewmodel.MeetingsListViewModel
import org.linphone.utils.AppUtils
+import org.linphone.utils.DialogUtils
import org.linphone.utils.Event
import org.linphone.utils.RecyclerViewHeaderDecoration
@@ -153,9 +156,13 @@ class MeetingsListFragment : AbstractMainFragment() {
adapter.resetSelection()
},
{ // onDelete
- Log.i("$TAG Deleting meeting [${model.id}]")
- model.delete()
- listViewModel.applyFilter()
+ if (model.isOrganizer()) {
+ showCancelMeetingDialog(model)
+ } else {
+ Log.i("$TAG Deleting meeting [${model.id}]")
+ model.delete()
+ listViewModel.applyFilter()
+ }
}
)
modalBottomSheet.show(parentFragmentManager, MeetingsMenuDialogFragment.TAG)
@@ -246,4 +253,38 @@ class MeetingsListFragment : AbstractMainFragment() {
AppUtils.getDimension(R.dimen.meeting_list_decoration_height).toInt()
)
}
+
+ private fun showCancelMeetingDialog(meetingModel: MeetingModel) {
+ Log.i("$TAG Meeting is editable, asking whether to cancel it or not before deleting it")
+
+ val model = ConfirmationDialogModel()
+ val dialog = DialogUtils.getCancelMeetingDialog(requireContext(), model)
+
+ model.dismissEvent.observe(viewLifecycleOwner) {
+ it.consume {
+ dialog.dismiss()
+ }
+ }
+
+ model.cancelEvent.observe(viewLifecycleOwner) {
+ it.consume {
+ Log.i("$TAG Deleting meeting [${meetingModel.id}]")
+ meetingModel.delete()
+ listViewModel.applyFilter()
+ dialog.dismiss()
+ }
+ }
+
+ model.confirmEvent.observe(viewLifecycleOwner) {
+ it.consume {
+ Log.i("$TAG Cancelling meeting [${meetingModel.id}]")
+ listViewModel.cancelMeeting(meetingModel.conferenceInfo)
+ meetingModel.delete()
+ listViewModel.applyFilter()
+ dialog.dismiss()
+ }
+ }
+
+ dialog.show()
+ }
}
diff --git a/app/src/main/java/org/linphone/ui/main/meetings/model/MeetingModel.kt b/app/src/main/java/org/linphone/ui/main/meetings/model/MeetingModel.kt
index c5486aacd..20f8b156a 100644
--- a/app/src/main/java/org/linphone/ui/main/meetings/model/MeetingModel.kt
+++ b/app/src/main/java/org/linphone/ui/main/meetings/model/MeetingModel.kt
@@ -84,4 +84,12 @@ class MeetingModel @WorkerThread constructor(val conferenceInfo: ConferenceInfo)
core.deleteConferenceInformation(conferenceInfo)
}
}
+
+ @WorkerThread
+ fun isOrganizer(): Boolean {
+ return coreContext.core.accountList.find { account ->
+ val address = account.params.identityAddress
+ address != null && conferenceInfo.organizer?.weakEqual(address) == true
+ } != null
+ }
}
diff --git a/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingsListViewModel.kt
index b7735a010..566ec0fae 100644
--- a/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingsListViewModel.kt
+++ b/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingsListViewModel.kt
@@ -75,6 +75,15 @@ class MeetingsListViewModel @UiThread constructor() : AbstractMainViewModel() {
}
}
+ @UiThread
+ fun cancelMeeting(conferenceInfo: ConferenceInfo) {
+ coreContext.postOnCoreThread { core ->
+ Log.w("$TAG Cancelling conference info [${conferenceInfo.uri?.asStringUriOnly()}]")
+ val conferenceScheduler = core.createConferenceScheduler()
+ conferenceScheduler.cancelConference(conferenceInfo)
+ }
+ }
+
@WorkerThread
private fun computeMeetingsList(filter: String) {
if (meetings.value.orEmpty().isEmpty()) {
@@ -133,8 +142,8 @@ class MeetingsListViewModel @UiThread constructor() : AbstractMainViewModel() {
System.currentTimeMillis(),
false
)
- val firstMeetingOfTheWeek = previousModelWeekLabel != todayWeekLabel
- list.add(MeetingListItemModel(null, firstMeetingOfTheWeek))
+ val first = previousModelWeekLabel != todayWeekLabel
+ list.add(MeetingListItemModel(null, first))
meetingForTodayFound = true
previousModelWeekLabel = todayWeekLabel
} else {
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 7dbcbf699..bc4e2c8f0 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -530,7 +530,7 @@
Description
Modifier la réunion
Annuler la réunion?
- Voulez-vous annuler la réunion et envoyer une notification aux participants?
+ Voulez-vous annuler la réunion et envoyer une notification aux participants ?
La réunion a été créée
La réunion a été mise à jour
La réunion a été annulée
@@ -592,7 +592,7 @@
Votre code :
Code correspondant :
Aucune correspondance
- Security alert
+ Alerte de sécurité
Réessayer
La confidentialité de votre appel peut être compromise !
@@ -620,8 +620,7 @@
Algorithme SAS : %s
L\'historique des appels a été supprimé
- Appareil vérifié
- Problème de sécurité !
+ Appareil authentifié
Appel en cours de transfert
L\'appel a été transferré
Le transfert a échoué !
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 6cad33680..ae7e94a85 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -658,7 +658,6 @@
History has been deleted
Device validated
- Security alert !
Call is being transferred
Call has been successfully transferred
Call transfer failed!