private Spannable highlightText(String text) { Spannable highlightedSpannable = Spannable.Factory.getInstance().newSpannable(text); if (highlight == null) { return highlightedSpannable; } Pattern pattern = Pattern.compile(highlight, Pattern.LITERAL | Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(text); while (matcher.find()) { highlightedSpannable.setSpan( new ForegroundColorSpan(context.getResources().getColor(android.R.color.holo_blue_light)), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } return highlightedSpannable; }
int off = layout.getOffsetForHorizontal(line, x); ClickableSpan[] links = Spannable.Factory.getInstance() .newSpannable(widget.getText()) .getSpans(off, off, ClickableSpan.class);
protected static boolean setSubject(final TextView tv, final String s, final String t, final int flags) { if (tv == null) return false; if ((flags & ChanThread.THREAD_FLAG_HEADER) > 0) { tv.setVisibility(View.GONE); tv.setText(""); return true; } String u = (s != null && !s.isEmpty() ? "<b>" + s + "</b>" : "") + (s != null && t != null && !s.isEmpty() && !t.isEmpty() ? "<br/>" : "") + (t != null && !t.isEmpty() ? t : ""); if (DEBUG) Log.i(TAG, "setSubject tv=" + tv + " u=" + u); if (!u.isEmpty()) { String html = ThreadViewer.markupHtml(u); Spannable spannable = Spannable.Factory.getInstance().newSpannable(Html.fromHtml(html, null, spoilerTagHandler)); tv.setText(spannable); tv.setVisibility(View.VISIBLE); } else { tv.setVisibility(View.GONE); tv.setText(""); } return true; }
static private boolean setHeaderValue(ThreadViewHolder viewHolder, final Cursor cursor, // View.OnClickListener repliesOnClickListener, View.OnClickListener sameIdOnClickListener) { TextView tv = viewHolder.list_item_header; if (tv == null) return false; String text = cursor.getString(cursor .getColumnIndex(ChanPost.POST_HEADLINE_TEXT)); if (text == null || text.isEmpty()) { tv.setVisibility(View.GONE); tv.setText(""); return true; } // if (repliesOnClickListener != null || sameIdOnClickListener != null) // tv.setMovementMethod(LinkMovementMethod.getInstance()); Spannable spannable = Spannable.Factory.getInstance().newSpannable( Html.fromHtml(text)); // if (repliesOnClickListener != null) // addLinkedSpans(spannable, REPLY_PATTERN, repliesOnClickListener); if (cursor.getBlob(cursor.getColumnIndex(ChanPost.POST_SAME_IDS_BLOB)) != null && sameIdOnClickListener != null) { tv.setMovementMethod(LinkMovementMethod.getInstance()); addLinkedSpans(spannable, ID_PATTERN, sameIdOnClickListener); } FontSize.sizeTextView(tv); tv.setText(spannable); tv.setVisibility(View.VISIBLE); return true; }
@Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { int x = (int) event.getX(); int y = (int) event.getY(); TextView widget = (TextView) v; x -= widget.getTotalPaddingLeft(); y -= widget.getTotalPaddingTop(); x += widget.getScrollX(); y += widget.getScrollY(); Layout layout = widget.getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); ClickableSpan[] link = Spannable.Factory.getInstance() .newSpannable(widget.getText()) .getSpans(off, off, ClickableSpan.class); if (link.length != 0) { if (action == MotionEvent.ACTION_UP) { link[0].onClick(widget); } return true; } } return false; } });
@SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { int x = (int) event.getX(); int y = (int) event.getY(); TextView widget = (TextView) v; x -= widget.getTotalPaddingLeft(); y -= widget.getTotalPaddingTop(); x += widget.getScrollX(); y += widget.getScrollY(); Layout layout = widget.getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); ClickableSpan[] link = Spannable.Factory.getInstance() .newSpannable(widget.getText()) .getSpans(off, off, ClickableSpan.class); if (link.length != 0) { if (action == MotionEvent.ACTION_UP) { link[0].onClick(widget); } return true; } } return false; } });
@Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { int x = (int) event.getX(); int y = (int) event.getY(); TextView widget = (TextView) v; x -= widget.getTotalPaddingLeft(); y -= widget.getTotalPaddingTop(); x += widget.getScrollX(); y += widget.getScrollY(); Layout layout = widget.getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); ClickableSpan[] link = Spannable.Factory.getInstance() .newSpannable(widget.getText()) .getSpans(off, off, ClickableSpan.class); if (link.length != 0) { if (action == MotionEvent.ACTION_UP) { link[0].onClick(widget); } return true; } } return false; } });
@Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { int x = (int) event.getX(); int y = (int) event.getY(); TextView widget = (TextView) v; x -= widget.getTotalPaddingLeft(); y -= widget.getTotalPaddingTop(); x += widget.getScrollX(); y += widget.getScrollY(); Layout layout = widget.getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); ClickableSpan[] link = Spannable.Factory.getInstance() .newSpannable(widget.getText()) .getSpans(off, off, ClickableSpan.class); if (link.length != 0) { if (action == MotionEvent.ACTION_UP) { link[0].onClick(widget); } return true; } } return false; } });
private void processNoIntralineDataA( DiffContentInfo diff, DiffInfoModel m, String line, int color) { final Spannable.Factory spannableFactory = Spannable.Factory.getInstance(); if (diff.a != null && diff.b != null && diff.a.length == 1 && diff.b.length == 1) { Spannable span = spannableFactory.newSpannable(prepareTabs(line)); int z = diff.a[0].indexOf(diff.b[0]); if (z != -1) { if (z > 0) { span.setSpan(new BackgroundColorSpan(color), 0, z, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } if (z + diff.b[0].length() < diff.a[0].length()) { z = z + diff.b[0].length(); span.setSpan(new BackgroundColorSpan(color), z, diff.a[0].length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } m.lineA = span; } else { m.lineA = prepareTabs(line); } }
private void processNoIntralineDataB( DiffContentInfo diff, DiffInfoModel m, String line, int color) { final Spannable.Factory spannableFactory = Spannable.Factory.getInstance(); if (diff.a != null && diff.b != null && diff.a.length == 1 && diff.b.length == 1) { Spannable span = spannableFactory.newSpannable(prepareTabs(line)); int z = diff.b[0].indexOf(diff.a[0]); if (z != -1) { if (z > 0) { span.setSpan(new BackgroundColorSpan(color), 0, z, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } if (z + diff.a[0].length() < diff.b[0].length()) { z = z + diff.a[0].length(); span.setSpan(new BackgroundColorSpan(color), z, diff.b[0].length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } m.lineB = span; } else { m.lineB = prepareTabs(line); } }
private CharSequence performFilterHighlight(Suggestion suggestion) { Spannable span = Spannable.Factory.getInstance().newSpannable(suggestion.mSuggestionText); int pos = 0; final Locale locale = AndroidHelper.getCurrentLocale(getApplicationContext()); final String suggestionNoCase = suggestion.mSuggestionText.toLowerCase(locale); final String filterNoCase = suggestion.mFilter.toLowerCase(locale); while ((pos = suggestionNoCase.indexOf(filterNoCase, pos)) != -1) { final int length = suggestion.mFilter.length(); if (length == 0) { break; } final StyleSpan bold = new StyleSpan(android.graphics.Typeface.BOLD); final ForegroundColorSpan color = new ForegroundColorSpan( ContextCompat.getColor(this, R.color.accent)); span.setSpan(bold, pos, pos + length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); span.setSpan(color, pos, pos + length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); pos += length; if (pos >= suggestionNoCase.length()) { break; } } return span; }
private CharSequence processHighlightTrailingSpaces(CharSequence text) { final Context context = mContext.get(); if (context == null) { return text; } if (!mHighlightTrailingWhitespaces) { return text; } int color = ContextCompat.getColor(context, R.color.diffHighlightColor); final Spannable.Factory spannableFactory = Spannable.Factory.getInstance(); String line = text.toString(); final Matcher matcher = HIGHLIGHT_TRAIL_SPACES_PATTERN.matcher(line); if (matcher.find()) { int start = matcher.start(); int end = matcher.end(); Spannable span = spannableFactory.newSpannable(text); span.setSpan(new BackgroundColorSpan(color), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); return span; } return text; }
private void bindPredefinedRepositoriesLink() { mBinding.repositoryPredefined.setMovementMethod(BetterLinkMovementMethod.getInstance()); String msg = getString(R.string.account_wizard_repository_page_message2); String link = getString(R.string.account_wizard_repository_page_message2_predefined); String text = String.format(Locale.getDefault(), msg, link); int pos = msg.indexOf("%1$s"); // Create a clickable span Spannable span = Spannable.Factory.getInstance().newSpannable(text); if (pos >= 0) { span.setSpan(new ClickableSpan() { @Override public void onClick(@NonNull View v) { // Click on span doesn't provide sound feedback it the text view doesn't // handle a click event. Just perform a click effect. v.playSoundEffect(SoundEffectConstants.CLICK); performOpenPredefinedRepositories(); } }, pos, pos + link.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } mBinding.repositoryPredefined.setText(span); }
private Spannable highlightOccurrences(String s) { final Locale locale = AndroidHelper.getCurrentLocale(mContext); String constraint = mFilter.mConstraint.toString().toLowerCase(locale); Spannable spannable = Spannable.Factory.getInstance().newSpannable(s); int index = 0; int len = constraint.length(); String s1 = s.toLowerCase(locale); while (true) { index = s1.indexOf(constraint, index); if (index == -1) { break; } final StyleSpan bold = new StyleSpan(android.graphics.Typeface.BOLD); spannable.setSpan(bold, index, index + len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); index += len; } return spannable; }
private Spannable highlightOccurrences(String s) { String constraint = mFilter.mConstraint.toString().toLowerCase(Locale.US); Spannable spannable = Spannable.Factory.getInstance().newSpannable(s); int index = 0; int len = constraint.length(); String s1 = s.toLowerCase(Locale.US); while (true) { index = s1.indexOf(constraint, index); if (index == -1) { break; } final StyleSpan bold = new StyleSpan(android.graphics.Typeface.BOLD); spannable.setSpan(bold, index, index + len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); index += len; } return spannable; }
public static CharSequence getHtmlText(NetworkLibrary library, String text) { final Spanned htmlText = Html.fromHtml(text); if (htmlText.getSpans(0, htmlText.length(), URLSpan.class).length == 0) { return htmlText; } final Spannable newHtmlText = Spannable.Factory.getInstance().newSpannable(htmlText); for (URLSpan span : newHtmlText.getSpans(0, newHtmlText.length(), URLSpan.class)) { final int start = newHtmlText.getSpanStart(span); final int end = newHtmlText.getSpanEnd(span); final int flags = newHtmlText.getSpanFlags(span); final String url = library.rewriteUrl(span.getURL(), true); newHtmlText.removeSpan(span); newHtmlText.setSpan(new URLSpan(url), start, end, flags); } return newHtmlText; } }
/** * Copied from {@link PhoneNumberUtils#createTtsSpannable} */ private static CharSequence createTtsSpannableInternal(CharSequence phoneNumber) { if (phoneNumber == null) { return null; } Spannable spannable = Spannable.Factory.getInstance().newSpannable(phoneNumber); addTtsSpanInternal(spannable, 0, spannable.length()); return spannable; }
@Override public void setText(CharSequence text, BufferType type) { // We better use a copy of the text, to avoid messing up with its spans (if any) Spannable textSpannable = Spannable.Factory.getInstance().newSpannable(text); textSpannable = highlightHashtags(textSpannable); textSpannable = highlightUserHandles(textSpannable); textSpannable = highlightUrls(textSpannable); super.setText(textSpannable, BufferType.SPANNABLE); }
@Test public void testSpannableWithClickableSpans() { Spannable clickableText = Spannable.Factory.getInstance().newSpannable("Some text."); clickableText.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { } }, 0, 1, 0); TextDrawable drawable = getMountedDrawableForText(clickableText); assertThat(drawable.getClickableSpans()).isNotNull().hasSize(1); }
@Test public void testSpannableWithoutClickableSpans() { Spannable nonClickableText = Spannable.Factory.getInstance().newSpannable("Some text."); TextDrawable drawable = getMountedDrawableForText(nonClickableText); assertThat(drawable.getClickableSpans()).isNotNull().hasSize(0); }