diff --git a/app/src/main/java/org/linphone/contact/ContactDataInterface.kt b/app/src/main/java/org/linphone/contact/ContactDataInterface.kt index 95132a0b4..892e30d61 100644 --- a/app/src/main/java/org/linphone/contact/ContactDataInterface.kt +++ b/app/src/main/java/org/linphone/contact/ContactDataInterface.kt @@ -19,7 +19,6 @@ */ package org.linphone.contact -import android.net.Uri import androidx.lifecycle.MutableLiveData import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.activities.main.viewmodels.MessageNotifierViewModel @@ -37,12 +36,6 @@ interface ContactDataInterface { val showGroupChatAvatar: Boolean get() = false - - val thumbnailUri: Uri? - get() = contact.value?.getThumbnailUri() - - val pictureUri: Uri? - get() = contact.value?.getPictureUri() } open class GenericContactData(private val sipAddress: Address) : ContactDataInterface { diff --git a/app/src/main/java/org/linphone/contact/ContactsManager.kt b/app/src/main/java/org/linphone/contact/ContactsManager.kt index feb478f24..8b5c6c899 100644 --- a/app/src/main/java/org/linphone/contact/ContactsManager.kt +++ b/app/src/main/java/org/linphone/contact/ContactsManager.kt @@ -33,7 +33,7 @@ import android.util.Patterns import androidx.core.app.Person import androidx.core.graphics.drawable.IconCompat import androidx.lifecycle.MutableLiveData -import java.lang.NumberFormatException +import java.io.IOException import kotlinx.coroutines.* import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences @@ -353,36 +353,41 @@ fun Friend.hasPresence(): Boolean { return false } -fun Friend.getPictureUri(): Uri? { - val refKey = refKey - if (refKey != null) { - try { - val nativeId = refKey.toLong() - return Uri.withAppendedPath( - ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, nativeId), - ContactsContract.Contacts.Photo.DISPLAY_PHOTO - ) - } catch (nfe: NumberFormatException) {} - } - - val photoUri = photo ?: return null - return Uri.parse(photoUri) +fun Friend.getThumbnailUri(): Uri? { + return getPictureUri(true) } -fun Friend.getThumbnailUri(): Uri? { +fun Friend.getPictureUri(thumbnailPreferred: Boolean = false): Uri? { val refKey = refKey if (refKey != null) { try { - val nativeId = refKey.toLong() + val lookupUri = ContentUris.withAppendedId( + ContactsContract.Contacts.CONTENT_URI, + refKey.toLong() + ) + + if (!thumbnailPreferred) { + val pictureUri = Uri.withAppendedPath( + lookupUri, + ContactsContract.Contacts.Photo.DISPLAY_PHOTO + ) + // Check that the URI points to a real file + val contentResolver = coreContext.context.contentResolver + try { + if (contentResolver.openAssetFileDescriptor(pictureUri, "r") != null) { + return pictureUri + } + } catch (ioe: IOException) { } + } + + // Fallback to thumbnail if high res picture isn't available return Uri.withAppendedPath( - ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, nativeId), + lookupUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY ) - } catch (nfe: NumberFormatException) {} + } catch (e: Exception) { } } - - val photoUri = photo ?: return null - return Uri.parse(photoUri) + return null } fun Friend.getPerson(): Person { diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index 15b4343e6..5e2eba3c3 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -52,6 +52,7 @@ import org.linphone.activities.voip.data.ConferenceParticipantDeviceData import org.linphone.activities.voip.views.HorizontalScrollDotsView import org.linphone.contact.ContactAvatarGenerator import org.linphone.contact.ContactDataInterface +import org.linphone.contact.getPictureUri import org.linphone.core.tools.Log import org.linphone.views.VoiceRecordProgressBar @@ -344,7 +345,7 @@ private fun loadContactPictureWithCoil( if (contact != null) { val context = imageView.context val displayName = contact.contact.value?.name ?: contact.displayName.value.orEmpty() - val source = if (useThumbnail) contact.thumbnailUri else contact.pictureUri + val source = contact.contact.value?.getPictureUri(useThumbnail) imageView.load(source) { transformations(CircleCropTransformation()) error( @@ -390,7 +391,7 @@ fun loadContactPictureWithCoil(imageView: ImageView, contact: ContactDataInterfa @BindingAdapter("coilContactBig") fun loadBigContactPictureWithCoil(imageView: ImageView, contact: ContactDataInterface?) { loadContactPictureWithCoil( - imageView, contact, true, + imageView, contact, false, R.dimen.contact_avatar_big_size, R.dimen.contact_avatar_text_big_size ) }