add grey avatar with first letter of email-guest

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This commit is contained in:
Marcel Hibbe 2024-11-21 12:57:09 +01:00
parent cb3614da34
commit c75cf2fe20
No known key found for this signature in database
GPG key ID: C793F8B59F43CE7B
2 changed files with 53 additions and 2 deletions

View file

@ -24,7 +24,7 @@ import com.nextcloud.talk.databinding.RvItemConversationInfoParticipantBinding
import com.nextcloud.talk.extensions.loadDefaultAvatar import com.nextcloud.talk.extensions.loadDefaultAvatar
import com.nextcloud.talk.extensions.loadDefaultGroupCallAvatar import com.nextcloud.talk.extensions.loadDefaultGroupCallAvatar
import com.nextcloud.talk.extensions.loadFederatedUserAvatar import com.nextcloud.talk.extensions.loadFederatedUserAvatar
import com.nextcloud.talk.extensions.loadGuestAvatar import com.nextcloud.talk.extensions.loadFirstLetterAvatar
import com.nextcloud.talk.extensions.loadUserAvatar import com.nextcloud.talk.extensions.loadUserAvatar
import com.nextcloud.talk.models.domain.ConversationModel import com.nextcloud.talk.models.domain.ConversationModel
import com.nextcloud.talk.models.json.participants.Participant import com.nextcloud.talk.models.json.participants.Participant
@ -214,7 +214,9 @@ class ParticipantItem(
if (model.displayName.isNullOrEmpty()) { if (model.displayName.isNullOrEmpty()) {
holder.binding.avatarView.loadDefaultAvatar(viewThemeUtils) holder.binding.avatarView.loadDefaultAvatar(viewThemeUtils)
} else { } else {
holder.binding.avatarView.loadGuestAvatar(user, model.displayName!!, false) holder.binding.avatarView.loadFirstLetterAvatar(
model.displayName!!.first().toString()
)
} }
} }

View file

@ -10,12 +10,19 @@
package com.nextcloud.talk.extensions package com.nextcloud.talk.extensions
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.graphics.drawable.LayerDrawable import android.graphics.drawable.LayerDrawable
import android.util.Log import android.util.Log
import android.widget.ImageView import android.widget.ImageView
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.res.ResourcesCompat
import coil.annotation.ExperimentalCoilApi import coil.annotation.ExperimentalCoilApi
import coil.imageLoader import coil.imageLoader
import coil.load import coil.load
@ -35,6 +42,7 @@ import com.nextcloud.talk.ui.theme.ViewThemeUtils
import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.ApiUtils
import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.DisplayUtils
import com.nextcloud.talk.utils.TextDrawable import com.nextcloud.talk.utils.TextDrawable
import java.util.Locale
private const val ROUNDING_PIXEL = 16f private const val ROUNDING_PIXEL = 16f
private const val TAG = "ImageViewExtensions" private const val TAG = "ImageViewExtensions"
@ -297,6 +305,21 @@ fun ImageView.loadNoteToSelfAvatar(): io.reactivex.disposables.Disposable {
) )
} }
fun ImageView.loadFirstLetterAvatar(letter: String): io.reactivex.disposables.Disposable {
val layers = arrayOfNulls<Drawable>(2)
layers[0] = ContextCompat.getDrawable(context, R.drawable.ic_launcher_background)
layers[1] = createTextDrawable(context, letter.uppercase(Locale.ROOT))
val layerDrawable = LayerDrawable(layers)
val data: Any = layerDrawable
return DisposableWrapper(
load(data) {
transformations(CircleCropTransformation())
}
)
}
fun ImageView.loadChangelogBotAvatar(): io.reactivex.disposables.Disposable { fun ImageView.loadChangelogBotAvatar(): io.reactivex.disposables.Disposable {
return loadSystemAvatar() return loadSystemAvatar()
} }
@ -355,6 +378,32 @@ fun ImageView.loadGuestAvatar(baseUrl: String, name: String, big: Boolean): io.r
) )
} }
@Suppress("MagicNumber")
private fun createTextDrawable(context: Context, letter: String): Drawable {
val size = 100
val bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
val paint = Paint().apply {
color = ResourcesCompat.getColor(context.resources, R.color.grey_600, null)
style = Paint.Style.FILL
}
canvas.drawRect(0f, 0f, size.toFloat(), size.toFloat(), paint)
val textPaint = Paint().apply {
color = Color.WHITE
textSize = size / 2f
isAntiAlias = true
textAlign = Paint.Align.CENTER
}
val xPos = size / 2f
val yPos = (canvas.height / 2 - (textPaint.descent() + textPaint.ascent()) / 2)
canvas.drawText(letter.take(1), xPos, yPos, textPaint)
return BitmapDrawable(context.resources, bitmap)
}
private class DisposableWrapper(private val disposable: coil.request.Disposable) : io.reactivex.disposables private class DisposableWrapper(private val disposable: coil.request.Disposable) : io.reactivex.disposables
.Disposable { .Disposable {