From 11bee2e07183d39efe86112d2253686225d548fa Mon Sep 17 00:00:00 2001 From: Philippe Auriach Date: Wed, 9 Aug 2017 15:28:03 +0200 Subject: [PATCH 1/2] ability to have return a drawable for dialog / users --- .../stfalcon/chatkit/commons/ImageLoader.java | 3 ++- .../chatkit/commons/models/IDialog.java | 4 ++++ .../chatkit/commons/models/IUser.java | 8 +++++++ .../chatkit/dialogs/DialogsListAdapter.java | 24 ++++++++++++------- .../features/demo/DemoDialogsActivity.java | 8 +++++-- 5 files changed, 35 insertions(+), 12 deletions(-) diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/commons/ImageLoader.java b/chatkit/src/main/java/com/stfalcon/chatkit/commons/ImageLoader.java index 4d795854..402b48f8 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/commons/ImageLoader.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/commons/ImageLoader.java @@ -16,6 +16,7 @@ package com.stfalcon.chatkit.commons; +import android.graphics.drawable.Drawable; import android.widget.ImageView; /** @@ -23,6 +24,6 @@ */ public interface ImageLoader { - void loadImage(ImageView imageView, String url); + void loadImage(ImageView imageView, Drawable drawable, String url); } diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IDialog.java b/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IDialog.java index 661c76e8..cf6deaa7 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IDialog.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IDialog.java @@ -16,6 +16,8 @@ package com.stfalcon.chatkit.commons.models; +import android.graphics.drawable.Drawable; + import java.util.List; /** @@ -26,6 +28,8 @@ public interface IDialog { String getId(); + Drawable getDialogPhotoDrawable(); + String getDialogPhoto(); String getDialogName(); diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IUser.java b/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IUser.java index d51c2081..cff1ff94 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IUser.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IUser.java @@ -16,6 +16,8 @@ package com.stfalcon.chatkit.commons.models; +import android.graphics.drawable.Drawable; + /** * For implementing by real user model */ @@ -35,6 +37,12 @@ public interface IUser { * */ String getName(); + /** + * + * @return the user's avatar drawable + */ + Drawable getAvatarDrawable(); + /** * Returns the user's avatar image url * diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogsListAdapter.java b/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogsListAdapter.java index 9638ff7e..7659fbb0 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogsListAdapter.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogsListAdapter.java @@ -32,6 +32,7 @@ import com.stfalcon.chatkit.commons.ViewHolder; import com.stfalcon.chatkit.commons.models.IDialog; import com.stfalcon.chatkit.commons.models.IMessage; +import com.stfalcon.chatkit.commons.models.IUser; import com.stfalcon.chatkit.utils.DateFormatter; import java.lang.reflect.Constructor; @@ -297,6 +298,13 @@ public void sort(Comparator comparator) { notifyDataSetChanged(); } + /** + * @return registered image loader + */ + public ImageLoader getImageLoader() { + return imageLoader; + } + /** * Register a callback to be invoked when image need to load. * @@ -306,13 +314,6 @@ public void setImageLoader(ImageLoader imageLoader) { this.imageLoader = imageLoader; } - /** - * @return registered image loader - */ - public ImageLoader getImageLoader() { - return imageLoader; - } - /** * @return the item click callback. */ @@ -592,12 +593,17 @@ public void onBind(final DIALOG dialog) { //Set Dialog avatar if (imageLoader != null) { - imageLoader.loadImage(ivAvatar, dialog.getDialogPhoto()); + imageLoader.loadImage(ivAvatar, dialog.getDialogPhotoDrawable(), dialog.getDialogPhoto()); } //Set Last message user avatar if (imageLoader != null) { - imageLoader.loadImage(ivLastMessageUser, dialog.getLastMessage().getUser().getAvatar()); + if (dialog.getLastMessage() != null && dialog.getLastMessage().getUser() != null) { + IUser user = dialog.getLastMessage().getUser(); + imageLoader.loadImage(ivLastMessageUser, user.getAvatarDrawable(), user.getAvatar()); + } else { + imageLoader.loadImage(ivLastMessageUser, null, null); + } } ivLastMessageUser.setVisibility(dialogStyle.isDialogMessageAvatarEnabled() && dialog.getUsers().size() > 1 ? VISIBLE : GONE); diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/DemoDialogsActivity.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/DemoDialogsActivity.java index f2848ba8..14ea004e 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/DemoDialogsActivity.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/DemoDialogsActivity.java @@ -1,5 +1,6 @@ package com.stfalcon.chatkit.sample.features.demo; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; @@ -27,8 +28,11 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { imageLoader = new ImageLoader() { @Override - public void loadImage(ImageView imageView, String url) { - Picasso.with(DemoDialogsActivity.this).load(url).into(imageView); + public void loadImage(ImageView imageView, Drawable drawable, String url) { + Picasso.with(DemoDialogsActivity.this) + .load(url) + .placeholder(drawable) + .into(imageView); } }; } From 8f34e3e0b1256d700861d48b1c3b312fabb8fcfc Mon Sep 17 00:00:00 2001 From: Philippe Auriach Date: Wed, 9 Aug 2017 16:32:52 +0200 Subject: [PATCH 2/2] Added ability to get context around image loading Without breaking change : ImageLoader is now an abstract class implementing the new methods of ContextImageLoader with the values used previously : nothing change for existing implementations. However, the user is now able to override other methods of ImageLoader if he wants to have additional data for say, the user. --- .../chatkit/commons/ContextImageLoader.java | 16 +++++++++++ .../stfalcon/chatkit/commons/ImageLoader.java | 24 ++++++++++++++-- .../chatkit/commons/models/IDialog.java | 4 --- .../chatkit/commons/models/IUser.java | 8 ------ .../chatkit/dialogs/DialogsListAdapter.java | 28 ++++++++----------- .../chatkit/messages/MessageHolders.java | 6 ++-- sample/build.gradle | 2 ++ .../features/demo/DemoDialogsActivity.java | 23 +++++++++++++-- 8 files changed, 73 insertions(+), 38 deletions(-) create mode 100644 chatkit/src/main/java/com/stfalcon/chatkit/commons/ContextImageLoader.java diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/commons/ContextImageLoader.java b/chatkit/src/main/java/com/stfalcon/chatkit/commons/ContextImageLoader.java new file mode 100644 index 00000000..d3f9249f --- /dev/null +++ b/chatkit/src/main/java/com/stfalcon/chatkit/commons/ContextImageLoader.java @@ -0,0 +1,16 @@ +package com.stfalcon.chatkit.commons; + +import android.widget.ImageView; + +import com.stfalcon.chatkit.commons.models.IDialog; +import com.stfalcon.chatkit.commons.models.IUser; +import com.stfalcon.chatkit.commons.models.MessageContentType; + +public interface ContextImageLoader { + + void loadImage(ImageView imageView, IDialog dialog); + + void loadImage(ImageView imageView, IUser user); + + void loadImage(ImageView imageView, MessageContentType.Image messageContent); +} diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/commons/ImageLoader.java b/chatkit/src/main/java/com/stfalcon/chatkit/commons/ImageLoader.java index 402b48f8..073bb67f 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/commons/ImageLoader.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/commons/ImageLoader.java @@ -16,14 +16,32 @@ package com.stfalcon.chatkit.commons; -import android.graphics.drawable.Drawable; import android.widget.ImageView; +import com.stfalcon.chatkit.commons.models.IDialog; +import com.stfalcon.chatkit.commons.models.IUser; +import com.stfalcon.chatkit.commons.models.MessageContentType; + /** * Callback for implementing images loading in message list */ -public interface ImageLoader { +public abstract class ImageLoader implements ContextImageLoader { + + public abstract void loadImage(ImageView imageView, String url); - void loadImage(ImageView imageView, Drawable drawable, String url); + @Override + public void loadImage(ImageView imageView, IDialog dialog) { + loadImage(imageView, dialog.getDialogPhoto()); + } + @Override + public void loadImage(ImageView imageView, IUser user) { + loadImage(imageView, user.getAvatar()); + } + + @Override + public void loadImage(ImageView imageView, MessageContentType.Image messageContent) { + loadImage(imageView, messageContent.getImageUrl()); + } } + diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IDialog.java b/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IDialog.java index cf6deaa7..661c76e8 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IDialog.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IDialog.java @@ -16,8 +16,6 @@ package com.stfalcon.chatkit.commons.models; -import android.graphics.drawable.Drawable; - import java.util.List; /** @@ -28,8 +26,6 @@ public interface IDialog { String getId(); - Drawable getDialogPhotoDrawable(); - String getDialogPhoto(); String getDialogName(); diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IUser.java b/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IUser.java index cff1ff94..d51c2081 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IUser.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IUser.java @@ -16,8 +16,6 @@ package com.stfalcon.chatkit.commons.models; -import android.graphics.drawable.Drawable; - /** * For implementing by real user model */ @@ -37,12 +35,6 @@ public interface IUser { * */ String getName(); - /** - * - * @return the user's avatar drawable - */ - Drawable getAvatarDrawable(); - /** * Returns the user's avatar image url * diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogsListAdapter.java b/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogsListAdapter.java index 7659fbb0..53f6a848 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogsListAdapter.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogsListAdapter.java @@ -28,11 +28,10 @@ import android.widget.TextView; import com.stfalcon.chatkit.R; -import com.stfalcon.chatkit.commons.ImageLoader; +import com.stfalcon.chatkit.commons.ContextImageLoader; import com.stfalcon.chatkit.commons.ViewHolder; import com.stfalcon.chatkit.commons.models.IDialog; import com.stfalcon.chatkit.commons.models.IMessage; -import com.stfalcon.chatkit.commons.models.IUser; import com.stfalcon.chatkit.utils.DateFormatter; import java.lang.reflect.Constructor; @@ -55,7 +54,7 @@ public class DialogsListAdapter private List items = new ArrayList<>(); private int itemLayoutId; private Class holderClass; - private ImageLoader imageLoader; + private ContextImageLoader imageLoader; private OnDialogClickListener onDialogClickListener; private OnDialogViewClickListener onDialogViewClickListener; private OnDialogLongClickListener onLongItemClickListener; @@ -68,7 +67,7 @@ public class DialogsListAdapter * * @param imageLoader image loading method */ - public DialogsListAdapter(ImageLoader imageLoader) { + public DialogsListAdapter(ContextImageLoader imageLoader) { this(R.layout.item_dialog, DialogViewHolder.class, imageLoader); } @@ -78,7 +77,7 @@ public DialogsListAdapter(ImageLoader imageLoader) { * @param itemLayoutId custom list item resource id * @param imageLoader image loading method */ - public DialogsListAdapter(@LayoutRes int itemLayoutId, ImageLoader imageLoader) { + public DialogsListAdapter(@LayoutRes int itemLayoutId, ContextImageLoader imageLoader) { this(itemLayoutId, DialogViewHolder.class, imageLoader); } @@ -90,7 +89,7 @@ public DialogsListAdapter(@LayoutRes int itemLayoutId, ImageLoader imageLoader) * @param imageLoader image loading method */ public DialogsListAdapter(@LayoutRes int itemLayoutId, Class holderClass, - ImageLoader imageLoader) { + ContextImageLoader imageLoader) { this.itemLayoutId = itemLayoutId; this.holderClass = holderClass; this.imageLoader = imageLoader; @@ -301,7 +300,7 @@ public void sort(Comparator comparator) { /** * @return registered image loader */ - public ImageLoader getImageLoader() { + public ContextImageLoader getImageLoader() { return imageLoader; } @@ -310,7 +309,7 @@ public ImageLoader getImageLoader() { * * @param imageLoader image loading method */ - public void setImageLoader(ImageLoader imageLoader) { + public void setImageLoader(ContextImageLoader imageLoader) { this.imageLoader = imageLoader; } @@ -415,7 +414,7 @@ public interface OnDialogViewLongClickListener { public abstract static class BaseDialogViewHolder extends ViewHolder { - protected ImageLoader imageLoader; + protected ContextImageLoader imageLoader; protected OnDialogClickListener onDialogClickListener; protected OnDialogLongClickListener onLongItemClickListener; protected OnDialogViewClickListener onDialogViewClickListener; @@ -426,7 +425,7 @@ public BaseDialogViewHolder(View itemView) { super(itemView); } - void setImageLoader(ImageLoader imageLoader) { + void setImageLoader(ContextImageLoader imageLoader) { this.imageLoader = imageLoader; } @@ -593,17 +592,12 @@ public void onBind(final DIALOG dialog) { //Set Dialog avatar if (imageLoader != null) { - imageLoader.loadImage(ivAvatar, dialog.getDialogPhotoDrawable(), dialog.getDialogPhoto()); + imageLoader.loadImage(ivAvatar, dialog); } //Set Last message user avatar if (imageLoader != null) { - if (dialog.getLastMessage() != null && dialog.getLastMessage().getUser() != null) { - IUser user = dialog.getLastMessage().getUser(); - imageLoader.loadImage(ivLastMessageUser, user.getAvatarDrawable(), user.getAvatar()); - } else { - imageLoader.loadImage(ivLastMessageUser, null, null); - } + imageLoader.loadImage(ivLastMessageUser, dialog.getLastMessage().getUser()); } ivLastMessageUser.setVisibility(dialogStyle.isDialogMessageAvatarEnabled() && dialog.getUsers().size() > 1 ? VISIBLE : GONE); diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageHolders.java b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageHolders.java index 8f126cd3..0dfa119b 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageHolders.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageHolders.java @@ -630,7 +630,7 @@ public IncomingImageMessageViewHolder(View itemView) { public void onBind(MESSAGE message) { super.onBind(message); if (image != null && imageLoader != null) { - imageLoader.loadImage(image, message.getImageUrl()); + imageLoader.loadImage(image, message); } if (imageOverlay != null) { @@ -681,7 +681,7 @@ public OutcomingImageMessageViewHolder(View itemView) { public void onBind(MESSAGE message) { super.onBind(message); if (image != null && imageLoader != null) { - imageLoader.loadImage(image, message.getImageUrl()); + imageLoader.loadImage(image, message); } if (imageOverlay != null) { @@ -770,7 +770,7 @@ public void onBind(MESSAGE message) { userAvatar.setVisibility(isAvatarExists ? View.VISIBLE : View.GONE); if (isAvatarExists) { - imageLoader.loadImage(userAvatar, message.getUser().getAvatar()); + imageLoader.loadImage(userAvatar, message.getUser()); } } } diff --git a/sample/build.gradle b/sample/build.gradle index 13d52cae..c900fae8 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -30,6 +30,7 @@ ext { circleImageViewVersion = '2.1.0' shapeImageViewVersion = '0.9.3' circleindicatorVersion = '1.2.2@aar' + textDrawableVersion = '1.0.1' } dependencies { @@ -51,6 +52,7 @@ dependencies { //ImageViews compile "de.hdodenhof:circleimageview:$circleImageViewVersion" compile "com.github.siyamed:android-shape-imageview:$shapeImageViewVersion" + compile "com.amulyakhare:com.amulyakhare.textdrawable:$textDrawableVersion" //Utils compile "me.relex:circleindicator:$circleindicatorVersion" diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/DemoDialogsActivity.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/DemoDialogsActivity.java index 14ea004e..461f326d 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/DemoDialogsActivity.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/DemoDialogsActivity.java @@ -1,17 +1,20 @@ package com.stfalcon.chatkit.sample.features.demo; -import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.widget.ImageView; +import com.amulyakhare.textdrawable.TextDrawable; import com.squareup.picasso.Picasso; import com.stfalcon.chatkit.commons.ImageLoader; +import com.stfalcon.chatkit.commons.models.IUser; import com.stfalcon.chatkit.dialogs.DialogsListAdapter; import com.stfalcon.chatkit.sample.common.data.model.Dialog; import com.stfalcon.chatkit.sample.utils.AppUtils; +import java.util.Random; + /* * Created by troy379 on 05.04.17. */ @@ -27,13 +30,27 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); imageLoader = new ImageLoader() { + @Override - public void loadImage(ImageView imageView, Drawable drawable, String url) { + public void loadImage(ImageView imageView, String url) { Picasso.with(DemoDialogsActivity.this) .load(url) - .placeholder(drawable) .into(imageView); } + + @Override + public void loadImage(ImageView imageView, IUser user) { + if(new Random().nextInt(2) == 1) { + Picasso.with(DemoDialogsActivity.this) + .load(user.getAvatar()) + .into(imageView); + } else { + TextDrawable drawable = TextDrawable.builder().buildRound( + user.getName().substring(0, 2), + DemoDialogsActivity.this.getResources().getColor(android.R.color.holo_red_dark)); + imageView.setImageDrawable(drawable); + } + } }; }