diff --git a/app/src/main/java/org/linphone/ui/main/MainActivity.kt b/app/src/main/java/org/linphone/ui/main/MainActivity.kt index 2d51f5d76..35d63aae0 100644 --- a/app/src/main/java/org/linphone/ui/main/MainActivity.kt +++ b/app/src/main/java/org/linphone/ui/main/MainActivity.kt @@ -29,6 +29,7 @@ import androidx.annotation.DrawableRes import androidx.annotation.UiThread import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat +import androidx.core.view.children import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope @@ -43,6 +44,7 @@ import org.linphone.R import org.linphone.databinding.MainActivityBinding import org.linphone.ui.main.viewmodel.MainViewModel import org.linphone.utils.AppUtils +import org.linphone.utils.slideInToastFromTop import org.linphone.utils.slideInToastFromTopForDuration @UiThread @@ -97,6 +99,21 @@ class MainActivity : AppCompatActivity() { coreContext.showCallActivity() } } + + viewModel.defaultAccountRegistrationErrorEvent.observe(this) { + it.consume { error -> + val tag = "DEFAULT_ACCOUNT_REGISTRATION_ERROR" + if (error) { + // First remove any already existing connection error toat + removePersistentRedToast(tag) + + val message = getString(R.string.toast_default_account_connection_state_error) + showPersistentRedToast(message, R.drawable.warning_circle, tag) + } else { + removePersistentRedToast(tag) + } + } + } } override fun onPostCreate(savedInstanceState: Bundle?) { @@ -151,6 +168,30 @@ class MainActivity : AppCompatActivity() { ) } + private fun showPersistentRedToast( + message: String, + @DrawableRes icon: Int, + tag: String, + doNotTint: Boolean = false + ) { + val redToast = AppUtils.getRedToast(this, binding.toastsArea, message, icon, doNotTint) + redToast.root.tag = tag + binding.toastsArea.addView(redToast.root) + + redToast.root.slideInToastFromTop( + binding.toastsArea as ViewGroup, + true + ) + } + + fun removePersistentRedToast(tag: String) { + for (child in binding.toastsArea.children) { + if (child.tag == tag) { + binding.toastsArea.removeView(child) + } + } + } + private fun loadContacts() { coreContext.contactsManager.loadContacts(this) diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt index 69ce2bb24..b5784fe84 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt @@ -25,9 +25,11 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R +import org.linphone.core.Account import org.linphone.core.Call import org.linphone.core.Core import org.linphone.core.CoreListenerStub +import org.linphone.core.RegistrationState import org.linphone.core.tools.Log import org.linphone.utils.AppUtils import org.linphone.utils.Event @@ -44,6 +46,10 @@ class MainViewModel @UiThread constructor() : ViewModel() { val callsStatus = MutableLiveData() + val defaultAccountRegistrationErrorEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + val changeSystemTopBarColorToInCallEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -52,6 +58,8 @@ class MainViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } + var defaultAccountRegistrationFailed = false + private val coreListener = object : CoreListenerStub() { @WorkerThread override fun onLastCallEnded(core: Core) { @@ -71,9 +79,41 @@ class MainViewModel @UiThread constructor() : ViewModel() { } atLastOneCall.postValue(core.callsNb > 0) } + + @WorkerThread + override fun onAccountRegistrationStateChanged( + core: Core, + account: Account, + state: RegistrationState?, + message: String + ) { + when (state) { + RegistrationState.Failed -> { + if (account == core.defaultAccount) { + Log.e("$TAG Default account registration failed!") + defaultAccountRegistrationFailed = true + defaultAccountRegistrationErrorEvent.postValue(Event(true)) + } else { + // TODO: show red top bar for non-default account registration failure + } + } + RegistrationState.Ok -> { + if (account == core.defaultAccount && defaultAccountRegistrationFailed) { + Log.i("$TAG Default account is now registered") + defaultAccountRegistrationFailed = false + defaultAccountRegistrationErrorEvent.postValue(Event(false)) + } else { + // TODO: hide red top bar for non-default account registration failure + } + } + else -> {} + } + } } init { + defaultAccountRegistrationFailed = false + coreContext.postOnCoreThread { core -> core.addListener(coreListener) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0c777543c..89f52ef56 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -108,6 +108,7 @@ Low cellular signal! Cellular signal is no longer low This call can be trusted + Connection error! Login Scan QR code