Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/stefan-niedermann/nextcloud-deck.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordesperateCoder <echotodevnull@gmail.com>2020-05-11 19:02:22 +0300
committerdesperateCoder <echotodevnull@gmail.com>2020-05-11 19:02:22 +0300
commit2ca59d8df9601a1a290a5045fca61350c7f5aafd (patch)
tree72122d06740181e52b83d3d62eeed6c7499d12e2 /app/src/main/java/it/niedermann/nextcloud/deck/util
parent3680b65badec9c454b46c4ae961584d66e7797a9 (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.java62
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);
+ }
}