From ad3b440e8824c231a7cbeabf3d073141ae978c72 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 10 Apr 2019 09:41:13 +0200 Subject: [PATCH] Progress with setting chip avatars Signed-off-by: Mario Danic --- .../MagicIncomingTextMessageViewHolder.java | 2 + .../MagicOutcomingTextMessageViewHolder.java | 2 + .../MentionAutocompleteCallback.java | 9 ++- .../talk/controllers/ChatController.java | 3 +- .../nextcloud/talk/utils/DisplayUtils.java | 58 +++++++++++++++++-- .../talk/utils/database/user/UserUtils.java | 7 +++ .../com/nextcloud/talk/utils/text/Spans.java | 14 +++++ app/src/main/res/drawable/accent_circle.xml | 26 +++++++++ app/src/main/res/drawable/white_circle.xml | 26 +++++++++ 9 files changed, 138 insertions(+), 9 deletions(-) create mode 100644 app/src/main/res/drawable/accent_circle.xml create mode 100644 app/src/main/res/drawable/white_circle.xml diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.java b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.java index a548b610f..524eb9da6 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.java @@ -151,6 +151,7 @@ public class MagicIncomingTextMessageViewHolder messageString, individualHashMap.get("id"), individualHashMap.get("name"), + userUtils.getUserById(message.getActiveUserId()), R.xml.chip_simple_background); } else { messageString = @@ -158,6 +159,7 @@ public class MagicIncomingTextMessageViewHolder messageString, individualHashMap.get("id"), individualHashMap.get("name"), + userUtils.getUserById(message.getActiveUserId()), R.xml.chip_accent_background); } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.java b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.java index bcf6d341b..e53d96402 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.java @@ -98,6 +98,7 @@ public class MagicOutcomingTextMessageViewHolder extends MessageHolders.Outcomin messageString, individualHashMap.get("id"), individualHashMap.get("name"), + userUtils.getUserById(message.getActiveUserId()), R.xml.chip_simple_background); } else { messageString = @@ -105,6 +106,7 @@ public class MagicOutcomingTextMessageViewHolder extends MessageHolders.Outcomin messageString, individualHashMap.get("id"), individualHashMap.get("name"), + userUtils.getUserById(message.getActiveUserId()), R.xml.chip_outgoing_own_mention); } } else if (individualHashMap.get("type").equals("file")) { diff --git a/app/src/main/java/com/nextcloud/talk/callbacks/MentionAutocompleteCallback.java b/app/src/main/java/com/nextcloud/talk/callbacks/MentionAutocompleteCallback.java index 450b157b3..230f582b4 100644 --- a/app/src/main/java/com/nextcloud/talk/callbacks/MentionAutocompleteCallback.java +++ b/app/src/main/java/com/nextcloud/talk/callbacks/MentionAutocompleteCallback.java @@ -25,6 +25,7 @@ import android.text.Editable; import android.text.Spanned; import android.text.style.DynamicDrawableSpan; import com.nextcloud.talk.R; +import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.json.mention.Mention; import com.nextcloud.talk.utils.DisplayUtils; import com.nextcloud.talk.utils.MagicCharPolicy; @@ -33,9 +34,11 @@ import com.otaliastudios.autocomplete.AutocompleteCallback; public class MentionAutocompleteCallback implements AutocompleteCallback { private Context context; + private UserEntity conversationUser; - public MentionAutocompleteCallback(Context context) { + public MentionAutocompleteCallback(Context context, UserEntity conversationUser) { this.context = context; + this.conversationUser = conversationUser; } @Override @@ -48,7 +51,9 @@ public class MentionAutocompleteCallback implements AutocompleteCallback presenter = new MentionAutocompletePresenter(getApplicationContext(), roomToken); - AutocompleteCallback callback = new MentionAutocompleteCallback(getActivity()); + AutocompleteCallback callback = new MentionAutocompleteCallback(getActivity(), + conversationUser); if (mentionAutocomplete == null && messageInput != null) { mentionAutocomplete = Autocomplete.on(messageInput) diff --git a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java index 30e0b5b80..1db3fdfe5 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java @@ -29,10 +29,7 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Typeface; -import android.graphics.drawable.Animatable; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.VectorDrawable; +import android.graphics.drawable.*; import android.net.Uri; import android.os.Build; import android.text.*; @@ -47,9 +44,17 @@ import androidx.annotation.*; import androidx.appcompat.widget.AppCompatDrawableManager; import androidx.core.content.ContextCompat; import androidx.core.graphics.drawable.DrawableCompat; +import com.facebook.common.executors.UiThreadImmediateExecutorService; +import com.facebook.common.references.CloseableReference; +import com.facebook.datasource.DataSource; +import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.controller.ControllerListener; +import com.facebook.drawee.drawable.RoundedColorDrawable; import com.facebook.drawee.view.SimpleDraweeView; import com.facebook.imagepipeline.common.RotationOptions; +import com.facebook.imagepipeline.core.ImagePipeline; +import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber; +import com.facebook.imagepipeline.image.CloseableImage; import com.facebook.imagepipeline.image.ImageInfo; import com.facebook.imagepipeline.postprocessors.RoundAsCirclePostprocessor; import com.facebook.imagepipeline.request.ImageRequest; @@ -57,6 +62,7 @@ import com.facebook.imagepipeline.request.ImageRequestBuilder; import com.google.android.material.chip.ChipDrawable; import com.nextcloud.talk.R; import com.nextcloud.talk.application.NextcloudTalkApplication; +import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.utils.text.Spans; import com.vanniktech.emoji.EmojiTextView; @@ -208,15 +214,52 @@ public class DisplayUtils { } - public static Drawable getDrawableForMentionChipSpan(Context context, String label, @XmlRes int chipResource) { + public static Drawable getDrawableForMentionChipSpan(Context context, String id, String label, + UserEntity conversationUser, + @XmlRes int chipResource) { ChipDrawable chip = ChipDrawable.createFromResource(context, chipResource); chip.setText(label); + int drawable; + + if (chipResource == R.xml.chip_accent_background) { + drawable = R.drawable.white_circle; + } else { + drawable = R.drawable.accent_circle; + } + + chip.setChipIcon(context.getDrawable(drawable)); + chip.setBounds(0, 0, chip.getIntrinsicWidth(), chip.getIntrinsicHeight()); + + ImageRequest imageRequest = + getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(conversationUser.getBaseUrl(), id, R.dimen.avatar_size_big)); + ImagePipeline imagePipeline = Fresco.getImagePipeline(); + DataSource> dataSource = imagePipeline.fetchDecodedImage(imageRequest, context); + + dataSource.subscribe( + new BaseBitmapDataSubscriber() { + + @Override + protected void onNewResultImpl(Bitmap bitmap) { + if (bitmap != null) { + chip.setChipIcon(getRoundedDrawable(new BitmapDrawable(bitmap))); + chip.invalidateSelf(); + } + } + + @Override + protected void onFailureImpl(DataSource> dataSource) { + } + }, + UiThreadImmediateExecutorService.getInstance()); + return chip; } + public static Spannable searchAndReplaceWithMentionSpan(Context context, Spannable text, String id, String label, + UserEntity conversationUser, @XmlRes int chipXmlRes) { Spannable spannableString = new SpannableString(text); @@ -233,13 +276,16 @@ public class DisplayUtils { int end = start + m.group().length(); lastStartIndex = end; mentionChipSpan = new Spans.MentionChipSpan(DisplayUtils.getDrawableForMentionChipSpan(context, - label, chipXmlRes), DynamicDrawableSpan.ALIGN_BASELINE, id, label); + id, label, conversationUser, chipXmlRes), + DynamicDrawableSpan.ALIGN_BASELINE, id, + label); spannableString.setSpan(mentionChipSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } return spannableString; } + public static Spannable searchAndColor(Spannable text, String searchText, @ColorInt int color) { Spannable spannableString = new SpannableString(text); diff --git a/app/src/main/java/com/nextcloud/talk/utils/database/user/UserUtils.java b/app/src/main/java/com/nextcloud/talk/utils/database/user/UserUtils.java index 531351e17..9e08993be 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/database/user/UserUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/database/user/UserUtils.java @@ -105,6 +105,13 @@ public class UserUtils { } + public UserEntity getUserById(String id) { + Result findUserQueryResult = dataStore.select(User.class).where(UserEntity.USER_ID.eq(id)) + .limit(1).get(); + + return (UserEntity) findUserQueryResult.firstOrNull(); + } + public UserEntity getUserWithId(long id) { Result findUserQueryResult = dataStore.select(User.class).where(UserEntity.ID.eq(id)) .limit(1).get(); diff --git a/app/src/main/java/com/nextcloud/talk/utils/text/Spans.java b/app/src/main/java/com/nextcloud/talk/utils/text/Spans.java index 6a82730fa..a5bb14e39 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/text/Spans.java +++ b/app/src/main/java/com/nextcloud/talk/utils/text/Spans.java @@ -20,10 +20,24 @@ package com.nextcloud.talk.utils.text; +import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import androidx.annotation.NonNull; +import com.facebook.common.executors.UiThreadImmediateExecutorService; +import com.facebook.common.references.CloseableReference; +import com.facebook.datasource.DataSource; +import com.facebook.drawee.backends.pipeline.Fresco; +import com.facebook.imagepipeline.core.ImagePipeline; +import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber; +import com.facebook.imagepipeline.image.CloseableImage; +import com.facebook.imagepipeline.request.ImageRequest; +import com.nextcloud.talk.R; +import com.nextcloud.talk.utils.ApiUtils; +import com.nextcloud.talk.utils.DisplayUtils; import lombok.Data; +import static com.nextcloud.talk.utils.DisplayUtils.getImageRequestForUrl; + public class Spans { @Data diff --git a/app/src/main/res/drawable/accent_circle.xml b/app/src/main/res/drawable/accent_circle.xml new file mode 100644 index 000000000..1a0e70aca --- /dev/null +++ b/app/src/main/res/drawable/accent_circle.xml @@ -0,0 +1,26 @@ + + + + + + diff --git a/app/src/main/res/drawable/white_circle.xml b/app/src/main/res/drawable/white_circle.xml new file mode 100644 index 000000000..836510890 --- /dev/null +++ b/app/src/main/res/drawable/white_circle.xml @@ -0,0 +1,26 @@ + + + + + +