From 465201010dd029c6074842e226c1fb34174a3a18 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 10 May 2024 15:11:23 +0200 Subject: [PATCH] Added missing toasts --- .../ui/assistant/fragment/LandingFragment.kt | 9 ++++ .../ui/assistant/fragment/LoginFragment.kt | 9 ++++ .../viewmodel/AccountLoginViewModel.kt | 12 ++++- .../ConferenceLayoutMenuDialogFragment.kt | 4 +- .../ConferenceParticipantsListFragment.kt | 14 +++++- .../viewmodel/ConferenceViewModel.kt | 12 ++++- .../ui/call/fragment/ActiveCallFragment.kt | 2 +- .../ui/call/viewmodel/CurrentCallViewModel.kt | 12 +++-- .../fragment/StartConversationFragment.kt | 6 ++- .../viewmodel/ConversationInfoViewModel.kt | 10 +++- .../chat/viewmodel/ConversationViewModel.kt | 10 +++- .../viewmodel/StartConversationViewModel.kt | 20 +++++--- .../main/contacts/fragment/ContactFragment.kt | 6 ++- .../contacts/fragment/ContactsListFragment.kt | 10 ++++ .../contacts/fragment/EditContactFragment.kt | 9 ++++ .../contacts/fragment/NewContactFragment.kt | 9 ++++ .../viewmodel/ContactNewOrEditViewModel.kt | 9 +++- .../contacts/viewmodel/ContactViewModel.kt | 12 +++-- .../viewmodel/ContactsListViewModel.kt | 7 ++- .../fragment/MediaListViewerFragment.kt | 5 +- .../history/fragment/StartCallFragment.kt | 14 +++++- .../history/viewmodel/HistoryViewModel.kt | 12 +++-- .../history/viewmodel/StartCallViewModel.kt | 13 +++++- .../meetings/fragment/EditMeetingFragment.kt | 9 ++++ .../fragment/ScheduleMeetingFragment.kt | 9 ++++ .../viewmodel/ScheduleMeetingViewModel.kt | 24 +++++++--- .../fragment/AccountProfileFragment.kt | 5 +- .../fragment/AccountSettingsFragment.kt | 5 +- ...CardDavAddressBookConfigurationFragment.kt | 15 +++--- .../LdapServerConfigurationFragment.kt | 6 +-- .../settings/viewmodel/CardDavViewModel.kt | 46 ++++++++++++++----- .../main/settings/viewmodel/LdapViewModel.kt | 11 +++-- app/src/main/res/values-fr/strings.xml | 23 ++++++++++ app/src/main/res/values/strings.xml | 23 ++++++++++ 34 files changed, 329 insertions(+), 73 deletions(-) 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 e9c287533..2c0661bc2 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 @@ -131,6 +131,15 @@ 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 793a2a08e..e1d3a71de 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 @@ -113,6 +113,15 @@ 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/viewmodel/AccountLoginViewModel.kt b/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountLoginViewModel.kt index f0176ddaa..02625caa7 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 @@ -69,6 +69,10 @@ open class AccountLoginViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } + val showRedToastEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + private lateinit var newlyCreatedAuthInfo: AuthInfo private lateinit var newlyCreatedAccount: Account @@ -152,7 +156,9 @@ open class AccountLoginViewModel @UiThread constructor() : ViewModel() { val identityAddress = Factory.instance().createAddress(identity) if (identityAddress == null) { Log.e("$TAG Can't parse [$identity] as Address!") - // TODO: show error + showRedToastEvent.postValue( + Event(R.string.assistant_login_cant_parse_address_toast) + ) return@postOnCoreThread } @@ -161,7 +167,9 @@ open class AccountLoginViewModel @UiThread constructor() : ViewModel() { Log.e( "$TAG Address [${identityAddress.asStringUriOnly()}] doesn't contains an username!" ) - // TODO: show error + showRedToastEvent.postValue( + Event(R.string.assistant_login_address_without_username_toast) + ) return@postOnCoreThread } diff --git a/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceLayoutMenuDialogFragment.kt b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceLayoutMenuDialogFragment.kt index a43a359e4..71ba400e1 100644 --- a/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceLayoutMenuDialogFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceLayoutMenuDialogFragment.kt @@ -73,14 +73,14 @@ class ConferenceLayoutMenuDialogFragment( if (conferenceModel.participantDevices.value.orEmpty().size < 7) { conferenceModel.changeLayout(ConferenceViewModel.GRID_LAYOUT) dismiss() - } else { - // TODO: notify user } } + view.setActiveSpeakerClickListener { conferenceModel.changeLayout(ConferenceViewModel.ACTIVE_SPEAKER_LAYOUT) dismiss() } + view.setAudioOnlyClickListener { conferenceModel.changeLayout(ConferenceViewModel.AUDIO_ONLY_LAYOUT) dismiss() 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 93595ee47..2d1982974 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 @@ -32,6 +32,7 @@ import org.linphone.R import org.linphone.core.Participant import org.linphone.core.tools.Log import org.linphone.databinding.CallConferenceParticipantsListFragmentBinding +import org.linphone.ui.GenericActivity import org.linphone.ui.call.adapter.ConferenceParticipantsListAdapter import org.linphone.ui.call.fragment.GenericCallFragment import org.linphone.ui.call.viewmodel.CurrentCallViewModel @@ -113,6 +114,15 @@ 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) { @@ -132,7 +142,9 @@ class ConferenceParticipantsListFragment : GenericCallFragment() { model.confirmEvent.observe(viewLifecycleOwner) { it.consume { viewModel.conferenceModel.kickParticipant(participant) - // TODO: notify participant was kicked out + val message = getString(R.string.conference_participant_was_kicked_out_toast) + val icon = R.drawable.check + (requireActivity() as GenericActivity).showGreenToast(message, icon) dialog.dismiss() } } 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 ad9c62fa6..503073aad 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 @@ -80,6 +80,10 @@ class ConferenceViewModel { MutableLiveData>>() } + val showRedToastEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + private lateinit var conference: Conference private val conferenceListener = object : ConferenceListenerStub() { @@ -305,7 +309,9 @@ class ConferenceViewModel { Log.e( "$TAG Failed to parse SIP URI [$uri] into address, can't add it to the conference!" ) - // TODO: notify user + showRedToastEvent.postValue( + Event(R.string.conference_failed_to_add_participant_invalid_address_toast) + ) } } val addressesArray = arrayOfNulls
(addresses.size) @@ -691,7 +697,9 @@ class ConferenceViewModel { "$TAG Too many participant devices for grid layout, switching to active speaker layout" ) setNewLayout(ACTIVE_SPEAKER_LAYOUT) - // TODO: notify user + showRedToastEvent.postValue( + Event(R.string.conference_too_many_participants_for_mosaic_layout_toast) + ) } } } diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt index 537c3d421..13653c198 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt @@ -358,7 +358,7 @@ class ActiveCallFragment : GenericCallFragment() { callViewModel.chatRoomCreationErrorEvent.observe(viewLifecycleOwner) { it.consume { error -> (requireActivity() as GenericActivity).showRedToast( - error, + getString(error), R.drawable.warning_circle ) } 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 5ca8773a1..304e24efe 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 @@ -173,8 +173,8 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { MutableLiveData>>() } - val chatRoomCreationErrorEvent: MutableLiveData> by lazy { - MutableLiveData>() + val chatRoomCreationErrorEvent: MutableLiveData> by lazy { + MutableLiveData>() } // Conference @@ -347,7 +347,9 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { Log.e("$TAG Conversation [$id] creation has failed!") chatRoom.removeListener(this) operationInProgress.postValue(false) - chatRoomCreationErrorEvent.postValue(Event("Error!")) // TODO: use translated string + chatRoomCreationErrorEvent.postValue( + Event(R.string.conversation_creation_error_toast) + ) } } } @@ -851,7 +853,9 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { "$TAG Failed to create 1-1 conversation with [${remote.asStringUriOnly()}]!" ) operationInProgress.postValue(false) - chatRoomCreationErrorEvent.postValue(Event("Error!")) // TODO: use translated string + chatRoomCreationErrorEvent.postValue( + Event(R.string.conversation_creation_error_toast) + ) } } } 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 eb321598b..a091275a3 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 @@ -106,7 +106,7 @@ class StartConversationFragment : GenericAddressPickerFragment() { it.consume { error -> Log.i("$TAG Conversation creation error, showing red toast") (requireActivity() as GenericActivity).showRedToast( - error, + getString(error), R.drawable.warning_circle ) } @@ -151,7 +151,9 @@ class StartConversationFragment : GenericAddressPickerFragment() { dialog.currentFocus?.hideKeyboard() dialog.dismiss() } else { - // TODO: show error + val message = getString(R.string.conversation_invalid_empty_subject_toast) + val icon = R.drawable.warning_circle + (requireActivity() as GenericActivity).showRedToast(message, icon) } } } 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 0bb604562..b191b9dd8 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 @@ -203,12 +203,18 @@ class ConversationInfoViewModel @UiThread constructor() : AbstractConversationVi coreContext.startVideoCall(conferenceAddress) } else { Log.e("$TAG Conference info URI is null!") - // TODO: notify error to user + val message = AppUtils.getString( + R.string.conference_failed_to_create_group_call_toast + ) + 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!") - // TODO: notify error to user + val message = AppUtils.getString( + R.string.conference_failed_to_create_group_call_toast + ) + 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 59b66e23e..8ba4e1836 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 @@ -295,12 +295,18 @@ class ConversationViewModel @UiThread constructor() : AbstractConversationViewMo coreContext.startVideoCall(conferenceAddress) } else { Log.e("$TAG Conference info URI is null!") - // TODO: notify error to user + val message = AppUtils.getString( + R.string.conference_failed_to_create_group_call_toast + ) + 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!") - // TODO: notify error to user + val message = AppUtils.getString( + R.string.conference_failed_to_create_group_call_toast + ) + showRedToastEvent.postValue(Event(Pair(message, R.drawable.warning_circle))) } } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/StartConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/StartConversationViewModel.kt index 659a17c25..feb434a1f 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/StartConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/StartConversationViewModel.kt @@ -50,8 +50,8 @@ class StartConversationViewModel @UiThread constructor() : AddressSelectionViewM val operationInProgress = MutableLiveData() - val chatRoomCreationErrorEvent: MutableLiveData> by lazy { - MutableLiveData>() + val chatRoomCreationErrorEvent: MutableLiveData> by lazy { + MutableLiveData>() } val chatRoomCreatedEvent: MutableLiveData>> by lazy { @@ -81,7 +81,9 @@ class StartConversationViewModel @UiThread constructor() : AddressSelectionViewM Log.e("$TAG Conversation [$id] creation has failed!") chatRoom.removeListener(this) operationInProgress.postValue(false) - chatRoomCreationErrorEvent.postValue(Event("Error!")) // TODO: use translated string + chatRoomCreationErrorEvent.postValue( + Event(R.string.conversation_failed_to_create_toast) + ) } } } @@ -165,7 +167,9 @@ class StartConversationViewModel @UiThread constructor() : AddressSelectionViewM } else { Log.e("$TAG Failed to create group conversation [$groupChatRoomSubject]!") operationInProgress.postValue(false) - chatRoomCreationErrorEvent.postValue(Event("Error!")) // TODO: use translated string + chatRoomCreationErrorEvent.postValue( + Event(R.string.conversation_failed_to_create_toast) + ) } } } @@ -212,7 +216,9 @@ class StartConversationViewModel @UiThread constructor() : AddressSelectionViewM "$TAG Account is in secure mode, can't chat with SIP address of different domain [${remote.asStringUriOnly()}]" ) operationInProgress.postValue(false) - chatRoomCreationErrorEvent.postValue(Event("Error!")) // TODO: use translated string + chatRoomCreationErrorEvent.postValue( + Event(R.string.conversation_invalid_participant_due_to_security_mode_toast) + ) return } @@ -258,7 +264,9 @@ class StartConversationViewModel @UiThread constructor() : AddressSelectionViewM } else { Log.e("$TAG Failed to create 1-1 conversation with [${remote.asStringUriOnly()}]!") operationInProgress.postValue(false) - chatRoomCreationErrorEvent.postValue(Event("Error!")) // TODO: use translated string + chatRoomCreationErrorEvent.postValue( + Event(R.string.conversation_failed_to_create_toast) + ) } } else { Log.w( 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 224f7bd56..04d3cd436 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 @@ -224,7 +224,11 @@ class ContactFragment : SlidingPaneChildFragment() { Log.w( "$TAG Contact [${viewModel.contact.value?.name?.value}] has been deleted" ) - // TODO: show green toast + + val message = getString(R.string.contact_deleted_toast) + val icon = R.drawable.check + (requireActivity() as GenericActivity).showGreenToast(message, icon) + goBack() } } 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 42d7e7724..03cdc5079 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,6 +42,7 @@ 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 @@ -149,6 +150,15 @@ 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 e844121ba..254a4bb5d 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 @@ -182,6 +182,15 @@ 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 73d4591a1..56d0dbcfa 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 @@ -180,6 +180,15 @@ 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 9cb4cbe4d..5d731ade2 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 @@ -28,6 +28,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.launch import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.R import org.linphone.contacts.ContactLoader.Companion.LINPHONE_ADDRESS_BOOK_FRIEND_LIST import org.linphone.core.Friend import org.linphone.core.FriendList.Status @@ -74,6 +75,10 @@ class ContactNewOrEditViewModel @UiThread constructor() : ViewModel() { val removeNewNumberOrAddressFieldEvent = MutableLiveData>() + val showRedToastEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + @UiThread fun findFriendByRefKey(refKey: String?) { reset() @@ -137,7 +142,9 @@ class ContactNewOrEditViewModel @UiThread constructor() : ViewModel() { val organization = company.value.orEmpty().trim() if (fn.isEmpty() && ln.isEmpty() && organization.isEmpty()) { Log.e("$TAG At least a mandatory field wasn't filled, aborting save") - // TODO: notify user + showRedToastEvent.postValue( + Event(R.string.contact_editor_mandatory_field_not_filled_toast) + ) 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 3f486b6e9..31ab05355 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 @@ -94,8 +94,8 @@ class ContactViewModel @UiThread constructor() : ViewModel() { val operationInProgress = MutableLiveData() - val chatRoomCreationErrorEvent: MutableLiveData> by lazy { - MutableLiveData>() + val chatRoomCreationErrorEvent: MutableLiveData> by lazy { + MutableLiveData>() } val showLongPressMenuForNumberOrAddressEvent: MutableLiveData> by lazy { @@ -209,7 +209,9 @@ class ContactViewModel @UiThread constructor() : ViewModel() { Log.e("$TAG Conversation [$id] creation has failed!") chatRoom.removeListener(this) operationInProgress.postValue(false) - chatRoomCreationErrorEvent.postValue(Event("Error!")) // TODO: use translated string + chatRoomCreationErrorEvent.postValue( + Event(R.string.conversation_creation_error_toast) + ) } } } @@ -626,7 +628,9 @@ class ContactViewModel @UiThread constructor() : ViewModel() { "$TAG Failed to create 1-1 conversation with [${remote.asStringUriOnly()}]!" ) operationInProgress.postValue(false) - chatRoomCreationErrorEvent.postValue(Event("Error!")) // TODO: use translated string + chatRoomCreationErrorEvent.postValue( + Event(R.string.conversation_creation_error_toast) + ) } } } 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 ebc784710..0b86198df 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 @@ -30,6 +30,7 @@ import java.util.Locale import kotlinx.coroutines.launch import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences +import org.linphone.R import org.linphone.contacts.ContactsManager.ContactsListener import org.linphone.core.Friend import org.linphone.core.MagicSearch @@ -63,6 +64,10 @@ class ContactsListViewModel @UiThread constructor() : AbstractMainViewModel() { MutableLiveData>>() } + val showGreenToastEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + private var previousFilter = "NotSet" private var domainFilter = "" @@ -218,7 +223,7 @@ class ContactsListViewModel @UiThread constructor() : AbstractMainViewModel() { coreContext.contactsManager.contactRemoved(contactModel.friend) contactModel.friend.remove() coreContext.contactsManager.notifyContactsListChanged() - // TODO: show green toast + showGreenToastEvent.postValue(Event(R.string.contact_deleted_toast)) } } 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 78949b651..baf81685e 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 @@ -142,7 +142,10 @@ class MediaListViewerFragment : GenericFragment() { val position = if (index == -1) { Log.e("$TAG File [$path] not found, using latest one available instead!") - // TODO: show error toast + val message = getString(R.string.conversation_media_not_found_toast) + val icon = R.drawable.warning_circle + (requireActivity() as GenericActivity).showRedToast(message, icon) + count - 1 } else { index 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 b353b542e..3fec1a037 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 @@ -34,6 +34,7 @@ import org.linphone.core.Address import org.linphone.core.Friend import org.linphone.core.tools.Log import org.linphone.databinding.StartCallFragmentBinding +import org.linphone.ui.GenericActivity import org.linphone.ui.main.fragment.GenericAddressPickerFragment import org.linphone.ui.main.fragment.GroupSetOrEditSubjectDialogModel import org.linphone.ui.main.history.viewmodel.StartCallViewModel @@ -141,6 +142,15 @@ 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 @@ -186,7 +196,9 @@ class StartCallFragment : GenericAddressPickerFragment() { dialog.currentFocus?.hideKeyboard() dialog.dismiss() } else { - // TODO: show error + val message = getString(R.string.conversation_invalid_empty_subject_toast) + val icon = R.drawable.warning_circle + (requireActivity() as GenericActivity).showRedToast(message, icon) } } } 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 6a755ed92..885c9de3c 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 @@ -59,8 +59,8 @@ class HistoryViewModel @UiThread constructor() : ViewModel() { val callLogFoundEvent = MutableLiveData>() - val chatRoomCreationErrorEvent: MutableLiveData> by lazy { - MutableLiveData>() + val chatRoomCreationErrorEvent: MutableLiveData> by lazy { + MutableLiveData>() } val goToConversationEvent: MutableLiveData>> by lazy { @@ -100,7 +100,9 @@ class HistoryViewModel @UiThread constructor() : ViewModel() { Log.e("$TAG Conversation [$id] creation has failed!") chatRoom.removeListener(this) operationInProgress.postValue(false) - chatRoomCreationErrorEvent.postValue(Event("Error!")) // TODO: use translated string + chatRoomCreationErrorEvent.postValue( + Event(R.string.conversation_failed_to_create_toast) + ) } } } @@ -268,7 +270,9 @@ class HistoryViewModel @UiThread constructor() : ViewModel() { "$TAG Failed to create 1-1 conversation with [${remote.asStringUriOnly()}]!" ) operationInProgress.postValue(false) - chatRoomCreationErrorEvent.postValue(Event("Error!")) // TODO: use translated string + chatRoomCreationErrorEvent.postValue( + Event(R.string.conversation_failed_to_create_toast) + ) } } } 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 1ed1ce1a2..63c1a944c 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 @@ -27,6 +27,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences +import org.linphone.R import org.linphone.core.ConferenceScheduler import org.linphone.core.ConferenceSchedulerListenerStub import org.linphone.core.Factory @@ -69,6 +70,10 @@ class StartCallViewModel @UiThread constructor() : AddressSelectionViewModel() { MutableLiveData>() } + val showRedToastEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + private val conferenceSchedulerListener = object : ConferenceSchedulerListenerStub() { override fun onStateChanged( conferenceScheduler: ConferenceScheduler, @@ -86,13 +91,17 @@ class StartCallViewModel @UiThread constructor() : AddressSelectionViewModel() { coreContext.startVideoCall(conferenceAddress) } else { Log.e("$TAG Conference info URI is null!") - // TODO: notify error to user + showRedToastEvent.postValue( + Event(R.string.conference_failed_to_create_group_call_toast) + ) } operationInProgress.postValue(false) } else if (state == ConferenceScheduler.State.Error) { conferenceScheduler.removeListener(this) Log.e("$TAG Failed to create group call!") - // TODO: notify error to user + showRedToastEvent.postValue( + Event(R.string.conference_failed_to_create_group_call_toast) + ) 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 1813edea7..ab7cc701f 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 @@ -185,6 +185,15 @@ 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/ScheduleMeetingFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/ScheduleMeetingFragment.kt index 03ea8eb0b..810b5a293 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 @@ -186,6 +186,15 @@ 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/ScheduleMeetingViewModel.kt b/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/ScheduleMeetingViewModel.kt index 47ef15e9a..4a87cdc73 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 @@ -75,10 +75,16 @@ class ScheduleMeetingViewModel @UiThread constructor() : ViewModel() { val operationInProgress = MutableLiveData() - val conferenceCreatedEvent = MutableLiveData>() - val hideBroadcast = MutableLiveData() + val conferenceCreatedEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + + val showRedToastEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + private var startTimestamp = 0L private var endTimestamp = 0L @@ -102,7 +108,7 @@ class ScheduleMeetingViewModel @UiThread constructor() : ViewModel() { when (state) { ConferenceScheduler.State.Error -> { operationInProgress.postValue(false) - // TODO: show error toast + showRedToastEvent.postValue(Event(R.string.meeting_failed_to_schedule_toast)) } ConferenceScheduler.State.Ready -> { val conferenceAddress = conferenceScheduler.info?.uri @@ -146,14 +152,18 @@ class ScheduleMeetingViewModel @UiThread constructor() : ViewModel() { } participants.value.orEmpty().size -> { Log.e("$TAG No invitation sent!") - // TODO: show error toast + showRedToastEvent.postValue( + Event(R.string.meeting_failed_to_send_invites_toast) + ) } else -> { Log.w("$TAG [$failedCount] invitations couldn't have been sent for:") for (failed in failedInvitations.orEmpty()) { Log.w(failed.asStringUriOnly()) } - // TODO: show error toast + showRedToastEvent.postValue( + Event(R.string.meeting_failed_to_send_part_of_invites_toast) + ) } } @@ -343,7 +353,9 @@ class ScheduleMeetingViewModel @UiThread constructor() : ViewModel() { Log.e( "$TAG Either no subject was set or no participant was selected, can't schedule meeting." ) - // TODO: show red toast + showRedToastEvent.postValue( + Event(R.string.meeting_schedule_mandatory_field_not_filled_toast) + ) return } 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 936748dd5..8b65bde65 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 @@ -37,6 +37,7 @@ import kotlinx.coroutines.launch 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.history.model.ConfirmationDialogModel import org.linphone.ui.main.settings.viewmodel.AccountProfileViewModel @@ -198,7 +199,9 @@ class AccountProfileFragment : GenericFragment() { Log.e( "$TAG Failed to find an account matching this identity address [$identity]" ) - // TODO: show error + val message = getString(R.string.account_failed_to_find_identity_toast) + val icon = R.drawable.warning_circle + (requireActivity() as GenericActivity).showRedToast(message, icon) goBack() } } 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 5a27f4eed..c837f9e02 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 @@ -35,6 +35,7 @@ import org.linphone.R 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.settings.viewmodel.AccountSettingsViewModel import org.linphone.utils.Event @@ -122,7 +123,9 @@ class AccountSettingsFragment : GenericFragment() { Log.e( "$TAG Failed to find an account matching this identity address [$identity]" ) - // TODO: show error + val message = getString(R.string.account_failed_to_find_identity_toast) + val icon = R.drawable.warning_circle + (requireActivity() as GenericActivity).showRedToast(message, icon) goBack() } } 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 6dca80802..6c10cf185 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 @@ -73,18 +73,19 @@ class CardDavAddressBookConfigurationFragment : GenericFragment() { goBack() } - viewModel.cardDavOperationSuccessfulEvent.observe(viewLifecycleOwner) { - it.consume { - Log.i("$TAG CardDAV friend list operation was successful, going back") - // TODO: show green toast + viewModel.showGreenToastEvent.observe(viewLifecycleOwner) { + it.consume { pair -> + val message = getString(pair.first) + val icon = pair.second + (requireActivity() as GenericActivity).showGreenToast(message, icon) goBack() } } - viewModel.showErrorToastEvent.observe(viewLifecycleOwner) { + viewModel.showRedToastEvent.observe(viewLifecycleOwner) { it.consume { pair -> - val icon = pair.first - val message = pair.second + 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 bdd59bff5..5bc88e8c4 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 @@ -80,10 +80,10 @@ class LdapServerConfigurationFragment : GenericFragment() { } } - viewModel.showErrorToastEvent.observe(viewLifecycleOwner) { + viewModel.showRedToastEvent.observe(viewLifecycleOwner) { it.consume { pair -> - val icon = pair.first - val message = pair.second + 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/viewmodel/CardDavViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/CardDavViewModel.kt index 113752334..767d433a8 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 @@ -52,12 +52,12 @@ class CardDavViewModel : ViewModel() { val syncInProgress = MutableLiveData() - val cardDavOperationSuccessfulEvent: MutableLiveData> by lazy { - MutableLiveData>() + val showGreenToastEvent: MutableLiveData>> by lazy { + MutableLiveData>>() } - val showErrorToastEvent: MutableLiveData>> by lazy { - MutableLiveData>>() + val showRedToastEvent: MutableLiveData>> by lazy { + MutableLiveData>>() } private lateinit var friendList: FriendList @@ -75,12 +75,25 @@ class CardDavViewModel : ViewModel() { when (status) { FriendList.SyncStatus.Successful -> { syncInProgress.postValue(false) - cardDavOperationSuccessfulEvent.postValue(Event(true)) + showGreenToastEvent.postValue( + Event( + Pair( + R.string.settings_contacts_carddav_sync_successful_toast, + R.drawable.check + ) + ) + ) } FriendList.SyncStatus.Failure -> { syncInProgress.postValue(false) - val icon = R.drawable.warning_circle - showErrorToastEvent.postValue(Event(Pair(icon, message.orEmpty()))) + showRedToastEvent.postValue( + Event( + Pair( + R.string.settings_contacts_carddav_sync_error_toast, + R.drawable.warning_circle + ) + ) + ) if (isEdit.value == false) { Log.e("$TAG Synchronization failed, removing Friend list from Core") friendList.removeListener(this) @@ -132,7 +145,14 @@ class CardDavViewModel : ViewModel() { val name = friendList.displayName core.removeFriendList(friendList) Log.i("$TAG Removed friends list with display name [$name]") - cardDavOperationSuccessfulEvent.postValue(Event(true)) + showGreenToastEvent.postValue( + Event( + Pair( + R.string.settings_contacts_carddav_deleted_toast, + R.drawable.trash_simple + ) + ) + ) } } } @@ -147,9 +167,13 @@ class CardDavViewModel : ViewModel() { val name = displayName.value.orEmpty().trim() val server = serverUrl.value.orEmpty().trim() if (name.isEmpty() || server.isEmpty()) { - // TODO: improve toast - showErrorToastEvent.postValue( - Event(Pair(R.drawable.warning_circle, "Name or Server is empty!")) + showRedToastEvent.postValue( + Event( + Pair( + R.string.settings_contacts_carddav_mandatory_field_not_filled_toast, + R.drawable.warning_circle + ) + ) ) return } 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 2eb1924a5..00c18fa8d 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 @@ -67,8 +67,8 @@ class LdapViewModel : ViewModel() { MutableLiveData>() } - val showErrorToastEvent: MutableLiveData>> by lazy { - MutableLiveData>>() + val showRedToastEvent: MutableLiveData>> by lazy { + MutableLiveData>>() } private lateinit var ldapToEdit: Ldap @@ -171,9 +171,10 @@ class LdapViewModel : ViewModel() { ldapServerOperationSuccessfulEvent.postValue(Event(true)) } catch (e: Exception) { Log.e("$TAG Exception while creating LDAP: $e") - // TODO: improve toast - showErrorToastEvent.postValue( - Event(Pair(R.drawable.warning_circle, e.toString())) + showRedToastEvent.postValue( + Event( + Pair(R.string.settings_contacts_ldap_error_toast, R.drawable.warning_circle) + ) ) } } diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d3ee55750..0d16c5500 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -124,6 +124,8 @@ Scanner un QR code J\'ai un compte SIP tiers Single sign on + L\'adresse SIP est invalide ! + L\'adresse SIP ne contient pas de nom d\'utilisateur ! Pas encore de compte ? Créer un compte On vous a envoyé un code de vérification par SMS au numéro %1$s.\n\nMerci de le saisir ci-dessous : @@ -235,6 +237,10 @@ Nom d\'utilisateur Mot de passe Domaine d\'authentification + Synchronization réussie + Erreur de synchronization ! + Compte CardDAV supprimé + Au moins un champ obligatoire n\'est pas rempli URL du serveur Bind DN Mot de passe @@ -248,6 +254,7 @@ Attributs de nom Attributs SIP Domaine SIP + Une erreur s\'est produite, la configuration LDAP n\'a pas été sauvegardée ! Réunions Disposition par défaut Intervenant actif @@ -314,6 +321,7 @@ Autentification requise La connexion a échoué pour le compte \n%s.\n\nVous pouvez renseigner votre mot de passe à nouveau ou bien vérifier les options de configuration de votre compte. Mot de passe + Le compte selectionné est introuvable ! Historique d\'appel Nouvel appel @@ -351,6 +359,7 @@ Erreur lors de la création du contact Ne pas sauvegarder vos changements Toutes vos modifications seront perdues. + Au moins un champ obligatoire n\'est pas rempli Numéros de téléphone et adresses SIP Entreprise : @@ -365,6 +374,7 @@ Partager Supprimer Salut, rejoins moi sur &appName; ! Tu peux le télécharger gratuitement sur %s + Le contact a été supprimé Augmenter le niveau de confiance Vous êtes sur le point de passer un appel vers l\'appareil $2%s\ de $1%s.\Voulez-vous démarrer l\'appel ? @@ -407,6 +417,7 @@ 1 semaine Créer une conversation Créer un groupe + Veuillez choisir un sujet pour la conversation Chercher un contact Créer une conversation de groupe Aucun contact ni suggestion pour le moment… @@ -416,6 +427,7 @@ %s est en train d\'écrire… %s sont en train d\'écrire… + Échec de la création de la conversation ! Ajouter des membres En réponse à : Chercher @@ -442,6 +454,9 @@ Ouvrir le fichier Sauvegarder le fichier Le message a été supprimé + Échec de la création de la conversation ! + Pour des raisons de sécurité, la création d\'une conversation avec un participant d\'un domaine tiers est désactivé. + Le média selectionné est introuvable ! Membres du groupe Ajouter des membres @@ -511,6 +526,10 @@ La réunion a été créée La réunion a été mise à jour La réunion a été annulée + Échec de la création de la réunion ! + Au moins un champ obligatoire n\'a pas été rempli + Échec de l\'envoi des invitations à la réunion ! + Échec de l\'envoi des invitations à la réunion pour certains des participants ! Rejoindre Annuler @@ -586,19 +605,23 @@ En attente d\'autres participants… Partage d\'écran Participants + L\'appel de groupe n\'a pas pu être créé! %s participant %s participants Retirer %s de la conférence ? Voulez-vous vraiment retirer ce participant de la conférence ? + Le participant a été exclu de la conférence En train de rejoindre… En pause partage son écran + L\'adresse SIP est invalide, elle ne peut être ajoutée à la conférence Mosaïque Intervenant actif Audio uniquement + Trop de participants pour l\'affichage mosaïque Appel de groupe distant Appel de groupe local diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7e8d3df2e..bedba33e0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -159,6 +159,8 @@ Scan QR code Use a third party SIP account Single sign on + SIP address is invalid! + SIP address doesn\'t contains a username! No account yet? Register We have sent a verification code on your phone number %1$s.\n\nPlease enter the verification code below: @@ -270,6 +272,10 @@ Username Password Auth realm + Synchronization was successful + Synchronization error! + CardDAV account removed + At least one mandatory field wasn\'t filled Server URL Bind DN Password @@ -283,6 +289,7 @@ Name attributes SIP attributes SIP domain + A error occurred, LDAP server not saved! Meetings Default layout Active speaker @@ -349,6 +356,7 @@ Authentication needed Connection failed because authentication is missing or invalid for account \n%s.\n\nYou can provide password again, or check your account configuration in the settings. New password + Failed to find matching account! Call history @@ -387,6 +395,7 @@ Failed to create contact! Don\'t save changes? All changes will be lost + At least one mandatory field wasn\'t filled Phone numbers & SIP addresses Company: @@ -401,6 +410,7 @@ Share Delete Hello, join me on &appName;! You can download it for free at %s + Contact has been removed Increase trust level You\'re about to make a call to $1%s\'s device $2%s.\nDo you want to make the call? @@ -443,6 +453,7 @@ 1 week New conversation New group conversation + Please enter a name for the conversation Search contact Create a group conversation No contact and no suggestion for the moment… @@ -452,6 +463,7 @@ %s is composing… %s are composing… + Failed to create conversation! Add participants Replying to: Search @@ -478,6 +490,9 @@ Open file Export file Message has been deleted + Failed to create conversation! + Can\'t create conversation with a participant not on the same domain due to security restrictions! + Selected media wasn\'t found Group members Add participants @@ -547,6 +562,10 @@ Meeting has been created Meeting has been updated Meeting has been cancelled + Failed to schedule meeting! + A least a mandatory field wasn\'t filled + Failed to send all invites to meeting! + Failed to send invites to some participants of the meeting! Join Cancel @@ -622,19 +641,23 @@ Waiting for other participants… Screen share Participants + Failed to create a group call! %s participant %s participants Remove %s from conference? Are you sure you want to remove this participant from the conference? + Participant was kicked out of conference Joining… Paused is sharing it\'s screen + Invalid SIP address, can\'t be added to conference Mosaic Speaker Audio only + Too many participants for mosaic layout Remote group call Local group call