diff options
author | desperateCoder <echotodevnull@gmail.com> | 2020-05-11 19:02:22 +0300 |
---|---|---|
committer | desperateCoder <echotodevnull@gmail.com> | 2020-05-11 19:02:22 +0300 |
commit | 2ca59d8df9601a1a290a5045fca61350c7f5aafd (patch) | |
tree | 72122d06740181e52b83d3d62eeed6c7499d12e2 /app/src/main/java/it/niedermann/nextcloud/deck/util | |
parent | 3680b65badec9c454b46c4ae961584d66e7797a9 (diff) |
#454 💬↩️ Reply to comments
Diffstat (limited to 'app/src/main/java/it/niedermann/nextcloud/deck/util')
-rw-r--r-- | app/src/main/java/it/niedermann/nextcloud/deck/util/ViewUtil.java | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/util/ViewUtil.java b/app/src/main/java/it/niedermann/nextcloud/deck/util/ViewUtil.java index 4b5be2fae..1039b5c95 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/util/ViewUtil.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/util/ViewUtil.java @@ -2,25 +2,35 @@ package it.niedermann.nextcloud.deck.util; import android.content.Context; import android.content.res.ColorStateList; +import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.style.ImageSpan; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.Px; import androidx.core.graphics.drawable.DrawableCompat; import androidx.core.widget.TextViewCompat; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; +import com.bumptech.glide.request.target.CustomTarget; +import com.bumptech.glide.request.transition.Transition; import java.util.Date; +import java.util.List; import it.niedermann.nextcloud.deck.Application; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.model.Account; +import it.niedermann.nextcloud.deck.model.ocs.comment.Mention; public final class ViewUtil { private ViewUtil() { @@ -72,4 +82,56 @@ public final class ViewUtil { public static Drawable getTintedImageView(@NonNull Context context, @DrawableRes int imageId, int colorId) { return getTintedImageView(context, imageId, context.getResources().getString(colorId)); } + + /** + * Replaces all mentions in the textView with an avatar and the display name + * + * @param account {@link Account} where the users of those mentions belong to + * @param mentions {@link List} of all mentions that should be substituted + * @param textView target {@link TextView} + */ + public static void setupMentions(@NonNull Account account, @NonNull List<Mention> mentions, TextView textView) { + Context context = textView.getContext(); + SpannableStringBuilder messageBuilder = new SpannableStringBuilder(textView.getText()); + + // Step 1 + // Add avatar icons and display names + for (Mention m : mentions) { + final String mentionId = "@" + m.getMentionId(); + final String mentionDisplayName = " " + m.getMentionDisplayName(); + int index = messageBuilder.toString().lastIndexOf(mentionId); + while (index >= 0) { + messageBuilder.setSpan(new ImageSpan(context, R.drawable.ic_person_grey600_24dp), index, index + mentionId.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + messageBuilder.insert(index + mentionId.length(), mentionDisplayName); + index = messageBuilder.toString().substring(0, index).lastIndexOf(mentionId); + } + } + textView.setText(messageBuilder); + + // Step 2 + // Replace avatar icons with real avatars + final ImageSpan[] list = messageBuilder.getSpans(0, messageBuilder.length(), ImageSpan.class); + for (ImageSpan span : list) { + final int spanStart = messageBuilder.getSpanStart(span); + final int spanEnd = messageBuilder.getSpanEnd(span); + Glide.with(context) + .asBitmap() + .placeholder(R.drawable.ic_person_grey600_24dp) + .load(account.getUrl() + "/index.php/avatar/" + messageBuilder.subSequence(spanStart + 1, spanEnd).toString() + "/" + DimensionUtil.dpToPx(context, R.dimen.icon_size_details)) + .apply(RequestOptions.circleCropTransform()) + .into(new CustomTarget<Bitmap>() { + @Override + public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) { + messageBuilder.removeSpan(span); + messageBuilder.setSpan(new ImageSpan(context, resource), spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + } + + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + // silence is gold + } + }); + } + textView.setText(messageBuilder); + } } |