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!