Added missing toasts

This commit is contained in:
Sylvain Berfini 2024-05-10 15:11:23 +02:00
parent b3ef701661
commit 465201010d
34 changed files with 329 additions and 73 deletions

View file

@ -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) {

View file

@ -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) {

View file

@ -69,6 +69,10 @@ open class AccountLoginViewModel @UiThread constructor() : ViewModel() {
MutableLiveData<Event<String>>()
}
val showRedToastEvent: MutableLiveData<Event<Int>> by lazy {
MutableLiveData<Event<Int>>()
}
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
}

View file

@ -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()

View file

@ -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()
}
}

View file

@ -80,6 +80,10 @@ class ConferenceViewModel {
MutableLiveData<Event<Pair<String, Participant>>>()
}
val showRedToastEvent: MutableLiveData<Event<Int>> by lazy {
MutableLiveData<Event<Int>>()
}
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<Address>(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)
)
}
}
}

View file

@ -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
)
}

View file

@ -173,8 +173,8 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() {
MutableLiveData<Event<Pair<String, String>>>()
}
val chatRoomCreationErrorEvent: MutableLiveData<Event<String>> by lazy {
MutableLiveData<Event<String>>()
val chatRoomCreationErrorEvent: MutableLiveData<Event<Int>> by lazy {
MutableLiveData<Event<Int>>()
}
// 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)
)
}
}
}

View file

@ -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)
}
}
}

View file

@ -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)))
}
}
}

View file

@ -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)))
}
}
}

View file

@ -50,8 +50,8 @@ class StartConversationViewModel @UiThread constructor() : AddressSelectionViewM
val operationInProgress = MutableLiveData<Boolean>()
val chatRoomCreationErrorEvent: MutableLiveData<Event<String>> by lazy {
MutableLiveData<Event<String>>()
val chatRoomCreationErrorEvent: MutableLiveData<Event<Int>> by lazy {
MutableLiveData<Event<Int>>()
}
val chatRoomCreatedEvent: MutableLiveData<Event<Pair<String, String>>> 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(

View file

@ -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()
}
}

View file

@ -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)
}

View file

@ -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() {

View file

@ -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() {

View file

@ -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<Event<NewOrEditNumberOrAddressModel>>()
val showRedToastEvent: MutableLiveData<Event<Int>> by lazy {
MutableLiveData<Event<Int>>()
}
@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
}

View file

@ -94,8 +94,8 @@ class ContactViewModel @UiThread constructor() : ViewModel() {
val operationInProgress = MutableLiveData<Boolean>()
val chatRoomCreationErrorEvent: MutableLiveData<Event<String>> by lazy {
MutableLiveData<Event<String>>()
val chatRoomCreationErrorEvent: MutableLiveData<Event<Int>> by lazy {
MutableLiveData<Event<Int>>()
}
val showLongPressMenuForNumberOrAddressEvent: MutableLiveData<Event<ContactNumberOrAddressModel>> 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)
)
}
}
}

View file

@ -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<Event<Pair<String, File>>>()
}
val showGreenToastEvent: MutableLiveData<Event<Int>> by lazy {
MutableLiveData<Event<Int>>()
}
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))
}
}

View file

@ -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

View file

@ -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)
}
}
}

View file

@ -59,8 +59,8 @@ class HistoryViewModel @UiThread constructor() : ViewModel() {
val callLogFoundEvent = MutableLiveData<Event<Boolean>>()
val chatRoomCreationErrorEvent: MutableLiveData<Event<String>> by lazy {
MutableLiveData<Event<String>>()
val chatRoomCreationErrorEvent: MutableLiveData<Event<Int>> by lazy {
MutableLiveData<Event<Int>>()
}
val goToConversationEvent: MutableLiveData<Event<Pair<String, String>>> 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)
)
}
}
}

View file

@ -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<Event<Boolean>>()
}
val showRedToastEvent: MutableLiveData<Event<Int>> by lazy {
MutableLiveData<Event<Int>>()
}
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)
}
}

View file

@ -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(

View file

@ -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(

View file

@ -75,10 +75,16 @@ class ScheduleMeetingViewModel @UiThread constructor() : ViewModel() {
val operationInProgress = MutableLiveData<Boolean>()
val conferenceCreatedEvent = MutableLiveData<Event<Boolean>>()
val hideBroadcast = MutableLiveData<Boolean>()
val conferenceCreatedEvent: MutableLiveData<Event<Boolean>> by lazy {
MutableLiveData<Event<Boolean>>()
}
val showRedToastEvent: MutableLiveData<Event<Int>> by lazy {
MutableLiveData<Event<Int>>()
}
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
}

View file

@ -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()
}
}

