Improve image loading

This commit is contained in:
Mario Danic 2019-12-30 13:56:39 +01:00
parent d19a3782ae
commit 5e1dc2f454
No known key found for this signature in database
GPG Key ID: CDE0BBD2738C4CC0
9 changed files with 47 additions and 43 deletions

View File

@ -294,9 +294,10 @@ dependencies {
implementation 'com.github.wooplr:Spotlight:1.3' implementation 'com.github.wooplr:Spotlight:1.3'
implementation'com.github.mario:chatkit:d32a7372bb' implementation'com.github.mario:chatkit:d32a7372bb'
implementation "io.coil-kt:coil:${coil_version}" /*implementation "io.coil-kt:coil:${coil_version}"
implementation "io.coil-kt:coil-gif:${coil_version}" implementation "io.coil-kt:coil-gif:${coil_version}"
implementation "io.coil-kt:coil-svg:${coil_version}" implementation "io.coil-kt:coil-svg:${coil_version}"*/
implementation 'com.github.coil-kt:coil:9769e11f19'
implementation 'com.github.natario1:Autocomplete:v1.1.0' implementation 'com.github.natario1:Autocomplete:v1.1.0'

View File

@ -42,7 +42,8 @@ import eu.davidea.flexibleadapter.items.IFilterable
import eu.davidea.flexibleadapter.items.IFlexible import eu.davidea.flexibleadapter.items.IFlexible
import eu.davidea.flexibleadapter.utils.FlexibleUtils import eu.davidea.flexibleadapter.utils.FlexibleUtils
import eu.davidea.viewholders.FlexibleViewHolder import eu.davidea.viewholders.FlexibleViewHolder
import kotlinx.android.synthetic.main.rv_item_conversation_with_last_message.view.* import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.rv_item_conversation_with_last_message.*
import java.util.* import java.util.*
import java.util.regex.Pattern import java.util.regex.Pattern
@ -101,57 +102,57 @@ class ConversationItem(
val appContext = NextcloudTalkApplication.sharedApplication!!.applicationContext val appContext = NextcloudTalkApplication.sharedApplication!!.applicationContext
if (model.changing) { if (model.changing) {
holder.itemView.actionProgressBar!!.visibility = View.VISIBLE holder.actionProgressBar!!.visibility = View.VISIBLE
} else { } else {
holder.itemView.actionProgressBar!!.visibility = View.GONE holder.actionProgressBar!!.visibility = View.GONE
} }
if (adapter.hasFilter()) { if (adapter.hasFilter()) {
FlexibleUtils.highlightText( FlexibleUtils.highlightText(
holder.itemView.dialogName!!, model.displayName, holder.dialogName!!, model.displayName,
adapter.getFilter(String::class.java).toString(), adapter.getFilter(String::class.java).toString(),
NextcloudTalkApplication.sharedApplication!! NextcloudTalkApplication.sharedApplication!!
.resources.getColor(R.color.colorPrimary) .resources.getColor(R.color.colorPrimary)
) )
} else { } else {
holder.itemView.dialogName!!.text = model.displayName holder.dialogName!!.text = model.displayName
} }
if (model.unreadMessages > 0) { if (model.unreadMessages > 0) {
holder.itemView.dialogUnreadBubble!!.visibility = View.VISIBLE holder.dialogUnreadBubble!!.visibility = View.VISIBLE
if (model.unreadMessages < 100) { if (model.unreadMessages < 100) {
holder.itemView.dialogUnreadBubble!!.text = model.unreadMessages.toLong() holder.dialogUnreadBubble!!.text = model.unreadMessages.toLong()
.toString() .toString()
} else { } else {
holder.itemView.dialogUnreadBubble!!.text = context.getString(R.string.nc_99_plus) holder.dialogUnreadBubble!!.text = context.getString(R.string.nc_99_plus)
} }
if (model.unreadMention) { if (model.unreadMention) {
holder.itemView.dialogUnreadBubble!!.background = holder.dialogUnreadBubble!!.background =
context.getDrawable(R.drawable.bubble_circle_unread_mention) context.getDrawable(R.drawable.bubble_circle_unread_mention)
} else { } else {
holder.itemView.dialogUnreadBubble!!.background = holder.dialogUnreadBubble!!.background =
context.getDrawable(R.drawable.bubble_circle_unread) context.getDrawable(R.drawable.bubble_circle_unread)
} }
} else { } else {
holder.itemView.dialogUnreadBubble!!.visibility = View.GONE holder.dialogUnreadBubble!!.visibility = View.GONE
} }
if (model.hasPassword) { if (model.hasPassword) {
holder.itemView.passwordProtectedRoomImageView!!.visibility = View.VISIBLE holder.passwordProtectedRoomImageView!!.visibility = View.VISIBLE
} else { } else {
holder.itemView.passwordProtectedRoomImageView!!.visibility = View.GONE holder.passwordProtectedRoomImageView!!.visibility = View.GONE
} }
if (model.favorite) { if (model.favorite) {
holder.itemView.favoriteConversationImageView!!.visibility = View.VISIBLE holder.favoriteConversationImageView!!.visibility = View.VISIBLE
} else { } else {
holder.itemView.favoriteConversationImageView!!.visibility = View.GONE holder.favoriteConversationImageView!!.visibility = View.GONE
} }
if (model.lastMessage != null) { if (model.lastMessage != null) {
holder.itemView.dialogDate!!.visibility = View.VISIBLE holder.dialogDate!!.visibility = View.VISIBLE
holder.itemView.dialogDate!!.text = DateUtils.getRelativeTimeSpanString( holder.dialogDate!!.text = DateUtils.getRelativeTimeSpanString(
model.lastActivity * 1000L, model.lastActivity * 1000L,
System.currentTimeMillis(), 0, DateUtils.FORMAT_ABBREV_RELATIVE System.currentTimeMillis(), 0, DateUtils.FORMAT_ABBREV_RELATIVE
) )
@ -160,7 +161,7 @@ class ConversationItem(
model.lastMessage!!.systemMessage model.lastMessage!!.systemMessage
) || Conversation.ConversationType.SYSTEM_CONVERSATION == model.type ) || Conversation.ConversationType.SYSTEM_CONVERSATION == model.type
) { ) {
holder.itemView.dialogLastMessage!!.text = model.lastMessage!!.text holder.dialogLastMessage!!.text = model.lastMessage!!.text
} else { } else {
var authorDisplayName = "" var authorDisplayName = ""
model.lastMessage!!.activeUser = user model.lastMessage!!.activeUser = user
@ -191,20 +192,18 @@ class ConversationItem(
text = model.lastMessage!!.lastMessageDisplayText text = model.lastMessage!!.lastMessageDisplayText
} }
holder.itemView.dialogLastMessage.text = text holder.dialogLastMessage.text = text
} }
} else { } else {
holder.itemView.dialogDate.visibility = View.GONE holder.dialogDate.visibility = View.GONE
holder.itemView.dialogLastMessage.setText(R.string.nc_no_messages_yet) holder.dialogLastMessage.setText(R.string.nc_no_messages_yet)
} }
holder.itemView.dialogAvatar.visibility = View.VISIBLE
val conversationDrawable: Drawable? = Images().getImageForConversation(context, model) val conversationDrawable: Drawable? = Images().getImageForConversation(context, model)
if (conversationDrawable != null) { if (conversationDrawable != null) {
holder.itemView.dialogAvatar.load(conversationDrawable) holder.dialogAvatar.load(conversationDrawable)
} else { } else {
holder.itemView.dialogAvatar.load( holder.dialogAvatar.load(
ApiUtils.getUrlForAvatarWithName( ApiUtils.getUrlForAvatarWithName(
user.baseUrl, user.baseUrl,
model.name, R.dimen.avatar_size model.name, R.dimen.avatar_size
@ -227,5 +226,8 @@ class ConversationItem(
class ConversationItemViewHolder( class ConversationItemViewHolder(
view: View, view: View,
adapter: FlexibleAdapter<*> adapter: FlexibleAdapter<*>
) : FlexibleViewHolder(view, adapter) ) : FlexibleViewHolder(view, adapter), LayoutContainer {
override val containerView: View?
get() = itemView
}
} }

View File

@ -203,7 +203,7 @@ class MagicPreviewMessageViewHolder(itemView: View?) : IncomingImageMessageViewH
override fun getPayloadForImageLoader(message: ChatMessage): Any { override fun getPayloadForImageLoader(message: ChatMessage): Any {
val map = HashMap<String, Any>() val map = HashMap<String, Any>()
if (message.getSelectedIndividualHashMap().containsKey("mimetype")) { if (message.getSelectedIndividualHashMap().containsKey("mimetype")) {
map.put("mimetype", message.getSelectedIndividualHashMap().get("mimetype")!!) map["mimetype"] = message.getSelectedIndividualHashMap().get("mimetype")!!
} }
return ImageLoaderPayload(map) return ImageLoaderPayload(map)

View File

@ -44,6 +44,7 @@ import butterknife.OnClick
import coil.api.load import coil.api.load
import coil.bitmappool.BitmapPool import coil.bitmappool.BitmapPool
import coil.drawable.CrossfadeDrawable import coil.drawable.CrossfadeDrawable
import coil.size.OriginalSize
import coil.transform.BlurTransformation import coil.transform.BlurTransformation
import coil.transform.CircleCropTransformation import coil.transform.CircleCropTransformation
import com.bluelinelabs.conductor.RouterTransaction import com.bluelinelabs.conductor.RouterTransaction
@ -413,7 +414,7 @@ class CallNotificationController(private val originalBundle: Bundle) : BaseContr
if (activity != null) { if (activity != null) {
val newBitmap = BlurTransformation(activity!!, 5f).transform( val newBitmap = BlurTransformation(activity!!, 5f).transform(
BitmapPool(10000000), bitmapFromImageView BitmapPool(10000000), bitmapFromImageView, OriginalSize
) )
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
backgroundImageView!!.setImageBitmap(newBitmap) backgroundImageView!!.setImageBitmap(newBitmap)

View File

@ -363,6 +363,7 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter
adapter = MessagesListAdapter( adapter = MessagesListAdapter(
conversationUser?.userId, messageHolders, ImageLoader { imageView, url, payload -> conversationUser?.userId, messageHolders, ImageLoader { imageView, url, payload ->
imageView.load(url) { imageView.load(url) {
if (conversationUser != null && url!!.startsWith(conversationUser.baseUrl) && (url.contains( if (conversationUser != null && url!!.startsWith(conversationUser.baseUrl) && (url.contains(
"index.php/core/preview?fileId=") || url.contains("/avatar/"))) { "index.php/core/preview?fileId=") || url.contains("/avatar/"))) {
@ -373,14 +374,11 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter
transformations(CircleCropTransformation()) transformations(CircleCropTransformation())
} else { } else {
if (payload is ImageLoaderPayload) { if (payload is ImageLoaderPayload) {
payload.map?.let { payload.map?.get("mimetype")?.let {
if (payload.map.containsKey("mimetype")) { val mimeTypeDrawableResource = getDrawableResourceIdForMimeType(it as String)
placeholder( val drawable = context.getDrawable(mimeTypeDrawableResource)
getDrawableResourceIdForMimeType( placeholder(drawable)
payload.map.get("mimetype") as String? error(drawable)
)
)
}
} }
} }
} }

View File

@ -54,6 +54,7 @@ import androidx.emoji.text.EmojiCompat
import coil.Coil import coil.Coil
import coil.api.load import coil.api.load
import coil.bitmappool.BitmapPool import coil.bitmappool.BitmapPool
import coil.size.OriginalSize
import coil.target.Target import coil.target.Target
import coil.transform.CircleCropTransformation import coil.transform.CircleCropTransformation
import com.google.android.material.chip.ChipDrawable import com.google.android.material.chip.ChipDrawable
@ -99,7 +100,7 @@ object DisplayUtils {
fun getRoundedDrawable(drawable: Drawable?): Drawable { fun getRoundedDrawable(drawable: Drawable?): Drawable {
val bitmap = getBitmap(drawable!!) val bitmap = getBitmap(drawable!!)
val drawable = runBlocking { val drawable = runBlocking {
return@runBlocking BitmapDrawable(CircleCropTransformation().transform(BitmapPool(10000), bitmap)) return@runBlocking BitmapDrawable(CircleCropTransformation().transform(BitmapPool(10000), bitmap, OriginalSize))
} }
return drawable return drawable

View File

@ -46,7 +46,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:scaleType="centerInside" android:scaleType="fitCenter"
app:layout_flexGrow="1" app:layout_flexGrow="1"
app:layout_wrapBefore="true" app:layout_wrapBefore="true"
app:layout_alignSelf="flex_start" app:layout_alignSelf="flex_start"

View File

@ -45,7 +45,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:scaleType="centerInside" android:scaleType="fitCenter"
app:layout_flexGrow="1" app:layout_flexGrow="1"
app:layout_wrapBefore="true" app:layout_wrapBefore="true"
app:layout_alignSelf="flex_start" app:layout_alignSelf="flex_start"

View File

@ -4,7 +4,8 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/quotedChatMessageView" android:id="@+id/quotedChatMessageView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:layout_marginBottom="8dp">
<View <View
android:id="@+id/quoteColoredView" android:id="@+id/quoteColoredView"
@ -54,7 +55,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:scaleType="centerInside" android:scaleType="fitCenter"
app:layout_alignSelf="flex_start" app:layout_alignSelf="flex_start"
app:layout_flexGrow="1" app:layout_flexGrow="1"
app:layout_wrapBefore="true" app:layout_wrapBefore="true"