package net.miz_hi.smileessence.model.status.tweet; import android.text.Html; import net.miz_hi.smileessence.Client; import net.miz_hi.smileessence.data.hashtag.Hashtag; import net.miz_hi.smileessence.data.hashtag.HashtagManager; import net.miz_hi.smileessence.model.status.IStatusModel; import net.miz_hi.smileessence.model.status.user.UserModel; import net.miz_hi.smileessence.preference.EnumPreferenceKey; import net.miz_hi.smileessence.status.EnumNameStyle; import net.miz_hi.smileessence.status.TweetUtils; import net.miz_hi.smileessence.task.impl.*; import net.miz_hi.smileessence.twitter.ResponseConverter; import net.miz_hi.smileessence.util.StringUtils; import twitter4j.*; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * data model for view and menu */ public class TweetModel implements Comparable<TweetModel>, IStatusModel { public Date createdAt; public long statusId; public UserModel user; private long inReplyToStatusId; private String text; private URLEntity[] urls; private MediaEntity[] medias; private HashtagEntity[] hashtags; private UserMentionEntity[] userMentions; private String source; public EnumTweetType type = EnumTweetType.NORMAL; /** * 子ツイート(RTでない場合は自分自身) */ private TweetModel original; private List<TweetModel> parents = new ArrayList<TweetModel>(); private boolean isFavorited; private boolean isRetweeted; private int favoriteCount; private int retweetCount; /** * 自分のリツイートのID */ private long myRetweetId = -1L; public TweetModel(Status status) { statusId = status.getId(); updateData(status); } public void updateData(Status status) { createdAt = status.getCreatedAt(); text = StringUtils.replaceUrlEntity(status.getText(), status.getURLEntities(), false); source = Html.fromHtml(status.getSource()).toString(); inReplyToStatusId = status.getInReplyToStatusId(); user = ResponseConverter.convert(status.getUser()); if (status.isRetweet()) { original = ResponseConverter.convert(status.getRetweetedStatus()); original.addParent(this); } else { original = this; } retweetCount = status.getRetweetCount(); favoriteCount = status.getFavoriteCount(); hashtags = status.getHashtagEntities(); urls = status.getURLEntities(); medias = status.getMediaEntities(); userMentions = status.getUserMentionEntities(); isFavorited = status.isFavorited(); isRetweeted = status.isRetweeted(); if (status.isRetweetedByMe()) { myRetweetId = status.getCurrentUserRetweetId(); } if (hashtags != null && original.user.isMe()) { for (HashtagEntity hashtag : hashtags) { HashtagManager.addOrUpdate(new Hashtag(hashtag.getText())); } } type = status.isRetweet() ? EnumTweetType.RETWEET : (TweetUtils.isReply(status) ? EnumTweetType.REPLY : EnumTweetType.NORMAL); } @Override public int compareTo(TweetModel another) { return another.createdAt.compareTo(this.createdAt); } private TweetModel() { } public static TweetModel getSampleModel() { TweetModel status = new TweetModel(); status.original = status; status.createdAt = new Date(); status.statusId = 0; status.text = ""; status.source = ""; status.inReplyToStatusId = 0; status.user = UserModel.getNullUserModel(); status.favoriteCount = 0; status.retweetCount = 0; status.hashtags = new HashtagEntity[0]; status.urls = new URLEntity[0]; status.medias = new MediaEntity[0]; status.userMentions = new UserMentionEntity[0]; status.isFavorited = false; status.isRetweeted = false; status.myRetweetId = -1L; status.type = EnumTweetType.NORMAL; return status; } public TweetModel getOriginal() { return original; } public List<TweetModel> getParents() { return parents; } public void addParent(TweetModel parent) { parents.add(parent); } public void deleteParent(TweetModel parent) { parents.remove(parent); } /* getter methods */ public long getInReplyToStatusId() { return original.inReplyToStatusId; } public String getText() { return original.text; } public String getSource() { return original.source; } public URLEntity[] getUrls() { return original.urls; } public MediaEntity[] getMedias() { return original.medias; } public HashtagEntity[] getHashtags() { return original.hashtags; } public UserMentionEntity[] getUserMentions() { return original.userMentions; } public boolean isFavorited() { return original.isFavorited; } public boolean isRetweeted() { return original.isRetweeted; } public int getFavoriteCount() { return original.favoriteCount; } public int getRetweetCount() { return original.retweetCount; } public boolean hasMyRetweetId() { return original.myRetweetId > -1L; } public long getMyRetweetId() { return original.myRetweetId; } /* action methods */ /** * call "statuses/show" api and update model * * @return updated model */ public TweetModel show() { Status status = new ShowTweetTask(statusId).call(); if (status != null) { updateData(status); } return this; } /** * call "statuses/show" api and update model in async */ public void showAsync() { new ShowTweetTask(statusId) { @Override public void onPostExecute(Status result) { if (result != null) { updateData(result); } } }.callAsync(); } /** * do destroy async */ public void destroy() { if (user.isMe()) { new DestroyTask(statusId).callAsync(); } else { new DestroyTask(original.statusId).callAsync(); } } /** * do favorite async */ public void favorite() { new FavoriteTask(original.statusId).callAsync(); } /** * do unfavorite async */ public void unfavorite() { new UnFavoriteTask(original.statusId).callAsync(); } /** * do retweet async */ public void retweet() { new RetweetTask(original.statusId).callAsync(); } public void setFavorited(boolean favorited) { original.isFavorited = favorited; } /** * returns list of screenName in own text */ public List<String> getScreenNames() { List<String> names = new ArrayList<String>(); names.add(original.user.screenName); if (original.userMentions != null) { for (UserMentionEntity entity : original.userMentions) { if (entity.getScreenName().equals(Client.getMainAccount().getScreenName())) { continue; } if (names.contains(entity.getScreenName())) { continue; } names.add(entity.getScreenName()); } } return names; } @Override public UserModel getUser() { return original.user; } @Override public String getTextTop() { UserModel shownUser = original.user; StringBuilder builder = new StringBuilder(); String style = Client.getPreferenceValue(EnumPreferenceKey.NAME_STYLE); if (style.equals(EnumNameStyle.S_N.get()) || style.equals(EnumNameStyle.S.get())) { builder.append(shownUser.screenName); } else if (style.equals(EnumNameStyle.N_S.get()) || style.equals(EnumNameStyle.N.get())) { builder.append(shownUser.name); } if (style.equals(EnumNameStyle.S_N.get())) { builder.append(" / "); builder.append(shownUser.name); } else if (style.equals(EnumNameStyle.N_S.get())) { builder.append(" / "); builder.append(shownUser.screenName); } return builder.toString(); } @Override public String getTextContent() { return getText(); } @Override public String getTextBottom() { StringBuilder builder = new StringBuilder(); if (type == EnumTweetType.RETWEET) { builder.append("(RT: "); builder.append(user.screenName); builder.append(") "); builder.append(StringUtils.dateToString(original.createdAt)); builder.append(" via "); builder.append(original.source); } else { builder.append(StringUtils.dateToString(createdAt)); builder.append(" via "); builder.append(source); } return builder.toString(); } }