View file

@ -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()
}
}

View file

@ -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)
}
}

View file

@ -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)
}
}

View file

@ -52,12 +52,12 @@ class CardDavViewModel : ViewModel() {
val syncInProgress = MutableLiveData<Boolean>()
val cardDavOperationSuccessfulEvent: MutableLiveData<Event<Boolean>> by lazy {
MutableLiveData<Event<Boolean>>()
val showGreenToastEvent: MutableLiveData<Event<Pair<Int, Int>>> by lazy {
MutableLiveData<Event<Pair<Int, Int>>>()
}
val showErrorToastEvent: MutableLiveData<Event<Pair<Int, String>>> by lazy {
MutableLiveData<Event<Pair<Int, String>>>()
val showRedToastEvent: MutableLiveData<Event<Pair<Int, Int>>> by lazy {
MutableLiveData<Event<Pair<Int, Int>>>()
}
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
}

View file

@ -67,8 +67,8 @@ class LdapViewModel : ViewModel() {
MutableLiveData<Event<Boolean>>()
}
val showErrorToastEvent: MutableLiveData<Event<Pair<Int, String>>> by lazy {
MutableLiveData<Event<Pair<Int, String>>>()
val showRedToastEvent: MutableLiveData<Event<Pair<Int, Int>>> by lazy {
MutableLiveData<Event<Pair<Int, Int>>>()
}
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)
)
)
}
}

View file

