package com.ydl.ydlcommon.utils;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import com.ydl.ydlcommon.utils.emoji.EmojiManager;
import com.ydl.ydlcommon.utils.emoji.ImageSpanAlignCenter;
import com.ydl.ydlcommon.R;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MoonUtil {
// private static final float DEF_SCALE = 0.6f;
private static final float DEF_SCALE = 0.55f;
private static final float SMALL_SCALE = 0.45F;
public static void identifyFaceExpression(Context context,
View textView, String value,int align ) {
identifyFaceExpression(context, textView, value, align, DEF_SCALE);
}
/**
* 动态正文SetText
* @param context
* @param textView
* @param value 正文
* @param topic 话题
* @param allContent 是否有全文的标示
* @param align
*/
public static void SetTrendContent(Context context,TextView textView, String value,String topic,String allContent,int align){
// viewSetText(textView, mSpannableString);
SpannableString spantopic = new SpannableString(topic);
spantopic.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.platform_text_user)), 0, topic.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spantopic);
SpannableString mSpannableString = makeSpannableStringTags(context, value, DEF_SCALE, align);
textView.append(mSpannableString);
if(!"".equals(allContent)&&allContent!=null){
SpannableString spanallContent = new SpannableString(allContent);
spanallContent.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.platform_text_user)), 0, allContent.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.append(spanallContent);
}
// textView.setMovementMethod(LinkMovementMethod.getInstance());
}
/**
* 动态列表评论 SetText
* @param context
* @param textView
* @param value 评论内容
* @param username 发布评论的人
* @param align
*/
public static void SetDicuss(Context context,TextView textView,String value,String username,String reply_username,int align){
// LogUtil.d("username: "+username+ " reply username: "+reply_username);
if(!"".equals(reply_username)&&reply_username!=null){
SpannableString spantuser = new SpannableString(username);
spantuser.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.platform_default_text_color)), 0, username.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spantuser);
textView.append("回复");
String reply_user_name=reply_username+":";
SpannableString spantreplyuser = new SpannableString(reply_user_name);
spantreplyuser.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.platform_default_text_color)), 0, reply_user_name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.append(spantreplyuser);
SpannableString mSpannableString = makeSpannableStringTags2(context, value, 0.45f, align);
textView.append(mSpannableString);
}else {
String usernamed=username+":";
SpannableString spantuser = new SpannableString(usernamed);
spantuser.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.platform_default_text_color)), 0, usernamed.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spantuser);
SpannableString mSpannableString = makeSpannableStringTags2(context, value, 0.45f, align);
textView.append(mSpannableString);
}
}
public static void SetItemDicussContent(Context context,TextView textView,String value,String username,String reply_username,int align){
if(!"".equals(reply_username)&&reply_username!=null){
textView.setText("回复");
String reply_user_name=reply_username+":";
SpannableString spantreplyuser = new SpannableString(reply_user_name);
spantreplyuser.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.platform_text_user)), 0, reply_user_name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.append(spantreplyuser);
SpannableString mSpannableString = makeSpannableStringTags2(context, value, 0.45f, align);
textView.append(mSpannableString);
}else {
String usernamed=username+":";
SpannableString spantuser = new SpannableString(usernamed);
spantuser.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.platform_text_user)), 0, usernamed.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spantuser);
SpannableString mSpannableString = makeSpannableStringTags2(context, value, 0.45f, align);
textView.append(mSpannableString);
}
}
/**
* 动态列表评论 SetText
* @param context
* @param textView
* @param value 评论内容
* @param username 发布评论的人
* @param textColor 替换文字颜色
* @param align
*/
public static void SetDicuss(Context context,TextView textView,String value,String username,int textColor,String reply_username,int align){
if(!"".equals(reply_username)&&reply_username!=null){
SpannableString spantuser = new SpannableString(username);
spantuser.setSpan(new ForegroundColorSpan(context.getResources().getColor(textColor)), 0, username.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spantuser);
textView.append("回复");
String reply_user_name=reply_username+":";
SpannableString spantreplyuser = new SpannableString(reply_user_name);
spantreplyuser.setSpan(new ForegroundColorSpan(context.getResources().getColor(textColor)), 0, reply_user_name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.append(spantreplyuser);
SpannableString mSpannableString = makeSpannableStringTags2(context, value, 0.45f, align);
textView.append(mSpannableString);
}else {
String usernamed=username+":";
SpannableString spantuser = new SpannableString(usernamed);
spantuser.setSpan(new ForegroundColorSpan(context.getResources().getColor(textColor)), 0, usernamed.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spantuser);
SpannableString mSpannableString = makeSpannableStringTags2(context, value, 0.45f, align);
textView.append(mSpannableString);
}
}
public static void identifyFaceExpressionAndATags(Context context,
View textView, String value,int align){
SpannableString mSpannableString = makeSpannableStringTags(context, value, DEF_SCALE, align);
viewSetText(textView, mSpannableString);
}
/** 具体类型的view设置内容
* @param textView
* @param mSpannableString
*/
private static void viewSetText(View textView, SpannableString mSpannableString) {
if(textView instanceof TextView) {
TextView tv=(TextView) textView;
tv.setText(mSpannableString);
} else if(textView instanceof EditText) {
EditText et=(EditText) textView;
et.setText(mSpannableString);
}
}
public static void identifyFaceExpression(Context context,
View textView, String value,int align, float scale) {
SpannableString mSpannableString = replaceEmoticons(context, value, scale, align);
viewSetText(textView, mSpannableString);
}
/**
lstmsgviewholder类使用,只需显示a标签对应的文本
*/
public static void identifyFaceExpressionAndTags(Context context,
View textView, String value,int align, float scale) {
SpannableString mSpannableString = makeSpannableStringTags(context, value, scale, align,false);
viewSetText(textView, mSpannableString);
}
// private static SpannableString replaceEmoticons(final Context context, String value, float scale, int align) {
// if(TextUtils.isEmpty(value)) {
// value="";
// }
// SpannableString mSpannableString=null;
// String[] sts=null;
// if(value.contains("4444")){
// sts=value.split("4444");
// }
// if(sts!=null){
// mSpannableString= new SpannableString(sts[0]+sts[1]);
// int start = mSpannableString.length() - sts[1].length() ; //超链接起始位置
// int end = mSpannableString.length(); //超链接结束位置
// final String url=sts[2];
// //可以为多部分设置超链接
// mSpannableString.setSpan(new Clickable(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// DeliveryListener.getL().showHelp(url);
// }
// }), start, end, Spanned.SPAN_MARK_MARK);
// }
// if(mSpannableString==null){
// mSpannableString=new SpannableString(value);
// }
//
// Matcher matcher = EmojiManager.getPattern().matcher(value);
// while (matcher.find()) {
// int start = matcher.start();
// int end = matcher.end();
// String emot = value.substring(start, end);
// Drawable d = getEmotDrawable(context, emot, scale);
// if (d != null) {
// ImageSpan span = new ImageSpan(d, align);
// mSpannableString.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// }
// }
// return mSpannableString;
// }
//2017/5/4 云信DEMOv3.6.0
private static SpannableString replaceEmoticons(Context context, String value, float scale, int align) {
if(TextUtils.isEmpty(value)) {
value="";
}
SpannableString mSpannableString = new SpannableString(value);
Matcher matcher = EmojiManager.getPattern().matcher(value);
while (matcher.find()) {
int start = matcher.start();
int end = matcher.end();
String emot = value.substring(start, end);
Drawable d = getEmotDrawable(context, emot, scale);
if (d != null) {
ImageSpan span = new ImageSpan(d, align);
mSpannableString.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
return mSpannableString;
}
private static Pattern mATagPattern = Pattern.compile("<a.*?>.*?</a>");
public static SpannableString makeSpannableStringTags(Context context, String value,float scale,int align) {
return makeSpannableStringTags(context, value, DEF_SCALE, align, true);
}
public static SpannableString makeSpannableStringTags2(Context context, String value,float scale,int align) {
return makeSpannableStringTags(context, value, scale, align, true);
}
// public static SpannableString makeSpannableStringTags(Context context, String value,float scale,int align,boolean bTagClickable) {
// ArrayList<ATagSpan> tagSpans = new ArrayList<ATagSpan>();
// if(TextUtils.isEmpty(value)){
// value="";
// }
// //a标签需要替换原始文本,放在moonutil类中
// Matcher aTagMatcher = mATagPattern.matcher(value);
//
// int start =0;
// int end = 0;
// while (aTagMatcher.find()) {
// start = aTagMatcher.start();
// end = aTagMatcher.end();
// String atagString = value.substring(start, end);
// ATagSpan tagSpan = getTagSpan(atagString);
// value = value.substring(0,start)+tagSpan.getTag()+value.substring(end);
// tagSpan.setRange(start, start+tagSpan.getTag().length());
// tagSpans.add(tagSpan);
// aTagMatcher= mATagPattern.matcher(value);
// }
//
//
// SpannableString mSpannableString = new SpannableString(value);
// Matcher matcher = EmojiManager.getPattern().matcher(value);
// while (matcher.find()) {
// start = matcher.start();
// end = matcher.end();
// String emot = value.substring(start, end);
// Drawable d = getEmotDrawable(context, emot, scale);
// if (d != null) {
// ImageSpan span = new ImageSpan(d, align);
// mSpannableString.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// }
// }
//
// if(bTagClickable){
// for(ATagSpan tagSpan:tagSpans){
// mSpannableString.setSpan(tagSpan, tagSpan.start, tagSpan.end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// }
// }
//
// return mSpannableString;
// }
//: 2017/5/4 云信DEMOv3.6.0
public static SpannableString makeSpannableStringTags(Context context, String value,float scale,int align,boolean bTagClickable) {
ArrayList<ATagSpan> tagSpans = new ArrayList<ATagSpan>();
if(TextUtils.isEmpty(value)){
value="";
}
//a标签需要替换原始文本,放在moonutil类中
Matcher aTagMatcher = mATagPattern.matcher(value);
int start =0;
int end = 0;
while (aTagMatcher.find()) {
start = aTagMatcher.start();
end = aTagMatcher.end();
String atagString = value.substring(start, end);
ATagSpan tagSpan = getTagSpan(atagString);
value = value.substring(0,start)+tagSpan.getTag()+value.substring(end);
tagSpan.setRange(start, start+tagSpan.getTag().length());
tagSpans.add(tagSpan);
aTagMatcher= mATagPattern.matcher(value);
}
SpannableString mSpannableString = new SpannableString(value);
Matcher matcher = EmojiManager.getPattern().matcher(value);
while (matcher.find()) {
start = matcher.start();
end = matcher.end();
String emot = value.substring(start, end);
Drawable d = getEmotDrawable(context, emot, scale);
if (d != null) {
ImageSpan span = align == -1 ? new ImageSpanAlignCenter(d) : new ImageSpan(d, align);
mSpannableString.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
if(bTagClickable){
for(ATagSpan tagSpan:tagSpans){
mSpannableString.setSpan(tagSpan, tagSpan.start, tagSpan.end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
return mSpannableString;
}
public static void replaceEmoticons(Context context, Editable editable, int start, int count) {
if (count <= 0 || editable.length() < start + count)
return;
CharSequence s = editable.subSequence(start, start + count);
Matcher matcher = EmojiManager.getPattern().matcher(s);
while (matcher.find()) {
int from = start + matcher.start();
int to = start + matcher.end();
String emot = editable.subSequence(from, to).toString();
Drawable d = getEmotDrawable(context, emot, SMALL_SCALE);
if (d != null) {
ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BOTTOM);
editable.setSpan(span, from, to, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
private static Drawable getEmotDrawable(Context context, String text, float scale) {
Drawable drawable = EmojiManager.getDrawable(context, text);
// scale
if (drawable != null) {
int width = (int) (drawable.getIntrinsicWidth() * scale);
int height = (int) (drawable.getIntrinsicHeight() * scale);
drawable.setBounds(0, 0, width, height);
}
return drawable;
}
private static ATagSpan getTagSpan(String text){
String href = null;
String tag = null;
if(text.toLowerCase().contains("href")){
int start = text.indexOf("\"");
int end = text.indexOf("\"",start+1);
if(end>start)
href =text.substring(start+1, end);
}
int start = text.indexOf(">");
int end = text.indexOf("<", start);
if(end>start)
tag = text.substring(start+1,end);
return new ATagSpan(tag,href);
}
private static class ATagSpan extends ClickableSpan{
private int start;
private int end;
private String mUrl;
private String tag;
ATagSpan(String tag, String url) {
this.tag = tag;
this.mUrl = url;
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(true);
}
public String getTag(){
return tag;
}
public void setRange(int start,int end){
this.start = start;
this.end = end;
}
@Override
public void onClick(View widget) {
try {
if (TextUtils.isEmpty(mUrl))
return;
Uri uri = Uri.parse(mUrl);
String scheme = uri.getScheme();
if (TextUtils.isEmpty(scheme)) {
mUrl = "http://" + mUrl;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}