ソースを参照

Merge pull request #2863 from nextcloud/bugfix/2496/fixChipsWithEmoji

Fix to display chips with emojis
Marcel Hibbe 2 年 前
コミット
111905bba1

+ 16 - 24
app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingTextMessageViewHolder.kt

@@ -85,9 +85,9 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) : MessageHolde
 
         itemView.isSelected = false
 
-        var messageString: Spannable = SpannableString(message.text)
+        var messageString: Spannable = SpannableString(message.message)
 
-        var textSize = context?.resources!!.getDimension(R.dimen.chat_text_size)
+        var textSize = context.resources!!.getDimension(R.dimen.chat_text_size)
 
         val messageParameters = message.messageParameters
         if (messageParameters != null && messageParameters.size > 0) {
@@ -226,38 +226,30 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) : MessageHolde
         for (key in messageParameters.keys) {
             val individualHashMap = message.messageParameters!![key]
             if (individualHashMap != null) {
-                if (
-                    individualHashMap["type"] == "user" ||
-                    individualHashMap["type"] == "guest" ||
-                    individualHashMap["type"] == "call"
-                ) {
-                    if (individualHashMap["id"] == message.activeUser!!.userId) {
+                when (individualHashMap["type"]) {
+                    "user", "guest", "call" -> {
+                        val chip = if (individualHashMap["id"] == message.activeUser!!.userId) {
+                            R.xml.chip_you
+                        } else {
+                            R.xml.chip_others
+                        }
                         messageStringInternal = DisplayUtils.searchAndReplaceWithMentionSpan(
+                            key,
                             binding.messageText.context,
                             messageStringInternal,
                             individualHashMap["id"]!!,
                             individualHashMap["name"]!!,
                             individualHashMap["type"]!!,
                             message.activeUser!!,
-                            R.xml.chip_you,
-                            viewThemeUtils
-                        )
-                    } else {
-                        messageStringInternal = DisplayUtils.searchAndReplaceWithMentionSpan(
-                            binding.messageText.context,
-                            messageStringInternal,
-                            individualHashMap["id"]!!,
-                            individualHashMap["name"]!!,
-                            individualHashMap["type"]!!,
-                            message.activeUser!!,
-                            R.xml.chip_others,
+                            chip,
                             viewThemeUtils
                         )
                     }
-                } else if (individualHashMap["type"] == "file") {
-                    itemView.setOnClickListener { v ->
-                        val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(individualHashMap["link"]))
-                        context!!.startActivity(browserIntent)
+                    "file" -> {
+                        itemView.setOnClickListener { v ->
+                            val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(individualHashMap["link"]))
+                            context.startActivity(browserIntent)
+                        }
                     }
                 }
             }

+ 28 - 22
app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingTextMessageViewHolder.kt

@@ -46,7 +46,7 @@ import com.nextcloud.talk.ui.recyclerview.MessageSwipeCallback
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.DateUtils
-import com.nextcloud.talk.utils.DisplayUtils.searchAndReplaceWithMentionSpan
+import com.nextcloud.talk.utils.DisplayUtils
 import com.nextcloud.talk.utils.TextMatchers
 import com.stfalcon.chatkit.messages.MessageHolders.OutcomingTextMessageViewHolder
 import javax.inject.Inject
@@ -71,7 +71,7 @@ class OutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewH
         super.onBind(message)
         sharedApplication!!.componentApplication.inject(this)
         val messageParameters: HashMap<String?, HashMap<String?, String?>>? = message.messageParameters
-        var messageString: Spannable = SpannableString(message.text)
+        var messageString: Spannable = SpannableString(message.message)
         realView.isSelected = false
         val layoutParams = binding.messageTime.layoutParams as FlexboxLayout.LayoutParams
         layoutParams.isWrapBefore = false
@@ -186,33 +186,39 @@ class OutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewH
         message: ChatMessage,
         messageString: Spannable
     ): Spannable {
-        var messageString1 = messageString
+        var messageStringInternal = messageString
         for (key in messageParameters.keys) {
             val individualHashMap: HashMap<String?, String?>? = message.messageParameters!![key]
             if (individualHashMap != null) {
-                if (individualHashMap["type"] == "user" ||
-                    individualHashMap["type"] == "guest" ||
-                    individualHashMap["type"] == "call"
-                ) {
-                    messageString1 = searchAndReplaceWithMentionSpan(
-                        binding.messageText.context,
-                        messageString1,
-                        individualHashMap["id"]!!,
-                        individualHashMap["name"]!!,
-                        individualHashMap["type"]!!,
-                        message.activeUser,
-                        R.xml.chip_others,
-                        viewThemeUtils
-                    )
-                } else if (individualHashMap["type"] == "file") {
-                    realView.setOnClickListener { v: View? ->
-                        val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(individualHashMap["link"]))
-                        context!!.startActivity(browserIntent)
+                when (individualHashMap["type"]) {
+                    "user", "guest", "call" -> {
+                        val chip = if (individualHashMap["id"] == message.activeUser!!.userId) {
+                            R.xml.chip_you
+                        } else {
+                            R.xml.chip_others
+                        }
+                        messageStringInternal = DisplayUtils.searchAndReplaceWithMentionSpan(
+                            key,
+                            binding.messageText.context,
+                            messageStringInternal,
+                            individualHashMap["id"]!!,
+                            individualHashMap["name"]!!,
+                            individualHashMap["type"]!!,
+                            message.activeUser!!,
+                            chip,
+                            viewThemeUtils
+                        )
+                    }
+                    "file" -> {
+                        itemView.setOnClickListener { v ->
+                            val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(individualHashMap["link"]))
+                            context.startActivity(browserIntent)
+                        }
                     }
                 }
             }
         }
-        return messageString1
+        return messageStringInternal
     }
 
     fun assignCommonMessageInterface(commonMessageInterface: CommonMessageInterface) {

+ 19 - 12
app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java

@@ -98,6 +98,7 @@ import static com.nextcloud.talk.utils.FileSortOrder.sort_z_to_a_id;
 
 public class DisplayUtils {
 
+    private static final String TAG = "DisplayUtils";
     private static final int INDEX_LUMINATION = 2;
     private static final double MAX_LIGHTNESS = 0.92;
 
@@ -240,7 +241,7 @@ public class DisplayUtils {
         return chip;
     }
 
-    public static Spannable searchAndReplaceWithMentionSpan(Context context, Spannable text,
+    public static Spannable searchAndReplaceWithMentionSpan(String key, Context context, Spannable text,
                                                             String id, String label, String type,
                                                             User conversationUser,
                                                             @XmlRes int chipXmlRes,
@@ -249,8 +250,8 @@ public class DisplayUtils {
         Spannable spannableString = new SpannableString(text);
         String stringText = text.toString();
 
-        Matcher m = Pattern.compile("@" + label,
-                                    Pattern.CASE_INSENSITIVE | Pattern.LITERAL | Pattern.MULTILINE)
+        String keyWithBrackets = "{" + key + "}";
+        Matcher m = Pattern.compile(keyWithBrackets, Pattern.CASE_INSENSITIVE | Pattern.LITERAL | Pattern.MULTILINE)
             .matcher(spannableString);
 
         ClickableSpan clickableSpan = new ClickableSpan() {
@@ -266,17 +267,23 @@ public class DisplayUtils {
             int start = stringText.indexOf(m.group(), lastStartIndex);
             int end = start + m.group().length();
             lastStartIndex = end;
-            mentionChipSpan = new Spans.MentionChipSpan(DisplayUtils.getDrawableForMentionChipSpan(context,
-                                                                                                   id,
-                                                                                                   label,
-                                                                                                   conversationUser,
-                                                                                                   type,
-                                                                                                   chipXmlRes,
-                                                                                                   null,
-                                                                                                   viewThemeUtils),
-                                                        BetterImageSpan.ALIGN_CENTER, id,
+
+            Drawable drawableForChip = DisplayUtils.getDrawableForMentionChipSpan(context,
+                                                       id,
+                                                       label,
+                                                       conversationUser,
+                                                       type,
+                                                       chipXmlRes,
+                                                       null,
+                                                       viewThemeUtils);
+
+            mentionChipSpan = new Spans.MentionChipSpan(drawableForChip,
+                                                        BetterImageSpan.ALIGN_CENTER,
+                                                        id,
                                                         label);
+
             spannableString.setSpan(mentionChipSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+
             if (chipXmlRes == R.xml.chip_you) {
                 spannableString.setSpan(
                     new ForegroundColorSpan(viewThemeUtils.getScheme(context).getOnPrimary()),