diff --git a/app/src/main/java/org/linphone/ui/GenericViewModel.kt b/app/src/main/java/org/linphone/ui/GenericViewModel.kt index 2b6f45dd9..5ca903d01 100644 --- a/app/src/main/java/org/linphone/ui/GenericViewModel.kt +++ b/app/src/main/java/org/linphone/ui/GenericViewModel.kt @@ -24,6 +24,7 @@ import androidx.lifecycle.ViewModel import org.linphone.utils.Event open class GenericViewModel : ViewModel() { + // Message res id, icon val showGreenToastEvent: MutableLiveData>> by lazy { MutableLiveData>>() } @@ -32,6 +33,7 @@ open class GenericViewModel : ViewModel() { MutableLiveData>>() } + // Message res id, icon val showRedToastEvent: MutableLiveData>> by lazy { MutableLiveData>>() } diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt index 812c420d4..bd0450b33 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt @@ -35,7 +35,9 @@ import org.linphone.compatibility.Compatibility import org.linphone.core.tools.Log import org.linphone.databinding.SettingsFragmentBinding import org.linphone.ui.main.fragment.GenericMainFragment +import org.linphone.ui.main.settings.model.ConfirmVfsDialogModel import org.linphone.ui.main.settings.viewmodel.SettingsViewModel +import org.linphone.utils.DialogUtils @UiThread class SettingsFragment : GenericMainFragment() { @@ -263,6 +265,10 @@ class SettingsFragment : GenericMainFragment() { binding.tunnelSettings.tunnelModeSpinner.setSelection(index) } + binding.setTurnOnVfsClickListener { + showConfirmVfsDialog() + } + startPostponedEnterTransition() } @@ -280,4 +286,31 @@ class SettingsFragment : GenericMainFragment() { super.onPause() } + + private fun showConfirmVfsDialog() { + val model = ConfirmVfsDialogModel() + val dialog = DialogUtils.getConfirmTurningOnVfsDialog( + requireActivity(), + model + ) + + model.cancelEvent.observe(viewLifecycleOwner) { + it.consume { + viewModel.isVfsEnabled.value = false + dialog.dismiss() + } + } + + model.confirmEvent.observe(viewLifecycleOwner) { + it.consume { + Log.w("$TAG Try turning on VFS") + viewModel.enableVfs() + + dialog.dismiss() + findNavController().popBackStack() + } + } + + dialog.show() + } } diff --git a/app/src/main/java/org/linphone/ui/main/settings/model/ConfirmVfsDialogModel.kt b/app/src/main/java/org/linphone/ui/main/settings/model/ConfirmVfsDialogModel.kt new file mode 100644 index 000000000..98d9277c6 --- /dev/null +++ b/app/src/main/java/org/linphone/ui/main/settings/model/ConfirmVfsDialogModel.kt @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2010-2025 Belledonne Communications SARL. + * + * This file is part of linphone-android + * (see https://www.linphone.org). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.linphone.ui.main.settings.model + +import androidx.annotation.UiThread +import androidx.lifecycle.MutableLiveData +import org.linphone.utils.Event + +class ConfirmVfsDialogModel + @UiThread + constructor() { + val cancelEvent = MutableLiveData>() + + val confirmEvent = MutableLiveData>() + + @UiThread + fun cancel() { + cancelEvent.value = Event(true) + } + + @UiThread + fun confirm() { + confirmEvent.value = Event(true) + } +} diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt index 3a6b4a819..a92a8a701 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt @@ -332,6 +332,8 @@ class SettingsViewModel Log.i("$TAG VFS has been enabled") } } else { + showRedToastEvent.postValue(Event(Pair(R.string.settings_security_enable_vfs_failure_toast, R.drawable.warning_circle))) + isVfsEnabled.postValue(false) Log.e("$TAG Failed to enable VFS!") } } diff --git a/app/src/main/java/org/linphone/utils/DialogUtils.kt b/app/src/main/java/org/linphone/utils/DialogUtils.kt index 2a9fa6951..83c87b66d 100644 --- a/app/src/main/java/org/linphone/utils/DialogUtils.kt +++ b/app/src/main/java/org/linphone/utils/DialogUtils.kt @@ -39,6 +39,7 @@ import org.linphone.databinding.DialogAssistantCreateAccountConfirmPhoneNumberBi import org.linphone.databinding.DialogCallConfirmTransferBinding import org.linphone.databinding.DialogCancelContactChangesBinding import org.linphone.databinding.DialogCancelMeetingBinding +import org.linphone.databinding.DialogConfirmTurningOnVfsBinding import org.linphone.databinding.DialogContactConfirmTrustCallBinding import org.linphone.databinding.DialogContactTrustProcessBinding import org.linphone.databinding.DialogDeleteContactBinding @@ -69,6 +70,7 @@ import org.linphone.ui.main.contacts.model.TrustCallDialogModel import org.linphone.ui.main.history.model.ConfirmationDialogModel import org.linphone.ui.main.model.AuthRequestedDialogModel import org.linphone.ui.main.model.GroupSetOrEditSubjectDialogModel +import org.linphone.ui.main.settings.model.ConfirmVfsDialogModel import org.linphone.ui.main.settings.model.UpdatePasswordDialogModel class DialogUtils { @@ -141,6 +143,22 @@ class DialogUtils { return getDialog(context, binding) } + @UiThread + fun getConfirmTurningOnVfsDialog( + context: Context, + viewModel: ConfirmVfsDialogModel + ): Dialog { + val binding: DialogConfirmTurningOnVfsBinding = DataBindingUtil.inflate( + LayoutInflater.from(context), + R.layout.dialog_confirm_turning_on_vfs, + null, + false + ) + binding.viewModel = viewModel + + return getDialog(context, binding) + } + @UiThread fun getNumberOrAddressPickerDialog( context: Context, diff --git a/app/src/main/res/layout/dialog_confirm_turning_on_vfs.xml b/app/src/main/res/layout/dialog_confirm_turning_on_vfs.xml new file mode 100644 index 000000000..ead3901c5 --- /dev/null +++ b/app/src/main/res/layout/dialog_confirm_turning_on_vfs.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/settings_fragment.xml b/app/src/main/res/layout/settings_fragment.xml index ae756092f..81a23ef10 100644 --- a/app/src/main/res/layout/settings_fragment.xml +++ b/app/src/main/res/layout/settings_fragment.xml @@ -8,6 +8,9 @@ + @@ -88,6 +91,7 @@ android:layout_marginEnd="16dp" android:visibility="@{viewModel.expandSecurity ? View.VISIBLE : View.GONE, default=gone}" app:layout_constraintTop_toBottomOf="@id/security" + bind:turnOnVfsClickListener="@{turnOnVfsClickListener}" bind:viewModel="@{viewModel}"/> + @@ -18,11 +21,13 @@ Securité Chiffrer tous les fichiers Attention, vous ne pourrez pas revenir en arrière ! + Échec à l\'activation du module d\'encryption + Confirmer l\'activation du chiffrement + Une fois la fonctionnalité activée, toutes les données de l\'application seront chiffrées et accessibles uniquement via celle-ci.\n\nCe changement est irréversible. Empêcher l\'interface d\'être enregistrée Appels Utiliser l\'annulateur d\'écho logiciel diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a8d3e036a..63e78e07b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -217,6 +217,9 @@ Security Encrypt everything Warning: once enabled it can\'t be disabled! + Failed to enable encryption module! + Do you really want to encrypt everything? + Be careful, it can\'t be undone! Prevent interface from being recorded Calls Use software echo canceller