package im.actor.sdk.view; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.style.ForegroundColorSpan; import java.util.List; import im.actor.core.util.StringMatch; import im.actor.sdk.util.Strings; public class SearchHighlight { public static Spannable highlightQuery(String src, String query, int color) { String matchString = src.toLowerCase().replace("@", " "); SpannableStringBuilder builder = new SpannableStringBuilder(src); if (matchString.startsWith(query)) { builder.setSpan(new ForegroundColorSpan(color), 0, query.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); } else { int index = matchString.indexOf(" " + query); if (index >= 0) { builder.setSpan(new ForegroundColorSpan(color), index + 1, index + 1 + query.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); } } return builder; } public static Spannable highlightMentionsQuery(String src, String query, int color) { String matchString = src.toLowerCase(); SpannableStringBuilder builder = new SpannableStringBuilder(src); int index = matchString.indexOf(" " + query); if (matchString.startsWith(query) || Strings.transliterate(matchString).startsWith(query)) { builder.setSpan(new ForegroundColorSpan(color), 0, query.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); } else if (index >= 0) { builder.setSpan(new ForegroundColorSpan(color), index + 1, index + 1 + query.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); } else if (query.length() == 2) { builder.setSpan(new ForegroundColorSpan(color), 0, 1, Spanned.SPAN_INCLUSIVE_INCLUSIVE); int spaceIndex = matchString.indexOf(" "); builder.setSpan(new ForegroundColorSpan(color), spaceIndex + 1, spaceIndex + 2, Spanned.SPAN_INCLUSIVE_INCLUSIVE); } return builder; } public static Spannable highlightMentionsQuery(String src, List<StringMatch> matches, int color) { SpannableStringBuilder builder = new SpannableStringBuilder(src); for (StringMatch sm : matches) { builder.setSpan(new ForegroundColorSpan(color), sm.getStart(), sm.getStart() + sm.getLength(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); } return builder; } }