From 2e8d061e223d11cbb3cb86f8a8567992e5b80f86 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 29 Apr 2022 14:02:32 +0200 Subject: [PATCH] Trying to prevent crashes seen on Crashlytics --- .../assistant/fragments/RemoteProvisioningFragment.kt | 4 +++- .../main/contact/viewmodels/ContactEditorViewModel.kt | 7 +++++-- .../main/dialer/fragments/DialerFragment.kt | 11 ++++++++--- .../java/org/linphone/contact/ContactAvatarView.kt | 5 ++++- .../main/java/org/linphone/contact/ContactLoader.kt | 5 ++++- .../main/java/org/linphone/utils/DataBindingUtils.kt | 5 +++-- app/src/main/java/org/linphone/utils/LinphoneUtils.kt | 6 ++++-- 7 files changed, 31 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/RemoteProvisioningFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/RemoteProvisioningFragment.kt index d80738b57..ecb1dc062 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/RemoteProvisioningFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/RemoteProvisioningFragment.kt @@ -76,6 +76,8 @@ class RemoteProvisioningFragment : GenericFragment() { viewModel.showOkButton( { - val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) - startActivity(browserIntent) - dialog.dismiss() + try { + val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + startActivity(browserIntent) + } catch (ise: IllegalStateException) { + Log.e("[Dialer] Can't start ACTION_VIEW intent, IllegalStateException: $ise") + } finally { + dialog.dismiss() + } }, getString(R.string.dialog_ok) ) diff --git a/app/src/main/java/org/linphone/contact/ContactAvatarView.kt b/app/src/main/java/org/linphone/contact/ContactAvatarView.kt index 1a7ee84b7..1360f4f25 100644 --- a/app/src/main/java/org/linphone/contact/ContactAvatarView.kt +++ b/app/src/main/java/org/linphone/contact/ContactAvatarView.kt @@ -51,7 +51,10 @@ class ContactAvatarView : LinearLayout { ) } - fun setData(data: ContactDataInterface) { + fun setData(data: ContactDataInterface?) { + // From Crashlytics it seems this function can be called with null parameter... + data ?: return + val contact = data.contact.value val initials = if (contact != null) { AppUtils.getInitials(contact.name ?: "") diff --git a/app/src/main/java/org/linphone/contact/ContactLoader.kt b/app/src/main/java/org/linphone/contact/ContactLoader.kt index c9300c53a..dcf99735c 100644 --- a/app/src/main/java/org/linphone/contact/ContactLoader.kt +++ b/app/src/main/java/org/linphone/contact/ContactLoader.kt @@ -93,7 +93,8 @@ class ContactLoader : LoaderManager.LoaderCallbacks { withContext(Dispatchers.IO) { try { - while (!cursor.isClosed && cursor.moveToNext()) { + // Cursor can be null now that we are on a different dispatcher according to Crashlytics + while (cursor != null && !cursor.isClosed && cursor.moveToNext()) { try { val id: String = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Data.CONTACT_ID)) @@ -224,6 +225,8 @@ class ContactLoader : LoaderManager.LoaderCallbacks { Log.e("[Contacts Loader] State Data Exception: $sde") } catch (ise: IllegalStateException) { Log.e("[Contacts Loader] Illegal State Exception: $ise") + } catch (e: Exception) { + Log.e("[Contacts Loader] Exception: $e") } finally { cancel() } diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index 981f61e94..3ee1e9d2e 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -203,14 +203,15 @@ fun setEditTextOnFocusChangeVisibilityOf(editText: EditText, view: View) { } @BindingAdapter("selectedIndex", "settingListener") -fun spinnerSetting(spinner: Spinner, selectedIndex: Int, listener: SettingListener) { +fun spinnerSetting(spinner: Spinner, selectedIndex: Int, listener: SettingListener?) { spinner.setSelection(selectedIndex, true) spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onNothingSelected(parent: AdapterView<*>?) {} override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { - listener.onListValueChanged(position) + // From Crashlytics it seems this method may be called with a null listener + listener?.onListValueChanged(position) } } } diff --git a/app/src/main/java/org/linphone/utils/LinphoneUtils.kt b/app/src/main/java/org/linphone/utils/LinphoneUtils.kt index f344f0ac7..fe50cb439 100644 --- a/app/src/main/java/org/linphone/utils/LinphoneUtils.kt +++ b/app/src/main/java/org/linphone/utils/LinphoneUtils.kt @@ -47,11 +47,13 @@ class LinphoneUtils { account.params.identityAddress?.asStringUriOnly() == address.asStringUriOnly() } val localDisplayName = account?.params?.identityAddress?.displayName - if (localDisplayName != null) { + // Do not return an empty local display name + if (localDisplayName != null && localDisplayName.isNotEmpty()) { return localDisplayName } } - return address.displayName ?: address.username ?: "" + // Do not return an empty display name + return address.displayName ?: address.username ?: address.asString() } fun getDisplayableAddress(address: Address?): String {