Using IO dispatcher to create generated avatar
This commit is contained in:
parent
5fac97b55d
commit
e6c842cd35
7 changed files with 97 additions and 53 deletions
|
@ -27,6 +27,8 @@ import android.view.animation.LinearInterpolator
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import org.linphone.LinphoneApplication.Companion.coreContext
|
import org.linphone.LinphoneApplication.Companion.coreContext
|
||||||
import org.linphone.LinphoneApplication.Companion.corePreferences
|
import org.linphone.LinphoneApplication.Companion.corePreferences
|
||||||
import org.linphone.R
|
import org.linphone.R
|
||||||
|
@ -53,6 +55,7 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf
|
||||||
override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
|
override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
|
||||||
override val showGroupChatAvatar: Boolean = chatRoom.hasCapability(ChatRoomCapabilities.Conference.toInt()) &&
|
override val showGroupChatAvatar: Boolean = chatRoom.hasCapability(ChatRoomCapabilities.Conference.toInt()) &&
|
||||||
!chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())
|
!chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())
|
||||||
|
override val coroutineScope: CoroutineScope = viewModelScope
|
||||||
|
|
||||||
val subject = MutableLiveData<String>()
|
val subject = MutableLiveData<String>()
|
||||||
|
|
||||||
|
|
|
@ -25,8 +25,10 @@ import android.media.ExifInterface
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
import java.io.ByteArrayOutputStream
|
import java.io.ByteArrayOutputStream
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import org.linphone.LinphoneApplication.Companion.coreContext
|
import org.linphone.LinphoneApplication.Companion.coreContext
|
||||||
import org.linphone.LinphoneApplication.Companion.corePreferences
|
import org.linphone.LinphoneApplication.Companion.corePreferences
|
||||||
import org.linphone.activities.main.contact.data.NumberOrAddressEditorData
|
import org.linphone.activities.main.contact.data.NumberOrAddressEditorData
|
||||||
|
@ -50,6 +52,7 @@ class ContactEditorViewModel(val c: Friend?) : ViewModel(), ContactDataInterface
|
||||||
override val contact: MutableLiveData<Friend> = MutableLiveData<Friend>()
|
override val contact: MutableLiveData<Friend> = MutableLiveData<Friend>()
|
||||||
override val displayName: MutableLiveData<String> = MutableLiveData<String>()
|
override val displayName: MutableLiveData<String> = MutableLiveData<String>()
|
||||||
override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
|
override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
|
||||||
|
override val coroutineScope: CoroutineScope = viewModelScope
|
||||||
|
|
||||||
val firstName = MutableLiveData<String>()
|
val firstName = MutableLiveData<String>()
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,8 @@ import android.provider.ContactsContract
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import org.linphone.LinphoneApplication.Companion.coreContext
|
import org.linphone.LinphoneApplication.Companion.coreContext
|
||||||
import org.linphone.LinphoneApplication.Companion.corePreferences
|
import org.linphone.LinphoneApplication.Companion.corePreferences
|
||||||
import org.linphone.R
|
import org.linphone.R
|
||||||
|
@ -52,6 +54,7 @@ class ContactViewModel(friend: Friend, async: Boolean = false) : MessageNotifier
|
||||||
override val contact: MutableLiveData<Friend> = MutableLiveData<Friend>()
|
override val contact: MutableLiveData<Friend> = MutableLiveData<Friend>()
|
||||||
override val displayName: MutableLiveData<String> = MutableLiveData<String>()
|
override val displayName: MutableLiveData<String> = MutableLiveData<String>()
|
||||||
override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
|
override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
|
||||||
|
override val coroutineScope: CoroutineScope = viewModelScope
|
||||||
|
|
||||||
var fullName = ""
|
var fullName = ""
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
package org.linphone.contact
|
package org.linphone.contact
|
||||||
|
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import org.linphone.LinphoneApplication.Companion.coreContext
|
import org.linphone.LinphoneApplication.Companion.coreContext
|
||||||
import org.linphone.activities.main.viewmodels.MessageNotifierViewModel
|
import org.linphone.activities.main.viewmodels.MessageNotifierViewModel
|
||||||
import org.linphone.core.Address
|
import org.linphone.core.Address
|
||||||
|
@ -36,12 +38,15 @@ interface ContactDataInterface {
|
||||||
|
|
||||||
val showGroupChatAvatar: Boolean
|
val showGroupChatAvatar: Boolean
|
||||||
get() = false
|
get() = false
|
||||||
|
|
||||||
|
val coroutineScope: CoroutineScope
|
||||||
}
|
}
|
||||||
|
|
||||||
open class GenericContactData(private val sipAddress: Address) : ContactDataInterface {
|
open class GenericContactData(private val sipAddress: Address) : ContactDataInterface {
|
||||||
final override val contact: MutableLiveData<Friend> = MutableLiveData<Friend>()
|
final override val contact: MutableLiveData<Friend> = MutableLiveData<Friend>()
|
||||||
final override val displayName: MutableLiveData<String> = MutableLiveData<String>()
|
final override val displayName: MutableLiveData<String> = MutableLiveData<String>()
|
||||||
final override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
|
final override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
|
||||||
|
final override val coroutineScope: CoroutineScope = coreContext.coroutineScope
|
||||||
|
|
||||||
init {
|
init {
|
||||||
securityLevel.value = ChatRoomSecurityLevel.ClearText
|
securityLevel.value = ChatRoomSecurityLevel.ClearText
|
||||||
|
@ -63,6 +68,7 @@ abstract class GenericContactViewModel(private val sipAddress: Address) : Messag
|
||||||
final override val contact: MutableLiveData<Friend> = MutableLiveData<Friend>()
|
final override val contact: MutableLiveData<Friend> = MutableLiveData<Friend>()
|
||||||
final override val displayName: MutableLiveData<String> = MutableLiveData<String>()
|
final override val displayName: MutableLiveData<String> = MutableLiveData<String>()
|
||||||
final override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
|
final override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
|
||||||
|
final override val coroutineScope: CoroutineScope = viewModelScope
|
||||||
|
|
||||||
init {
|
init {
|
||||||
securityLevel.value = ChatRoomSecurityLevel.ClearText
|
securityLevel.value = ChatRoomSecurityLevel.ClearText
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
package org.linphone.contact
|
package org.linphone.contact
|
||||||
|
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import org.linphone.LinphoneApplication.Companion.coreContext
|
import org.linphone.LinphoneApplication.Companion.coreContext
|
||||||
import org.linphone.core.*
|
import org.linphone.core.*
|
||||||
import org.linphone.utils.LinphoneUtils
|
import org.linphone.utils.LinphoneUtils
|
||||||
|
@ -28,6 +29,7 @@ class ContactSelectionData(private val searchResult: SearchResult) : ContactData
|
||||||
override val contact: MutableLiveData<Friend> = MutableLiveData<Friend>()
|
override val contact: MutableLiveData<Friend> = MutableLiveData<Friend>()
|
||||||
override val displayName: MutableLiveData<String> = MutableLiveData<String>()
|
override val displayName: MutableLiveData<String> = MutableLiveData<String>()
|
||||||
override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
|
override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
|
||||||
|
override val coroutineScope: CoroutineScope = coreContext.coroutineScope
|
||||||
|
|
||||||
val isDisabled: MutableLiveData<Boolean> by lazy {
|
val isDisabled: MutableLiveData<Boolean> by lazy {
|
||||||
MutableLiveData<Boolean>()
|
MutableLiveData<Boolean>()
|
||||||
|
|
|
@ -118,8 +118,9 @@ class CoreContext(
|
||||||
MutableLiveData<Event<String>>()
|
MutableLiveData<Event<String>>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val coroutineScope = CoroutineScope(Dispatchers.Main + SupervisorJob())
|
||||||
|
|
||||||
private val loggingService = Factory.instance().loggingService
|
private val loggingService = Factory.instance().loggingService
|
||||||
private val coroutineScope = CoroutineScope(Dispatchers.Main + SupervisorJob())
|
|
||||||
|
|
||||||
private var overlayX = 0f
|
private var overlayX = 0f
|
||||||
private var overlayY = 0f
|
private var overlayY = 0f
|
||||||
|
|
|
@ -42,7 +42,9 @@ import coil.request.CachePolicy
|
||||||
import coil.request.videoFrameMillis
|
import coil.request.videoFrameMillis
|
||||||
import coil.transform.CircleCropTransformation
|
import coil.transform.CircleCropTransformation
|
||||||
import com.google.android.material.switchmaterial.SwitchMaterial
|
import com.google.android.material.switchmaterial.SwitchMaterial
|
||||||
|
import kotlinx.coroutines.*
|
||||||
import org.linphone.BR
|
import org.linphone.BR
|
||||||
|
import org.linphone.LinphoneApplication.Companion.coreContext
|
||||||
import org.linphone.LinphoneApplication.Companion.corePreferences
|
import org.linphone.LinphoneApplication.Companion.corePreferences
|
||||||
import org.linphone.R
|
import org.linphone.R
|
||||||
import org.linphone.activities.GenericActivity
|
import org.linphone.activities.GenericActivity
|
||||||
|
@ -320,7 +322,7 @@ fun loadImageWithCoil(imageView: ImageView, path: String?) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadContactPictureWithCoil(
|
private suspend fun loadContactPictureWithCoil(
|
||||||
imageView: ImageView,
|
imageView: ImageView,
|
||||||
contact: ContactDataInterface?,
|
contact: ContactDataInterface?,
|
||||||
useThumbnail: Boolean,
|
useThumbnail: Boolean,
|
||||||
|
@ -329,76 +331,100 @@ private fun loadContactPictureWithCoil(
|
||||||
color: Int = 0,
|
color: Int = 0,
|
||||||
textColor: Int = 0
|
textColor: Int = 0
|
||||||
) {
|
) {
|
||||||
if (contact != null) {
|
coroutineScope {
|
||||||
val context = imageView.context
|
withContext(Dispatchers.IO) {
|
||||||
val displayName = contact.contact.value?.name ?: contact.displayName.value.orEmpty()
|
if (contact != null) {
|
||||||
val source = contact.contact.value?.getPictureUri(useThumbnail)
|
val context = imageView.context
|
||||||
imageView.load(source) {
|
val displayName = contact.contact.value?.name ?: contact.displayName.value.orEmpty()
|
||||||
transformations(CircleCropTransformation())
|
val source = contact.contact.value?.getPictureUri(useThumbnail)
|
||||||
error(
|
imageView.load(source) {
|
||||||
if (contact.showGroupChatAvatar) {
|
transformations(CircleCropTransformation())
|
||||||
val bg = AppCompatResources.getDrawable(context, R.drawable.generated_avatar_bg)
|
error(
|
||||||
imageView.background = bg
|
if (contact.showGroupChatAvatar) {
|
||||||
AppCompatResources.getDrawable(context, R.drawable.icon_multiple_contacts_avatar)
|
val bg = AppCompatResources.getDrawable(context, R.drawable.generated_avatar_bg)
|
||||||
} else if (displayName.isEmpty() || AppUtils.getInitials(displayName) == "+") {
|
imageView.background = bg
|
||||||
val bg = AppCompatResources.getDrawable(context, R.drawable.generated_avatar_bg)
|
AppCompatResources.getDrawable(context, R.drawable.icon_multiple_contacts_avatar)
|
||||||
imageView.background = bg
|
} else if (displayName.isEmpty() || AppUtils.getInitials(displayName) == "+") {
|
||||||
AppCompatResources.getDrawable(context, R.drawable.icon_single_contact_avatar)
|
val bg = AppCompatResources.getDrawable(context, R.drawable.generated_avatar_bg)
|
||||||
} else {
|
imageView.background = bg
|
||||||
val builder = ContactAvatarGenerator(context)
|
AppCompatResources.getDrawable(context, R.drawable.icon_single_contact_avatar)
|
||||||
builder.setLabel(displayName)
|
} else {
|
||||||
if (size > 0) {
|
val builder = ContactAvatarGenerator(context)
|
||||||
builder.setAvatarSize(AppUtils.getDimension(size).toInt())
|
builder.setLabel(displayName)
|
||||||
}
|
if (size > 0) {
|
||||||
if (textSize > 0) {
|
builder.setAvatarSize(AppUtils.getDimension(size).toInt())
|
||||||
builder.setTextSize(AppUtils.getDimension(textSize))
|
}
|
||||||
}
|
if (textSize > 0) {
|
||||||
if (color > 0) {
|
builder.setTextSize(AppUtils.getDimension(textSize))
|
||||||
builder.setBackgroundColorAttribute(color)
|
}
|
||||||
}
|
if (color > 0) {
|
||||||
if (textColor > 0) {
|
builder.setBackgroundColorAttribute(color)
|
||||||
builder.setTextColorResource(textColor)
|
}
|
||||||
}
|
if (textColor > 0) {
|
||||||
builder.build()
|
builder.setTextColorResource(textColor)
|
||||||
|
}
|
||||||
|
builder.build()
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
)
|
} else {
|
||||||
|
val bg = AppCompatResources.getDrawable(imageView.context, R.drawable.generated_avatar_bg)
|
||||||
|
imageView.background = bg
|
||||||
|
imageView.load(R.drawable.icon_single_contact_avatar)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
val bg = AppCompatResources.getDrawable(imageView.context, R.drawable.generated_avatar_bg)
|
|
||||||
imageView.background = bg
|
|
||||||
imageView.load(R.drawable.icon_single_contact_avatar)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@BindingAdapter("coilContact")
|
@BindingAdapter("coilContact")
|
||||||
fun loadContactPictureWithCoil(imageView: ImageView, contact: ContactDataInterface?) {
|
fun loadContactPictureWithCoil(imageView: ImageView, contact: ContactDataInterface?) {
|
||||||
loadContactPictureWithCoil(imageView, contact, true)
|
val coroutineScope = contact?.coroutineScope ?: coreContext.coroutineScope
|
||||||
|
coroutineScope.launch {
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
loadContactPictureWithCoil(imageView, contact, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@BindingAdapter("coilContactBig")
|
@BindingAdapter("coilContactBig")
|
||||||
fun loadBigContactPictureWithCoil(imageView: ImageView, contact: ContactDataInterface?) {
|
fun loadBigContactPictureWithCoil(imageView: ImageView, contact: ContactDataInterface?) {
|
||||||
loadContactPictureWithCoil(
|
val coroutineScope = contact?.coroutineScope ?: coreContext.coroutineScope
|
||||||
imageView, contact, false,
|
coroutineScope.launch {
|
||||||
R.dimen.contact_avatar_big_size, R.dimen.contact_avatar_text_big_size
|
withContext(Dispatchers.Main) {
|
||||||
)
|
loadContactPictureWithCoil(
|
||||||
|
imageView, contact, false,
|
||||||
|
R.dimen.contact_avatar_big_size, R.dimen.contact_avatar_text_big_size
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@BindingAdapter("coilVoipContactAlt")
|
@BindingAdapter("coilVoipContactAlt")
|
||||||
fun loadVoipContactPictureWithCoilAlt(imageView: ImageView, contact: ContactDataInterface?) {
|
fun loadVoipContactPictureWithCoilAlt(imageView: ImageView, contact: ContactDataInterface?) {
|
||||||
loadContactPictureWithCoil(
|
val coroutineScope = contact?.coroutineScope ?: coreContext.coroutineScope
|
||||||
imageView, contact, false,
|
coroutineScope.launch {
|
||||||
R.dimen.voip_contact_avatar_max_size, R.dimen.voip_contact_avatar_text_size,
|
withContext(Dispatchers.Main) {
|
||||||
R.attr.voipParticipantBackgroundColor, R.color.white_color
|
loadContactPictureWithCoil(
|
||||||
)
|
imageView, contact, false,
|
||||||
|
R.dimen.voip_contact_avatar_max_size, R.dimen.voip_contact_avatar_text_size,
|
||||||
|
R.attr.voipParticipantBackgroundColor, R.color.white_color
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@BindingAdapter("coilVoipContact")
|
@BindingAdapter("coilVoipContact")
|
||||||
fun loadVoipContactPictureWithCoil(imageView: ImageView, contact: ContactDataInterface?) {
|
fun loadVoipContactPictureWithCoil(imageView: ImageView, contact: ContactDataInterface?) {
|
||||||
loadContactPictureWithCoil(
|
val coroutineScope = contact?.coroutineScope ?: coreContext.coroutineScope
|
||||||
imageView, contact, false,
|
coroutineScope.launch {
|
||||||
R.dimen.voip_contact_avatar_max_size, R.dimen.voip_contact_avatar_text_size,
|
withContext(Dispatchers.Main) {
|
||||||
R.attr.voipBackgroundColor, R.color.white_color
|
loadContactPictureWithCoil(
|
||||||
)
|
imageView, contact, false,
|
||||||
|
R.dimen.voip_contact_avatar_max_size, R.dimen.voip_contact_avatar_text_size,
|
||||||
|
R.attr.voipBackgroundColor, R.color.white_color
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@BindingAdapter("coilGoneIfError")
|
@BindingAdapter("coilGoneIfError")
|
||||||
|
|
Loading…
Reference in a new issue