From fd3f3a076ef2ce0fca304ddb64011dc46234f371 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 17 Jun 2020 10:49:33 +0200 Subject: [PATCH] Display call error reason as Snack + small audio call overlay improvement --- app/build.gradle | 4 +-- .../linphone/activities/main/MainActivity.kt | 6 ++++ .../main/viewmodels/SharedMainViewModel.kt | 8 ++--- .../java/org/linphone/core/CoreContext.kt | 36 ++++++++++++++++--- app/src/main/res/values/strings.xml | 7 ++++ 5 files changed, 51 insertions(+), 10 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 743c506a3..890640584 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -142,9 +142,9 @@ repositories { url file(LinphoneSdkBuildDir + '/maven_repository/') } - /*maven { + maven { url "https://linphone.org/maven_repository" - }*/ + } } dependencies { diff --git a/app/src/main/java/org/linphone/activities/main/MainActivity.kt b/app/src/main/java/org/linphone/activities/main/MainActivity.kt index 6ead8686c..d83af6f83 100644 --- a/app/src/main/java/org/linphone/activities/main/MainActivity.kt +++ b/app/src/main/java/org/linphone/activities/main/MainActivity.kt @@ -87,6 +87,12 @@ class MainActivity : GenericActivity(), SnackBarActivity, NavController.OnDestin } }) + coreContext.callErrorMessageResourceId.observe(this, Observer { + it.consume { messageResourceId -> + showSnackBar(messageResourceId) + } + }) + binding.setGoBackToCallClickListener { val intent = Intent(this, CallActivity::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) diff --git a/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt b/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt index cb5aa0395..48e70f0d6 100644 --- a/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt @@ -52,11 +52,11 @@ class SharedMainViewModel : ViewModel() { val selectedContact = MutableLiveData() - /* Call */ - - var pendingCallTransfer: Boolean = false - /* Accounts */ val proxyConfigRemoved = MutableLiveData() + + /* Call */ + + var pendingCallTransfer: Boolean = false } diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 0710769e4..b60e85b54 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -29,9 +29,11 @@ import android.os.Vibrator import android.telephony.PhoneStateListener import android.telephony.TelephonyManager import android.view.* +import androidx.lifecycle.MutableLiveData import java.io.File import kotlin.math.abs import org.linphone.LinphoneApplication.Companion.corePreferences +import org.linphone.R import org.linphone.activities.call.CallActivity import org.linphone.activities.call.IncomingCallActivity import org.linphone.activities.call.OutgoingCallActivity @@ -42,6 +44,7 @@ import org.linphone.core.tools.Log import org.linphone.mediastream.Version import org.linphone.notifications.NotificationsManager import org.linphone.utils.AppUtils +import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils class CoreContext(val context: Context, coreConfig: Config) { @@ -66,6 +69,10 @@ class CoreContext(val context: Context, coreConfig: Config) { NotificationsManager(context) } + val callErrorMessageResourceId: MutableLiveData> by lazy { + MutableLiveData>() + } + private var gsmCallActive = false private val phoneStateListener = object : PhoneStateListener() { override fun onCallStateChanged(state: Int, phoneNumber: String?) { @@ -171,6 +178,22 @@ class CoreContext(val context: Context, coreConfig: Config) { removeCallOverlay() } + + if (state == Call.State.Error) { + Log.w("[Context] Call error reason is ${call.errorInfo.reason}") + val id = when (call.errorInfo.reason) { + Reason.Busy -> R.string.call_error_user_busy + Reason.IOError -> R.string.call_error_io_error + Reason.NotAcceptable -> R.string.call_error_incompatible_media_params + Reason.NotFound -> R.string.call_error_user_not_found + else -> R.string.call_error_unknown + } + callErrorMessageResourceId.value = Event(id) + } else if (state == Call.State.End && call.errorInfo.reason == Reason.Declined) { + Log.i("[Context] Call has been declined") + val id = R.string.call_error_declined + callErrorMessageResourceId.value = Event(id) + } } } } @@ -317,6 +340,7 @@ class CoreContext(val context: Context, coreConfig: Config) { val address: Address? = core.interpretUrl(stringAddress) if (address == null) { Log.e("[Context] Failed to parse $stringAddress, abort outgoing call") + callErrorMessageResourceId.value = Event(R.string.call_error_network_unreachable) return } @@ -326,6 +350,7 @@ class CoreContext(val context: Context, coreConfig: Config) { fun startCall(address: Address, forceZRTP: Boolean = false) { if (!core.isNetworkReachable) { Log.e("[Context] Network unreachable, abort outgoing call") + callErrorMessageResourceId.value = Event(R.string.call_error_network_unreachable) return } @@ -388,11 +413,11 @@ class CoreContext(val context: Context, coreConfig: Config) { params.x = overlayX.toInt() params.y = overlayY.toInt() params.gravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL - val overlay = LayoutInflater.from(context).inflate(org.linphone.R.layout.call_overlay, null) + val overlay = LayoutInflater.from(context).inflate(R.layout.call_overlay, null) var initX = overlayX var initY = overlayY - overlay.setOnTouchListener { _, event -> + overlay.setOnTouchListener { view, event -> when (event.action) { MotionEvent.ACTION_DOWN -> { initX = params.x - event.rawX @@ -408,8 +433,7 @@ class CoreContext(val context: Context, coreConfig: Config) { } MotionEvent.ACTION_UP -> { if (abs(overlayX - params.x) < 5 && abs(overlayY - params.y) < 5) { - Log.i("[Core Context] Overlay clicked, go back to call view") - onCallStarted() + view.performClick() } overlayX = params.x.toFloat() overlayY = params.y.toFloat() @@ -418,6 +442,10 @@ class CoreContext(val context: Context, coreConfig: Config) { } true } + overlay.setOnClickListener { + Log.i("[Context] Overlay clicked, go back to call view") + onCallStarted() + } callOverlay = overlay windowManager.addView(overlay, params) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 91bcfa1c5..4f64b9526 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -189,6 +189,13 @@ Outgoing call Call running Conference + Call has been declined + User is busy + User hasn\'t been found + Incompatible media parameters + Network is unreachable + Network error + Unknown error Audio