@ -124,6 +124,8 @@
<string name="assistant_scan_qr_code">Scanner un QR code</string>
<string name="assistant_login_third_party_sip_account">J\'ai un compte SIP tiers</string>
<string name="assistant_login_using_single_sign_on">Single sign on</string>
<string name="assistant_login_cant_parse_address_toast">L\'adresse SIP est invalide !</string>
<string name="assistant_login_address_without_username_toast">L\'adresse SIP ne contient pas de nom d\'utilisateur !</string>
<string name="assistant_no_account_yet">Pas encore de compte ?</string>
<string name="assistant_account_register">Créer un compte</string>
<string name="assistant_account_creation_sms_confirmation_explanation">On vous a envoyé un code de vérification par SMS au numéro %1$s.\n\nMerci de le saisir ci-dessous :</string>
@ -235,6 +237,10 @@
<string name="settings_contacts_carddav_username_title">Nom d\'utilisateur</string>
<string name="settings_contacts_carddav_password_title">Mot de passe</string>
<string name="settings_contacts_carddav_realm_title">Domaine d\'authentification</string>
<string name="settings_contacts_carddav_sync_successful_toast">Synchronization réussie</string>
<string name="settings_contacts_carddav_sync_error_toast">Erreur de synchronization !</string>
<string name="settings_contacts_carddav_deleted_toast">Compte CardDAV supprimé</string>
<string name="settings_contacts_carddav_mandatory_field_not_filled_toast">Au moins un champ obligatoire n\'est pas rempli</string>
<string name="settings_contacts_ldap_server_url_title">URL du serveur</string>
<string name="settings_contacts_ldap_bind_dn_title">Bind DN</string>
<string name="settings_contacts_ldap_password_title">Mot de passe</string>
@ -248,6 +254,7 @@
<string name="settings_contacts_ldap_name_attributes_title">Attributs de nom</string>
<string name="settings_contacts_ldap_sip_attributes_title">Attributs SIP</string>
<string name="settings_contacts_ldap_sip_domain_title">Domaine SIP</string>
<string name="settings_contacts_ldap_error_toast">Une erreur s\'est produite, la configuration LDAP n\'a pas été sauvegardée !</string>
<string name="settings_meetings_title">Réunions</string>
<string name="settings_meetings_default_layout_title">Disposition par défaut</string>
<string name="settings_meetings_layout_active_speaker_label">Intervenant actif</string>
@ -314,6 +321,7 @@
<string name="account_settings_dialog_invalid_password_title">Autentification requise</string>
<string name="account_settings_dialog_invalid_password_message">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.</string>
<string name="account_settings_dialog_invalid_password_hint">Mot de passe</string>
<string name="account_failed_to_find_identity_toast">Le compte selectionné est introuvable !</string>
<string name="history_title">Historique d\'appel</string>
<string name="history_call_start_title">Nouvel appel</string>
@ -351,6 +359,7 @@
<string name="contact_editor_error_saving_contact_toast">Erreur lors de la création du contact</string>
<string name="contact_editor_dialog_abort_confirmation_title">Ne pas sauvegarder vos changements</string>
<string name="contact_editor_dialog_abort_confirmation_message">Toutes vos modifications seront perdues.</string>
<string name="contact_editor_mandatory_field_not_filled_toast">Au moins un champ obligatoire n\'est pas rempli</string>
<string name="contact_details_numbers_and_addresses_title">Numéros de téléphone et adresses SIP</string>
<string name="contact_details_company_name">Entreprise :</string>
@ -365,6 +374,7 @@
<string name="contact_details_share">Partager</string>
<string name="contact_details_delete">Supprimer</string>
<string name="contact_sms_invite_content">Salut, rejoins moi sur &appName; ! Tu peux le télécharger gratuitement sur %s</string>
<string name="contact_deleted_toast">Le contact a été supprimé</string>
<string name="contact_dialog_increase_trust_level_title">Augmenter le niveau de confiance</string>
<string name="contact_dialog_increase_trust_level_message">Vous êtes sur le point de passer un appel vers l\'appareil $2%s\ de $1%s.\Voulez-vous démarrer l\'appel ?</string>
@ -407,6 +417,7 @@
<string name="conversation_ephemeral_messages_duration_one_week">1 semaine</string>
<string name="new_conversation_title">Créer une conversation</string>
<string name="new_group_conversation_title">Créer un groupe</string>
<string name="conversation_invalid_empty_subject_toast">Veuillez choisir un sujet pour la conversation</string>
<string name="new_conversation_search_bar_filter_hint">Chercher un contact</string>
<string name="new_conversation_create_group">Créer une conversation de groupe</string>
<string name="new_conversation_no_contact">Aucun contact ni suggestion pour le moment…</string>
@ -416,6 +427,7 @@
<item quantity="one">%s est en train d\'écrire…</item>
<item quantity="other">%s sont en train d\'écrire…</item>
</plurals>
<string name="conversation_creation_error_toast">Échec de la création de la conversation !</string>
<string name="conversation_add_participants_title">Ajouter des membres</string>
<string name="conversation_reply_to_message_title">En réponse à :</string>
<string name="conversation_menu_search_in_messages">Chercher</string>
@ -442,6 +454,9 @@
<string name="conversation_dialog_open_file_label">Ouvrir le fichier</string>
<string name="conversation_dialog_export_file_label">Sauvegarder le fichier</string>
<string name="conversation_message_deleted_toast">Le message a été supprimé</string>
<string name="conversation_failed_to_create_toast">Échec de la création de la conversation !</string>
<string name="conversation_invalid_participant_due_to_security_mode_toast">Pour des raisons de sécurité, la création d\'une conversation avec un participant d\'un domaine tiers est désactivé.</string>
<string name="conversation_media_not_found_toast">Le média selectionné est introuvable !</string>
<string name="conversation_info_participants_list_title">Membres du groupe</string>
<string name="conversation_info_add_participants_label">Ajouter des membres</string>
@ -511,6 +526,10 @@
<string name="meeting_info_created_toast">La réunion a été créée</string>
<string name="meeting_info_updated_toast">La réunion a été mise à jour</string>
<string name="meeting_info_cancelled_toast">La réunion a été annulée</string>
<string name="meeting_failed_to_schedule_toast">Échec de la création de la réunion !</string>
<string name="meeting_schedule_mandatory_field_not_filled_toast">Au moins un champ obligatoire n\'a pas été rempli</string>
<string name="meeting_failed_to_send_invites_toast">Échec de l\'envoi des invitations à la réunion !</string>
<string name="meeting_failed_to_send_part_of_invites_toast">Échec de l\'envoi des invitations à la réunion pour certains des participants !</string>
<string name="meeting_waiting_room_join">Rejoindre</string>
<string name="meeting_waiting_room_cancel">Annuler</string>
@ -586,19 +605,23 @@
<string name="conference_call_empty">En attente d\'autres participants…</string>
<string name="conference_action_screen_sharing">Partage d\'écran</string>
<string name="conference_action_show_participants">Participants</string>
<string name="conference_failed_to_create_group_call_toast">L\'appel de groupe n\'a pas pu être créé!</string>
<plurals name="conference_participants_list_title" tools:ignore="MissingQuantity">
<item quantity="one">%s participant</item>
<item quantity="other">%s participants</item>
</plurals>
<string name="conference_confirm_removing_participant_dialog_title">Retirer %s de la conférence ?</string>
<string name="conference_confirm_removing_participant_dialog_message">Voulez-vous vraiment retirer ce participant de la conférence ?</string>
<string name="conference_participant_was_kicked_out_toast">Le participant a été exclu de la conférence</string>
<string name="conference_participant_joining_text">En train de rejoindre…</string>
<string name="conference_participant_paused_text">En pause</string>
<string name="conference_active_speaker_is_screen_sharing">partage son écran</string>
<string name="conference_failed_to_add_participant_invalid_address_toast">L\'adresse SIP est invalide, elle ne peut être ajoutée à la conférence</string>
<string name="conference_layout_grid">Mosaïque</string>
<string name="conference_layout_active_speaker">Intervenant actif</string>
<string name="conference_layout_audio_only">Audio uniquement</string>
<string name="conference_too_many_participants_for_mosaic_layout_toast">Trop de participants pour l\'affichage mosaïque</string>
<string name="conference_remotely_hosted_title">Appel de groupe distant</string>
<string name="conference_locally_hosted_title">Appel de groupe local</string>

