package com.jasonchen.microlang.utils; import android.graphics.Bitmap; import android.text.SpannableString; import android.text.Spanned; import android.text.TextUtils; import android.text.method.LinkMovementMethod; import android.text.style.ImageSpan; import android.text.style.URLSpan; import android.text.util.Linkify; import android.widget.EditText; import android.widget.TextView; import com.jasonchen.microlang.beans.AdBean; import com.jasonchen.microlang.beans.CommentBean; import com.jasonchen.microlang.beans.DMBean; import com.jasonchen.microlang.beans.DMUserBean; import com.jasonchen.microlang.beans.MessageBean; import com.jasonchen.microlang.beans.MessageListBean; import com.jasonchen.microlang.beans.UserBean; import com.jasonchen.microlang.debug.AppLogger; import com.jasonchen.microlang.lib.MyURLSpan; import com.jasonchen.microlang.lib.MyWeiboDetailURLSpan; import com.jasonchen.microlang.lib.WeiboPatterns; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.regex.Matcher; /** * jasonchen * 2015/04/10 */ public class TimeLineUtility { private TimeLineUtility() { } public static void addLinks(TextView view) { CharSequence content = view.getText(); view.setText(convertNormalStringToWeiboDetailSpannableString(content.toString())); /*if (view.getLinksClickable()) { view.setMovementMethod(LinkMovementMethod.getInstance()); }*/ } public static SpannableString convertNormalStringToSpannableString(String txt) { //hack to fix android imagespan bug,see http://stackoverflow.com/questions/3253148/imagespan-is-cut-off-incorrectly-aligned //if string only contains emotion tags,add a empty char to the end String hackTxt; if (txt.startsWith("[") && txt.endsWith("]")) { hackTxt = txt + " "; } else { hackTxt = txt; } SpannableString value = SpannableString.valueOf(hackTxt); Linkify.addLinks(value, WeiboPatterns.MENTION_URL, WeiboPatterns.MENTION_SCHEME); Linkify.addLinks(value, WeiboPatterns.WEB_URL, WeiboPatterns.WEB_SCHEME); Linkify.addLinks(value, WeiboPatterns.TOPIC_URL, WeiboPatterns.TOPIC_SCHEME); URLSpan[] urlSpans = value.getSpans(0, value.length(), URLSpan.class); MyURLSpan weiboSpan = null; for (URLSpan urlSpan : urlSpans) { weiboSpan = new MyURLSpan(urlSpan.getURL()); int start = value.getSpanStart(urlSpan); int end = value.getSpanEnd(urlSpan); value.removeSpan(urlSpan); value.setSpan(weiboSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } TimeLineUtility.addEmotions(value); return value; } public static SpannableString convertNormalStringToWeiboDetailSpannableString(String txt) { //hack to fix android imagespan bug,see http://stackoverflow.com/questions/3253148/imagespan-is-cut-off-incorrectly-aligned //if string only contains emotion tags,add a empty char to the end String hackTxt; if (txt.startsWith("[") && txt.endsWith("]")) { hackTxt = txt + " "; } else { hackTxt = txt; } SpannableString value = SpannableString.valueOf(hackTxt); Linkify.addLinks(value, WeiboPatterns.MENTION_URL, WeiboPatterns.MENTION_SCHEME); Linkify.addLinks(value, WeiboPatterns.WEB_URL, WeiboPatterns.WEB_SCHEME); Linkify.addLinks(value, WeiboPatterns.TOPIC_URL, WeiboPatterns.TOPIC_SCHEME); URLSpan[] urlSpans = value.getSpans(0, value.length(), URLSpan.class); MyWeiboDetailURLSpan weiboSpan = null; for (URLSpan urlSpan : urlSpans) { weiboSpan = new MyWeiboDetailURLSpan(urlSpan.getURL()); int start = value.getSpanStart(urlSpan); int end = value.getSpanEnd(urlSpan); value.removeSpan(urlSpan); value.setSpan(weiboSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } TimeLineUtility.addEmotions(value); return value; } public static void addJustHighLightLinks(MessageBean bean) { bean.setListViewSpannableString(convertNormalStringToSpannableString(bean.getText())); bean.getSourceString(); if (bean.getRetweeted_status() != null) { bean.getRetweeted_status().setListViewSpannableString( buildOriWeiboSpannalString(bean.getRetweeted_status())); bean.getRetweeted_status().getSourceString(); } } public static void addWeiboDetailJustHighLightLinks(MessageBean bean) { bean.setWeiboDetailListViewSpannableString(convertNormalStringToWeiboDetailSpannableString(bean.getText())); bean.getSourceString(); if (bean.getRetweeted_status() != null) { bean.getRetweeted_status().setWeiboDetailListViewSpannableString( buildWeiboDetailOriWeiboSpannalString(bean.getRetweeted_status())); bean.getRetweeted_status().getSourceString(); } } private static SpannableString buildOriWeiboSpannalString(MessageBean oriMsg) { String name = ""; UserBean oriUser = oriMsg.getUser(); if (oriUser != null) { name = oriUser.getScreen_name(); if (TextUtils.isEmpty(name)) { name = oriUser.getId(); } } SpannableString value; if (!TextUtils.isEmpty(name)) { value = TimeLineUtility .convertNormalStringToSpannableString("@" + name + ":" + oriMsg.getText()); } else { value = TimeLineUtility.convertNormalStringToSpannableString(oriMsg.getText()); } return value; } private static SpannableString buildWeiboDetailOriWeiboSpannalString(MessageBean oriMsg) { String name = ""; UserBean oriUser = oriMsg.getUser(); if (oriUser != null) { name = oriUser.getScreen_name(); if (TextUtils.isEmpty(name)) { name = oriUser.getId(); } } SpannableString value; if (!TextUtils.isEmpty(name)) { value = TimeLineUtility .convertNormalStringToWeiboDetailSpannableString("@" + name + ":" + oriMsg.getText()); } else { value = TimeLineUtility.convertNormalStringToWeiboDetailSpannableString(oriMsg.getText()); } return value; } public static void addJustHighLightLinks(CommentBean bean) { bean.setListViewSpannableString( TimeLineUtility.convertNormalStringToSpannableString(bean.getText())); bean.getSourceString(); if (bean.getStatus() != null) { bean.getStatus() .setListViewSpannableString(buildOriWeiboSpannalString(bean.getStatus())); } if (bean.getReply_comment() != null) { addJustHighLightLinksOnlyReplyComment(bean.getReply_comment()); } } private static void addJustHighLightLinksOnlyReplyComment(CommentBean bean) { String name = ""; UserBean reUser = bean.getUser(); if (reUser != null) { name = reUser.getScreen_name(); } SpannableString value; if (!TextUtils.isEmpty(name)) { value = TimeLineUtility .convertNormalStringToSpannableString("@" + name + ":" + bean.getText()); } else { value = TimeLineUtility.convertNormalStringToSpannableString(bean.getText()); } bean.setListViewSpannableString(value); } public static void addJustHighLightLinks(DMUserBean bean) { bean.setListViewSpannableString( TimeLineUtility.convertNormalStringToSpannableString(bean.getText())); } public static void addJustHighLightLinks(DMBean bean) { bean.setListViewSpannableString( TimeLineUtility.convertNormalStringToSpannableString(bean.getText())); } public static void filterHomeTimeLineSinaWeiboAd(MessageListBean value) { /*if (!SettingUtility.isFilterSinaAd()) { return; }*/ List<MessageBean> msgList = value.getItemList(); Iterator<MessageBean> iterator = msgList.iterator(); final List<AdBean> adBeanList = value.getAd(); if (adBeanList.size() > 0) { AppLogger.i("filter " + adBeanList.size() + " sina weibo ads"); List<String> adIdList = new ArrayList<String>(); for (AdBean adBean : adBeanList) { adIdList.add(adBean.getId()); } while (iterator.hasNext()) { MessageBean msg = iterator.next(); UserBean user = msg.getUser(); if (user == null) { continue; } if (adIdList.contains(msg.getId())) { iterator.remove(); value.removedCountPlus(); } } } } /*public static void filterMessage(MessageListBean value) { List<MessageBean> msgList = value.getItemList(); Iterator<MessageBean> iterator = msgList.iterator(); List<String> keywordFilter = FilterDBTask.getFilterKeywordList(FilterDBTask.TYPE_KEYWORD); List<String> userFilter = FilterDBTask.getFilterKeywordList(FilterDBTask.TYPE_USER); List<String> topicFilter = FilterDBTask.getFilterKeywordList(FilterDBTask.TYPE_TOPIC); List<String> sourceFilter = FilterDBTask.getFilterKeywordList(FilterDBTask.TYPE_SOURCE); while (iterator.hasNext()) { MessageBean msg = iterator.next(); if (msg.getUser() == null) { iterator.remove(); value.removedCountPlus(); } else if (SettingUtility.isEnableFilter() && TimeLineUtility .haveFilterWord(msg, keywordFilter, userFilter, topicFilter, sourceFilter)) { iterator.remove(); value.removedCountPlus(); } else { msg.getListViewSpannableString(); TimeUtility.dealMills(msg); } } }*/ public static boolean haveFilterWord(MessageBean content, List<String> keywordFilter , List<String> userFilter, List<String> topicFilter, List<String> sourceFilter) { //if this message is sent myself, ignore it; if (content.getUser().getId().equals(GlobalContext.getInstance().getCurrentAccountId())) { return false; } boolean hasOriMessage = content.getRetweeted_status() != null; MessageBean oriMessage = content.getRetweeted_status(); for (String filterWord : keywordFilter) { if (content.getText().contains(filterWord)) { return true; } if (hasOriMessage && oriMessage.getText().contains(filterWord)) { return true; } } for (String filterWord : userFilter) { if (content.getUser() != null && content.getUser().getScreen_name() .equals(filterWord)) { return true; } if (hasOriMessage && oriMessage.getUser() != null && oriMessage.getUser().getScreen_name().equals(filterWord)) { return true; } } for (String filterWord : topicFilter) { Matcher localMatcher = WeiboPatterns.TOPIC_URL.matcher(content.getText()); while (localMatcher.find()) { String str2 = localMatcher.group(0); if (TextUtils.isEmpty(str2) || str2.length() < 3) { continue; } if (filterWord.equals(str2.substring(1, str2.length() - 1))) { return true; } } if (content.getRetweeted_status() != null) { localMatcher = WeiboPatterns.TOPIC_URL .matcher(content.getRetweeted_status().getText()); while (localMatcher.find()) { String str2 = localMatcher.group(0); if (TextUtils.isEmpty(str2) || str2.length() < 3) { continue; } if (filterWord.equals(str2.substring(1, str2.length() - 1))) { return true; } } } } for (String filterWord : sourceFilter) { if (filterWord.equals(content.getSourceString())) { return true; } if (hasOriMessage && filterWord .equals(content.getRetweeted_status().getSourceString())) { return true; } } return false; } public static void addEmotions(SpannableString value) { Matcher localMatcher = WeiboPatterns.EMOTION_URL.matcher(value); while (localMatcher.find()) { String str2 = localMatcher.group(0); int k = localMatcher.start(); int m = localMatcher.end(); if (m - k < 8) { Bitmap bitmap = GlobalContext.getInstance().getEmotionsPics().get(str2); if (bitmap == null) { bitmap = GlobalContext.getInstance().getHuahuaPics().get(str2); } if (bitmap != null) { //Matrix matrix = new Matrix(); //matrix.postScale(0.8f,0.8f); //长和宽放大缩小的比例 //Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true); ImageSpan localImageSpan = new ImageSpan( GlobalContext.getInstance().getActivity(), bitmap, ImageSpan.ALIGN_BASELINE); value.setSpan(localImageSpan, k, m, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } } } public static void addEmotions(EditText et, String txt) { String hackTxt; if (txt.startsWith("[") && txt.endsWith("]")) { hackTxt = txt + " "; } else { hackTxt = txt; } SpannableString value = SpannableString.valueOf(hackTxt); TimeLineUtility.addEmotions(value); et.setText(value); } }