use of org.telegram.ui.Components.AnchorSpan in project Telegram-FOSS by Telegram-FOSS-Team.
the class ArticleViewer method getText.
private CharSequence getText(TLRPC.WebPage page, View parentView, TLRPC.RichText parentRichText, TLRPC.RichText richText, TLRPC.PageBlock parentBlock, int maxWidth) {
if (richText == null) {
return null;
}
if (richText instanceof TLRPC.TL_textFixed) {
return getText(page, parentView, parentRichText, ((TLRPC.TL_textFixed) richText).text, parentBlock, maxWidth);
} else if (richText instanceof TLRPC.TL_textItalic) {
return getText(page, parentView, parentRichText, ((TLRPC.TL_textItalic) richText).text, parentBlock, maxWidth);
} else if (richText instanceof TLRPC.TL_textBold) {
return getText(page, parentView, parentRichText, ((TLRPC.TL_textBold) richText).text, parentBlock, maxWidth);
} else if (richText instanceof TLRPC.TL_textUnderline) {
return getText(page, parentView, parentRichText, ((TLRPC.TL_textUnderline) richText).text, parentBlock, maxWidth);
} else if (richText instanceof TLRPC.TL_textStrike) {
return getText(page, parentView, parentRichText, ((TLRPC.TL_textStrike) richText).text, parentBlock, maxWidth);
} else if (richText instanceof TLRPC.TL_textEmail) {
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getText(page, parentView, parentRichText, ((TLRPC.TL_textEmail) richText).text, parentBlock, maxWidth));
MetricAffectingSpan[] innerSpans = spannableStringBuilder.getSpans(0, spannableStringBuilder.length(), MetricAffectingSpan.class);
if (spannableStringBuilder.length() != 0) {
spannableStringBuilder.setSpan(new TextPaintUrlSpan(innerSpans == null || innerSpans.length == 0 ? getTextPaint(parentRichText, richText, parentBlock) : null, "mailto:" + getUrl(richText)), 0, spannableStringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return spannableStringBuilder;
} else if (richText instanceof TLRPC.TL_textUrl) {
TLRPC.TL_textUrl textUrl = (TLRPC.TL_textUrl) richText;
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getText(page, parentView, parentRichText, ((TLRPC.TL_textUrl) richText).text, parentBlock, maxWidth));
MetricAffectingSpan[] innerSpans = spannableStringBuilder.getSpans(0, spannableStringBuilder.length(), MetricAffectingSpan.class);
TextPaint paint = innerSpans == null || innerSpans.length == 0 ? getTextPaint(parentRichText, richText, parentBlock) : null;
MetricAffectingSpan span;
if (textUrl.webpage_id != 0) {
span = new TextPaintWebpageUrlSpan(paint, getUrl(richText));
} else {
span = new TextPaintUrlSpan(paint, getUrl(richText));
}
if (spannableStringBuilder.length() != 0) {
spannableStringBuilder.setSpan(span, 0, spannableStringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return spannableStringBuilder;
} else if (richText instanceof TLRPC.TL_textPlain) {
return ((TLRPC.TL_textPlain) richText).text;
} else if (richText instanceof TLRPC.TL_textAnchor) {
TLRPC.TL_textAnchor textAnchor = (TLRPC.TL_textAnchor) richText;
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getText(page, parentView, parentRichText, textAnchor.text, parentBlock, maxWidth));
spannableStringBuilder.setSpan(new AnchorSpan(textAnchor.name), 0, spannableStringBuilder.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
return spannableStringBuilder;
} else if (richText instanceof TLRPC.TL_textEmpty) {
return "";
} else if (richText instanceof TLRPC.TL_textConcat) {
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
int count = richText.texts.size();
for (int a = 0; a < count; a++) {
TLRPC.RichText innerRichText = richText.texts.get(a);
TLRPC.RichText lastRichText = getLastRichText(innerRichText);
boolean extraSpace = maxWidth >= 0 && innerRichText instanceof TLRPC.TL_textUrl && ((TLRPC.TL_textUrl) innerRichText).webpage_id != 0;
if (extraSpace && spannableStringBuilder.length() != 0 && spannableStringBuilder.charAt(spannableStringBuilder.length() - 1) != '\n') {
spannableStringBuilder.append(" ");
spannableStringBuilder.setSpan(new TextSelectionHelper.IgnoreCopySpannable(), spannableStringBuilder.length() - 1, spannableStringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
CharSequence innerText = getText(page, parentView, parentRichText, innerRichText, parentBlock, maxWidth);
int flags = getTextFlags(lastRichText);
int startLength = spannableStringBuilder.length();
spannableStringBuilder.append(innerText);
if (flags != 0 && !(innerText instanceof SpannableStringBuilder)) {
if ((flags & TEXT_FLAG_URL) != 0 || (flags & TEXT_FLAG_WEBPAGE_URL) != 0) {
String url = getUrl(innerRichText);
if (url == null) {
url = getUrl(parentRichText);
}
MetricAffectingSpan span;
if ((flags & TEXT_FLAG_WEBPAGE_URL) != 0) {
span = new TextPaintWebpageUrlSpan(getTextPaint(parentRichText, lastRichText, parentBlock), url);
} else {
span = new TextPaintUrlSpan(getTextPaint(parentRichText, lastRichText, parentBlock), url);
}
if (startLength != spannableStringBuilder.length()) {
spannableStringBuilder.setSpan(span, startLength, spannableStringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
} else {
if (startLength != spannableStringBuilder.length()) {
spannableStringBuilder.setSpan(new TextPaintSpan(getTextPaint(parentRichText, lastRichText, parentBlock)), startLength, spannableStringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
if (extraSpace && a != count - 1) {
spannableStringBuilder.append(" ");
spannableStringBuilder.setSpan(new TextSelectionHelper.IgnoreCopySpannable(), spannableStringBuilder.length() - 1, spannableStringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
return spannableStringBuilder;
} else if (richText instanceof TLRPC.TL_textSubscript) {
return getText(page, parentView, parentRichText, ((TLRPC.TL_textSubscript) richText).text, parentBlock, maxWidth);
} else if (richText instanceof TLRPC.TL_textSuperscript) {
return getText(page, parentView, parentRichText, ((TLRPC.TL_textSuperscript) richText).text, parentBlock, maxWidth);
} else if (richText instanceof TLRPC.TL_textMarked) {
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getText(page, parentView, parentRichText, ((TLRPC.TL_textMarked) richText).text, parentBlock, maxWidth));
MetricAffectingSpan[] innerSpans = spannableStringBuilder.getSpans(0, spannableStringBuilder.length(), MetricAffectingSpan.class);
if (spannableStringBuilder.length() != 0) {
spannableStringBuilder.setSpan(new TextPaintMarkSpan(innerSpans == null || innerSpans.length == 0 ? getTextPaint(parentRichText, richText, parentBlock) : null), 0, spannableStringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return spannableStringBuilder;
} else if (richText instanceof TLRPC.TL_textPhone) {
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getText(page, parentView, parentRichText, ((TLRPC.TL_textPhone) richText).text, parentBlock, maxWidth));
MetricAffectingSpan[] innerSpans = spannableStringBuilder.getSpans(0, spannableStringBuilder.length(), MetricAffectingSpan.class);
if (spannableStringBuilder.length() != 0) {
spannableStringBuilder.setSpan(new TextPaintUrlSpan(innerSpans == null || innerSpans.length == 0 ? getTextPaint(parentRichText, richText, parentBlock) : null, "tel:" + getUrl(richText)), 0, spannableStringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return spannableStringBuilder;
} else if (richText instanceof TLRPC.TL_textImage) {
TLRPC.TL_textImage textImage = (TLRPC.TL_textImage) richText;
TLRPC.Document document = WebPageUtils.getDocumentWithId(page, textImage.document_id);
if (document != null) {
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("*");
int w = AndroidUtilities.dp(textImage.w);
int h = AndroidUtilities.dp(textImage.h);
maxWidth = Math.abs(maxWidth);
if (w > maxWidth) {
float scale = maxWidth / (float) w;
w = maxWidth;
h *= scale;
}
if (parentView != null) {
int color = Theme.getColor(Theme.key_windowBackgroundWhite);
float lightness = (0.2126f * Color.red(color) + 0.7152f * Color.green(color) + 0.0722f * Color.blue(color)) / 255.0f;
spannableStringBuilder.setSpan(new TextPaintImageReceiverSpan(parentView, document, page, w, h, false, lightness <= 0.705f), 0, spannableStringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return spannableStringBuilder;
} else {
return "";
}
}
return "not supported " + richText;
}
use of org.telegram.ui.Components.AnchorSpan in project Telegram-FOSS by Telegram-FOSS-Team.
the class ArticleViewer method createLayoutForText.
private DrawingText createLayoutForText(View parentView, CharSequence plainText, TLRPC.RichText richText, int width, int textY, TLRPC.PageBlock parentBlock, Layout.Alignment align, int maxLines, WebpageAdapter parentAdapter) {
if (plainText == null && (richText == null || richText instanceof TLRPC.TL_textEmpty)) {
return null;
}
if (width < 0) {
width = AndroidUtilities.dp(10);
}
CharSequence text;
if (plainText != null) {
text = plainText;
} else {
text = getText(parentAdapter, parentView, richText, richText, parentBlock, width);
}
if (TextUtils.isEmpty(text)) {
return null;
}
int additionalSize = AndroidUtilities.dp(SharedConfig.ivFontSize - 16);
TextPaint paint;
if (parentBlock instanceof TLRPC.TL_pageBlockEmbedPost && richText == null) {
TLRPC.TL_pageBlockEmbedPost pageBlockEmbedPost = (TLRPC.TL_pageBlockEmbedPost) parentBlock;
if (pageBlockEmbedPost.author == plainText) {
if (embedPostAuthorPaint == null) {
embedPostAuthorPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
embedPostAuthorPaint.setColor(getTextColor());
}
embedPostAuthorPaint.setTextSize(AndroidUtilities.dp(15) + additionalSize);
paint = embedPostAuthorPaint;
} else {
if (embedPostDatePaint == null) {
embedPostDatePaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
embedPostDatePaint.setColor(getGrayTextColor());
}
embedPostDatePaint.setTextSize(AndroidUtilities.dp(14) + additionalSize);
paint = embedPostDatePaint;
}
} else if (parentBlock instanceof TLRPC.TL_pageBlockChannel) {
if (channelNamePaint == null) {
channelNamePaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
channelNamePaint.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
channelNamePhotoPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
channelNamePhotoPaint.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
}
channelNamePaint.setColor(getTextColor());
channelNamePaint.setTextSize(AndroidUtilities.dp(15));
channelNamePhotoPaint.setColor(0xffffffff);
channelNamePhotoPaint.setTextSize(AndroidUtilities.dp(15));
paint = parentAdapter.channelBlock != null ? channelNamePhotoPaint : channelNamePaint;
} else if (parentBlock instanceof TL_pageBlockRelatedArticlesChild) {
TL_pageBlockRelatedArticlesChild pageBlockRelatedArticlesChild = (TL_pageBlockRelatedArticlesChild) parentBlock;
if (plainText == pageBlockRelatedArticlesChild.parent.articles.get(pageBlockRelatedArticlesChild.num).title) {
if (relatedArticleHeaderPaint == null) {
relatedArticleHeaderPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
relatedArticleHeaderPaint.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
}
relatedArticleHeaderPaint.setColor(getTextColor());
relatedArticleHeaderPaint.setTextSize(AndroidUtilities.dp(15) + additionalSize);
paint = relatedArticleHeaderPaint;
} else {
if (relatedArticleTextPaint == null) {
relatedArticleTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
}
relatedArticleTextPaint.setColor(getGrayTextColor());
relatedArticleTextPaint.setTextSize(AndroidUtilities.dp(14) + additionalSize);
paint = relatedArticleTextPaint;
}
} else if (isListItemBlock(parentBlock) && plainText != null) {
if (listTextPointerPaint == null) {
listTextPointerPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
listTextPointerPaint.setColor(getTextColor());
}
if (listTextNumPaint == null) {
listTextNumPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
listTextNumPaint.setColor(getTextColor());
}
listTextPointerPaint.setTextSize(AndroidUtilities.dp(19) + additionalSize);
listTextNumPaint.setTextSize(AndroidUtilities.dp(16) + additionalSize);
if (parentBlock instanceof TL_pageBlockListItem && !((TL_pageBlockListItem) parentBlock).parent.pageBlockList.ordered) {
paint = listTextPointerPaint;
} else {
paint = listTextNumPaint;
}
} else {
paint = getTextPaint(richText, richText, parentBlock);
}
StaticLayout result;
if (maxLines != 0) {
if (parentBlock instanceof TLRPC.TL_pageBlockPullquote) {
result = StaticLayoutEx.createStaticLayout(text, paint, width, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false, TextUtils.TruncateAt.END, width, maxLines);
} else {
result = StaticLayoutEx.createStaticLayout(text, paint, width, align, 1.0f, AndroidUtilities.dp(4), false, TextUtils.TruncateAt.END, width, maxLines);
}
} else {
if (text.charAt(text.length() - 1) == '\n') {
text = text.subSequence(0, text.length() - 1);
}
if (parentBlock instanceof TLRPC.TL_pageBlockPullquote) {
result = new StaticLayout(text, paint, width, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false);
} else {
result = new StaticLayout(text, paint, width, align, 1.0f, AndroidUtilities.dp(4), false);
}
}
if (result == null) {
return null;
}
CharSequence finalText = result.getText();
LinkPath textPath = null;
LinkPath markPath = null;
if (textY >= 0) {
if (result != null && !searchResults.isEmpty() && searchText != null) {
String lowerString = text.toString().toLowerCase();
int startIndex = 0;
int index;
while ((index = lowerString.indexOf(searchText, startIndex)) >= 0) {
startIndex = index + searchText.length();
if (index == 0 || AndroidUtilities.isPunctuationCharacter(lowerString.charAt(index - 1))) {
adapter[0].searchTextOffset.put(searchText + parentBlock + richText + index, textY + result.getLineTop(result.getLineForOffset(index)));
}
}
}
}
if (result != null && finalText instanceof Spanned) {
Spanned spanned = (Spanned) finalText;
try {
AnchorSpan[] innerSpans = spanned.getSpans(0, spanned.length(), AnchorSpan.class);
int linesCount = result.getLineCount();
if (innerSpans != null && innerSpans.length > 0) {
for (int a = 0; a < innerSpans.length; a++) {
if (linesCount <= 1) {
parentAdapter.anchorsOffset.put(innerSpans[a].getName(), textY);
} else {
parentAdapter.anchorsOffset.put(innerSpans[a].getName(), textY + result.getLineTop(result.getLineForOffset(spanned.getSpanStart(innerSpans[a]))));
}
}
}
} catch (Exception ignore) {
}
try {
TextPaintWebpageUrlSpan[] innerSpans = spanned.getSpans(0, spanned.length(), TextPaintWebpageUrlSpan.class);
if (innerSpans != null && innerSpans.length > 0) {
textPath = new LinkPath(true);
textPath.setAllowReset(false);
for (int a = 0; a < innerSpans.length; a++) {
int start = spanned.getSpanStart(innerSpans[a]);
int end = spanned.getSpanEnd(innerSpans[a]);
textPath.setCurrentLayout(result, start, 0);
int shift = innerSpans[a].getTextPaint() != null ? innerSpans[a].getTextPaint().baselineShift : 0;
textPath.setBaselineShift(shift != 0 ? shift + AndroidUtilities.dp(shift > 0 ? 5 : -2) : 0);
result.getSelectionPath(start, end, textPath);
}
textPath.setAllowReset(true);
}
} catch (Exception ignore) {
}
try {
TextPaintMarkSpan[] innerSpans = spanned.getSpans(0, spanned.length(), TextPaintMarkSpan.class);
if (innerSpans != null && innerSpans.length > 0) {
markPath = new LinkPath(true);
markPath.setAllowReset(false);
for (int a = 0; a < innerSpans.length; a++) {
int start = spanned.getSpanStart(innerSpans[a]);
int end = spanned.getSpanEnd(innerSpans[a]);
markPath.setCurrentLayout(result, start, 0);
int shift = innerSpans[a].getTextPaint() != null ? innerSpans[a].getTextPaint().baselineShift : 0;
markPath.setBaselineShift(shift != 0 ? shift + AndroidUtilities.dp(shift > 0 ? 5 : -2) : 0);
result.getSelectionPath(start, end, markPath);
}
markPath.setAllowReset(true);
}
} catch (Exception ignore) {
}
}
DrawingText drawingText = new DrawingText();
drawingText.textLayout = result;
drawingText.textPath = textPath;
drawingText.markPath = markPath;
drawingText.parentBlock = parentBlock;
drawingText.parentText = richText;
return drawingText;
}
Aggregations