package com.thankcreate.care.tool.converter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import org.json.JSONArray; import org.json.JSONObject; import android.content.SharedPreferences; import android.text.Html; import com.renren.api.connect.android.users.UserInfo; import com.thankcreate.care.App; import com.thankcreate.care.tool.misc.PreferenceHelper; import com.thankcreate.care.tool.misc.StringTool; import com.thankcreate.care.viewmodel.CommentViewModel; import com.thankcreate.care.viewmodel.EntryType; import com.thankcreate.care.viewmodel.FriendViewModel; import com.thankcreate.care.viewmodel.ItemViewModel; import com.thankcreate.care.viewmodel.MainViewModel; import com.thankcreate.care.viewmodel.PictureItemViewModel; import com.thankcreate.care.viewmodel.RenrenType; /** * 安卓版的DoubanConverter对所有豆瓣广播做了统一处理 * 不论什么类型,都用convertUnionStatus去转化 * 注意:豆瓣有个其它平台都没有的特点,对转发广播的评论就是对原始广播的评论 * 转发上显示的评论数,也就是原始广播的评论数 * @author ThankCreate */ public class DoubanConverter { public static String largeAvatar = ""; public static CommentViewModel convertCommentToCommon(JSONObject comment) { if(comment == null) return null; CommentViewModel model = new CommentViewModel(); try { JSONObject user = comment.optJSONObject("user"); if(user == null) return null; model.title = user.optString("screen_name"); model.iconURL = user.optString("small_avatar"); model.uid = user.optString("id"); model.doubanUID = user.optString("uid"); model.content = comment.optString("text"); model.id = comment.optString("id"); String rawTime = comment.optString("created_at"); model.time = convertDoubanDateStringToDate(rawTime); model.type = EntryType.Douban; } catch (Exception e) { return null; } return model; } public static FriendViewModel convertFriendToCommon(JSONObject user) { if(user == null) return null; FriendViewModel model = new FriendViewModel(); try { model.name = user.optString("screen_name"); model.description = user.optString("description"); model.avatar = user.optString("small_avatar"); model.avatar2 = user.optString("large_avatar"); model.ID = user.optString("id"); model.firstCharactor = StringTool.converterToFirstSpell(model.name.toLowerCase()); } catch (Exception e) { e.printStackTrace(); return null; } return model; } public static ItemViewModel convertUnionStatus(JSONObject status, MainViewModel mainViewModel) { if(status == null) return null; try { ItemViewModel model = new ItemViewModel(); JSONObject user = status.optJSONObject("user"); if(user == null) return null; model.iconURL = user .optString("small_avatar"); largeAvatar = PreferenceHelper.getString("Douban_FollowerAvatar2"); model.largeIconURL = largeAvatar; model.title = user.optString("screen_name"); String acctachTitle = ""; JSONArray listAttach = status.optJSONArray("attachments"); if(listAttach != null) { int length = listAttach.length(); for (int i = 0; i < length; i++) { JSONObject attach = listAttach.getJSONObject(i); String type = attach.optString("type"); acctachTitle = attach.optString("title"); } } String trimStatusTitle = trimMark(status.optString("title")); String statusText = status.optString("text"); model.content = trimStatusTitle + " " + acctachTitle + " " + statusText; String rawTime = status.optString("created_at"); model.time = convertDoubanDateStringToDate(rawTime); model.ID = status.optString("id"); model.commentCount = status.optString("comments_count"); model.sharedCount = status.optString("reshared_count"); model.type = EntryType.Douban; JSONObject fowardStatus = status.optJSONObject("reshared_status"); if(fowardStatus != null) { ItemViewModel forwardModel = new ItemViewModel(); JSONObject forwardUser = fowardStatus.optJSONObject("user"); if(forwardUser == null) return null; forwardModel.iconURL = forwardUser.optString("small_avatar"); forwardModel.largeIconURL = forwardModel.iconURL; forwardModel.title = forwardUser.optString("screen_name"); String forwardAcctachTitle = ""; JSONArray forwardListAttach = fowardStatus.optJSONArray("attachments"); if(forwardListAttach != null) { int length = forwardListAttach.length(); for (int i = 0; i < length; i++) { JSONObject attach = forwardListAttach.getJSONObject(i); String type = attach.optString("type"); forwardAcctachTitle = attach.optString("title"); } } String trimFowardStatusTitle = trimMark(fowardStatus.optString("title")); String fowardStatusText = fowardStatus.optString("text"); forwardModel.content = trimFowardStatusTitle + " " + forwardAcctachTitle + " " + fowardStatusText; String forwardRawTime = fowardStatus.optString("created_at"); forwardModel.time = convertDoubanDateStringToDate(forwardRawTime); forwardModel.ID = fowardStatus.optString("id"); forwardModel.commentCount = fowardStatus.optString("comments_count"); forwardModel.sharedCount = fowardStatus.optString("reshared_count"); forwardModel.type = EntryType.Douban; String useFowardPictureString = PreferenceHelper.getString("Global_NeedFetchImageInRetweet", "True"); if(useFowardPictureString.equalsIgnoreCase("True")) { filtPicture(fowardStatus, forwardModel, mainViewModel); } // 如果是转播的话,把model的text改成“转播”两字,不然空在那里很奇怪 model.content = "转播"; model.commentCount = forwardModel.commentCount; model.sharedCount = forwardModel.sharedCount; model.forwardItem = forwardModel; } filtPicture(status, model, mainViewModel); return model; } catch (Exception e) { return null; } } // public static ItemViewModel convertStatusToCommon(JSONObject status, MainViewModel mainViewModel) // { // if(status == null) // return null; // try { // String tp = status.optString("type"); // String title = status.optString("title"); // // if (title.contains("关注") // 新关注了某个人 // || title.contains("加入") // 加入小组 // || title.contains("活动") // 对某活动感兴趣 // || title.contains("歌曲") // 某2添加了某歌曲 // || title.contains("试读") // 正在试读 // || title.contains("豆瓣阅读") // 豆瓣阅读 // || title.contains("使用") // 开始使用 // || title.contains("日记")) // 写了日记 // { // return null; // } // // if(tp.equalsIgnoreCase("collect_book")) // { // return convertStatusBook(status, mainViewModel); // } // else if(tp.equalsIgnoreCase("collect_movie")) // { // return convertStatusMovie(status, mainViewModel); // } // else if(tp.equalsIgnoreCase("collect_music")) // { // return convertStatusMusic(status, mainViewModel); // } // // 豆瓣现在抽风,纯文字状态有时候type是null 真无语>_< // // Note:豆瓣的所有的转发,外转的type都是text // else if(tp.equalsIgnoreCase("text") || title.equalsIgnoreCase("说:")) // { // return convertStatusText(status, mainViewModel); // } // return null; // } catch (Exception e) { // return null; // } // } // // public static ItemViewModel convertStatusBook(JSONObject status, MainViewModel mainViewModel) // { // if(status == null) // return null; // try { // ItemViewModel model = new ItemViewModel(); // JSONObject user = status.optJSONObject("user"); // if(user == null) // return null; // model.iconURL = user .optString("small_avatar"); // //if(StringTool.isNullOrEmpty(largeAvatar)) // { // largeAvatar = PreferenceHelper.getString("Douban_FollowerAvatar2"); // } // model.largeIconURL = largeAvatar; // model.title = user.optString("screen_name"); // // String bookTitle = ""; // JSONArray listAttach = status.optJSONArray("attachments"); // if(listAttach != null) // { // int length = listAttach.length(); // for (int i = 0; i < length; i++) { // JSONObject attach = listAttach.getJSONObject(i); // String type = attach.optString("type"); // if(type.equalsIgnoreCase("book")) // { // bookTitle = attach.optString("title"); // } // } // } // String trimStatusTitle = trimMark(status.optString("title")); // String statusText = status.optString("text"); // model.content = trimStatusTitle + " “" + bookTitle + "” " + statusText; // // String rawTime = status.optString("created_at"); // model.time = convertDoubanDateStringToDate(rawTime); // model.ID = status.optString("id"); // model.commentCount = status.optString("comments_count"); // model.sharedCount = status.optString("reshared_count"); // model.type = EntryType.Douban; // filtPicture(status, model, mainViewModel); // return model; // } catch (Exception e) { // return null; // } // } // // public static ItemViewModel convertStatusMovie(JSONObject status, MainViewModel mainViewModel) // { // if(status == null) // return null; // try { // ItemViewModel model = new ItemViewModel(); // JSONObject user = status.optJSONObject("user"); // if(user == null) // return null; // model.iconURL = user.optString("small_avatar"); // //if(StringTool.isNullOrEmpty(largeAvatar)) // { // largeAvatar = PreferenceHelper.getString("Douban_FollowerAvatar2"); // } // model.largeIconURL = largeAvatar; // model.title = user.optString("screen_name"); // // String movieTitle = ""; // JSONArray listAttach = status.optJSONArray("attachments"); // if(listAttach != null) // { // int length = listAttach.length(); // for (int i = 0; i < length; i++) { // JSONObject attach = listAttach.getJSONObject(i); // String type = attach.optString("type"); // if(type.equalsIgnoreCase("movie")) // { // movieTitle = attach.optString("title"); // } // } // } // String trimStatusTitle = trimMark(status.optString("title")); // String statusText = status.optString("text"); // model.content = trimStatusTitle + " “" + movieTitle + "” " + statusText; // // String rawTime = status.optString("created_at"); // model.time = convertDoubanDateStringToDate(rawTime); // model.ID = status.optString("id"); // model.commentCount = status.optString("comments_count"); // model.sharedCount = status.optString("reshared_count"); // model.type = EntryType.Douban; // filtPicture(status, model, mainViewModel); // return model; // } catch (Exception e) { // return null; // } // } // // public static ItemViewModel convertStatusMusic(JSONObject status, MainViewModel mainViewModel) // { // if(status == null) // return null; // try { // ItemViewModel model = new ItemViewModel(); // JSONObject user = status.optJSONObject("user"); // if(user == null) // return null; // model.iconURL = user.optString("small_avatar"); // //if(StringTool.isNullOrEmpty(largeAvatar)) // { // largeAvatar = PreferenceHelper.getString("Douban_FollowerAvatar2"); // } // model.largeIconURL = largeAvatar; // model.title = user.optString("screen_name"); // // String musicTitle = ""; // JSONArray listAttach = status.optJSONArray("attachments"); // if(listAttach != null) // { // int length = listAttach.length(); // for (int i = 0; i < length; i++) { // JSONObject attach = listAttach.getJSONObject(i); // String type = attach.optString("type"); // if(type.equalsIgnoreCase("music")) // { // musicTitle = attach.optString("title"); // } // } // } // String trimStatusTitle = trimMark(status.optString("title")); // String statusText = status.optString("text"); // model.content = trimStatusTitle + " “" + musicTitle + "” " + statusText; // // String rawTime = status.optString("created_at"); // model.time = convertDoubanDateStringToDate(rawTime); // model.ID = status.optString("id"); // model.commentCount = status.optString("comments_count"); // model.sharedCount = status.optString("reshared_count"); // model.type = EntryType.Douban; // filtPicture(status, model, mainViewModel); // return model; // } catch (Exception e) { // return null; // } // } // // public static ItemViewModel convertStatusText(JSONObject status, MainViewModel mainViewModel) // { // if(status == null) // return null; // try { // ItemViewModel model = new ItemViewModel(); // JSONObject user = status.optJSONObject("user"); // if(user == null) // return null; // model.iconURL = user.optString("small_avatar"); // //if(StringTool.isNullOrEmpty(largeAvatar)) // { // largeAvatar = PreferenceHelper.getString("Douban_FollowerAvatar2"); // } // model.largeIconURL = largeAvatar; // model.title = user.optString("screen_name"); // model.content = status.optString("text"); // String rawTime = status.optString("created_at"); // model.time = convertDoubanDateStringToDate(rawTime); // model.ID = status.optString("id"); // model.commentCount = status.optString("comments_count"); // model.sharedCount = status.optString("reshared_count"); // model.type = EntryType.Douban; // // JSONObject foward = status.optJSONObject("reshared_status"); // if(foward != null) // { // ItemViewModel fowardModel = convertStatusToCommon(foward, mainViewModel); // if(fowardModel == null) // return null; // // 如果是转播的话,把model的text改成“转播”两字,不然空在那里很奇怪 // model.content = "转播"; // model.forwardItem = fowardModel; // } // filtPicture(status, model, mainViewModel); // return model; // } catch (Exception e) { // return null; // } // } public static void filtPicture(JSONObject status, ItemViewModel model, MainViewModel mainViewModel) { if (status == null || model == null) return; try { JSONArray listAttach = status.optJSONArray("attachments"); if(listAttach == null) return; for(int i = 0; i < listAttach.length(); i++) { JSONObject attach = listAttach.getJSONObject(i); String attachType = attach.optString("type"); // 其实也没必要这样去一个个的比较类型,wp7版没有这一段,ios版有这一段 // if(attachType.equalsIgnoreCase("movie") // || attachType.equalsIgnoreCase("music") // || attachType.equalsIgnoreCase("book") // || attachType.equalsIgnoreCase("image")) { JSONArray listMedia = attach.optJSONArray("media"); if(listMedia == null) return; for(int j = 0; j < listMedia.length(); j++) { JSONObject media = listMedia.getJSONObject(i); String mediaType = media.optString("type"); if(mediaType.equalsIgnoreCase("image")) { model.imageURL = media.optString("src"); model.midImageURL = generateDoubanSrc(model.imageURL, "median"); model.fullImageURL = generateDoubanSrc(model.imageURL, "raw"); PictureItemViewModel picItem = new PictureItemViewModel(); picItem.smallURL = model.imageURL; picItem.middleURL = model.midImageURL; picItem.largeURL = model.fullImageURL; picItem.ID = model.ID; picItem.type = EntryType.Douban; picItem.title = model.title; picItem.description = model.content; picItem.time = model.time; mainViewModel.doubanPictureItems.add(picItem); break; } } break; } } } catch (Exception e) { return; } } // 豆瓣虽然只给了一个src,但是它的中图和大图是直接把链接中的small替换成median或raw就行了 public static String generateDoubanSrc(String input, String dest) { if(StringTool.isNullOrEmpty(input) || StringTool.isNullOrEmpty(dest)) return input; return input.replace("small", dest); } // 因为读过的内容会在Title里写个如下打分字样 ,要把它去掉 // 读过[score]0[/score] public static String trimMark(String input) { if(input == null) return ""; try { for (int i = 0; i < input.length(); i++) { if (input.charAt(i) == '[') { String result = input.substring(0, i); return result; } } return input; } catch (Exception e) { return input; } } // 豆瓣的祼格式是这样的 // 2012-12-07 20:37:36 // SimpleDateFormat必须做缓存,否则你会死得很惨 // 这玩意儿不做缓存的话几乎在虚拟机上跑不动 public static SimpleDateFormat sdf; public static Date convertDoubanDateStringToDate(String rawDate) { if(StringTool.isNullOrEmpty(rawDate)) return new Date(); if(sdf == null) sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH); Date resultDate = null; try { resultDate = sdf.parse(rawDate); } catch (ParseException e) { resultDate = new Date(); } return resultDate; } }