package net.dev123.yibo.service.adapter; import java.util.Date; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.dev123.commons.ServiceProvider; import net.dev123.commons.util.ListUtil; import net.dev123.commons.util.StringUtil; import net.dev123.commons.util.TimeSpanUtil; import net.dev123.mblog.FeaturePatternUtils; import net.dev123.mblog.entity.Status; import net.dev123.mblog.entity.User; import net.dev123.yibo.EditMicroBlogActivity; import net.dev123.yibo.EditRetweetActivity; import net.dev123.yibo.R; import net.dev123.yibo.common.Constants; import net.dev123.yibo.common.EmotionLoader; import net.dev123.yibo.common.GlobalResource; import net.dev123.yibo.common.GlobalVars; import net.dev123.yibo.common.ImageQuality; import net.dev123.yibo.db.LocalAccount; import net.dev123.yibo.db.LocalStatus; import net.dev123.yibo.service.cache.wrap.StatusWrap; import net.dev123.yibo.service.listener.ImageClickListener; import net.dev123.yibo.service.task.ImageLoad4HeadTask; import net.dev123.yibo.service.task.ImageLoad4ThumbnailTask; import net.dev123.yibo.service.task.QueryResponseCountTask; import net.dev123.yibo.service.task.TwitterRetweetTask; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.text.Html; import android.text.Spannable; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; public class StatusUtil { public static View initConvertView(Context context, View convertView, ServiceProvider serviceProvider) { if (convertView != null && convertView.getId() == R.id.llStatus) { return convertView; } LayoutInflater inflater = LayoutInflater.from(context); convertView = inflater.inflate(R.layout.list_item_status, null); StatusHolder holder = new StatusHolder(convertView, serviceProvider); convertView.setTag(holder); return convertView; } public static View fillConvertView(View convertView, Status status) { if (convertView == null || status == null) { return null; } Context context = convertView.getContext(); StatusHolder holder = (StatusHolder)convertView.getTag(); if (holder == null) { return null; } holder.reset(); boolean isNetEase = status.getServiceProvider() == ServiceProvider.NetEase; User user = status.getUser(); if (user == null) { return convertView; } if (GlobalVars.IS_SHOW_HEAD) { holder.ivProfilePicture.setVisibility(View.VISIBLE); holder.headClickListener.setUser(user); String profileUrl = user.getProfileImageUrl(); if (StringUtil.isNotEmpty(profileUrl)) { ImageLoad4HeadTask headTask = new ImageLoad4HeadTask(holder.ivProfilePicture, profileUrl, true); holder.headTask = headTask; headTask.execute(); } } else { holder.ivProfilePicture.setVisibility(View.GONE); } holder.tvScreenName.setText(user.getScreenName()); if (status.getUser().isVerified()) { holder.ivVerify.setVisibility(View.VISIBLE); } if (status.getGeoLocation() != null) { holder.ivLocation.setVisibility(View.VISIBLE); } if (status.isFavorited()) { holder.ivFavorite.setVisibility(View.VISIBLE); } holder.tvCreatedAt.setText(TimeSpanUtil.toTimeSpanString(status.getCreatedAt())); Spannable textSpan = EmotionLoader.getEmotionSpannable(status.getServiceProvider(), status.getText()); holder.tvText.setText(textSpan); Status retweet = status.getRetweetedStatus(); if (retweet != null) { holder.llRetweet.setVisibility(View.VISIBLE); holder.tvRetweetText.setVisibility(View.VISIBLE); String retweetText = ""; if (retweet.getUser() != null) { retweetText = retweet.getUser().getMentionTitleName() + ": " + retweet.getText(); } Spannable retweetTextSpan = EmotionLoader.getEmotionSpannable( status.getServiceProvider(), retweetText); holder.tvRetweetText.setText(retweetTextSpan); } String thumbnailUrl = status.getThumbnailPicture(); ImageView ivTempThumbnail = holder.ivThumbnail; if (retweet != null) { thumbnailUrl = retweet.getThumbnailPicture(); ivTempThumbnail = holder.ivRetweetThumbnail; } if (StringUtil.isNotEmpty(thumbnailUrl)) { holder.ivAttachment.setVisibility(View.VISIBLE); if (GlobalVars.IS_SHOW_THUMBNAIL && !isNetEase) { ivTempThumbnail.setVisibility(View.VISIBLE); ImageLoad4ThumbnailTask thumbnailTask = new ImageLoad4ThumbnailTask(ivTempThumbnail, thumbnailUrl); holder.thumbnailTask = thumbnailTask; thumbnailTask.execute(status); ivTempThumbnail.setOnClickListener(new ImageClickListener(status)); } } String source = String.format(GlobalResource.getStatusSourceFormat(context), status.getSource()); holder.tvSource.setText(Html.fromHtml(source).toString()); String responseFormat = GlobalResource.getStatusResponseFormat(context); String responseText = String.format(responseFormat, 0, 0); if (status.getRetweetCount() == null) { holder.tvResponse.setText(responseText); QueryResponseCountTask countTask = new QueryResponseCountTask(context, status, holder.tvResponse); holder.responseCountTask = countTask; countTask.execute(); } else { responseText = String.format(responseFormat, status.getRetweetCount(), status.getCommentCount()); holder.tvResponse.setText(responseText); } return convertView; } public static View fillConvertView(View convertView, StatusWrap statusWrap) { if (convertView == null || statusWrap == null || statusWrap.getWrap() == null) { return null; } Status status = statusWrap.getWrap(); fillConvertView(convertView, status); StatusHolder holder = (StatusHolder)convertView.getTag(); if (holder == null) { return null; } statusWrap.hit(); if (!statusWrap.isReaded()) { holder.tvCreatedAt.setTextColor(GlobalResource.getStatusTimelineUnreadColor(convertView.getContext())); if (statusWrap.getHit() > 2) { statusWrap.setReaded(true); } } return convertView; } public static String extraRichStatus(Context context, Status status) { String statusText = status.getUser().getMentionName() + ": " + status.getText(); String middleUrl = status.getMiddlePicture(); Status retweet = status.getRetweetedStatus(); if (retweet != null) { String retweetText = retweet.getUser().getMentionName() + ": " + retweet.getText(); statusText = context.getString(R.string.msg_extra_rich_text, statusText, retweetText); middleUrl = retweet.getMiddlePicture(); } if (middleUrl != null) { statusText += context.getString(R.string.msg_extra_image, middleUrl); } return statusText; } public static String extraSimpleStatus(Context context, Status status) { String statusText = status.getUser().getMentionName() + ": " + status.getText(); Status retweet = status.getRetweetedStatus(); if (retweet != null) { String retweetText = retweet.getUser().getMentionName() + ": " + retweet.getText(); statusText = context.getString(R.string.msg_extra_simple_text, statusText, retweetText); } return statusText; } public static Set<String> extraStatusMentions(final Status status, boolean excludeSelf) { Pattern mentionPattern = FeaturePatternUtils.getMentionPattern(status.getServiceProvider()); Matcher matcher = mentionPattern.matcher(status.getText()); Set<String> mentions = new LinkedHashSet<String>(); while (matcher.find()) { mentions.add(matcher.group()); } if (excludeSelf) { mentions.remove(status.getUser().getMentionName()); } return mentions; } public static LocalStatus createDividerStatus(List<Status> statusList, LocalAccount account) { if (ListUtil.isEmpty(statusList) || account == null) { return null; } Status status = statusList.get(statusList.size() - 1); StringBuffer newId = new StringBuffer(status.getId()); char c = newId.charAt(newId.length() - 1); byte b = (byte)((int)c - 1); newId.setCharAt(newId.length() - 1, (char)b); LocalStatus dividerStatus = new LocalStatus(); dividerStatus.setId(newId.toString()); dividerStatus.setAccountId(account.getAccountId()); dividerStatus.setServiceProvider(account.getServiceProvider()); Date createdAt = new Date(status.getCreatedAt().getTime() -1); dividerStatus.setCreatedAt(createdAt); dividerStatus.setDivider(true); dividerStatus.setText("divider"); return dividerStatus; } public static void retweet(final Context context, final Status status) { if (context == null || status == null || StringUtil.isEmpty(status.getId())) { return; } if (status.getServiceProvider() == ServiceProvider.Twitter) { new AlertDialog.Builder(context) .setTitle(R.string.title_dialog_retweet) .setMessage(R.string.msg_dialog_retweet) .setPositiveButton(R.string.btn_dialog_retweet, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); //官方RT,RT的是原始微博,不是转发后形成的新微博 new TwitterRetweetTask(context, status).execute(); } }) .setNegativeButton(R.string.btn_cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .setNeutralButton(R.string.btn_dialog_quote, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); //民间RT支持,会将微薄内容拷贝出来,作为引用内容,发布微薄 quoteTweet(context, status); } }) .create() .show(); } else { officialRetweet(context, status); } } private static void quoteTweet(Context context, Status status){ String appendText = String.format( FeaturePatternUtils.getRetweetFormat(status.getServiceProvider()), FeaturePatternUtils.getRetweetSeparator(status.getServiceProvider()), status.getUser().getMentionName(), status.getText() ); Status retweet = status.getRetweetedStatus(); if (retweet != null) { //官方RT形成的微博结构,引用推文时不再插入RT,因为上面的status.getText()就是RT appendText += String.format( FeaturePatternUtils.getRetweetFormat(status.getServiceProvider()), "", retweet.getUser().getMentionName(), retweet.getText()); } Intent intent = new Intent(); intent.putExtra("TYPE", Constants.EDIT_TYPE_RETWEET); intent.putExtra("APPEND_TEXT", appendText); intent.setClass(context, EditMicroBlogActivity.class); ((Activity)context).startActivity(intent); } private static void officialRetweet(Context context, Status status){ Intent intent = new Intent(); intent.putExtra("TYPE", Constants.EDIT_TYPE_RETWEET); intent.putExtra("STATUS", status); intent.setClass(context, EditRetweetActivity.class); ((Activity)context).startActivity(intent); } public static String getBigImageUrl(Status status) { String url = null; if (status == null) { return url; } if (status.getRetweetedStatus() != null) { status = status.getRetweetedStatus(); } if (GlobalVars.IMAGE_DOWNLOAD_QUALITY == ImageQuality.Low || GlobalVars.IMAGE_DOWNLOAD_QUALITY == ImageQuality.Middle) { url = status.getMiddlePicture(); } else if (GlobalVars.IMAGE_DOWNLOAD_QUALITY == ImageQuality.High){ url = status.getOriginalPicture(); } else if (GlobalVars.IMAGE_DOWNLOAD_QUALITY == ImageQuality.Adaptive_Net) { switch (GlobalVars.NET_TYPE) { case WIFI: url = status.getOriginalPicture(); break; case NONE: case UNKNOW: case MOBILE_GPRS: case MOBILE_EDGE: case MOBILE_3G: url = status.getMiddlePicture(); break; } } return url; } }