View file

@ -159,6 +159,8 @@
<string name="assistant_scan_qr_code">Scan QR code</string>
<string name="assistant_login_third_party_sip_account">Use a third party SIP account</string>
<string name="assistant_login_using_single_sign_on">Single sign on</string>
<string name="assistant_login_cant_parse_address_toast">SIP address is invalid!</string>
<string name="assistant_login_address_without_username_toast">SIP address doesn\'t contains a username!</string>
<string name="assistant_no_account_yet">No account yet?</string>
<string name="assistant_account_register">Register</string>
<string name="assistant_account_creation_sms_confirmation_explanation">We have sent a verification code on your phone number %1$s.\n\nPlease enter the verification code below:</string>
@ -270,6 +272,10 @@
<string name="settings_contacts_carddav_username_title">Username</string>
<string name="settings_contacts_carddav_password_title">Password</string>
<string name="settings_contacts_carddav_realm_title">Auth realm</string>
<string name="settings_contacts_carddav_sync_successful_toast">Synchronization was successful</string>
<string name="settings_contacts_carddav_sync_error_toast">Synchronization error!</string>
<string name="settings_contacts_carddav_deleted_toast">CardDAV account removed</string>
<string name="settings_contacts_carddav_mandatory_field_not_filled_toast">At least one mandatory field wasn\'t filled</string>
<string name="settings_contacts_ldap_server_url_title">Server URL</string>
<string name="settings_contacts_ldap_bind_dn_title">Bind DN</string>
<string name="settings_contacts_ldap_password_title">Password</string>
@ -283,6 +289,7 @@
<string name="settings_contacts_ldap_name_attributes_title">Name attributes</string>
<string name="settings_contacts_ldap_sip_attributes_title">SIP attributes</string>
<string name="settings_contacts_ldap_sip_domain_title">SIP domain</string>
<string name="settings_contacts_ldap_error_toast">A error occurred, LDAP server not saved!</string>
<string name="settings_meetings_title">Meetings</string>
<string name="settings_meetings_default_layout_title">Default layout</string>
<string name="settings_meetings_layout_active_speaker_label">Active speaker</string>
@ -349,6 +356,7 @@
<string name="account_settings_dialog_invalid_password_title">Authentication needed</string>
<string name="account_settings_dialog_invalid_password_message">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.</string>
<string name="account_settings_dialog_invalid_password_hint">New password</string>
<string name="account_failed_to_find_identity_toast">Failed to find matching account!</string>
<!-- Call history -->
<string name="history_title">Call history</string>
@ -387,6 +395,7 @@
<string name="contact_editor_error_saving_contact_toast">Failed to create contact!</string>
<string name="contact_editor_dialog_abort_confirmation_title">Don\'t save changes?</string>
<string name="contact_editor_dialog_abort_confirmation_message">All changes will be lost</string>
<string name="contact_editor_mandatory_field_not_filled_toast">At least one mandatory field wasn\'t filled</string>
<string name="contact_details_numbers_and_addresses_title">Phone numbers &amp; SIP addresses</string>
<string name="contact_details_company_name">Company:</string>
@ -401,6 +410,7 @@
<string name="contact_details_share">Share</string>
<string name="contact_details_delete">Delete</string>
<string name="contact_sms_invite_content">Hello, join me on &appName;! You can download it for free at %s</string>
<string name="contact_deleted_toast">Contact has been removed</string>
<string name="contact_dialog_increase_trust_level_title">Increase trust level</string>
<string name="contact_dialog_increase_trust_level_message">You\'re about to make a call to $1%s\'s device $2%s.\nDo you want to make the call?</string>
@ -443,6 +453,7 @@
<string name="conversation_ephemeral_messages_duration_one_week">1 week</string>
<string name="new_conversation_title">New conversation</string>
<string name="new_group_conversation_title">New group conversation</string>
<string name="conversation_invalid_empty_subject_toast">Please enter a name for the conversation</string>
<string name="new_conversation_search_bar_filter_hint">Search contact</string>
<string name="new_conversation_create_group">Create a group conversation</string>
<string name="new_conversation_no_contact">No contact and no suggestion for the moment…</string>
@ -452,6 +463,7 @@
<item quantity="one">%s is composing…</item>
<item quantity="other">%s are composing…</item>
</plurals>
<string name="conversation_creation_error_toast">Failed to create conversation!</string>
<string name="conversation_add_participants_title">Add participants</string>
<string name="conversation_reply_to_message_title">Replying to:</string>
<string name="conversation_menu_search_in_messages">Search</string>
@ -478,6 +490,9 @@
<string name="conversation_dialog_open_file_label">Open file</string>
<string name="conversation_dialog_export_file_label">Export file</string>
<string name="conversation_message_deleted_toast">Message has been deleted</string>
<string name="conversation_failed_to_create_toast">Failed to create conversation!</string>
<string name="conversation_invalid_participant_due_to_security_mode_toast">Can\'t create conversation with a participant not on the same domain due to security restrictions!</string>
<string name="conversation_media_not_found_toast">Selected media wasn\'t found</string>
<string name="conversation_info_participants_list_title">Group members</string>
<string name="conversation_info_add_participants_label">Add participants</string>
@ -547,6 +562,10 @@
<string name="meeting_info_created_toast">Meeting has been created</string>
<string name="meeting_info_updated_toast">Meeting has been updated</string>
<string name="meeting_info_cancelled_toast">Meeting has been cancelled</string>
<string name="meeting_failed_to_schedule_toast">Failed to schedule meeting!</string>
<string name="meeting_schedule_mandatory_field_not_filled_toast">A least a mandatory field wasn\'t filled</string>
<string name="meeting_failed_to_send_invites_toast">Failed to send all invites to meeting!</string>
<string name="meeting_failed_to_send_part_of_invites_toast">Failed to send invites to some participants of the meeting!</string>
<string name="meeting_waiting_room_join">Join</string>
<string name="meeting_waiting_room_cancel">Cancel</string>
@ -622,19 +641,23 @@
<string name="conference_call_empty">Waiting for other participants…</string>
<string name="conference_action_screen_sharing">Screen share</string>
<string name="conference_action_show_participants">Participants</string>
<string name="conference_failed_to_create_group_call_toast">Failed to create a group call!</string>
<plurals name="conference_participants_list_title">
<item quantity="one">%s participant</item>
<item quantity="other">%s participants</item>
</plurals>
<string name="conference_confirm_removing_participant_dialog_title">Remove %s from conference?</string>
<string name="conference_confirm_removing_participant_dialog_message">Are you sure you want to remove this participant from the conference?</string>
<string name="conference_participant_was_kicked_out_toast">Participant was kicked out of conference</string>
<string name="conference_participant_joining_text">Joining…</string>
<string name="conference_participant_paused_text">Paused</string>
<string name="conference_active_speaker_is_screen_sharing">is sharing it\'s screen</string>
<string name="conference_failed_to_add_participant_invalid_address_toast">Invalid SIP address, can\'t be added to conference</string>
<string name="conference_layout_grid">Mosaic</string>
<string name="conference_layout_active_speaker">Speaker</string>
<string name="conference_layout_audio_only">Audio only</string>
<string name="conference_too_many_participants_for_mosaic_layout_toast">Too many participants for mosaic layout</string>
<string name="conference_remotely_hosted_title">Remote group call</string>
<string name="conference_locally_hosted_title">Local group call</string>