diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 2785e25e3..acdd2d13d 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -83,11 +83,15 @@ class CoreContext @UiThread constructor(val context: Context) : HandlerThread("C MutableLiveData>() } - val greenToastToShowEvent: MutableLiveData>> by lazy { - MutableLiveData>>() + val showGreenToastEvent: MutableLiveData>> by lazy { + MutableLiveData>>() } - val redToastToShowEvent: MutableLiveData>> by lazy { + val showRedToastEvent: MutableLiveData>> by lazy { + MutableLiveData>>() + } + + val showFormattedRedToastEvent: MutableLiveData>> by lazy { MutableLiveData>>() } @@ -136,16 +140,22 @@ class CoreContext @UiThread constructor(val context: Context) : HandlerThread("C ) { Log.i("$TAG Configuring state changed [$status], message is [$message]") if (status == ConfiguringState.Successful) { - val text = context.getString( - org.linphone.R.string.toast_remote_provisioning_config_applied + showGreenToastEvent.postValue( + Event( + Pair( + org.linphone.R.string.toast_remote_provisioning_config_applied, + org.linphone.R.drawable.smiley + ) + ) ) - greenToastToShowEvent.postValue(Event(Pair(text, org.linphone.R.drawable.smiley))) } else if (status == ConfiguringState.Failed) { - val text = context.getString( - org.linphone.R.string.toast_remote_provisioning_config_failed - ) - redToastToShowEvent.postValue( - Event(Pair(text, org.linphone.R.drawable.warning_circle)) + showRedToastEvent.postValue( + Event( + Pair( + org.linphone.R.string.toast_remote_provisioning_config_failed, + org.linphone.R.drawable.warning_circle + ) + ) ) } } @@ -183,7 +193,7 @@ class CoreContext @UiThread constructor(val context: Context) : HandlerThread("C "$TAG Call error reason is [${errorInfo.reason}](${errorInfo.protocolCode}): ${errorInfo.phrase}" ) val text = LinphoneUtils.getCallErrorInfoToast(call) - redToastToShowEvent.postValue( + showFormattedRedToastEvent.postValue( Event(Pair(text, org.linphone.R.drawable.warning_circle)) ) } @@ -198,12 +208,10 @@ class CoreContext @UiThread constructor(val context: Context) : HandlerThread("C "$TAG Transferred call [${transfered.remoteAddress.asStringUriOnly()}] state changed [$state]" ) if (state == Call.State.Connected) { - val message = context.getString( - org.linphone.R.string.toast_call_transfer_successful - ) val icon = org.linphone.R.drawable.phone_transfer - - greenToastToShowEvent.postValue(Event(Pair(message, icon))) + showGreenToastEvent.postValue( + Event(Pair(org.linphone.R.string.toast_call_transfer_successful, icon)) + ) } } diff --git a/app/src/main/java/org/linphone/ui/GenericFragment.kt b/app/src/main/java/org/linphone/ui/GenericFragment.kt new file mode 100644 index 000000000..d710c573b --- /dev/null +++ b/app/src/main/java/org/linphone/ui/GenericFragment.kt @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2010-2023 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 + +import androidx.annotation.UiThread +import androidx.fragment.app.Fragment + +@UiThread +abstract class GenericFragment : Fragment() { + companion object { + private const val TAG = "[Generic Fragment]" + } + + protected fun observeToastEvents(viewModel: GenericViewModel) { + viewModel.showRedToastEvent.observe(viewLifecycleOwner) { + it.consume { pair -> + val message = getString(pair.first) + val icon = pair.second + (requireActivity() as GenericActivity).showRedToast(message, icon) + } + } + + viewModel.showFormattedRedToastEvent.observe(viewLifecycleOwner) { + it.consume { pair -> + val message = pair.first + val icon = pair.second + (requireActivity() as GenericActivity).showRedToast(message, icon) + } + } + + viewModel.showGreenToastEvent.observe(viewLifecycleOwner) { + it.consume { pair -> + val message = getString(pair.first) + val icon = pair.second + (requireActivity() as GenericActivity).showRedToast(message, icon) + } + } + + viewModel.showFormattedGreenToastEvent.observe(viewLifecycleOwner) { + it.consume { pair -> + val message = pair.first + val icon = pair.second + (requireActivity() as GenericActivity).showGreenToast(message, icon) + } + } + } +} diff --git a/app/src/main/java/org/linphone/ui/GenericViewModel.kt b/app/src/main/java/org/linphone/ui/GenericViewModel.kt new file mode 100644 index 000000000..2b6f45dd9 --- /dev/null +++ b/app/src/main/java/org/linphone/ui/GenericViewModel.kt @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2010-2024 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 + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import org.linphone.utils.Event + +open class GenericViewModel : ViewModel() { + val showGreenToastEvent: MutableLiveData>> by lazy { + MutableLiveData>>() + } + + val showFormattedGreenToastEvent: MutableLiveData>> by lazy { + MutableLiveData>>() + } + + val showRedToastEvent: MutableLiveData>> by lazy { + MutableLiveData>>() + } + + val showFormattedRedToastEvent: MutableLiveData>> by lazy { + MutableLiveData>>() + } +} diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/LandingFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/LandingFragment.kt index 2c0661bc2..6ced388cf 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/LandingFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/LandingFragment.kt @@ -26,7 +26,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.navGraphViewModels @@ -38,13 +37,14 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.AssistantLandingFragmentBinding import org.linphone.ui.GenericActivity +import org.linphone.ui.GenericFragment import org.linphone.ui.assistant.model.AcceptConditionsAndPolicyDialogModel import org.linphone.ui.assistant.viewmodel.LandingViewModel import org.linphone.utils.DialogUtils import org.linphone.utils.PhoneNumberUtils @UiThread -class LandingFragment : Fragment() { +class LandingFragment : GenericFragment() { companion object { private const val TAG = "[Landing Fragment]" } @@ -69,6 +69,7 @@ class LandingFragment : Fragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setBackClickListener { requireActivity().finish() @@ -131,15 +132,6 @@ class LandingFragment : Fragment() { } } - viewModel.showRedToastEvent.observe(viewLifecycleOwner) { - it.consume { message -> - (requireActivity() as GenericActivity).showRedToast( - getString(message), - R.drawable.warning_circle - ) - } - } - coreContext.postOnCoreThread { val dialPlan = PhoneNumberUtils.getDeviceDialPlan(requireContext()) if (dialPlan != null) { diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/LoginFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/LoginFragment.kt index e1d3a71de..6a13c8ca0 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/LoginFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/LoginFragment.kt @@ -26,7 +26,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs @@ -38,11 +37,12 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.AssistantLoginFragmentBinding import org.linphone.ui.GenericActivity +import org.linphone.ui.GenericFragment import org.linphone.ui.assistant.viewmodel.AccountLoginViewModel import org.linphone.utils.PhoneNumberUtils @UiThread -class LoginFragment : Fragment() { +class LoginFragment : GenericFragment() { companion object { private const val TAG = "[Login Fragment]" } @@ -69,6 +69,7 @@ class LoginFragment : Fragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setBackClickListener { goBack() @@ -113,15 +114,6 @@ class LoginFragment : Fragment() { } } - viewModel.showRedToastEvent.observe(viewLifecycleOwner) { - it.consume { message -> - (requireActivity() as GenericActivity).showRedToast( - getString(message), - R.drawable.warning_circle - ) - } - } - coreContext.postOnCoreThread { val dialPlan = PhoneNumberUtils.getDeviceDialPlan(requireContext()) if (dialPlan != null) { diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/PermissionsFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/PermissionsFragment.kt index c5d9d5916..73742369f 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/PermissionsFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/PermissionsFragment.kt @@ -28,17 +28,17 @@ import android.view.ViewGroup import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.UiThread import androidx.core.content.ContextCompat -import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.compatibility.Compatibility import org.linphone.core.tools.Log import org.linphone.databinding.AssistantPermissionsFragmentBinding +import org.linphone.ui.GenericFragment import org.linphone.ui.assistant.AssistantActivity @UiThread -class PermissionsFragment : Fragment() { +class PermissionsFragment : GenericFragment() { companion object { private const val TAG = "[Permissions Fragment]" } diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/ProfileModeFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/ProfileModeFragment.kt index 26513b642..f2ebed5ef 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/ProfileModeFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/ProfileModeFragment.kt @@ -24,16 +24,16 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread -import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import androidx.navigation.navGraphViewModels import org.linphone.R import org.linphone.databinding.AssistantSecureModeFragmentBinding +import org.linphone.ui.GenericFragment import org.linphone.ui.assistant.viewmodel.AccountLoginViewModel import org.linphone.utils.DialogUtils @UiThread -class ProfileModeFragment : Fragment() { +class ProfileModeFragment : GenericFragment() { companion object { private const val TAG = "[Profile Mode Fragment]" } @@ -58,6 +58,7 @@ class ProfileModeFragment : Fragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setBackClickListener { findNavController().popBackStack() diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/QrCodeScannerFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/QrCodeScannerFragment.kt index 61abc114e..0ce163dcf 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/QrCodeScannerFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/QrCodeScannerFragment.kt @@ -28,7 +28,6 @@ import android.view.ViewGroup import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.UiThread import androidx.core.content.ContextCompat -import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import androidx.navigation.navGraphViewModels import org.linphone.LinphoneApplication.Companion.coreContext @@ -36,10 +35,11 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.AssistantQrCodeScannerFragmentBinding import org.linphone.ui.GenericActivity +import org.linphone.ui.GenericFragment import org.linphone.ui.assistant.viewmodel.QrCodeViewModel @UiThread -class QrCodeScannerFragment : Fragment() { +class QrCodeScannerFragment : GenericFragment() { companion object { private const val TAG = "[Qr Code Scanner Fragment]" } @@ -76,6 +76,7 @@ class QrCodeScannerFragment : Fragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setBackClickListener { goBack() diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/RegisterCodeConfirmationFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/RegisterCodeConfirmationFragment.kt index d73d86141..1b29e899f 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/RegisterCodeConfirmationFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/RegisterCodeConfirmationFragment.kt @@ -26,16 +26,16 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread -import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import androidx.navigation.navGraphViewModels import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.AssistantRegisterConfirmSmsCodeFragmentBinding +import org.linphone.ui.GenericFragment import org.linphone.ui.assistant.viewmodel.AccountCreationViewModel @UiThread -class RegisterCodeConfirmationFragment : Fragment() { +class RegisterCodeConfirmationFragment : GenericFragment() { companion object { private const val TAG = "[Register Code Confirmation Fragment]" } @@ -60,6 +60,7 @@ class RegisterCodeConfirmationFragment : Fragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setBackClickListener { goBack() diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/RegisterFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/RegisterFragment.kt index 6c350d44f..73a24c142 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/RegisterFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/RegisterFragment.kt @@ -31,7 +31,6 @@ import android.widget.AdapterView import android.widget.ArrayAdapter import androidx.annotation.UiThread import androidx.appcompat.widget.AppCompatTextView -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.navGraphViewModels @@ -42,13 +41,14 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.AssistantRegisterFragmentBinding import org.linphone.ui.GenericActivity +import org.linphone.ui.GenericFragment import org.linphone.ui.assistant.model.ConfirmPhoneNumberDialogModel import org.linphone.ui.assistant.viewmodel.AccountCreationViewModel import org.linphone.utils.DialogUtils import org.linphone.utils.PhoneNumberUtils @UiThread -class RegisterFragment : Fragment() { +class RegisterFragment : GenericFragment() { companion object { private const val TAG = "[Register Fragment]" } @@ -86,6 +86,7 @@ class RegisterFragment : Fragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setBackClickListener { goBack() diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/ThirdPartySipAccountLoginFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/ThirdPartySipAccountLoginFragment.kt index 87585bf2d..d9d3d3d20 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/ThirdPartySipAccountLoginFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/ThirdPartySipAccountLoginFragment.kt @@ -26,7 +26,6 @@ import android.view.ViewGroup import android.widget.AdapterView import android.widget.ArrayAdapter import androidx.annotation.UiThread -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.navGraphViewModels @@ -37,11 +36,12 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.AssistantThirdPartySipAccountLoginFragmentBinding import org.linphone.ui.GenericActivity +import org.linphone.ui.GenericFragment import org.linphone.ui.assistant.viewmodel.ThirdPartySipAccountLoginViewModel import org.linphone.utils.PhoneNumberUtils @UiThread -class ThirdPartySipAccountLoginFragment : Fragment() { +class ThirdPartySipAccountLoginFragment : GenericFragment() { companion object { private const val TAG = "[Third Party SIP Account Login Fragment]" } @@ -90,6 +90,7 @@ class ThirdPartySipAccountLoginFragment : Fragment() { binding.transport.setSelection(viewModel.availableTransports.size - 1) binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setBackClickListener { goBack() diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/ThirdPartySipAccountWarningFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/ThirdPartySipAccountWarningFragment.kt index 012abc052..b14aae62c 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/ThirdPartySipAccountWarningFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/ThirdPartySipAccountWarningFragment.kt @@ -26,14 +26,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread -import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.AssistantThirdPartySipAccountWarningFragmentBinding +import org.linphone.ui.GenericFragment @UiThread -class ThirdPartySipAccountWarningFragment : Fragment() { +class ThirdPartySipAccountWarningFragment : GenericFragment() { companion object { private const val TAG = "[Third Party SIP Account Warning Fragment]" } diff --git a/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountCreationViewModel.kt b/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountCreationViewModel.kt index 691b88811..f1067e824 100644 --- a/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountCreationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountCreationViewModel.kt @@ -23,7 +23,6 @@ import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -44,11 +43,12 @@ import org.linphone.core.CoreListenerStub import org.linphone.core.DialPlan import org.linphone.core.Factory import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.utils.AppUtils import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils -class AccountCreationViewModel @UiThread constructor() : ViewModel() { +class AccountCreationViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Account Creation ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountLoginViewModel.kt b/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountLoginViewModel.kt index 02625caa7..b378fbfd9 100644 --- a/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountLoginViewModel.kt +++ b/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountLoginViewModel.kt @@ -23,7 +23,6 @@ import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R @@ -35,12 +34,13 @@ import org.linphone.core.Factory import org.linphone.core.Reason import org.linphone.core.RegistrationState import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.ui.main.model.setEndToEndEncryptionMandatory import org.linphone.ui.main.model.setInteroperabilityMode import org.linphone.utils.AppUtils import org.linphone.utils.Event -open class AccountLoginViewModel @UiThread constructor() : ViewModel() { +open class AccountLoginViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Account Login ViewModel]" } @@ -69,10 +69,6 @@ open class AccountLoginViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } - val showRedToastEvent: MutableLiveData> by lazy { - MutableLiveData>() - } - private lateinit var newlyCreatedAuthInfo: AuthInfo private lateinit var newlyCreatedAccount: Account @@ -157,7 +153,12 @@ open class AccountLoginViewModel @UiThread constructor() : ViewModel() { if (identityAddress == null) { Log.e("$TAG Can't parse [$identity] as Address!") showRedToastEvent.postValue( - Event(R.string.assistant_login_cant_parse_address_toast) + Event( + Pair( + R.string.assistant_login_cant_parse_address_toast, + R.drawable.warning_circle + ) + ) ) return@postOnCoreThread } @@ -168,7 +169,12 @@ open class AccountLoginViewModel @UiThread constructor() : ViewModel() { "$TAG Address [${identityAddress.asStringUriOnly()}] doesn't contains an username!" ) showRedToastEvent.postValue( - Event(R.string.assistant_login_address_without_username_toast) + Event( + Pair( + R.string.assistant_login_address_without_username_toast, + R.drawable.warning_circle + ) + ) ) return@postOnCoreThread } diff --git a/app/src/main/java/org/linphone/ui/assistant/viewmodel/QrCodeViewModel.kt b/app/src/main/java/org/linphone/ui/assistant/viewmodel/QrCodeViewModel.kt index 9bcaaee70..e8787c1c3 100644 --- a/app/src/main/java/org/linphone/ui/assistant/viewmodel/QrCodeViewModel.kt +++ b/app/src/main/java/org/linphone/ui/assistant/viewmodel/QrCodeViewModel.kt @@ -23,14 +23,14 @@ import android.util.Patterns import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.core.Core import org.linphone.core.CoreListenerStub import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.utils.Event -class QrCodeViewModel @UiThread constructor() : ViewModel() { +class QrCodeViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Qr Code Scanner ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/assistant/viewmodel/ThirdPartySipAccountLoginViewModel.kt b/app/src/main/java/org/linphone/ui/assistant/viewmodel/ThirdPartySipAccountLoginViewModel.kt index f489ec5e0..680b4ed65 100644 --- a/app/src/main/java/org/linphone/ui/assistant/viewmodel/ThirdPartySipAccountLoginViewModel.kt +++ b/app/src/main/java/org/linphone/ui/assistant/viewmodel/ThirdPartySipAccountLoginViewModel.kt @@ -23,7 +23,6 @@ import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import java.util.Locale import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences @@ -37,10 +36,11 @@ import org.linphone.core.Reason import org.linphone.core.RegistrationState import org.linphone.core.TransportType import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.utils.AppUtils import org.linphone.utils.Event -class ThirdPartySipAccountLoginViewModel @UiThread constructor() : ViewModel() { +class ThirdPartySipAccountLoginViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Third Party SIP Account Login ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceAddParticipantsFragment.kt b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceAddParticipantsFragment.kt index 073f1e76a..19baceba1 100644 --- a/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceAddParticipantsFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceAddParticipantsFragment.kt @@ -75,8 +75,8 @@ class ConferenceAddParticipantsFragment : GenericAddressPickerFragment() { super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner - binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setBackClickListener { goBack() diff --git a/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceParticipantsListFragment.kt b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceParticipantsListFragment.kt index 2d1982974..0b11c37a4 100644 --- a/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceParticipantsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceParticipantsListFragment.kt @@ -82,6 +82,8 @@ class ConferenceParticipantsListFragment : GenericCallFragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) + observeToastEvents(viewModel.conferenceModel) binding.participantsList.setHasFixedSize(true) binding.participantsList.layoutManager = LinearLayoutManager(requireContext()) @@ -114,15 +116,6 @@ class ConferenceParticipantsListFragment : GenericCallFragment() { showKickParticipantDialog(displayName, participant) } } - - viewModel.conferenceModel.showRedToastEvent.observe(viewLifecycleOwner) { - it.consume { message -> - (requireActivity() as GenericActivity).showRedToast( - getString(message), - R.drawable.warning_circle - ) - } - } } private fun showKickParticipantDialog(displayName: String, participant: Participant) { diff --git a/app/src/main/java/org/linphone/ui/call/conference/viewmodel/ConferenceViewModel.kt b/app/src/main/java/org/linphone/ui/call/conference/viewmodel/ConferenceViewModel.kt index 503073aad..ae41e593c 100644 --- a/app/src/main/java/org/linphone/ui/call/conference/viewmodel/ConferenceViewModel.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/viewmodel/ConferenceViewModel.kt @@ -33,13 +33,14 @@ import org.linphone.core.Participant import org.linphone.core.ParticipantDevice import org.linphone.core.StreamType import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.ui.call.conference.model.ConferenceParticipantDeviceModel import org.linphone.ui.call.conference.model.ConferenceParticipantModel import org.linphone.ui.call.conference.view.GridBoxLayout import org.linphone.utils.AppUtils import org.linphone.utils.Event -class ConferenceViewModel { +class ConferenceViewModel : GenericViewModel() { companion object { private const val TAG = "[Conference ViewModel]" @@ -80,10 +81,6 @@ class ConferenceViewModel { MutableLiveData>>() } - val showRedToastEvent: MutableLiveData> by lazy { - MutableLiveData>() - } - private lateinit var conference: Conference private val conferenceListener = object : ConferenceListenerStub() { @@ -310,7 +307,12 @@ class ConferenceViewModel { "$TAG Failed to parse SIP URI [$uri] into address, can't add it to the conference!" ) showRedToastEvent.postValue( - Event(R.string.conference_failed_to_add_participant_invalid_address_toast) + Event( + Pair( + R.string.conference_failed_to_add_participant_invalid_address_toast, + R.drawable.warning_circle + ) + ) ) } } @@ -698,7 +700,12 @@ class ConferenceViewModel { ) setNewLayout(ACTIVE_SPEAKER_LAYOUT) showRedToastEvent.postValue( - Event(R.string.conference_too_many_participants_for_mosaic_layout_toast) + Event( + Pair( + R.string.conference_too_many_participants_for_mosaic_layout_toast, + R.drawable.warning_circle + ) + ) ) } } diff --git a/app/src/main/java/org/linphone/ui/call/fragment/AbstractNewTransferCallFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/AbstractNewTransferCallFragment.kt index 08749e4f1..bb0bc8467 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/AbstractNewTransferCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/AbstractNewTransferCallFragment.kt @@ -106,6 +106,7 @@ abstract class AbstractNewTransferCallFragment : GenericCallFragment() { viewModel.title.value = title binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setBackClickListener { findNavController().popBackStack() diff --git a/app/src/main/java/org/linphone/ui/call/fragment/CallsListFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/CallsListFragment.kt index 793243747..d015e1fe1 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/CallsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/CallsListFragment.kt @@ -71,6 +71,7 @@ class CallsListFragment : GenericCallFragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) binding.callsList.setHasFixedSize(true) binding.callsList.layoutManager = LinearLayoutManager(requireContext()) diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ConversationFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/ConversationFragment.kt index 750491205..2fb4981d6 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/ConversationFragment.kt @@ -204,9 +204,11 @@ class ConversationFragment : GenericCallFragment() { viewModel.isInCallConversation.value = true binding.viewModel = viewModel + observeToastEvents(viewModel) sendMessageViewModel.isInCallConversation.value = true binding.sendMessageViewModel = sendMessageViewModel + observeToastEvents(sendMessageViewModel) binding.setBackClickListener { findNavController().popBackStack() @@ -362,14 +364,6 @@ class ConversationFragment : GenericCallFragment() { } } - sendMessageViewModel.showRedToastEvent.observe(viewLifecycleOwner) { - it.consume { pair -> - val message = pair.first - val icon = pair.second - (requireActivity() as GenericActivity).showRedToast(message, icon) - } - } - viewModel.searchFilter.observe(viewLifecycleOwner) { filter -> viewModel.applyFilter(filter.trim()) } @@ -400,14 +394,6 @@ class ConversationFragment : GenericCallFragment() { } } - viewModel.showRedToastEvent.observe(viewLifecycleOwner) { - it.consume { pair -> - val message = pair.first - val icon = pair.second - (requireActivity() as GenericActivity).showRedToast(message, icon) - } - } - viewModel.messageDeletedEvent.observe(viewLifecycleOwner) { it.consume { val message = getString(R.string.conversation_message_deleted_toast) diff --git a/app/src/main/java/org/linphone/ui/call/fragment/GenericCallFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/GenericCallFragment.kt index 2472d2aa7..f380d0c30 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/GenericCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/GenericCallFragment.kt @@ -22,12 +22,12 @@ package org.linphone.ui.call.fragment import android.os.Bundle import android.view.View import androidx.annotation.UiThread -import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider +import org.linphone.ui.GenericFragment import org.linphone.ui.call.viewmodel.SharedCallViewModel @UiThread -abstract class GenericCallFragment : Fragment() { +abstract class GenericCallFragment : GenericFragment() { companion object { private const val TAG = "[Generic Call Fragment]" } diff --git a/app/src/main/java/org/linphone/ui/call/model/ZrtpSasConfirmationDialogModel.kt b/app/src/main/java/org/linphone/ui/call/model/ZrtpSasConfirmationDialogModel.kt index e6043d9fb..dfcf69d66 100644 --- a/app/src/main/java/org/linphone/ui/call/model/ZrtpSasConfirmationDialogModel.kt +++ b/app/src/main/java/org/linphone/ui/call/model/ZrtpSasConfirmationDialogModel.kt @@ -21,17 +21,17 @@ package org.linphone.ui.call.model import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import java.util.Random import org.linphone.R import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.utils.AppUtils import org.linphone.utils.Event class ZrtpSasConfirmationDialogModel @UiThread constructor( authTokenToRead: String, private val authTokenToListen: String -) : ViewModel() { +) : GenericViewModel() { companion object { private const val TAG = "[ZRTP SAS Confirmation Dialog]" private const val ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" diff --git a/app/src/main/java/org/linphone/ui/call/viewmodel/CallsViewModel.kt b/app/src/main/java/org/linphone/ui/call/viewmodel/CallsViewModel.kt index 58256ab67..6c3b80096 100644 --- a/app/src/main/java/org/linphone/ui/call/viewmodel/CallsViewModel.kt +++ b/app/src/main/java/org/linphone/ui/call/viewmodel/CallsViewModel.kt @@ -22,19 +22,19 @@ package org.linphone.ui.call.viewmodel import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.Call import org.linphone.core.Core import org.linphone.core.CoreListenerStub import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.ui.call.model.CallModel import org.linphone.utils.AppUtils import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils -class CallsViewModel @UiThread constructor() : ViewModel() { +class CallsViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Calls ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt index 304e24efe..637806bd8 100644 --- a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt @@ -26,7 +26,6 @@ import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.core.app.ActivityCompat import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import java.util.Locale import kotlinx.coroutines.Dispatchers @@ -51,6 +50,7 @@ import org.linphone.core.MediaEncryption import org.linphone.core.SecurityLevel import org.linphone.core.StreamType import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.ui.call.conference.viewmodel.ConferenceViewModel import org.linphone.ui.call.model.AudioDeviceModel import org.linphone.ui.call.model.CallMediaEncryptionModel @@ -63,7 +63,7 @@ import org.linphone.utils.AudioUtils import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils -class CurrentCallViewModel @UiThread constructor() : ViewModel() { +class CurrentCallViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Current Call ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/call/viewmodel/SharedCallViewModel.kt b/app/src/main/java/org/linphone/ui/call/viewmodel/SharedCallViewModel.kt index 0b2033866..5431099f7 100644 --- a/app/src/main/java/org/linphone/ui/call/viewmodel/SharedCallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/call/viewmodel/SharedCallViewModel.kt @@ -21,11 +21,11 @@ package org.linphone.ui.call.viewmodel import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import androidx.window.layout.FoldingFeature +import org.linphone.ui.GenericViewModel import org.linphone.utils.Event -class SharedCallViewModel @UiThread constructor() : ViewModel() { +class SharedCallViewModel @UiThread constructor() : GenericViewModel() { val toggleFullScreenEvent = MutableLiveData>() val foldingState = MutableLiveData() diff --git a/app/src/main/java/org/linphone/ui/main/MainActivity.kt b/app/src/main/java/org/linphone/ui/main/MainActivity.kt index 961498c60..a10d565eb 100644 --- a/app/src/main/java/org/linphone/ui/main/MainActivity.kt +++ b/app/src/main/java/org/linphone/ui/main/MainActivity.kt @@ -196,15 +196,23 @@ class MainActivity : GenericActivity() { } } - coreContext.greenToastToShowEvent.observe(this) { + coreContext.showGreenToastEvent.observe(this) { it.consume { pair -> - val message = pair.first + val message = getString(pair.first) val icon = pair.second showGreenToast(message, icon) } } - coreContext.redToastToShowEvent.observe(this) { + coreContext.showRedToastEvent.observe(this) { + it.consume { pair -> + val message = getString(pair.first) + val icon = pair.second + showRedToast(message, icon) + } + } + + coreContext.showFormattedRedToastEvent.observe(this) { it.consume { pair -> val message = pair.first val icon = pair.second diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationDocumentsListFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationDocumentsListFragment.kt index b395e0865..7420ca524 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationDocumentsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationDocumentsListFragment.kt @@ -84,6 +84,7 @@ class ConversationDocumentsListFragment : SlidingPaneChildFragment() { viewModel = ViewModelProvider(this)[ConversationDocumentsListViewModel::class.java] binding.viewModel = viewModel + observeToastEvents(viewModel) val localSipUri = args.localSipUri val remoteSipUri = args.remoteSipUri diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationEphemeralLifetimeFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationEphemeralLifetimeFragment.kt index f5153a8a3..0034aefca 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationEphemeralLifetimeFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationEphemeralLifetimeFragment.kt @@ -65,6 +65,7 @@ class ConversationEphemeralLifetimeFragment : SlidingPaneChildFragment() { viewModel = ViewModelProvider(this)[ConversationEphemeralLifetimeViewModel::class.java] binding.viewModel = viewModel + observeToastEvents(viewModel) val lifetime = args.currentEphemeralLifetime Log.i("$TAG Current lifetime for ephemeral messages is [$lifetime]") diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt index ef7af2a7e..38503e8b1 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt @@ -352,6 +352,9 @@ class ConversationFragment : SlidingPaneChildFragment() { binding.viewModel = viewModel binding.sendMessageViewModel = sendMessageViewModel + observeToastEvents(viewModel) + observeToastEvents(sendMessageViewModel) + binding.setBackClickListener { goBack() } @@ -592,14 +595,6 @@ class ConversationFragment : SlidingPaneChildFragment() { } } - sendMessageViewModel.showRedToastEvent.observe(viewLifecycleOwner) { - it.consume { pair -> - val message = pair.first - val icon = pair.second - (requireActivity() as GenericActivity).showRedToast(message, icon) - } - } - viewModel.searchFilter.observe(viewLifecycleOwner) { filter -> viewModel.applyFilter(filter.trim()) } @@ -662,22 +657,6 @@ class ConversationFragment : SlidingPaneChildFragment() { } } - viewModel.showGreenToastEvent.observe(viewLifecycleOwner) { - it.consume { pair -> - val message = pair.first - val icon = pair.second - (requireActivity() as GenericActivity).showGreenToast(message, icon) - } - } - - viewModel.showRedToastEvent.observe(viewLifecycleOwner) { - it.consume { pair -> - val message = pair.first - val icon = pair.second - (requireActivity() as GenericActivity).showRedToast(message, icon) - } - } - viewModel.messageDeletedEvent.observe(viewLifecycleOwner) { it.consume { val message = getString(R.string.conversation_message_deleted_toast) diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt index 24c42ffb5..ed4813532 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt @@ -86,6 +86,7 @@ class ConversationInfoFragment : SlidingPaneChildFragment() { viewModel = ViewModelProvider(this)[ConversationInfoViewModel::class.java] binding.viewModel = viewModel + observeToastEvents(viewModel) val localSipUri = args.localSipUri val remoteSipUri = args.remoteSipUri @@ -179,22 +180,6 @@ class ConversationInfoFragment : SlidingPaneChildFragment() { } } - viewModel.showGreenToastEvent.observe(viewLifecycleOwner) { - it.consume { pair -> - val message = pair.first - val icon = pair.second - (requireActivity() as GenericActivity).showGreenToast(message, icon) - } - } - - viewModel.showRedToastEvent.observe(viewLifecycleOwner) { - it.consume { pair -> - val message = pair.first - val icon = pair.second - (requireActivity() as GenericActivity).showRedToast(message, icon) - } - } - sharedViewModel.listOfSelectedSipUrisEvent.observe(viewLifecycleOwner) { it.consume { list -> Log.i("$TAG Found [${list.size}] new participants to add to the group, let's do it") diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt index da97b4677..7917d06e7 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt @@ -85,6 +85,7 @@ class ConversationMediaListFragment : SlidingPaneChildFragment() { viewModel = ViewModelProvider(this)[ConversationMediaListViewModel::class.java] binding.viewModel = viewModel + observeToastEvents(viewModel) val localSipUri = args.localSipUri val remoteSipUri = args.remoteSipUri diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/StartConversationFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/StartConversationFragment.kt index a091275a3..951431d91 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/StartConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/StartConversationFragment.kt @@ -66,8 +66,8 @@ class StartConversationFragment : GenericAddressPickerFragment() { super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner - binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setBackClickListener { goBack() diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/EventLogModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/EventLogModel.kt index 36f6d3f9a..f53bbbdd1 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/EventLogModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/EventLogModel.kt @@ -36,7 +36,7 @@ class EventLogModel @WorkerThread constructor( onJoinConferenceClicked: ((uri: String) -> Unit)? = null, onWebUrlClicked: ((url: String) -> Unit)? = null, onContactClicked: ((friendRefKey: String) -> Unit)? = null, - onRedToastToShow: ((pair: Pair) -> Unit)? = null + onRedToastToShow: ((pair: Pair) -> Unit)? = null ) { companion object { private const val TAG = "[Event Log Model]" diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt index 3c14e2100..dc3bb6d27 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt @@ -77,7 +77,7 @@ class MessageModel @WorkerThread constructor( private val onJoinConferenceClicked: ((uri: String) -> Unit)? = null, private val onWebUrlClicked: ((url: String) -> Unit)? = null, private val onContactClicked: ((friendRefKey: String) -> Unit)? = null, - private val onRedToastToShow: ((pair: Pair) -> Unit)? = null + private val onRedToastToShow: ((pair: Pair) -> Unit)? = null ) { companion object { private const val TAG = "[Message Model]" @@ -702,8 +702,9 @@ class MessageModel @WorkerThread constructor( val lowMediaVolume = AudioUtils.isMediaVolumeLow(coreContext.context) if (lowMediaVolume) { Log.w("$TAG Media volume is low, notifying user as they may not hear voice message") - val message = AppUtils.getString(R.string.toast_low_media_volume) - onRedToastToShow?.invoke(Pair(message, R.drawable.speaker_slash)) + onRedToastToShow?.invoke( + Pair(R.string.toast_low_media_volume, R.drawable.speaker_slash) + ) } if (voiceRecordAudioFocusRequest == null) { diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/AbstractConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/AbstractConversationViewModel.kt index 8a55a5d6d..37d484513 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/AbstractConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/AbstractConversationViewModel.kt @@ -22,14 +22,14 @@ package org.linphone.ui.main.chat.viewmodel import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.core.ChatRoom import org.linphone.core.Factory import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.utils.Event -abstract class AbstractConversationViewModel : ViewModel() { +abstract class AbstractConversationViewModel : GenericViewModel() { companion object { private const val TAG = "[Abstract Conversation ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationEphemeralLifetimeViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationEphemeralLifetimeViewModel.kt index dcc42e23e..f648fc567 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationEphemeralLifetimeViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationEphemeralLifetimeViewModel.kt @@ -21,9 +21,9 @@ package org.linphone.ui.main.chat.viewmodel import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel +import org.linphone.ui.GenericViewModel -class ConversationEphemeralLifetimeViewModel @UiThread constructor() : ViewModel() { +class ConversationEphemeralLifetimeViewModel @UiThread constructor() : GenericViewModel() { val currentlySelectedValue = MutableLiveData() init { diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt index b191b9dd8..9f9954022 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt @@ -92,14 +92,6 @@ class ConversationInfoViewModel @UiThread constructor() : AbstractConversationVi MutableLiveData>>() } - val showGreenToastEvent: MutableLiveData>> by lazy { - MutableLiveData>>() - } - - val showRedToastEvent: MutableLiveData>> by lazy { - MutableLiveData>>() - } - private val chatRoomListener = object : ChatRoomListenerStub() { @WorkerThread override fun onParticipantAdded(chatRoom: ChatRoom, eventLog: EventLog) { @@ -108,7 +100,7 @@ class ConversationInfoViewModel @UiThread constructor() : AbstractConversationVi R.string.toast_participant_added_to_conversation, getParticipant(eventLog) ) - showGreenToastEvent.postValue(Event(Pair(message, R.drawable.user_circle))) + showFormattedGreenToastEvent.postValue(Event(Pair(message, R.drawable.user_circle))) computeParticipantsList() infoChangedEvent.postValue(Event(true)) @@ -121,7 +113,7 @@ class ConversationInfoViewModel @UiThread constructor() : AbstractConversationVi R.string.toast_participant_removed_from_conversation, getParticipant(eventLog) ) - showGreenToastEvent.postValue(Event(Pair(message, R.drawable.user_circle))) + showFormattedGreenToastEvent.postValue(Event(Pair(message, R.drawable.user_circle))) computeParticipantsList() infoChangedEvent.postValue(Event(true)) @@ -143,7 +135,7 @@ class ConversationInfoViewModel @UiThread constructor() : AbstractConversationVi getParticipant(eventLog) ) } - showGreenToastEvent.postValue(Event(Pair(message, R.drawable.user_circle))) + showFormattedGreenToastEvent.postValue(Event(Pair(message, R.drawable.user_circle))) computeParticipantsList() } @@ -153,10 +145,9 @@ class ConversationInfoViewModel @UiThread constructor() : AbstractConversationVi Log.i( "$TAG Conversation [${LinphoneUtils.getChatRoomId(chatRoom)}] has a new subject [${chatRoom.subject}]" ) - val message = AppUtils.getString( - R.string.toast_conversation_subject_changed + showGreenToastEvent.postValue( + Event(Pair(R.string.toast_conversation_subject_changed, R.drawable.check)) ) - showGreenToastEvent.postValue(Event(Pair(message, R.drawable.check))) subject.postValue(chatRoom.subject) infoChangedEvent.postValue(Event(true)) @@ -165,24 +156,38 @@ class ConversationInfoViewModel @UiThread constructor() : AbstractConversationVi @WorkerThread override fun onEphemeralEvent(chatRoom: ChatRoom, eventLog: EventLog) { Log.i("$TAG Ephemeral event [${eventLog.type}]") - val message = when (eventLog.type) { + when (eventLog.type) { EventLog.Type.ConferenceEphemeralMessageEnabled -> { - AppUtils.getString( - R.string.toast_conversation_ephemeral_messages_enabled + showGreenToastEvent.postValue( + Event( + Pair( + R.string.toast_conversation_ephemeral_messages_enabled, + R.drawable.clock_countdown + ) + ) ) } EventLog.Type.ConferenceEphemeralMessageDisabled -> { - AppUtils.getString( - R.string.toast_conversation_ephemeral_messages_disabled + showGreenToastEvent.postValue( + Event( + Pair( + R.string.toast_conversation_ephemeral_messages_disabled, + R.drawable.clock_countdown + ) + ) ) } else -> { - AppUtils.getString( - R.string.toast_conversation_ephemeral_messages_lifetime_changed + showGreenToastEvent.postValue( + Event( + Pair( + R.string.toast_conversation_ephemeral_messages_lifetime_changed, + R.drawable.clock_countdown + ) + ) ) } } - showGreenToastEvent.postValue(Event(Pair(message, R.drawable.clock_countdown))) } } @@ -203,18 +208,26 @@ class ConversationInfoViewModel @UiThread constructor() : AbstractConversationVi coreContext.startVideoCall(conferenceAddress) } else { Log.e("$TAG Conference info URI is null!") - val message = AppUtils.getString( - R.string.conference_failed_to_create_group_call_toast + showRedToastEvent.postValue( + Event( + Pair( + R.string.conference_failed_to_create_group_call_toast, + R.drawable.warning_circle + ) + ) ) - showRedToastEvent.postValue(Event(Pair(message, R.drawable.warning_circle))) } } else if (state == ConferenceScheduler.State.Error) { conferenceScheduler.removeListener(this) Log.e("$TAG Failed to create group call!") - val message = AppUtils.getString( - R.string.conference_failed_to_create_group_call_toast + showRedToastEvent.postValue( + Event( + Pair( + R.string.conference_failed_to_create_group_call_toast, + R.drawable.warning_circle + ) + ) ) - showRedToastEvent.postValue(Event(Pair(message, R.drawable.warning_circle))) } } } @@ -451,10 +464,14 @@ class ConversationInfoViewModel @UiThread constructor() : AbstractConversationVi val ok = chatRoom.addParticipants(toAddList.toTypedArray()) if (!ok) { Log.w("$TAG Failed to add some/all participants to the group!") - val message = AppUtils.getString( - R.string.toast_failed_to_add_participant_to_group_conversation + showRedToastEvent.postValue( + Event( + Pair( + R.string.toast_failed_to_add_participant_to_group_conversation, + R.drawable.warning_circle + ) + ) ) - showRedToastEvent.postValue(Event(Pair(message, R.drawable.warning_circle))) } } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt index 8ba4e1836..7358c6c15 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt @@ -116,14 +116,6 @@ class ConversationViewModel @UiThread constructor() : AbstractConversationViewMo MutableLiveData>() } - val showGreenToastEvent: MutableLiveData>> by lazy { - MutableLiveData>>() - } - - val showRedToastEvent: MutableLiveData>> by lazy { - MutableLiveData>>() - } - val messageDeletedEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -295,18 +287,26 @@ class ConversationViewModel @UiThread constructor() : AbstractConversationViewMo coreContext.startVideoCall(conferenceAddress) } else { Log.e("$TAG Conference info URI is null!") - val message = AppUtils.getString( - R.string.conference_failed_to_create_group_call_toast + showRedToastEvent.postValue( + Event( + Pair( + R.string.conference_failed_to_create_group_call_toast, + R.drawable.warning_circle + ) + ) ) - showRedToastEvent.postValue(Event(Pair(message, R.drawable.warning_circle))) } } else if (state == ConferenceScheduler.State.Error) { conferenceScheduler.removeListener(this) Log.e("$TAG Failed to create group call!") - val message = AppUtils.getString( - R.string.conference_failed_to_create_group_call_toast + showRedToastEvent.postValue( + Event( + Pair( + R.string.conference_failed_to_create_group_call_toast, + R.drawable.warning_circle + ) + ) ) - showRedToastEvent.postValue(Event(Pair(message, R.drawable.warning_circle))) } } } @@ -864,16 +864,24 @@ class ConversationViewModel @UiThread constructor() : AbstractConversationViewMo Log.i( "$TAG File [$filePath] has been successfully exported to documents" ) - val message = AppUtils.getString( - R.string.toast_file_successfully_exported_to_documents + showGreenToastEvent.postValue( + Event( + Pair( + R.string.toast_file_successfully_exported_to_documents, + R.drawable.check + ) + ) ) - showGreenToastEvent.postValue(Event(Pair(message, R.drawable.check))) } else { Log.e("$TAG Failed to export file [$filePath] to documents!") - val message = AppUtils.getString( - R.string.toast_export_file_to_documents_error + showRedToastEvent.postValue( + Event( + Pair( + R.string.toast_export_file_to_documents_error, + R.drawable.warning_circle + ) + ) ) - showRedToastEvent.postValue(Event(Pair(message, R.drawable.warning_circle))) } } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt index 4e95f6e12..8a6efd362 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt @@ -32,7 +32,6 @@ import org.linphone.core.CoreListenerStub import org.linphone.core.tools.Log import org.linphone.ui.main.chat.model.ConversationModel import org.linphone.ui.main.viewmodel.AbstractMainViewModel -import org.linphone.utils.AppUtils import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils @@ -45,10 +44,6 @@ class ConversationsListViewModel @UiThread constructor() : AbstractMainViewModel val fetchInProgress = MutableLiveData() - val showGreenToastEvent: MutableLiveData>> by lazy { - MutableLiveData>>() - } - private val coreListener = object : CoreListenerStub() { @WorkerThread override fun onChatRoomStateChanged( @@ -67,9 +62,10 @@ class ConversationsListViewModel @UiThread constructor() : AbstractMainViewModel ChatRoom.State.Deleted -> { computeChatRoomsList(currentFilter) - val message = AppUtils.getString(R.string.toast_conversation_deleted) showGreenToastEvent.postValue( - Event(Pair(message, R.drawable.chat_teardrop_text)) + Event( + Pair(R.string.toast_conversation_deleted, R.drawable.chat_teardrop_text) + ) ) } else -> {} diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt index d696f6a02..744237ab1 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt @@ -25,7 +25,6 @@ import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.core.app.ActivityCompat import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.media.AudioFocusRequestCompat import java.text.SimpleDateFormat @@ -47,16 +46,16 @@ import org.linphone.core.Player import org.linphone.core.PlayerListener import org.linphone.core.Recorder import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.ui.main.chat.model.FileModel import org.linphone.ui.main.chat.model.MessageModel import org.linphone.ui.main.chat.model.ParticipantModel -import org.linphone.utils.AppUtils import org.linphone.utils.AudioUtils import org.linphone.utils.Event import org.linphone.utils.FileUtils import org.linphone.utils.LinphoneUtils -class SendMessageInConversationViewModel @UiThread constructor() : ViewModel() { +class SendMessageInConversationViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Send Message In Conversation ViewModel]" } @@ -120,10 +119,6 @@ class SendMessageInConversationViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } - val showRedToastEvent: MutableLiveData>> by lazy { - MutableLiveData>>() - } - lateinit var chatRoom: ChatRoom private var chatMessageToReplyTo: ChatMessage? = null @@ -521,10 +516,14 @@ class SendMessageInConversationViewModel @UiThread constructor() : ViewModel() { "$TAG Max duration for voice recording exceeded (${maxVoiceRecordDuration}ms), stopping." ) stopVoiceRecorder() - val message = AppUtils.getString( - R.string.toast_voice_recording_max_duration_reached + showRedToastEvent.postValue( + Event( + Pair( + R.string.toast_voice_recording_max_duration_reached, + R.drawable.warning_circle + ) + ) ) - showRedToastEvent.postValue(Event(Pair(message, R.drawable.warning_circle))) } } }.launchIn(viewModelScope) @@ -589,8 +588,9 @@ class SendMessageInConversationViewModel @UiThread constructor() : ViewModel() { val lowMediaVolume = AudioUtils.isMediaVolumeLow(context) if (lowMediaVolume) { Log.w("$TAG Media volume is low, notifying user as they may not hear voice message") - val message = AppUtils.getString(R.string.toast_low_media_volume) - showRedToastEvent.postValue(Event(Pair(message, R.drawable.speaker_slash))) + showRedToastEvent.postValue( + Event(Pair(R.string.toast_low_media_volume, R.drawable.speaker_slash)) + ) } if (voiceRecordAudioFocusRequest == null) { diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt index 04d3cd436..2b0a21e5f 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt @@ -98,6 +98,7 @@ class ContactFragment : SlidingPaneChildFragment() { viewModel = ViewModelProvider(this)[ContactViewModel::class.java] binding.viewModel = viewModel + observeToastEvents(viewModel) val refKey = args.contactRefKey Log.i("$TAG Looking up for contact with ref key [$refKey]") diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt index 03cdc5079..78790fa22 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt @@ -42,7 +42,6 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.ContactsListFilterPopupMenuBinding import org.linphone.databinding.ContactsListFragmentBinding -import org.linphone.ui.GenericActivity import org.linphone.ui.main.contacts.adapter.ContactsListAdapter import org.linphone.ui.main.contacts.model.ContactAvatarModel import org.linphone.ui.main.contacts.viewmodel.ContactsListViewModel @@ -105,6 +104,7 @@ class ContactsListFragment : AbstractMainFragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = listViewModel + observeToastEvents(listViewModel) binding.contactsList.setHasFixedSize(true) binding.contactsList.layoutManager = LinearLayoutManager(requireContext()) @@ -150,15 +150,6 @@ class ContactsListFragment : AbstractMainFragment() { } } - listViewModel.showGreenToastEvent.observe(viewLifecycleOwner) { - it.consume { message -> - (requireActivity() as GenericActivity).showRedToast( - getString(message), - R.drawable.check - ) - } - } - binding.setOnNewContactClicked { sharedViewModel.showNewContactEvent.value = Event(true) } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt index 254a4bb5d..665ebf2ae 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt @@ -115,6 +115,7 @@ class EditContactFragment : SlidingPaneChildFragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) val refKey = args.contactRefKey Log.i("$TAG Looking up for contact with ref key [$refKey]") @@ -182,15 +183,6 @@ class EditContactFragment : SlidingPaneChildFragment() { removeCell(model) } } - - viewModel.showRedToastEvent.observe(viewLifecycleOwner) { - it.consume { message -> - (requireActivity() as GenericActivity).showRedToast( - getString(message), - R.drawable.warning_circle - ) - } - } } override fun onResume() { diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt index 56d0dbcfa..369037da5 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt @@ -43,14 +43,14 @@ import org.linphone.ui.GenericActivity import org.linphone.ui.main.MainActivity import org.linphone.ui.main.contacts.model.NewOrEditNumberOrAddressModel import org.linphone.ui.main.contacts.viewmodel.ContactNewOrEditViewModel -import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.ui.main.history.model.ConfirmationDialogModel import org.linphone.utils.DialogUtils import org.linphone.utils.Event import org.linphone.utils.FileUtils @UiThread -class NewContactFragment : GenericFragment() { +class NewContactFragment : GenericMainFragment() { companion object { private const val TAG = "[New Contact Fragment]" } @@ -111,6 +111,7 @@ class NewContactFragment : GenericFragment() { viewModel = ViewModelProvider(this)[ContactNewOrEditViewModel::class.java] binding.viewModel = viewModel + observeToastEvents(viewModel) val addressToAdd = sharedViewModel.sipAddressToAddToNewContact if (addressToAdd.isNotEmpty()) { @@ -180,15 +181,6 @@ class NewContactFragment : GenericFragment() { removeCell(model) } } - - viewModel.showRedToastEvent.observe(viewLifecycleOwner) { - it.consume { message -> - (requireActivity() as GenericActivity).showRedToast( - getString(message), - R.drawable.warning_circle - ) - } - } } override fun onResume() { diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt index 5d731ade2..3911579d0 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt @@ -24,7 +24,6 @@ import androidx.annotation.AnyThread import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.launch import org.linphone.LinphoneApplication.Companion.coreContext @@ -34,11 +33,12 @@ import org.linphone.core.Friend import org.linphone.core.FriendList.Status import org.linphone.core.SubscribePolicy import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.ui.main.contacts.model.NewOrEditNumberOrAddressModel import org.linphone.utils.Event import org.linphone.utils.FileUtils -class ContactNewOrEditViewModel @UiThread constructor() : ViewModel() { +class ContactNewOrEditViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Contact New/Edit View Model]" @@ -75,10 +75,6 @@ class ContactNewOrEditViewModel @UiThread constructor() : ViewModel() { val removeNewNumberOrAddressFieldEvent = MutableLiveData>() - val showRedToastEvent: MutableLiveData> by lazy { - MutableLiveData>() - } - @UiThread fun findFriendByRefKey(refKey: String?) { reset() @@ -143,7 +139,12 @@ class ContactNewOrEditViewModel @UiThread constructor() : ViewModel() { if (fn.isEmpty() && ln.isEmpty() && organization.isEmpty()) { Log.e("$TAG At least a mandatory field wasn't filled, aborting save") showRedToastEvent.postValue( - Event(R.string.contact_editor_mandatory_field_not_filled_toast) + Event( + Pair( + R.string.contact_editor_mandatory_field_not_filled_toast, + R.drawable.warning_circle + ) + ) ) return } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt index 31ab05355..59146582a 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt @@ -22,7 +22,6 @@ package org.linphone.ui.main.contacts.viewmodel import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import java.io.File import java.util.Locale @@ -42,6 +41,7 @@ import org.linphone.core.CoreListenerStub import org.linphone.core.Friend import org.linphone.core.SecurityLevel import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.ui.main.contacts.model.ContactAvatarModel import org.linphone.ui.main.contacts.model.ContactDeviceModel import org.linphone.ui.main.contacts.model.ContactNumberOrAddressClickListener @@ -52,7 +52,7 @@ import org.linphone.utils.Event import org.linphone.utils.FileUtils import org.linphone.utils.LinphoneUtils -class ContactViewModel @UiThread constructor() : ViewModel() { +class ContactViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Contact ViewModel]" diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt index 0b86198df..dd6f62628 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt @@ -64,10 +64,6 @@ class ContactsListViewModel @UiThread constructor() : AbstractMainViewModel() { MutableLiveData>>() } - val showGreenToastEvent: MutableLiveData> by lazy { - MutableLiveData>() - } - private var previousFilter = "NotSet" private var domainFilter = "" @@ -223,7 +219,9 @@ class ContactsListViewModel @UiThread constructor() : AbstractMainViewModel() { coreContext.contactsManager.contactRemoved(contactModel.friend) contactModel.friend.remove() coreContext.contactsManager.notifyContactsListChanged() - showGreenToastEvent.postValue(Event(R.string.contact_deleted_toast)) + showGreenToastEvent.postValue( + Event(Pair(R.string.contact_deleted_toast, R.drawable.warning_circle)) + ) } } diff --git a/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/FileViewerFragment.kt b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/FileViewerFragment.kt index 62927a018..e85e7bcae 100644 --- a/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/FileViewerFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/FileViewerFragment.kt @@ -40,14 +40,13 @@ import kotlinx.coroutines.launch import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.FileViewerFragmentBinding -import org.linphone.ui.GenericActivity import org.linphone.ui.main.file_media_viewer.adapter.PdfPagesListAdapter import org.linphone.ui.main.file_media_viewer.viewmodel.FileViewModel -import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.utils.FileUtils @UiThread -class FileViewerFragment : GenericFragment() { +class FileViewerFragment : GenericMainFragment() { companion object { private const val TAG = "[File Viewer Fragment]" @@ -93,6 +92,7 @@ class FileViewerFragment : GenericFragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) val path = args.path val preLoadedContent = args.content @@ -157,22 +157,6 @@ class FileViewerFragment : GenericFragment() { startActivityForResult(intent, EXPORT_FILE_AS_DOCUMENT) } } - - viewModel.showGreenToastEvent.observe(viewLifecycleOwner) { - it.consume { pair -> - val message = pair.first - val icon = pair.second - (requireActivity() as GenericActivity).showGreenToast(message, icon) - } - } - - viewModel.showRedToastEvent.observe(viewLifecycleOwner) { - it.consume { pair -> - val message = pair.first - val icon = pair.second - (requireActivity() as GenericActivity).showRedToast(message, icon) - } - } } override fun onResume() { diff --git a/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaListViewerFragment.kt b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaListViewerFragment.kt index baf81685e..03c0ccf7f 100644 --- a/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaListViewerFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaListViewerFragment.kt @@ -41,11 +41,11 @@ import org.linphone.databinding.FileMediaViewerFragmentBinding import org.linphone.ui.GenericActivity import org.linphone.ui.main.chat.viewmodel.ConversationMediaListViewModel import org.linphone.ui.main.file_media_viewer.adapter.MediaListAdapter -import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.utils.AppUtils import org.linphone.utils.FileUtils -class MediaListViewerFragment : GenericFragment() { +class MediaListViewerFragment : GenericMainFragment() { companion object { private const val TAG = "[Media List Viewer]" } @@ -91,6 +91,7 @@ class MediaListViewerFragment : GenericFragment() { viewModel = ViewModelProvider(this)[ConversationMediaListViewModel::class.java] binding.viewModel = viewModel + observeToastEvents(viewModel) // Consider full screen mode the default sharedViewModel.mediaViewerFullScreenMode.value = true diff --git a/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaViewerFragment.kt b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaViewerFragment.kt index 281ec3b4f..4784116f3 100644 --- a/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaViewerFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaViewerFragment.kt @@ -28,11 +28,11 @@ import androidx.lifecycle.ViewModelProvider import org.linphone.core.tools.Log import org.linphone.databinding.FileMediaViewerChildFragmentBinding import org.linphone.ui.main.file_media_viewer.viewmodel.MediaViewModel -import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.ui.main.viewmodel.SharedMainViewModel @UiThread -class MediaViewerFragment : GenericFragment() { +class MediaViewerFragment : GenericMainFragment() { companion object { private const val TAG = "[Media Viewer Fragment]" } @@ -61,6 +61,7 @@ class MediaViewerFragment : GenericFragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) val path = if (arguments?.containsKey("path") == true) { requireArguments().getString("path") diff --git a/app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/FileViewModel.kt b/app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/FileViewModel.kt index bd528e93e..19d3e419c 100644 --- a/app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/FileViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/FileViewModel.kt @@ -26,7 +26,6 @@ import android.os.ParcelFileDescriptor import android.widget.ImageView import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import java.io.BufferedReader import java.io.File @@ -38,11 +37,11 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.linphone.R import org.linphone.core.tools.Log -import org.linphone.utils.AppUtils +import org.linphone.ui.GenericViewModel import org.linphone.utils.Event import org.linphone.utils.FileUtils -class FileViewModel @UiThread constructor() : ViewModel() { +class FileViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[File ViewModel]" } @@ -77,14 +76,6 @@ class FileViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } - val showGreenToastEvent: MutableLiveData>> by lazy { - MutableLiveData>>() - } - - val showRedToastEvent: MutableLiveData>> by lazy { - MutableLiveData>>() - } - // Below are required for PDF viewer private lateinit var pdfRenderer: PdfRenderer @@ -231,16 +222,24 @@ class FileViewModel @UiThread constructor() : ViewModel() { Log.i( "$TAG File [$filePath] has been successfully exported to documents" ) - val message = AppUtils.getString( - R.string.toast_file_successfully_exported_to_documents + showGreenToastEvent.postValue( + Event( + Pair( + R.string.toast_file_successfully_exported_to_documents, + R.drawable.check + ) + ) ) - showGreenToastEvent.postValue(Event(Pair(message, R.drawable.check))) } else { Log.e("$TAG Failed to export file [$filePath] to documents!") - val message = AppUtils.getString( - R.string.toast_export_file_to_documents_error + showRedToastEvent.postValue( + Event( + Pair( + R.string.toast_export_file_to_documents_error, + R.drawable.warning_circle + ) + ) ) - showRedToastEvent.postValue(Event(Pair(message, R.drawable.warning_circle))) } } } @@ -256,16 +255,24 @@ class FileViewModel @UiThread constructor() : ViewModel() { Log.i( "$TAG Text has been successfully exported to documents" ) - val message = AppUtils.getString( - R.string.toast_file_successfully_exported_to_documents + showGreenToastEvent.postValue( + Event( + Pair( + R.string.toast_file_successfully_exported_to_documents, + R.drawable.check + ) + ) ) - showGreenToastEvent.postValue(Event(Pair(message, R.drawable.check))) } else { Log.e("$TAG Failed to save text to documents!") - val message = AppUtils.getString( - R.string.toast_export_file_to_documents_error + showRedToastEvent.postValue( + Event( + Pair( + R.string.toast_export_file_to_documents_error, + R.drawable.warning_circle + ) + ) ) - showRedToastEvent.postValue(Event(Pair(message, R.drawable.warning_circle))) } } } diff --git a/app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/MediaViewModel.kt b/app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/MediaViewModel.kt index e4e224ce8..8339c8901 100644 --- a/app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/MediaViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/MediaViewModel.kt @@ -23,12 +23,12 @@ import android.media.AudioAttributes import android.media.MediaPlayer import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.utils.Event import org.linphone.utils.FileUtils -class MediaViewModel @UiThread constructor() : ViewModel() { +class MediaViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Media ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/fragment/AbstractMainFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/AbstractMainFragment.kt index 6c2cb67ea..c51d49e41 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/AbstractMainFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/AbstractMainFragment.kt @@ -45,7 +45,7 @@ import org.linphone.utils.setKeyboardInsetListener import org.linphone.utils.showKeyboard @UiThread -abstract class AbstractMainFragment : GenericFragment() { +abstract class AbstractMainFragment : GenericMainFragment() { companion object { private const val TAG = "[Abstract Main Fragment]" } diff --git a/app/src/main/java/org/linphone/ui/main/fragment/AddParticipantsFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/AddParticipantsFragment.kt index 6ed2261ae..706f54255 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/AddParticipantsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/AddParticipantsFragment.kt @@ -71,8 +71,8 @@ class AddParticipantsFragment : GenericAddressPickerFragment() { super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner - binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setBackClickListener { goBack() diff --git a/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt index c22055a88..c76cbeb39 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt @@ -45,7 +45,7 @@ import org.linphone.ui.main.settings.fragment.AccountProfileFragmentDirections import org.linphone.ui.main.viewmodel.DrawerMenuViewModel @UiThread -class DrawerMenuFragment : GenericFragment() { +class DrawerMenuFragment : GenericMainFragment() { companion object { private const val TAG = "[Drawer Menu Fragment]" } @@ -72,6 +72,7 @@ class DrawerMenuFragment : GenericFragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setSettingsClickedListener { val navController = (requireActivity() as MainActivity).findNavController() diff --git a/app/src/main/java/org/linphone/ui/main/fragment/EmptyFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/EmptyFragment.kt index fe82f82a1..dc66a3268 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/EmptyFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/EmptyFragment.kt @@ -24,12 +24,12 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread -import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import org.linphone.databinding.EmptyFragmentBinding +import org.linphone.ui.GenericFragment @UiThread -class EmptyFragment : Fragment() { +class EmptyFragment : GenericFragment() { private lateinit var binding: EmptyFragmentBinding override fun onCreateView( diff --git a/app/src/main/java/org/linphone/ui/main/fragment/GenericAddressPickerFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/GenericAddressPickerFragment.kt index 807ad213c..958e99f0b 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/GenericAddressPickerFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/GenericAddressPickerFragment.kt @@ -44,7 +44,7 @@ import org.linphone.utils.LinphoneUtils import org.linphone.utils.RecyclerViewHeaderDecoration @UiThread -abstract class GenericAddressPickerFragment : GenericFragment() { +abstract class GenericAddressPickerFragment : GenericMainFragment() { companion object { private const val TAG = "[Generic Address Picker Fragment]" } diff --git a/app/src/main/java/org/linphone/ui/main/fragment/GenericFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/GenericMainFragment.kt similarity index 92% rename from app/src/main/java/org/linphone/ui/main/fragment/GenericFragment.kt rename to app/src/main/java/org/linphone/ui/main/fragment/GenericMainFragment.kt index 73b6e5029..a504b7c12 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/GenericFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/GenericMainFragment.kt @@ -22,15 +22,15 @@ package org.linphone.ui.main.fragment import android.os.Bundle import android.view.View import androidx.annotation.UiThread -import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import org.linphone.core.tools.Log +import org.linphone.ui.GenericFragment import org.linphone.ui.main.viewmodel.SharedMainViewModel @UiThread -abstract class GenericFragment : Fragment() { +abstract class GenericMainFragment : GenericFragment() { companion object { - private const val TAG = "[Generic Fragment]" + private const val TAG = "[Generic Main Fragment]" } protected lateinit var sharedViewModel: SharedMainViewModel diff --git a/app/src/main/java/org/linphone/ui/main/fragment/SlidingPaneChildFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/SlidingPaneChildFragment.kt index 37f7ec97a..4eb93720f 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/SlidingPaneChildFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/SlidingPaneChildFragment.kt @@ -29,7 +29,7 @@ import org.linphone.core.tools.Log import org.linphone.ui.main.viewmodel.DefaultAccountChangedViewModel @UiThread -abstract class SlidingPaneChildFragment : GenericFragment() { +abstract class SlidingPaneChildFragment : GenericMainFragment() { companion object { private const val TAG = "[Sliding Pane Child Fragment]" } diff --git a/app/src/main/java/org/linphone/ui/main/help/fragment/DebugFragment.kt b/app/src/main/java/org/linphone/ui/main/help/fragment/DebugFragment.kt index 29666f80c..00c494e22 100644 --- a/app/src/main/java/org/linphone/ui/main/help/fragment/DebugFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/help/fragment/DebugFragment.kt @@ -32,10 +32,10 @@ import org.linphone.core.CorePreferences import org.linphone.core.tools.Log import org.linphone.databinding.HelpDebugFragmentBinding import org.linphone.ui.GenericActivity -import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.ui.main.help.viewmodel.HelpViewModel -class DebugFragment : GenericFragment() { +class DebugFragment : GenericMainFragment() { companion object { private const val TAG = "[Debug Fragment]" } @@ -59,6 +59,7 @@ class DebugFragment : GenericFragment() { super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setBackClickListener { goBack() diff --git a/app/src/main/java/org/linphone/ui/main/help/fragment/HelpFragment.kt b/app/src/main/java/org/linphone/ui/main/help/fragment/HelpFragment.kt index 70af601e3..5080f47a7 100644 --- a/app/src/main/java/org/linphone/ui/main/help/fragment/HelpFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/help/fragment/HelpFragment.kt @@ -32,13 +32,13 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.HelpFragmentBinding import org.linphone.ui.GenericActivity -import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.ui.main.help.viewmodel.HelpViewModel import org.linphone.ui.main.history.model.ConfirmationDialogModel import org.linphone.utils.DialogUtils @UiThread -class HelpFragment : GenericFragment() { +class HelpFragment : GenericMainFragment() { companion object { private const val TAG = "[Help Fragment]" } @@ -62,6 +62,7 @@ class HelpFragment : GenericFragment() { super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setBackClickListener { goBack() diff --git a/app/src/main/java/org/linphone/ui/main/help/viewmodel/HelpViewModel.kt b/app/src/main/java/org/linphone/ui/main/help/viewmodel/HelpViewModel.kt index d22216330..5cab7972e 100644 --- a/app/src/main/java/org/linphone/ui/main/help/viewmodel/HelpViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/help/viewmodel/HelpViewModel.kt @@ -22,7 +22,6 @@ package org.linphone.ui.main.help.viewmodel import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.BuildConfig import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences @@ -32,10 +31,11 @@ import org.linphone.core.CoreListenerStub import org.linphone.core.Factory import org.linphone.core.VersionUpdateCheckResult import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.utils.AppUtils import org.linphone.utils.Event -class HelpViewModel @UiThread constructor() : ViewModel() { +class HelpViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Help ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryFragment.kt index 5bfd18c91..618ada772 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryFragment.kt @@ -97,6 +97,7 @@ class HistoryFragment : SlidingPaneChildFragment() { viewModel = ViewModelProvider(this)[HistoryViewModel::class.java] binding.viewModel = viewModel + observeToastEvents(viewModel) val callId = args.callId Log.i("$TAG Looking up for call log with call id [$callId]") diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/StartCallFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/StartCallFragment.kt index 3fec1a037..67645509b 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/StartCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/StartCallFragment.kt @@ -74,6 +74,7 @@ class StartCallFragment : GenericAddressPickerFragment() { viewModel.title.value = getString(R.string.history_call_start_title) binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setBackClickListener { goBack() @@ -142,15 +143,6 @@ class StartCallFragment : GenericAddressPickerFragment() { } } - viewModel.showRedToastEvent.observe(viewLifecycleOwner) { - it.consume { message -> - (requireActivity() as GenericActivity).showRedToast( - getString(message), - R.drawable.warning_circle - ) - } - } - binding.root.setKeyboardInsetListener { keyboardVisible -> if (keyboardVisible) { viewModel.isNumpadVisible.value = false diff --git a/app/src/main/java/org/linphone/ui/main/history/viewmodel/HistoryViewModel.kt b/app/src/main/java/org/linphone/ui/main/history/viewmodel/HistoryViewModel.kt index 885c9de3c..4fc6bf702 100644 --- a/app/src/main/java/org/linphone/ui/main/history/viewmodel/HistoryViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/history/viewmodel/HistoryViewModel.kt @@ -22,7 +22,6 @@ package org.linphone.ui.main.history.viewmodel import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R @@ -31,6 +30,7 @@ import org.linphone.core.ChatRoom import org.linphone.core.ChatRoomListenerStub import org.linphone.core.ChatRoomParams import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.ui.main.history.model.CallLogHistoryModel import org.linphone.ui.main.history.model.CallLogModel import org.linphone.ui.main.model.isEndToEndEncryptionMandatory @@ -38,7 +38,7 @@ import org.linphone.utils.AppUtils import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils -class HistoryViewModel @UiThread constructor() : ViewModel() { +class HistoryViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[History ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/history/viewmodel/StartCallViewModel.kt b/app/src/main/java/org/linphone/ui/main/history/viewmodel/StartCallViewModel.kt index 63c1a944c..0bfaddf02 100644 --- a/app/src/main/java/org/linphone/ui/main/history/viewmodel/StartCallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/history/viewmodel/StartCallViewModel.kt @@ -70,10 +70,6 @@ class StartCallViewModel @UiThread constructor() : AddressSelectionViewModel() { MutableLiveData>() } - val showRedToastEvent: MutableLiveData> by lazy { - MutableLiveData>() - } - private val conferenceSchedulerListener = object : ConferenceSchedulerListenerStub() { override fun onStateChanged( conferenceScheduler: ConferenceScheduler, @@ -92,7 +88,12 @@ class StartCallViewModel @UiThread constructor() : AddressSelectionViewModel() { } else { Log.e("$TAG Conference info URI is null!") showRedToastEvent.postValue( - Event(R.string.conference_failed_to_create_group_call_toast) + Event( + Pair( + R.string.conference_failed_to_create_group_call_toast, + R.drawable.warning_circle + ) + ) ) } operationInProgress.postValue(false) @@ -100,7 +101,12 @@ class StartCallViewModel @UiThread constructor() : AddressSelectionViewModel() { conferenceScheduler.removeListener(this) Log.e("$TAG Failed to create group call!") showRedToastEvent.postValue( - Event(R.string.conference_failed_to_create_group_call_toast) + Event( + Pair( + R.string.conference_failed_to_create_group_call_toast, + R.drawable.warning_circle + ) + ) ) operationInProgress.postValue(false) } diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/EditMeetingFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/EditMeetingFragment.kt index ab7cc701f..bc848a67d 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/EditMeetingFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/EditMeetingFragment.kt @@ -73,6 +73,7 @@ class EditMeetingFragment : SlidingPaneChildFragment() { viewModel = ViewModelProvider(this)[ScheduleMeetingViewModel::class.java] binding.viewModel = viewModel + observeToastEvents(viewModel) val conferenceUri = args.conferenceUri Log.i("$TAG Found conference URI [$conferenceUri] in arguments") @@ -185,15 +186,6 @@ class EditMeetingFragment : SlidingPaneChildFragment() { } } - viewModel.showRedToastEvent.observe(viewLifecycleOwner) { - it.consume { message -> - (requireActivity() as GenericActivity).showRedToast( - getString(message), - R.drawable.warning_circle - ) - } - } - sharedViewModel.listOfSelectedSipUrisEvent.observe(viewLifecycleOwner) { it.consume { list -> Log.i( diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt index 3f0f35c97..eb81acb16 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt @@ -99,6 +99,7 @@ class MeetingFragment : SlidingPaneChildFragment() { viewModel = ViewModelProvider(this)[MeetingViewModel::class.java] binding.viewModel = viewModel + observeToastEvents(viewModel) val uri = args.conferenceUri Log.i( diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt index 6583e02e4..745dbc964 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt @@ -40,11 +40,11 @@ import org.linphone.databinding.MeetingWaitingRoomFragmentBinding import org.linphone.ui.GenericActivity import org.linphone.ui.call.fragment.AudioDevicesMenuDialogFragment import org.linphone.ui.call.model.AudioDeviceModel -import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.ui.main.meetings.viewmodel.MeetingWaitingRoomViewModel @UiThread -class MeetingWaitingRoomFragment : GenericFragment() { +class MeetingWaitingRoomFragment : GenericMainFragment() { companion object { private const val TAG = "[Meeting Waiting Room Fragment]" } @@ -94,6 +94,7 @@ class MeetingWaitingRoomFragment : GenericFragment() { viewModel = ViewModelProvider(this)[MeetingWaitingRoomViewModel::class.java] binding.viewModel = viewModel + observeToastEvents(viewModel) val uri = args.conferenceUri Log.i( diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/ScheduleMeetingFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/ScheduleMeetingFragment.kt index 810b5a293..e5df970fe 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/ScheduleMeetingFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/ScheduleMeetingFragment.kt @@ -37,12 +37,12 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.MeetingScheduleFragmentBinding import org.linphone.ui.GenericActivity -import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.ui.main.meetings.viewmodel.ScheduleMeetingViewModel import org.linphone.utils.Event @UiThread -class ScheduleMeetingFragment : GenericFragment() { +class ScheduleMeetingFragment : GenericMainFragment() { companion object { private const val TAG = "[Schedule Meeting Fragment]" } @@ -73,6 +73,7 @@ class ScheduleMeetingFragment : GenericFragment() { viewModel = ViewModelProvider(this)[ScheduleMeetingViewModel::class.java] binding.viewModel = viewModel + observeToastEvents(viewModel) val participants = args.participants if (!participants.isNullOrEmpty()) { @@ -186,15 +187,6 @@ class ScheduleMeetingFragment : GenericFragment() { } } - viewModel.showRedToastEvent.observe(viewLifecycleOwner) { - it.consume { message -> - (requireActivity() as GenericActivity).showRedToast( - getString(message), - R.drawable.warning_circle - ) - } - } - sharedViewModel.listOfSelectedSipUrisEvent.observe(viewLifecycleOwner) { it.consume { list -> Log.i( diff --git a/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingViewModel.kt b/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingViewModel.kt index a66027d7c..80f225036 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingViewModel.kt @@ -22,7 +22,6 @@ package org.linphone.ui.main.meetings.viewmodel import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import java.util.Locale import java.util.TimeZone import org.linphone.LinphoneApplication.Companion.coreContext @@ -35,12 +34,13 @@ import org.linphone.core.ConferenceSchedulerListenerStub import org.linphone.core.Factory import org.linphone.core.Participant import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.ui.main.meetings.model.ParticipantModel import org.linphone.utils.AppUtils import org.linphone.utils.Event import org.linphone.utils.TimestampUtils -class MeetingViewModel @UiThread constructor() : ViewModel() { +class MeetingViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Meeting ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingWaitingRoomViewModel.kt b/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingWaitingRoomViewModel.kt index 29bd59f7c..a05140e77 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingWaitingRoomViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingWaitingRoomViewModel.kt @@ -25,7 +25,6 @@ import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.core.app.ActivityCompat import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R @@ -39,13 +38,14 @@ import org.linphone.core.CoreListenerStub import org.linphone.core.Factory import org.linphone.core.MediaDirection import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.ui.call.model.AudioDeviceModel import org.linphone.ui.main.contacts.model.ContactAvatarModel import org.linphone.utils.AppUtils import org.linphone.utils.Event import org.linphone.utils.TimestampUtils -class MeetingWaitingRoomViewModel @UiThread constructor() : ViewModel() { +class MeetingWaitingRoomViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Meeting Waiting Room ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/ScheduleMeetingViewModel.kt b/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/ScheduleMeetingViewModel.kt index 4a87cdc73..7a3ebac7b 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/ScheduleMeetingViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/ScheduleMeetingViewModel.kt @@ -23,7 +23,6 @@ import androidx.annotation.AnyThread import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import java.util.Calendar import java.util.Locale import java.util.TimeZone @@ -39,12 +38,13 @@ import org.linphone.core.Factory import org.linphone.core.Participant import org.linphone.core.ParticipantInfo import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.ui.main.model.SelectedAddressModel import org.linphone.utils.AppUtils import org.linphone.utils.Event import org.linphone.utils.TimestampUtils -class ScheduleMeetingViewModel @UiThread constructor() : ViewModel() { +class ScheduleMeetingViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Schedule Meeting ViewModel]" } @@ -81,10 +81,6 @@ class ScheduleMeetingViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } - val showRedToastEvent: MutableLiveData> by lazy { - MutableLiveData>() - } - private var startTimestamp = 0L private var endTimestamp = 0L @@ -108,7 +104,14 @@ class ScheduleMeetingViewModel @UiThread constructor() : ViewModel() { when (state) { ConferenceScheduler.State.Error -> { operationInProgress.postValue(false) - showRedToastEvent.postValue(Event(R.string.meeting_failed_to_schedule_toast)) + showRedToastEvent.postValue( + Event( + Pair( + R.string.meeting_failed_to_schedule_toast, + R.drawable.warning_circle + ) + ) + ) } ConferenceScheduler.State.Ready -> { val conferenceAddress = conferenceScheduler.info?.uri @@ -153,7 +156,12 @@ class ScheduleMeetingViewModel @UiThread constructor() : ViewModel() { participants.value.orEmpty().size -> { Log.e("$TAG No invitation sent!") showRedToastEvent.postValue( - Event(R.string.meeting_failed_to_send_invites_toast) + Event( + Pair( + R.string.meeting_failed_to_send_invites_toast, + R.drawable.warning_circle + ) + ) ) } else -> { @@ -162,7 +170,12 @@ class ScheduleMeetingViewModel @UiThread constructor() : ViewModel() { Log.w(failed.asStringUriOnly()) } showRedToastEvent.postValue( - Event(R.string.meeting_failed_to_send_part_of_invites_toast) + Event( + Pair( + R.string.meeting_failed_to_send_part_of_invites_toast, + R.drawable.warning_circle + ) + ) ) } } @@ -354,7 +367,12 @@ class ScheduleMeetingViewModel @UiThread constructor() : ViewModel() { "$TAG Either no subject was set or no participant was selected, can't schedule meeting." ) showRedToastEvent.postValue( - Event(R.string.meeting_schedule_mandatory_field_not_filled_toast) + Event( + Pair( + R.string.meeting_schedule_mandatory_field_not_filled_toast, + R.drawable.warning_circle + ) + ) ) return } diff --git a/app/src/main/java/org/linphone/ui/main/recordings/RecordingsFragment.kt b/app/src/main/java/org/linphone/ui/main/recordings/RecordingsFragment.kt index aabcd5e4d..4d5e6f8cd 100644 --- a/app/src/main/java/org/linphone/ui/main/recordings/RecordingsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/recordings/RecordingsFragment.kt @@ -25,10 +25,10 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread import org.linphone.databinding.RecordingsFragmentBinding -import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.fragment.GenericMainFragment @UiThread -class RecordingsFragment : GenericFragment() { +class RecordingsFragment : GenericMainFragment() { private lateinit var binding: RecordingsFragmentBinding override fun onCreateView( diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt index 8b65bde65..f646c5a9b 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt @@ -38,7 +38,7 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.AccountProfileFragmentBinding import org.linphone.ui.GenericActivity -import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.ui.main.history.model.ConfirmationDialogModel import org.linphone.ui.main.settings.viewmodel.AccountProfileViewModel import org.linphone.utils.DialogUtils @@ -46,7 +46,7 @@ import org.linphone.utils.Event import org.linphone.utils.FileUtils @UiThread -class AccountProfileFragment : GenericFragment() { +class AccountProfileFragment : GenericMainFragment() { companion object { private const val TAG = "[Account Profile Fragment]" } @@ -113,6 +113,7 @@ class AccountProfileFragment : GenericFragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) val identity = args.accountIdentity Log.i("$TAG Looking up for account with identity address [$identity]") diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileModeFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileModeFragment.kt index ef1590f4c..a700ca766 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileModeFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileModeFragment.kt @@ -28,12 +28,12 @@ import androidx.navigation.navGraphViewModels import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.AccountProfileSecureModeFragmentBinding -import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.ui.main.settings.viewmodel.AccountProfileViewModel import org.linphone.utils.DialogUtils @UiThread -class AccountProfileModeFragment : GenericFragment() { +class AccountProfileModeFragment : GenericMainFragment() { companion object { private const val TAG = "[Account Profile Mode Fragment]" } @@ -58,6 +58,7 @@ class AccountProfileModeFragment : GenericFragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setBackClickListener { Log.i("$TAG Leaving without saving changes...") diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountSettingsFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountSettingsFragment.kt index c837f9e02..e02628c65 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountSettingsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountSettingsFragment.kt @@ -36,12 +36,12 @@ import org.linphone.core.TransportType import org.linphone.core.tools.Log import org.linphone.databinding.AccountSettingsFragmentBinding import org.linphone.ui.GenericActivity -import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.ui.main.settings.viewmodel.AccountSettingsViewModel import org.linphone.utils.Event @UiThread -class AccountSettingsFragment : GenericFragment() { +class AccountSettingsFragment : GenericMainFragment() { companion object { private const val TAG = "[Account Settings Fragment]" } @@ -89,6 +89,7 @@ class AccountSettingsFragment : GenericFragment() { viewModel = ViewModelProvider(this)[AccountSettingsViewModel::class.java] binding.viewModel = viewModel + observeToastEvents(viewModel) val identity = args.accountIdentity Log.i("$TAG Looking up for account with identity address [$identity]") diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/CardDavAddressBookConfigurationFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/CardDavAddressBookConfigurationFragment.kt index 6c10cf185..a66e4c8c3 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/CardDavAddressBookConfigurationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/CardDavAddressBookConfigurationFragment.kt @@ -28,12 +28,11 @@ import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.navArgs import org.linphone.core.tools.Log import org.linphone.databinding.SettingsContactsCarddavBinding -import org.linphone.ui.GenericActivity -import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.ui.main.settings.viewmodel.CardDavViewModel @UiThread -class CardDavAddressBookConfigurationFragment : GenericFragment() { +class CardDavAddressBookConfigurationFragment : GenericMainFragment() { companion object { private const val TAG = "[CardDAV Address Book Configuration Fragment]" } @@ -60,6 +59,7 @@ class CardDavAddressBookConfigurationFragment : GenericFragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) val friendListDisplayName = args.displayName if (friendListDisplayName != null) { @@ -72,22 +72,5 @@ class CardDavAddressBookConfigurationFragment : GenericFragment() { binding.setBackClickListener { goBack() } - - viewModel.showGreenToastEvent.observe(viewLifecycleOwner) { - it.consume { pair -> - val message = getString(pair.first) - val icon = pair.second - (requireActivity() as GenericActivity).showGreenToast(message, icon) - goBack() - } - } - - viewModel.showRedToastEvent.observe(viewLifecycleOwner) { - it.consume { pair -> - val message = getString(pair.first) - val icon = pair.second - (requireActivity() as GenericActivity).showRedToast(message, icon) - } - } } } diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/LdapServerConfigurationFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/LdapServerConfigurationFragment.kt index 5bc88e8c4..14a1b3902 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/LdapServerConfigurationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/LdapServerConfigurationFragment.kt @@ -28,12 +28,11 @@ import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.navArgs import org.linphone.core.tools.Log import org.linphone.databinding.SettingsContactsLdapBinding -import org.linphone.ui.GenericActivity -import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.ui.main.settings.viewmodel.LdapViewModel @UiThread -class LdapServerConfigurationFragment : GenericFragment() { +class LdapServerConfigurationFragment : GenericMainFragment() { companion object { private const val TAG = "[LDAP Server Configuration Fragment]" } @@ -60,6 +59,7 @@ class LdapServerConfigurationFragment : GenericFragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) val ldapServerUrl = args.serverUrl if (ldapServerUrl != null) { @@ -79,13 +79,5 @@ class LdapServerConfigurationFragment : GenericFragment() { goBack() } } - - viewModel.showRedToastEvent.observe(viewLifecycleOwner) { - it.consume { pair -> - val message = getString(pair.first) - val icon = pair.second - (requireActivity() as GenericActivity).showRedToast(message, icon) - } - } } } diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsAdvancedFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsAdvancedFragment.kt index 6a55a7fb6..91af18f82 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsAdvancedFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsAdvancedFragment.kt @@ -26,11 +26,11 @@ import android.view.ViewGroup import androidx.annotation.UiThread import androidx.lifecycle.ViewModelProvider import org.linphone.databinding.SettingsAdvancedFragmentBinding -import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.ui.main.settings.viewmodel.SettingsViewModel @UiThread -class SettingsAdvancedFragment : GenericFragment() { +class SettingsAdvancedFragment : GenericMainFragment() { companion object { private const val TAG = "[Advanced Settings Fragment]" } @@ -56,6 +56,7 @@ class SettingsAdvancedFragment : GenericFragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setBackClickListener { goBack() 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 21bf32110..b88f3cbd8 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 @@ -32,11 +32,11 @@ import org.linphone.R import org.linphone.compatibility.Compatibility import org.linphone.core.tools.Log import org.linphone.databinding.SettingsFragmentBinding -import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.ui.main.settings.viewmodel.SettingsViewModel @UiThread -class SettingsFragment : GenericFragment() { +class SettingsFragment : GenericMainFragment() { companion object { private const val TAG = "[Settings Fragment]" } @@ -108,6 +108,7 @@ class SettingsFragment : GenericFragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) binding.setBackClickListener { goBack() diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt index 6714b0639..c24da66b3 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt @@ -21,13 +21,13 @@ package org.linphone.ui.main.settings.viewmodel import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.core.Account import org.linphone.core.DialPlan import org.linphone.core.Factory import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.ui.main.model.AccountModel import org.linphone.ui.main.model.isEndToEndEncryptionMandatory import org.linphone.ui.main.model.setEndToEndEncryptionMandatory @@ -35,7 +35,7 @@ import org.linphone.ui.main.model.setInteroperabilityMode import org.linphone.ui.main.settings.model.AccountDeviceModel import org.linphone.utils.Event -class AccountProfileViewModel @UiThread constructor() : ViewModel() { +class AccountProfileViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Account Profile ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountSettingsViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountSettingsViewModel.kt index ead2d46c4..9974d5de6 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountSettingsViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountSettingsViewModel.kt @@ -21,7 +21,6 @@ package org.linphone.ui.main.settings.viewmodel import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import java.util.Locale import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.core.AVPFMode @@ -29,10 +28,11 @@ import org.linphone.core.Account import org.linphone.core.NatPolicy import org.linphone.core.TransportType import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.ui.main.model.isEndToEndEncryptionMandatory import org.linphone.utils.Event -class AccountSettingsViewModel @UiThread constructor() : ViewModel() { +class AccountSettingsViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Account Settings ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/CardDavViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/CardDavViewModel.kt index 767d433a8..a12e0a241 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/CardDavViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/CardDavViewModel.kt @@ -22,16 +22,16 @@ package org.linphone.ui.main.settings.viewmodel import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.Factory import org.linphone.core.FriendList import org.linphone.core.FriendListListenerStub import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.utils.Event -class CardDavViewModel : ViewModel() { +class CardDavViewModel : GenericViewModel() { companion object { private const val TAG = "[CardDAV ViewModel]" } @@ -52,14 +52,6 @@ class CardDavViewModel : ViewModel() { val syncInProgress = MutableLiveData() - val showGreenToastEvent: MutableLiveData>> by lazy { - MutableLiveData>>() - } - - val showRedToastEvent: MutableLiveData>> by lazy { - MutableLiveData>>() - } - private lateinit var friendList: FriendList private val friendListListener = object : FriendListListenerStub() { diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/LdapViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/LdapViewModel.kt index 00c18fa8d..4f3cb43e3 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/LdapViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/LdapViewModel.kt @@ -21,14 +21,14 @@ package org.linphone.ui.main.settings.viewmodel import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.Ldap import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.utils.Event -class LdapViewModel : ViewModel() { +class LdapViewModel : GenericViewModel() { companion object { private const val TAG = "[LDAP ViewModel]" } @@ -67,10 +67,6 @@ class LdapViewModel : ViewModel() { MutableLiveData>() } - val showRedToastEvent: MutableLiveData>> by lazy { - MutableLiveData>>() - } - private lateinit var ldapToEdit: Ldap init { 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 82c559648..3cb78756f 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 @@ -22,7 +22,6 @@ package org.linphone.ui.main.settings.viewmodel import android.os.Vibrator import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R @@ -30,11 +29,12 @@ import org.linphone.core.Conference import org.linphone.core.FriendList import org.linphone.core.VFS import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.ui.main.settings.model.CardDavLdapModel import org.linphone.utils.AppUtils import org.linphone.utils.Event -class SettingsViewModel @UiThread constructor() : ViewModel() { +class SettingsViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Settings ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/sso/fragment/SingleSignOnFragment.kt b/app/src/main/java/org/linphone/ui/main/sso/fragment/SingleSignOnFragment.kt index 95f0354af..e95c852c0 100644 --- a/app/src/main/java/org/linphone/ui/main/sso/fragment/SingleSignOnFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/sso/fragment/SingleSignOnFragment.kt @@ -32,10 +32,10 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.SingleSignOnFragmentBinding import org.linphone.ui.GenericActivity -import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.ui.main.sso.viewmodel.SingleSignOnViewModel -class SingleSignOnFragment : GenericFragment() { +class SingleSignOnFragment : GenericMainFragment() { companion object { private const val TAG = "[Single Sign On Fragment]" @@ -63,6 +63,7 @@ class SingleSignOnFragment : GenericFragment() { super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + observeToastEvents(viewModel) viewModel.singleSignOnProcessCompletedEvent.observe(viewLifecycleOwner) { it.consume { diff --git a/app/src/main/java/org/linphone/ui/main/sso/viewmodel/SingleSignOnViewModel.kt b/app/src/main/java/org/linphone/ui/main/sso/viewmodel/SingleSignOnViewModel.kt index dddf3065e..b79c9d4e5 100644 --- a/app/src/main/java/org/linphone/ui/main/sso/viewmodel/SingleSignOnViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/sso/viewmodel/SingleSignOnViewModel.kt @@ -23,7 +23,6 @@ import android.content.Intent import android.net.Uri import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import java.io.File import kotlinx.coroutines.launch @@ -37,11 +36,12 @@ import net.openid.appauth.ResponseTypeValues import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.core.Factory import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.utils.Event import org.linphone.utils.FileUtils import org.linphone.utils.TimestampUtils -class SingleSignOnViewModel : ViewModel() { +class SingleSignOnViewModel : GenericViewModel() { companion object { private const val TAG = "[Single Sign On ViewModel]" diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractMainViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractMainViewModel.kt index ae3f622fc..3d8cf5042 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractMainViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractMainViewModel.kt @@ -22,7 +22,6 @@ package org.linphone.ui.main.viewmodel import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.core.Account @@ -33,11 +32,12 @@ import org.linphone.core.ConfiguringState import org.linphone.core.Core import org.linphone.core.CoreListenerStub import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.ui.main.model.AccountModel import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils -open class AbstractMainViewModel @UiThread constructor() : ViewModel() { +open class AbstractMainViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Abstract Main ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/DefaultAccountChangedViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/DefaultAccountChangedViewModel.kt index ef5dd71e4..82f579b18 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/DefaultAccountChangedViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/DefaultAccountChangedViewModel.kt @@ -21,14 +21,14 @@ package org.linphone.ui.main.viewmodel import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.core.Account import org.linphone.core.Core import org.linphone.core.CoreListenerStub +import org.linphone.ui.GenericViewModel import org.linphone.utils.Event -open class DefaultAccountChangedViewModel : ViewModel() { +open class DefaultAccountChangedViewModel : GenericViewModel() { val defaultAccountChangedEvent: MutableLiveData> by lazy { MutableLiveData>() } diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/DrawerMenuViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/DrawerMenuViewModel.kt index acd95ebea..c2b474416 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/DrawerMenuViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/DrawerMenuViewModel.kt @@ -23,7 +23,6 @@ import android.view.View import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.core.Account @@ -31,10 +30,11 @@ import org.linphone.core.ConfiguringState import org.linphone.core.Core import org.linphone.core.CoreListenerStub import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.ui.main.model.AccountModel import org.linphone.utils.Event -class DrawerMenuViewModel @UiThread constructor() : ViewModel() { +class DrawerMenuViewModel @UiThread constructor() : GenericViewModel() { companion object { private const val TAG = "[Drawer Menu ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/welcome/fragment/WelcomePage1Fragment.kt b/app/src/main/java/org/linphone/ui/welcome/fragment/WelcomePage1Fragment.kt index b8ba51ad9..cbdb371b9 100644 --- a/app/src/main/java/org/linphone/ui/welcome/fragment/WelcomePage1Fragment.kt +++ b/app/src/main/java/org/linphone/ui/welcome/fragment/WelcomePage1Fragment.kt @@ -24,11 +24,11 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread -import androidx.fragment.app.Fragment import org.linphone.R +import org.linphone.ui.GenericFragment @UiThread -class WelcomePage1Fragment : Fragment() { +class WelcomePage1Fragment : GenericFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, diff --git a/app/src/main/java/org/linphone/ui/welcome/fragment/WelcomePage2Fragment.kt b/app/src/main/java/org/linphone/ui/welcome/fragment/WelcomePage2Fragment.kt index 1118d6d5d..26757647b 100644 --- a/app/src/main/java/org/linphone/ui/welcome/fragment/WelcomePage2Fragment.kt +++ b/app/src/main/java/org/linphone/ui/welcome/fragment/WelcomePage2Fragment.kt @@ -24,11 +24,11 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread -import androidx.fragment.app.Fragment import org.linphone.R +import org.linphone.ui.GenericFragment @UiThread -class WelcomePage2Fragment : Fragment() { +class WelcomePage2Fragment : GenericFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, diff --git a/app/src/main/java/org/linphone/ui/welcome/fragment/WelcomePage3Fragment.kt b/app/src/main/java/org/linphone/ui/welcome/fragment/WelcomePage3Fragment.kt index a0c603b2c..1772f3797 100644 --- a/app/src/main/java/org/linphone/ui/welcome/fragment/WelcomePage3Fragment.kt +++ b/app/src/main/java/org/linphone/ui/welcome/fragment/WelcomePage3Fragment.kt @@ -24,11 +24,11 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread -import androidx.fragment.app.Fragment import org.linphone.R +import org.linphone.ui.GenericFragment @UiThread -class WelcomePage3Fragment : Fragment() { +class WelcomePage3Fragment : GenericFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?,