Add some sugar for fetching conversation image

This commit is contained in:
Mario Danic 2019-12-19 20:31:01 +01:00
parent 380667040a
commit 1f6d3a1a63
No known key found for this signature in database
GPG Key ID: CDE0BBD2738C4CC0
3 changed files with 61 additions and 66 deletions

View File

@ -22,11 +22,11 @@ package com.nextcloud.talk.adapters.items
import android.content.Context import android.content.Context
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.graphics.drawable.LayerDrawable
import android.text.TextUtils import android.text.TextUtils
import android.text.format.DateUtils import android.text.format.DateUtils
import android.view.View import android.view.View
import coil.api.load import coil.api.load
import coil.request.CachePolicy
import coil.transform.CircleCropTransformation import coil.transform.CircleCropTransformation
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication
@ -35,6 +35,7 @@ import com.nextcloud.talk.models.json.conversations.Conversation
import com.nextcloud.talk.models.json.conversations.Conversation.ConversationType.ONE_TO_ONE_CONVERSATION import com.nextcloud.talk.models.json.conversations.Conversation.ConversationType.ONE_TO_ONE_CONVERSATION
import com.nextcloud.talk.newarch.local.models.UserNgEntity import com.nextcloud.talk.newarch.local.models.UserNgEntity
import com.nextcloud.talk.newarch.local.models.getCredentials import com.nextcloud.talk.newarch.local.models.getCredentials
import com.nextcloud.talk.newarch.utils.Images
import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.ApiUtils
import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
@ -199,47 +200,11 @@ class ConversationItem(
holder.itemView.dialogAvatar.visibility = View.VISIBLE holder.itemView.dialogAvatar.visibility = View.VISIBLE
var shouldLoadAvatar = true
val objectType: String? = model.objectType
if (!TextUtils.isEmpty(objectType)) {
when (objectType) {
"share:password" -> {
shouldLoadAvatar = false
holder.itemView.dialogAvatar.load(R.drawable.ic_file_password_request) {
transformations(CircleCropTransformation())
}
}
"file" -> {
shouldLoadAvatar = false
holder.itemView.dialogAvatar.load(R.drawable.ic_file_icon) {
transformations(CircleCropTransformation())
}
} val conversationDrawable: Drawable? = Images().getImageForConversation(context, model)
else -> { if (conversationDrawable != null) {
} holder.itemView.dialogAvatar.setImageDrawable(conversationDrawable)
} } else {
}
if (Conversation.ConversationType.SYSTEM_CONVERSATION == model.type) {
val layers = arrayOfNulls<Drawable>(2)
layers[0] = context.getDrawable(R.drawable.ic_launcher_background)
layers[1] = context.getDrawable(R.drawable.ic_launcher_foreground)
val layerDrawable = LayerDrawable(layers)
holder.itemView.dialogAvatar.load(layerDrawable) {
transformations(CircleCropTransformation())
}
shouldLoadAvatar = false
}
if (shouldLoadAvatar) {
when (model.type) {
ONE_TO_ONE_CONVERSATION -> if (!TextUtils.isEmpty(
model.name
)
) {
holder.itemView.dialogAvatar.load( holder.itemView.dialogAvatar.load(
ApiUtils.getUrlForAvatarWithName( ApiUtils.getUrlForAvatarWithName(
user.baseUrl, user.baseUrl,
@ -249,20 +214,6 @@ class ConversationItem(
addHeader("Authorization", user.getCredentials()) addHeader("Authorization", user.getCredentials())
transformations(CircleCropTransformation()) transformations(CircleCropTransformation())
} }
} else {
holder.itemView.dialogAvatar.visibility = View.GONE
}
Conversation.ConversationType.GROUP_CONVERSATION ->
holder.itemView.dialogAvatar.load(R.drawable.ic_people_group_white_24px) {
transformations(CircleCropTransformation())
}
Conversation.ConversationType.PUBLIC_CONVERSATION ->
holder.itemView.dialogAvatar.load(R.drawable.ic_link_white_24px) {
transformations(CircleCropTransformation())
}
else -> holder.itemView.dialogAvatar.visibility = View.GONE
}
} }
} }

View File

@ -21,13 +21,18 @@
package com.nextcloud.talk.newarch.utils package com.nextcloud.talk.newarch.utils
import android.content.Context import android.content.Context
import android.graphics.drawable.Drawable
import android.graphics.drawable.LayerDrawable
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import coil.ImageLoader import coil.ImageLoader
import coil.request.LoadRequest import coil.request.LoadRequest
import coil.target.Target import coil.target.Target
import coil.transform.Transformation import coil.transform.Transformation
import com.nextcloud.talk.R
import com.nextcloud.talk.models.json.conversations.Conversation
import com.nextcloud.talk.newarch.local.models.UserNgEntity import com.nextcloud.talk.newarch.local.models.UserNgEntity
import com.nextcloud.talk.newarch.local.models.getCredentials import com.nextcloud.talk.newarch.local.models.getCredentials
import com.nextcloud.talk.utils.DisplayUtils
class Images { class Images {
fun getRequestForUrl( fun getRequestForUrl(
@ -58,4 +63,42 @@ class Images {
} }
} }
} }
// returns null if it's one-to-one that you need to fetch yourself
fun getImageForConversation(context: Context, conversation: Conversation): Drawable? {
conversation.objectType?.let { objectType ->
when (objectType) {
"share:password" -> {
return DisplayUtils.getRoundedDrawable(context.getDrawable(R.drawable.ic_file_password_request))
}
"file" -> {
return DisplayUtils.getRoundedDrawable(context.getDrawable(R.drawable.ic_file_icon))
}
else -> {
} // do nothing
}
}
when (conversation.type) {
Conversation.ConversationType.ONE_TO_ONE_CONVERSATION -> {
return null
}
Conversation.ConversationType.GROUP_CONVERSATION -> {
return DisplayUtils.getRoundedDrawable(context.getDrawable(R.drawable.ic_people_group_white_24px))
}
Conversation.ConversationType.PUBLIC_CONVERSATION -> {
return DisplayUtils.getRoundedDrawable(context.getDrawable(R.drawable.ic_link_white_24px))
}
//Conversation.ConversationType.SYSTEM_CONVERSATION
else -> {
// we handle else as SYSTEM_CONVERSATION
val layers = arrayOfNulls<Drawable>(2)
layers[0] = context.getDrawable(R.drawable.ic_launcher_background)
layers[1] = context.getDrawable(R.drawable.ic_launcher_foreground)
return DisplayUtils.getRoundedDrawable(LayerDrawable(layers))
}
}
}
} }

View File

@ -101,21 +101,22 @@ object DisplayUtils {
} }
private fun roundImage(pool: BitmapPool, input: Bitmap): Bitmap { private fun roundImage(pool: BitmapPool, input: Bitmap): Bitmap {
val circlePaint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG) val paint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG)
val bitmapPaint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG).apply { xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN) }
val minSize = min(input.width, input.height) val minSize = min(input.width, input.height)
val radius = minSize / 2f val radius = minSize / 2f
val output = pool.get(minSize, minSize, input.config) val output = pool.get(minSize, minSize, input.config)
output.applyCanvas { output.applyCanvas {
drawCircle(radius, radius, radius, circlePaint) drawCircle(radius, radius, radius, paint)
drawBitmap(input, 0f, 0f, bitmapPaint) paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
drawBitmap(input, radius - input.width / 2, radius - input.height / 2, paint)
} }
pool.put(input) pool.put(input)
return output return output
} }
private fun getBitmap(drawable: Drawable): Bitmap { private fun getBitmap(drawable: Drawable): Bitmap {
val bitmap = Bitmap.createBitmap( val bitmap = Bitmap.createBitmap(
drawable.intrinsicWidth, drawable.intrinsicWidth,