Browse Source

Progress with setting chip avatars

Signed-off-by: Mario Danic <mario@lovelyhq.com>
Mario Danic 6 years ago
parent
commit
ad3b440e88

+ 2 - 0
app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.java

@@ -151,6 +151,7 @@ public class MagicIncomingTextMessageViewHolder
                                             messageString,
                                             messageString,
                                             individualHashMap.get("id"),
                                             individualHashMap.get("id"),
                                             individualHashMap.get("name"),
                                             individualHashMap.get("name"),
+                                            userUtils.getUserById(message.getActiveUserId()),
                                             R.xml.chip_simple_background);
                                             R.xml.chip_simple_background);
                         } else {
                         } else {
                             messageString =
                             messageString =
@@ -158,6 +159,7 @@ public class MagicIncomingTextMessageViewHolder
                                             messageString,
                                             messageString,
                                             individualHashMap.get("id"),
                                             individualHashMap.get("id"),
                                             individualHashMap.get("name"),
                                             individualHashMap.get("name"),
+                                            userUtils.getUserById(message.getActiveUserId()),
                                             R.xml.chip_accent_background);
                                             R.xml.chip_accent_background);
                         }
                         }
 
 

+ 2 - 0
app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.java

@@ -98,6 +98,7 @@ public class MagicOutcomingTextMessageViewHolder extends MessageHolders.Outcomin
                                             messageString,
                                             messageString,
                                             individualHashMap.get("id"),
                                             individualHashMap.get("id"),
                                             individualHashMap.get("name"),
                                             individualHashMap.get("name"),
+                                            userUtils.getUserById(message.getActiveUserId()),
                                             R.xml.chip_simple_background);
                                             R.xml.chip_simple_background);
                         } else {
                         } else {
                             messageString =
                             messageString =
@@ -105,6 +106,7 @@ public class MagicOutcomingTextMessageViewHolder extends MessageHolders.Outcomin
                                             messageString,
                                             messageString,
                                             individualHashMap.get("id"),
                                             individualHashMap.get("id"),
                                             individualHashMap.get("name"),
                                             individualHashMap.get("name"),
+                                            userUtils.getUserById(message.getActiveUserId()),
                                             R.xml.chip_outgoing_own_mention);
                                             R.xml.chip_outgoing_own_mention);
                         }
                         }
                     } else if (individualHashMap.get("type").equals("file")) {
                     } else if (individualHashMap.get("type").equals("file")) {

+ 7 - 2
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.Spanned;
 import android.text.style.DynamicDrawableSpan;
 import android.text.style.DynamicDrawableSpan;
 import com.nextcloud.talk.R;
 import com.nextcloud.talk.R;
+import com.nextcloud.talk.models.database.UserEntity;
 import com.nextcloud.talk.models.json.mention.Mention;
 import com.nextcloud.talk.models.json.mention.Mention;
 import com.nextcloud.talk.utils.DisplayUtils;
 import com.nextcloud.talk.utils.DisplayUtils;
 import com.nextcloud.talk.utils.MagicCharPolicy;
 import com.nextcloud.talk.utils.MagicCharPolicy;
@@ -33,9 +34,11 @@ import com.otaliastudios.autocomplete.AutocompleteCallback;
 
 
 public class MentionAutocompleteCallback implements AutocompleteCallback<Mention> {
 public class MentionAutocompleteCallback implements AutocompleteCallback<Mention> {
     private Context context;
     private Context context;
+    private UserEntity conversationUser;
 
 
-    public MentionAutocompleteCallback(Context context) {
+    public MentionAutocompleteCallback(Context context, UserEntity conversationUser) {
         this.context = context;
         this.context = context;
+        this.conversationUser = conversationUser;
     }
     }
 
 
     @Override
     @Override
@@ -48,7 +51,9 @@ public class MentionAutocompleteCallback implements AutocompleteCallback<Mention
         editable.replace(start, end, replacement + " ");
         editable.replace(start, end, replacement + " ");
         Spans.MentionChipSpan mentionChipSpan =
         Spans.MentionChipSpan mentionChipSpan =
                 new Spans.MentionChipSpan(DisplayUtils.getDrawableForMentionChipSpan(context,
                 new Spans.MentionChipSpan(DisplayUtils.getDrawableForMentionChipSpan(context,
-                        item.getLabel(), R.xml.chip_accent_background), DynamicDrawableSpan.ALIGN_BASELINE,
+                        item.getId(), item.getLabel(), conversationUser,
+                        R.xml.chip_accent_background),
+                        DynamicDrawableSpan.ALIGN_BASELINE,
                         item.getId(), item.getLabel());
                         item.getId(), item.getLabel());
         editable.setSpan(mentionChipSpan, start, start + item.getLabel().length() ,
         editable.setSpan(mentionChipSpan, start, start + item.getLabel().length() ,
                 Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
                 Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

+ 2 - 1
app/src/main/java/com/nextcloud/talk/controllers/ChatController.java

@@ -485,7 +485,8 @@ public class ChatController extends BaseController implements MessagesListAdapte
         float elevation = 6f;
         float elevation = 6f;
         Drawable backgroundDrawable = new ColorDrawable(Color.WHITE);
         Drawable backgroundDrawable = new ColorDrawable(Color.WHITE);
         AutocompletePresenter<Mention> presenter = new MentionAutocompletePresenter(getApplicationContext(), roomToken);
         AutocompletePresenter<Mention> presenter = new MentionAutocompletePresenter(getApplicationContext(), roomToken);
-        AutocompleteCallback<Mention> callback = new MentionAutocompleteCallback(getActivity());
+        AutocompleteCallback<Mention> callback = new MentionAutocompleteCallback(getActivity(),
+                conversationUser);
 
 
         if (mentionAutocomplete == null && messageInput != null) {
         if (mentionAutocomplete == null && messageInput != null) {
             mentionAutocomplete = Autocomplete.<Mention>on(messageInput)
             mentionAutocomplete = Autocomplete.<Mention>on(messageInput)

+ 52 - 6
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.Canvas;
 import android.graphics.Paint;
 import android.graphics.Paint;
 import android.graphics.Typeface;
 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.net.Uri;
 import android.os.Build;
 import android.os.Build;
 import android.text.*;
 import android.text.*;
@@ -47,9 +44,17 @@ import androidx.annotation.*;
 import androidx.appcompat.widget.AppCompatDrawableManager;
 import androidx.appcompat.widget.AppCompatDrawableManager;
 import androidx.core.content.ContextCompat;
 import androidx.core.content.ContextCompat;
 import androidx.core.graphics.drawable.DrawableCompat;
 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.controller.ControllerListener;
+import com.facebook.drawee.drawable.RoundedColorDrawable;
 import com.facebook.drawee.view.SimpleDraweeView;
 import com.facebook.drawee.view.SimpleDraweeView;
 import com.facebook.imagepipeline.common.RotationOptions;
 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.image.ImageInfo;
 import com.facebook.imagepipeline.postprocessors.RoundAsCirclePostprocessor;
 import com.facebook.imagepipeline.postprocessors.RoundAsCirclePostprocessor;
 import com.facebook.imagepipeline.request.ImageRequest;
 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.google.android.material.chip.ChipDrawable;
 import com.nextcloud.talk.R;
 import com.nextcloud.talk.R;
 import com.nextcloud.talk.application.NextcloudTalkApplication;
 import com.nextcloud.talk.application.NextcloudTalkApplication;
+import com.nextcloud.talk.models.database.UserEntity;
 import com.nextcloud.talk.utils.text.Spans;
 import com.nextcloud.talk.utils.text.Spans;
 import com.vanniktech.emoji.EmojiTextView;
 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);
         ChipDrawable chip = ChipDrawable.createFromResource(context, chipResource);
         chip.setText(label);
         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());
         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<CloseableReference<CloseableImage>> 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<CloseableReference<CloseableImage>> dataSource) {
+                    }
+                },
+                UiThreadImmediateExecutorService.getInstance());
+
         return chip;
         return chip;
     }
     }
 
 
