@@ 101,6 101,7 @@ import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.regex.Matcher;
import java.util.regex.Pattern;
import eu.siacs.conversations.Config;
@@ 1395,14 1396,18 @@ public class ConversationFragment extends XmppFragment
return true;
});
+ final Pattern lastColonPattern = Pattern.compile("(?<!\\w):");
emojiSearchBinding = DataBindingUtil.inflate(inflater, R.layout.emoji_search, null, false);
emojiSearchBinding.emoji.setOnItemClickListener((parent, view, position, id) -> {
EmojiSearch.EmojiSearchAdapter adapter = ((EmojiSearch.EmojiSearchAdapter) emojiSearchBinding.emoji.getAdapter());
Editable toInsert = adapter.getItem(position).toInsert();
toInsert.append(" ");
Editable s = binding.textinput.getText();
- int lastColon = s.toString().lastIndexOf(':');
- s.replace(lastColon, s.length(), toInsert, 0, toInsert.length());
+
+ Matcher lastColonMatcher = lastColonPattern.matcher(s);
+ int lastColon = -1;
+ while(lastColonMatcher.find()) lastColon = lastColonMatcher.end();
+ if (lastColon > 0) s.replace(lastColon - 1, s.length(), toInsert, 0, toInsert.length());
});
setupEmojiSearch();
emojiPopup = new PopupWindow(emojiSearchBinding.getRoot(), WindowManager.LayoutParams.MATCH_PARENT, (int) (activity.getResources().getDisplayMetrics().density * 150));
@@ 1413,12 1418,14 @@ public class ConversationFragment extends XmppFragment
public void afterTextChanged(Editable s) {
emojiDebounce.removeCallbacksAndMessages(null);
emojiDebounce.postDelayed(() -> {
- int lastColon = s.toString().lastIndexOf(':');
+ Matcher lastColonMatcher = lastColonPattern.matcher(s);
+ int lastColon = -1;
+ while(lastColonMatcher.find()) lastColon = lastColonMatcher.end();
if (lastColon < 0) {
emojiPopup.dismiss();
return;
}
- final String q = s.toString().substring(lastColon + 1);
+ final String q = s.toString().substring(lastColon);
if (notEmojiSearch.matcher(q).find()) {
emojiPopup.dismiss();
} else {