Using IO dispatcher to create generated avatar

This commit is contained in:
Sylvain Berfini 2022-06-09 15:24:43 +02:00
parent 5fac97b55d
commit e6c842cd35
7 changed files with 97 additions and 53 deletions

View file

@ -27,6 +27,8 @@ import android.view.animation.LinearInterpolator
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.CoroutineScope
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R
@ -53,6 +55,7 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf
override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
override val showGroupChatAvatar: Boolean = chatRoom.hasCapability(ChatRoomCapabilities.Conference.toInt()) &&
!chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())
override val coroutineScope: CoroutineScope = viewModelScope
val subject = MutableLiveData<String>()

View file

@ -25,8 +25,10 @@ import android.media.ExifInterface
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import java.io.ByteArrayOutputStream
import java.io.IOException
import kotlinx.coroutines.CoroutineScope
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
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 displayName: MutableLiveData<String> = MutableLiveData<String>()
override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
override val coroutineScope: CoroutineScope = viewModelScope
val firstName = MutableLiveData<String>()

View file

@ -24,6 +24,8 @@ import android.provider.ContactsContract
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.CoroutineScope
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
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 displayName: MutableLiveData<String> = MutableLiveData<String>()
override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
override val coroutineScope: CoroutineScope = viewModelScope
var fullName = ""

View file

@ -20,6 +20,8 @@
package org.linphone.contact
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.CoroutineScope
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.activities.main.viewmodels.MessageNotifierViewModel
import org.linphone.core.Address
@ -36,12 +38,15 @@ interface ContactDataInterface {
val showGroupChatAvatar: Boolean
get() = false
val coroutineScope: CoroutineScope
}
open class GenericContactData(private val sipAddress: Address) : ContactDataInterface {
final override val contact: MutableLiveData<Friend> = MutableLiveData<Friend>()
final override val displayName: MutableLiveData<String> = MutableLiveData<String>()
final override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
final override val coroutineScope: CoroutineScope = coreContext.coroutineScope
init {
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 displayName: MutableLiveData<String> = MutableLiveData<String>()
final override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
final override val coroutineScope: CoroutineScope = viewModelScope
init {
securityLevel.value = ChatRoomSecurityLevel.ClearText

View file

@ -20,6 +20,7 @@
package org.linphone.contact
import androidx.lifecycle.MutableLiveData
import kotlinx.coroutines.CoroutineScope
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.core.*
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 displayName: MutableLiveData<String> = MutableLiveData<String>()
override val securityLevel: MutableLiveData<ChatRoomSecurityLevel> = MutableLiveData<ChatRoomSecurityLevel>()
override val coroutineScope: CoroutineScope = coreContext.coroutineScope
val isDisabled: MutableLiveData<Boolean> by lazy {
MutableLiveData<Boolean>()

View file

@ -118,8 +118,9 @@ class CoreContext(
MutableLiveData<Event<String>>()
}
val coroutineScope = CoroutineScope(Dispatchers.Main + SupervisorJob())
private val loggingService = Factory.instance().loggingService
private val coroutineScope = CoroutineScope(Dispatchers.Main + SupervisorJob())
private var overlayX = 0f
private var overlayY = 0f

View file

@ -42,7 +42,9 @@ import coil.request.CachePolicy
import coil.request.videoFrameMillis
import coil.transform.CircleCropTransformation
import com.google.android.material.switchmaterial.SwitchMaterial
import kotlinx.coroutines.*
import org.linphone.BR
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R
import org.linphone.activities.GenericActivity
@ -320,7 +322,7 @@ fun loadImageWithCoil(imageView: ImageView, path: String?) {
}
}
private fun loadContactPictureWithCoil(
private suspend fun loadContactPictureWithCoil(
imageView: ImageView,
contact: ContactDataInterface?,
useThumbnail: Boolean,
@ -329,6 +331,8 @@ private fun loadContactPictureWithCoil(
color: Int = 0,
textColor: Int = 0
) {
coroutineScope {
withContext(Dispatchers.IO) {
if (contact != null) {
val context = imageView.context
val displayName = contact.contact.value?.name ?: contact.displayName.value.orEmpty()
@ -369,37 +373,59 @@ private fun loadContactPictureWithCoil(
imageView.load(R.drawable.icon_single_contact_avatar)
}
}
}
}
@BindingAdapter("coilContact")
fun loadContactPictureWithCoil(imageView: ImageView, contact: ContactDataInterface?) {
val coroutineScope = contact?.coroutineScope ?: coreContext.coroutineScope
coroutineScope.launch {
withContext(Dispatchers.Main) {
loadContactPictureWithCoil(imageView, contact, true)
}
}
}
@BindingAdapter("coilContactBig")
fun loadBigContactPictureWithCoil(imageView: ImageView, contact: ContactDataInterface?) {
val coroutineScope = contact?.coroutineScope ?: coreContext.coroutineScope
coroutineScope.launch {
withContext(Dispatchers.Main) {
loadContactPictureWithCoil(
imageView, contact, false,
R.dimen.contact_avatar_big_size, R.dimen.contact_avatar_text_big_size
)
}
}
}
@BindingAdapter("coilVoipContactAlt")
fun loadVoipContactPictureWithCoilAlt(imageView: ImageView, contact: ContactDataInterface?) {
val coroutineScope = contact?.coroutineScope ?: coreContext.coroutineScope
coroutineScope.launch {
withContext(Dispatchers.Main) {
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")
fun loadVoipContactPictureWithCoil(imageView: ImageView, contact: ContactDataInterface?) {
val coroutineScope = contact?.coroutineScope ?: coreContext.coroutineScope
coroutineScope.launch {
withContext(Dispatchers.Main) {
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")
fun loadAvatarWithCoil(imageView: ImageView, path: String?) {