+
     public static Spannable searchAndReplaceWithMentionSpan(Context context, Spannable text,
     public static Spannable searchAndReplaceWithMentionSpan(Context context, Spannable text,
                                                             String id, String label,
                                                             String id, String label,
+                                                            UserEntity conversationUser,
                                                             @XmlRes int chipXmlRes) {
                                                             @XmlRes int chipXmlRes) {
 
 
         Spannable spannableString = new SpannableString(text);
         Spannable spannableString = new SpannableString(text);
@@ -233,13 +276,16 @@ public class DisplayUtils {
             int end = start + m.group().length();
             int end = start + m.group().length();
             lastStartIndex = end;
             lastStartIndex = end;
             mentionChipSpan = new Spans.MentionChipSpan(DisplayUtils.getDrawableForMentionChipSpan(context,
             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);
             spannableString.setSpan(mentionChipSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
         }
         }
 
 
         return spannableString;
         return spannableString;
 
 
     }
     }
+
     public static Spannable searchAndColor(Spannable text, String searchText, @ColorInt int color) {
     public static Spannable searchAndColor(Spannable text, String searchText, @ColorInt int color) {
 
 
         Spannable spannableString = new SpannableString(text);
         Spannable spannableString = new SpannableString(text);

+ 7 - 0
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) {
     public UserEntity getUserWithId(long id) {
         Result findUserQueryResult = dataStore.select(User.class).where(UserEntity.ID.eq(id))
         Result findUserQueryResult = dataStore.select(User.class).where(UserEntity.ID.eq(id))
                 .limit(1).get();
                 .limit(1).get();

+ 14 - 0
app/src/main/java/com/nextcloud/talk/utils/text/Spans.java

@@ -20,10 +20,24 @@
 
 
 package com.nextcloud.talk.utils.text;
 package com.nextcloud.talk.utils.text;
 
 
+import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Drawable;
 import androidx.annotation.NonNull;
 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 lombok.Data;
 
 
+import static com.nextcloud.talk.utils.DisplayUtils.getImageRequestForUrl;
+
 public class Spans {
 public class Spans {
 
 
     @Data
     @Data

+ 26 - 0
app/src/main/res/drawable/accent_circle.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Nextcloud Talk application
+  ~
+  ~ @author Mario Danic
+  ~ Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
+  ~
+  ~ This program is free software: you can redistribute it and/or modify
+  ~ it under the terms of the GNU General Public License as published by
+  ~ the Free Software Foundation, either version 3 of the License, or
+  ~ at your option) any later version.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  ~ GNU General Public License for more details.
+  ~
+  ~ You should have received a copy of the GNU General Public License
+  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <solid
+        android:color="@color/colorAccent"/>
+</shape>

+ 26 - 0
app/src/main/res/drawable/white_circle.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Nextcloud Talk application
+  ~
+  ~ @author Mario Danic
+  ~ Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
+  ~
+  ~ This program is free software: you can redistribute it and/or modify
+  ~ it under the terms of the GNU General Public License as published by
+  ~ the Free Software Foundation, either version 3 of the License, or
+  ~ at your option) any later version.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  ~ GNU General Public License for more details.
+  ~
+  ~ You should have received a copy of the GNU General Public License
+  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <solid
+        android:color="@color/white"/>
+</shape>