diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 2d9df8d98..e1eb66227 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -166,6 +166,16 @@ class CoreContext @UiThread constructor(val context: Context) : HandlerThread("C showCallActivity() } } + Call.State.Error -> { + val errorInfo = call.errorInfo + Log.w( + "$TAG Call error reason is [${errorInfo.reason}](${errorInfo.protocolCode}): ${errorInfo.phrase}" + ) + val text = LinphoneUtils.getCallErrorInfoToast(call) + redToastToShowEvent.postValue( + Event(Pair(text, org.linphone.R.drawable.warning_circle)) + ) + } else -> { } } diff --git a/app/src/main/java/org/linphone/ui/call/CallActivity.kt b/app/src/main/java/org/linphone/ui/call/CallActivity.kt index dbb10be91..e6e193f75 100644 --- a/app/src/main/java/org/linphone/ui/call/CallActivity.kt +++ b/app/src/main/java/org/linphone/ui/call/CallActivity.kt @@ -185,7 +185,11 @@ class CallActivity : GenericActivity() { } callViewModel.goToEndedCallEvent.observe(this) { - it.consume { + it.consume { message -> + if (message.isNotEmpty()) { + showRedToast(message, R.drawable.warning_circle) + } + val action = ActiveCallFragmentDirections.actionGlobalEndedCallFragment() findNavController(R.id.call_nav_container).navigate(action) } 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 372fb2c44..5364f1c3a 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 @@ -140,8 +140,8 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } - val goToEndedCallEvent: MutableLiveData> by lazy { - MutableLiveData>() + val goToEndedCallEvent: MutableLiveData> by lazy { + MutableLiveData>() } val requestRecordAudioPermission: MutableLiveData> by lazy { @@ -256,13 +256,23 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { "$TAG Failed to get a valid call to display, go to ended call fragment" ) updateCallDuration() - goToEndedCallEvent.postValue(Event(true)) + val text = if (call.state == Call.State.Error) { + LinphoneUtils.getCallErrorInfoToast(call) + } else { + "" + } + goToEndedCallEvent.postValue(Event(text)) } } else { updateCallDuration() Log.i("$TAG Call is ending, go to ended call fragment") // Show that call was ended for a few seconds, then leave - goToEndedCallEvent.postValue(Event(true)) + val text = if (call.state == Call.State.Error) { + LinphoneUtils.getCallErrorInfoToast(call) + } else { + "" + } + goToEndedCallEvent.postValue(Event(text)) } } else { val videoEnabled = call.currentParams.isVideoEnabled diff --git a/app/src/main/java/org/linphone/utils/LinphoneUtils.kt b/app/src/main/java/org/linphone/utils/LinphoneUtils.kt index f3e2b7f21..a18393d44 100644 --- a/app/src/main/java/org/linphone/utils/LinphoneUtils.kt +++ b/app/src/main/java/org/linphone/utils/LinphoneUtils.kt @@ -40,6 +40,7 @@ import org.linphone.core.ChatRoom import org.linphone.core.ConferenceInfo import org.linphone.core.Core import org.linphone.core.Factory +import org.linphone.core.Reason import org.linphone.core.tools.Log import org.linphone.ui.main.contacts.model.ContactAvatarModel @@ -121,6 +122,37 @@ class LinphoneUtils { } } + @WorkerThread + fun getCallErrorInfoToast(call: Call): String { + val errorInfo = call.errorInfo + Log.w( + "$TAG Call error reason is [${errorInfo.reason}](${errorInfo.protocolCode}): ${errorInfo.phrase}" + ) + return when (errorInfo.reason) { + Reason.Busy -> { + AppUtils.getString(R.string.toast_call_error_user_busy) + } + Reason.IOError -> { + AppUtils.getString(R.string.toast_call_error_io_error) + } + Reason.NotAcceptable -> { + AppUtils.getString(R.string.toast_call_error_incompatible_media_params) + } + Reason.NotFound -> { + AppUtils.getString(R.string.toast_call_error_user_not_found) + } + Reason.ServerTimeout -> { + AppUtils.getString(R.string.toast_call_error_server_timeout) + } + Reason.TemporarilyUnavailable -> { + AppUtils.getString(R.string.toast_call_error_temporarily_unavailable) + } + else -> { + "${errorInfo.protocolCode} / ${errorInfo.phrase}" + } + } + } + @WorkerThread fun isEndToEndEncryptedChatAvailable(core: Core): Boolean { return core.isLimeX3DhEnabled && diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index ba38de826..ebee25d41 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -107,6 +107,13 @@ Echec lors de la connexion à la conférence! Configuration appliquée avec succès Erreur durant la récupération ou l\'application de la configuration + L\'utilisateur est occupé + L\'utilisateur n\'a pu être trouvé + Paramètres media incompatibles + Le réseau n\'est pas joignable + Service indisponible ou erreur réseau + Délai d\'attente du serveur dépassé + Temporairement indisponible Conditions de service & politique de confidentialité diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8c2049bfb..ab96806b4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -142,6 +142,13 @@ Failed to join conference! Configuration successfully applied Error while trying to download and apply remote configuration + User is busy + User has not been found + Incompatible media parameters + Network is unreachable + Service unavailable or network error + Server timeout + Temporarily unavailable General terms & privacy policy