From 5e1dc2f454e1c6b77c4c82d86f548fdf98ae52c6 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Mon, 30 Dec 2019 13:56:39 +0100 Subject: [PATCH] Improve image loading --- app/build.gradle | 5 +- .../talk/adapters/items/ConversationItem.kt | 54 ++++++++++--------- .../messages/MagicPreviewMessageViewHolder.kt | 2 +- .../controllers/CallNotificationController.kt | 3 +- .../talk/controllers/ChatController.kt | 14 +++-- .../com/nextcloud/talk/utils/DisplayUtils.kt | 3 +- .../item_custom_incoming_preview_message.xml | 2 +- .../item_custom_outcoming_preview_message.xml | 2 +- .../main/res/layout/item_message_quote.xml | 5 +- 9 files changed, 47 insertions(+), 43 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d34558135..2b3358167 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -294,9 +294,10 @@ dependencies { implementation 'com.github.wooplr:Spotlight:1.3' 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-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' diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt index 89e54d3f2..6720fe538 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt @@ -42,7 +42,8 @@ import eu.davidea.flexibleadapter.items.IFilterable import eu.davidea.flexibleadapter.items.IFlexible import eu.davidea.flexibleadapter.utils.FlexibleUtils 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.regex.Pattern @@ -101,57 +102,57 @@ class ConversationItem( val appContext = NextcloudTalkApplication.sharedApplication!!.applicationContext if (model.changing) { - holder.itemView.actionProgressBar!!.visibility = View.VISIBLE + holder.actionProgressBar!!.visibility = View.VISIBLE } else { - holder.itemView.actionProgressBar!!.visibility = View.GONE + holder.actionProgressBar!!.visibility = View.GONE } if (adapter.hasFilter()) { FlexibleUtils.highlightText( - holder.itemView.dialogName!!, model.displayName, + holder.dialogName!!, model.displayName, adapter.getFilter(String::class.java).toString(), NextcloudTalkApplication.sharedApplication!! .resources.getColor(R.color.colorPrimary) ) } else { - holder.itemView.dialogName!!.text = model.displayName + holder.dialogName!!.text = model.displayName } if (model.unreadMessages > 0) { - holder.itemView.dialogUnreadBubble!!.visibility = View.VISIBLE + holder.dialogUnreadBubble!!.visibility = View.VISIBLE if (model.unreadMessages < 100) { - holder.itemView.dialogUnreadBubble!!.text = model.unreadMessages.toLong() + holder.dialogUnreadBubble!!.text = model.unreadMessages.toLong() .toString() } 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) { - holder.itemView.dialogUnreadBubble!!.background = + holder.dialogUnreadBubble!!.background = context.getDrawable(R.drawable.bubble_circle_unread_mention) } else { - holder.itemView.dialogUnreadBubble!!.background = + holder.dialogUnreadBubble!!.background = context.getDrawable(R.drawable.bubble_circle_unread) } } else { - holder.itemView.dialogUnreadBubble!!.visibility = View.GONE + holder.dialogUnreadBubble!!.visibility = View.GONE } if (model.hasPassword) { - holder.itemView.passwordProtectedRoomImageView!!.visibility = View.VISIBLE + holder.passwordProtectedRoomImageView!!.visibility = View.VISIBLE } else { - holder.itemView.passwordProtectedRoomImageView!!.visibility = View.GONE + holder.passwordProtectedRoomImageView!!.visibility = View.GONE } if (model.favorite) { - holder.itemView.favoriteConversationImageView!!.visibility = View.VISIBLE + holder.favoriteConversationImageView!!.visibility = View.VISIBLE } else { - holder.itemView.favoriteConversationImageView!!.visibility = View.GONE + holder.favoriteConversationImageView!!.visibility = View.GONE } if (model.lastMessage != null) { - holder.itemView.dialogDate!!.visibility = View.VISIBLE - holder.itemView.dialogDate!!.text = DateUtils.getRelativeTimeSpanString( + holder.dialogDate!!.visibility = View.VISIBLE + holder.dialogDate!!.text = DateUtils.getRelativeTimeSpanString( model.lastActivity * 1000L, System.currentTimeMillis(), 0, DateUtils.FORMAT_ABBREV_RELATIVE ) @@ -160,7 +161,7 @@ class ConversationItem( model.lastMessage!!.systemMessage ) || Conversation.ConversationType.SYSTEM_CONVERSATION == model.type ) { - holder.itemView.dialogLastMessage!!.text = model.lastMessage!!.text + holder.dialogLastMessage!!.text = model.lastMessage!!.text } else { var authorDisplayName = "" model.lastMessage!!.activeUser = user @@ -191,20 +192,18 @@ class ConversationItem( text = model.lastMessage!!.lastMessageDisplayText } - holder.itemView.dialogLastMessage.text = text + holder.dialogLastMessage.text = text } } else { - holder.itemView.dialogDate.visibility = View.GONE - holder.itemView.dialogLastMessage.setText(R.string.nc_no_messages_yet) + holder.dialogDate.visibility = View.GONE + holder.dialogLastMessage.setText(R.string.nc_no_messages_yet) } - holder.itemView.dialogAvatar.visibility = View.VISIBLE - val conversationDrawable: Drawable? = Images().getImageForConversation(context, model) if (conversationDrawable != null) { - holder.itemView.dialogAvatar.load(conversationDrawable) + holder.dialogAvatar.load(conversationDrawable) } else { - holder.itemView.dialogAvatar.load( + holder.dialogAvatar.load( ApiUtils.getUrlForAvatarWithName( user.baseUrl, model.name, R.dimen.avatar_size @@ -227,5 +226,8 @@ class ConversationItem( class ConversationItemViewHolder( view: View, adapter: FlexibleAdapter<*> - ) : FlexibleViewHolder(view, adapter) + ) : FlexibleViewHolder(view, adapter), LayoutContainer { + override val containerView: View? + get() = itemView + } } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.kt index 86ee05ace..c50d3f62b 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.kt @@ -203,7 +203,7 @@ class MagicPreviewMessageViewHolder(itemView: View?) : IncomingImageMessageViewH override fun getPayloadForImageLoader(message: ChatMessage): Any { val map = HashMap() if (message.getSelectedIndividualHashMap().containsKey("mimetype")) { - map.put("mimetype", message.getSelectedIndividualHashMap().get("mimetype")!!) + map["mimetype"] = message.getSelectedIndividualHashMap().get("mimetype")!! } return ImageLoaderPayload(map) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/CallNotificationController.kt b/app/src/main/java/com/nextcloud/talk/controllers/CallNotificationController.kt index 551dc50d9..f299d6b20 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallNotificationController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/CallNotificationController.kt @@ -44,6 +44,7 @@ import butterknife.OnClick import coil.api.load import coil.bitmappool.BitmapPool import coil.drawable.CrossfadeDrawable +import coil.size.OriginalSize import coil.transform.BlurTransformation import coil.transform.CircleCropTransformation import com.bluelinelabs.conductor.RouterTransaction @@ -413,7 +414,7 @@ class CallNotificationController(private val originalBundle: Bundle) : BaseContr if (activity != null) { val newBitmap = BlurTransformation(activity!!, 5f).transform( - BitmapPool(10000000), bitmapFromImageView + BitmapPool(10000000), bitmapFromImageView, OriginalSize ) withContext(Dispatchers.Main) { backgroundImageView!!.setImageBitmap(newBitmap) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 828bd833a..12bfc0f27 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -363,6 +363,7 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter adapter = MessagesListAdapter( conversationUser?.userId, messageHolders, ImageLoader { imageView, url, payload -> + imageView.load(url) { if (conversationUser != null && url!!.startsWith(conversationUser.baseUrl) && (url.contains( "index.php/core/preview?fileId=") || url.contains("/avatar/"))) { @@ -373,14 +374,11 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter transformations(CircleCropTransformation()) } else { if (payload is ImageLoaderPayload) { - payload.map?.let { - if (payload.map.containsKey("mimetype")) { - placeholder( - getDrawableResourceIdForMimeType( - payload.map.get("mimetype") as String? - ) - ) - } + payload.map?.get("mimetype")?.let { + val mimeTypeDrawableResource = getDrawableResourceIdForMimeType(it as String) + val drawable = context.getDrawable(mimeTypeDrawableResource) + placeholder(drawable) + error(drawable) } } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.kt index ba9310b39..d1da10466 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.kt @@ -54,6 +54,7 @@ import androidx.emoji.text.EmojiCompat import coil.Coil import coil.api.load import coil.bitmappool.BitmapPool +import coil.size.OriginalSize import coil.target.Target import coil.transform.CircleCropTransformation import com.google.android.material.chip.ChipDrawable @@ -99,7 +100,7 @@ object DisplayUtils { fun getRoundedDrawable(drawable: Drawable?): Drawable { val bitmap = getBitmap(drawable!!) val drawable = runBlocking { - return@runBlocking BitmapDrawable(CircleCropTransformation().transform(BitmapPool(10000), bitmap)) + return@runBlocking BitmapDrawable(CircleCropTransformation().transform(BitmapPool(10000), bitmap, OriginalSize)) } return drawable diff --git a/app/src/main/res/layout/item_custom_incoming_preview_message.xml b/app/src/main/res/layout/item_custom_incoming_preview_message.xml index 4595e0bc0..b3c440355 100644 --- a/app/src/main/res/layout/item_custom_incoming_preview_message.xml +++ b/app/src/main/res/layout/item_custom_incoming_preview_message.xml @@ -46,7 +46,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true" - android:scaleType="centerInside" + android:scaleType="fitCenter" app:layout_flexGrow="1" app:layout_wrapBefore="true" app:layout_alignSelf="flex_start" diff --git a/app/src/main/res/layout/item_custom_outcoming_preview_message.xml b/app/src/main/res/layout/item_custom_outcoming_preview_message.xml index bf42117cc..f73f1ec75 100644 --- a/app/src/main/res/layout/item_custom_outcoming_preview_message.xml +++ b/app/src/main/res/layout/item_custom_outcoming_preview_message.xml @@ -45,7 +45,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true" - android:scaleType="centerInside" + android:scaleType="fitCenter" app:layout_flexGrow="1" app:layout_wrapBefore="true" app:layout_alignSelf="flex_start" diff --git a/app/src/main/res/layout/item_message_quote.xml b/app/src/main/res/layout/item_message_quote.xml index d36517e6a..586a824f5 100644 --- a/app/src/main/res/layout/item_message_quote.xml +++ b/app/src/main/res/layout/item_message_quote.xml @@ -4,7 +4,8 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/quotedChatMessageView" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:layout_marginBottom="8dp">