From 7d57f6ac0aa8c32ad119cd74cb9cf279809dcbf4 Mon Sep 17 00:00:00 2001 From: Kazuki Yamaguchi Date: Fri, 18 Sep 2015 21:43:03 +0900 Subject: View は twitter4j に直接触らないでほしい MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/CommandOpenHashtagDialog.java | 10 +-- .../smileessence/entity/DirectMessage.java | 59 +------------- .../smileessence/entity/EntitySupport.java | 93 ++++++++++++++++++++++ .../net/lacolaco/smileessence/entity/Tweet.java | 56 +------------ .../smileessence/twitter/TweetBuilder.java | 11 ++- .../view/dialog/MessageDetailDialogFragment.java | 19 +---- .../view/dialog/MessageMenuDialogFragment.java | 19 ++--- .../view/dialog/StatusDetailDialogFragment.java | 13 ++- .../view/dialog/StatusMenuDialogFragment.java | 21 +++-- .../smileessence/viewmodel/StatusViewModel.java | 16 +--- 10 files changed, 142 insertions(+), 175 deletions(-) create mode 100644 app/src/main/java/net/lacolaco/smileessence/entity/EntitySupport.java (limited to 'app/src') diff --git a/app/src/main/java/net/lacolaco/smileessence/command/CommandOpenHashtagDialog.java b/app/src/main/java/net/lacolaco/smileessence/command/CommandOpenHashtagDialog.java index 558bb415..7b481e5c 100644 --- a/app/src/main/java/net/lacolaco/smileessence/command/CommandOpenHashtagDialog.java +++ b/app/src/main/java/net/lacolaco/smileessence/command/CommandOpenHashtagDialog.java @@ -35,20 +35,20 @@ public class CommandOpenHashtagDialog extends Command { // ------------------------------ FIELDS ------------------------------ - private final HashtagEntity hashtagEntity; + private final String hashtag; // --------------------------- CONSTRUCTORS --------------------------- - public CommandOpenHashtagDialog(Activity activity, HashtagEntity hashtagEntity) { + public CommandOpenHashtagDialog(Activity activity, String hashtag) { super(-1, activity); - this.hashtagEntity = hashtagEntity; + this.hashtag = hashtag; } // --------------------- GETTER / SETTER METHODS --------------------- @Override public String getText() { - return "#" + hashtagEntity.getText(); + return "#" + hashtag; } @Override @@ -61,7 +61,7 @@ public class CommandOpenHashtagDialog extends Command { @Override public boolean execute() { HashtagDialogFragment dialogFragment = new HashtagDialogFragment(); - dialogFragment.setText(hashtagEntity.getText()); + dialogFragment.setText(hashtag); DialogHelper.showDialog(getActivity(), dialogFragment); return false; } diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/DirectMessage.java b/app/src/main/java/net/lacolaco/smileessence/entity/DirectMessage.java index 1f31171f..c7b3dfba 100644 --- a/app/src/main/java/net/lacolaco/smileessence/entity/DirectMessage.java +++ b/app/src/main/java/net/lacolaco/smileessence/entity/DirectMessage.java @@ -9,7 +9,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -public class DirectMessage { +public class DirectMessage extends EntitySupport { // キャッシュ これも weak reference private static Cache storage = CacheBuilder.newBuilder().weakValues().build(); @@ -43,12 +43,6 @@ public class DirectMessage { private String text; private Date createdAt; - private UserMentionEntity[] mentions; - private HashtagEntity[] hashtags; - private MediaEntity[] media; - private URLEntity[] urls; - private SymbolEntity[] symbols; - private DirectMessage(twitter4j.DirectMessage st) { update(st); } @@ -60,11 +54,7 @@ public class DirectMessage { text = message.getText(); createdAt = message.getCreatedAt(); - mentions = message.getUserMentionEntities(); - hashtags = message.getHashtagEntities(); - media = message.getExtendedMediaEntities().length > 0 ? message.getExtendedMediaEntities() : message.getMediaEntities(); - urls = message.getURLEntities(); - symbols = message.getSymbolEntities(); + updateEntities(message); } public long getId() { @@ -87,51 +77,6 @@ public class DirectMessage { return createdAt; } - public UserMentionEntity[] getMentions() { - return mentions; - } - - public HashtagEntity[] getHashtags() { - return hashtags; - } - - public MediaEntity[] getMedia() { - return media; - } - - public URLEntity[] getUrls() { - return urls; - } - - public SymbolEntity[] getSymbols() { - return symbols; - } - - public List getMentioningScreenNames(String excludeScreenName) { - List names = getMentioningScreenNames(); - if (excludeScreenName != null) { - names.remove(excludeScreenName); - } - return names; - } - - public List getMentioningScreenNames() { - List names = new ArrayList<>(); - names.add(getSender().getScreenName()); - if (getSender() != getRecipient()) { - names.add(getRecipient().getScreenName()); - } - if (getMentions() != null) { - for (UserMentionEntity entity : getMentions()) { - if (names.contains(entity.getScreenName())) { - continue; - } - names.add(entity.getScreenName()); - } - } - return names; - } - public String getMessageSummary() { return String.format("@%s: %s", getSender().getScreenName(), getText()); } diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/EntitySupport.java b/app/src/main/java/net/lacolaco/smileessence/entity/EntitySupport.java new file mode 100644 index 00000000..1df7cbd1 --- /dev/null +++ b/app/src/main/java/net/lacolaco/smileessence/entity/EntitySupport.java @@ -0,0 +1,93 @@ +package net.lacolaco.smileessence.entity; + +import twitter4j.*; + +import java.util.ArrayList; +import java.util.List; + +public abstract class EntitySupport { + private List mentions; + private List hashtags; + private List mediaUrls; + private List urlsExpanded; + private List symbols; + + protected void updateEntities(twitter4j.EntitySupport status) { + mentions = extractMentions(status.getUserMentionEntities()); + hashtags = extractHashtags(status.getHashtagEntities()); + mediaUrls = extractMediaUrls(status.getExtendedMediaEntities().length > 0 ? status.getExtendedMediaEntities() : status.getMediaEntities()); + urlsExpanded = extractExpandedUrls(status.getURLEntities()); + symbols = extractSymbols(status.getSymbolEntities()); + } + + public List getMentions() { + return mentions; + } + + public List getHashtags() { + return hashtags; + } + + public List getMediaUrls() { + return mediaUrls; + } + + public List getUrlsExpanded() { + return urlsExpanded; + } + + public List getSymbols() { + return symbols; + } + + private List extractMentions(UserMentionEntity[] entities) { + List names = new ArrayList<>(); + if (entities != null) { + for (UserMentionEntity entity : entities) { + names.add(entity.getScreenName()); + } + } + return names; + } + + private List extractSymbols(SymbolEntity[] entities) { + List names = new ArrayList<>(); + if (entities != null) { + for (SymbolEntity entity : entities) { + names.add(entity.getText()); + } + } + return names; + } + + private List extractExpandedUrls(URLEntity[] entities) { + List names = new ArrayList<>(); + if (entities != null) { + for (URLEntity entity : entities) { + names.add(entity.getExpandedURL()); + } + } + return names; + } + + private List extractMediaUrls(MediaEntity[] entities) { + List names = new ArrayList<>(); + if (entities != null) { + for (MediaEntity entity : entities) { + names.add(entity.getMediaURLHttps()); + } + } + return names; + } + + private List extractHashtags(HashtagEntity[] entities) { + List names = new ArrayList<>(); + if (entities != null) { + for (HashtagEntity entity : entities) { + names.add(entity.getText()); + } + } + return names; + } + +} diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.java b/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.java index 3d0cf8d3..3da59c38 100644 --- a/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.java +++ b/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.java @@ -10,7 +10,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -public class Tweet { +public class Tweet extends EntitySupport { // キャッシュ こっちは soft reference private static Cache storage = CacheBuilder.newBuilder().softValues().build(); @@ -45,11 +45,6 @@ public class Tweet { private String source; private boolean isRetweet; private Tweet retweetedTweet; - private UserMentionEntity[] mentions; - private HashtagEntity[] hashtags; - private MediaEntity[] media; - private URLEntity[] urls; - private SymbolEntity[] symbols; private long inReplyTo; private int favoriteCount; private int retweetCount; @@ -67,17 +62,13 @@ public class Tweet { favoriteCount = status.getFavoriteCount(); retweetCount = status.getRetweetCount(); - mentions = status.getUserMentionEntities(); - hashtags = status.getHashtagEntities(); - media = status.getExtendedMediaEntities().length > 0 ? status.getExtendedMediaEntities() : status.getMediaEntities(); - urls = status.getURLEntities(); - symbols = status.getSymbolEntities(); inReplyTo = status.getInReplyToStatusId(); - isRetweet = status.isRetweet(); if (isRetweet()) { retweetedTweet = Tweet.fromTwitter(status.getRetweetedStatus()); } + + updateEntities(status); } public String getTwitterUrl() { @@ -128,48 +119,7 @@ public class Tweet { return retweetCount; } - public UserMentionEntity[] getMentions() { - return mentions; - } - - public HashtagEntity[] getHashtags() { - return hashtags; - } - - public MediaEntity[] getMedia() { - return media; - } - - public URLEntity[] getUrls() { - return urls; - } - - public SymbolEntity[] getSymbols() { - return symbols; - } - public long getInReplyTo() { return inReplyTo; } - - public List getMentioningScreenNames(String excludeScreenName) { - List names = getMentioningScreenNames(); - if (excludeScreenName != null) { - names.remove(excludeScreenName); - } - return names; - } - - public List getMentioningScreenNames() { - List names = new ArrayList<>(); - names.add(getUser().getScreenName()); - if (getMentions() != null) { - for (UserMentionEntity entity : getMentions()) { - if (!names.contains(entity.getScreenName())) { - names.add(entity.getScreenName()); - } - } - } - return names; - } } diff --git a/app/src/main/java/net/lacolaco/smileessence/twitter/TweetBuilder.java b/app/src/main/java/net/lacolaco/smileessence/twitter/TweetBuilder.java index 2cd0954a..4946a44e 100644 --- a/app/src/main/java/net/lacolaco/smileessence/twitter/TweetBuilder.java +++ b/app/src/main/java/net/lacolaco/smileessence/twitter/TweetBuilder.java @@ -33,6 +33,7 @@ import twitter4j.StatusUpdate; import java.io.File; import java.util.ArrayList; import java.util.Collection; +import java.util.List; public class TweetBuilder { @@ -67,12 +68,16 @@ public class TweetBuilder { // -------------------------- OTHER METHODS -------------------------- public TweetBuilder addScreenName(String screenName) { - screenNameList.add(screenName); + if (!screenNameList.contains(screenName)) { + screenNameList.add(screenName); + } return this; } - public TweetBuilder addScreenNames(Collection screenNames) { - screenNameList.addAll(screenNames); + public TweetBuilder addScreenNames(List screenNames) { + for (String name : screenNames) { + addScreenName(name); + } return this; } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageDetailDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageDetailDialogFragment.java index 676c2db0..8ad43c3c 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageDetailDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageDetailDialogFragment.java @@ -186,26 +186,15 @@ public class MessageDetailDialogFragment extends StackableDialogFragment impleme private ArrayList getCommands(Activity activity, DirectMessage message, Account account) { ArrayList commands = new ArrayList<>(); // URL - if (message.getUrls() != null) { - for (URLEntity urlEntity : message.getUrls()) { - commands.add(new CommandOpenURL(activity, urlEntity.getExpandedURL())); - } + for (String url : message.getUrlsExpanded()) { + commands.add(new CommandOpenURL(activity, url)); } - for (MediaEntity mediaEntity : getMediaEntities(message)) { - commands.add(new CommandOpenURL(activity, mediaEntity.getMediaURL())); + for (String url : message.getMediaUrls()) { + commands.add(new CommandOpenURL(activity, url)); } return commands; } - private MediaEntity[] getMediaEntities(DirectMessage message) { - if (message.getMedia().length == 0) { - // direct message's media is contained also in url entities. - return new MediaEntity[0]; - } else { - return message.getMedia(); - } - } - private View getTitleView(MainActivity activity, Account account, DirectMessage message) { View view = activity.getLayoutInflater().inflate(R.layout.dialog_status_detail, null); View messageHeader = view.findViewById(R.id.layout_status_header); diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageMenuDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageMenuDialogFragment.java index dcf24f38..8996ad02 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageMenuDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageMenuDialogFragment.java @@ -92,20 +92,21 @@ public class MessageMenuDialogFragment extends MenuDialogFragment { public void addBottomCommands(Activity activity, DirectMessage message, Account account, ArrayList commands) { commands.add(new CommandSaveAsTemplate(activity, message.getText())); //User - for (String screenName : message.getMentioningScreenNames()) { + if (message.getSender() != message.getRecipient()) { + commands.add(new CommandOpenUserDetail(activity, message.getRecipient().getScreenName(), account)); + } + for (String screenName : message.getMentions()) { commands.add(new CommandOpenUserDetail(activity, screenName, account)); } for (Command command : getHashtagCommands(activity, message)) { commands.add(command); } // Media - if (message.getUrls() != null) { - for (URLEntity urlEntity : message.getUrls()) { - commands.add(new CommandOpenURL(activity, urlEntity.getExpandedURL())); - } + for (String url : message.getUrlsExpanded()) { + commands.add(new CommandOpenURL(activity, url)); } - for (MediaEntity mediaEntity : message.getMedia()) { - commands.add(new CommandOpenURL(activity, mediaEntity.getMediaURL())); + for (String url : message.getMediaUrls()) { + commands.add(new CommandOpenURL(activity, url)); } } @@ -123,8 +124,8 @@ public class MessageMenuDialogFragment extends MenuDialogFragment { private ArrayList getHashtagCommands(Activity activity, DirectMessage status) { ArrayList commands = new ArrayList<>(); if (status.getHashtags() != null) { - for (HashtagEntity hashtagEntity : status.getHashtags()) { - commands.add(new CommandOpenHashtagDialog(activity, hashtagEntity)); + for (String hashtag : status.getHashtags()) { + commands.add(new CommandOpenHashtagDialog(activity, hashtag)); } } return commands; diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java index d21c67c7..72db5583 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java @@ -57,7 +57,6 @@ import net.lacolaco.smileessence.viewmodel.StatusViewModel; import java.util.ArrayList; import twitter4j.MediaEntity; -import twitter4j.URLEntity; public class StatusDetailDialogFragment extends StackableDialogFragment implements View.OnClickListener { @@ -235,13 +234,11 @@ public class StatusDetailDialogFragment extends StackableDialogFragment implemen private ArrayList getCommands(Activity activity, Tweet tweet, Account account) { ArrayList commands = new ArrayList<>(); // URL - if (tweet.getUrls() != null) { - for (URLEntity urlEntity : tweet.getUrls()) { - commands.add(new CommandOpenURL(activity, urlEntity.getExpandedURL())); - } + for (String url : tweet.getUrlsExpanded()) { + commands.add(new CommandOpenURL(activity, url)); } - for (MediaEntity mediaEntity : tweet.getMedia()) { - commands.add(new CommandOpenURL(activity, mediaEntity.getMediaURL())); + for (String url : tweet.getMediaUrls()) { + commands.add(new CommandOpenURL(activity, url)); } return commands; } @@ -271,7 +268,7 @@ public class StatusDetailDialogFragment extends StackableDialogFragment implemen if (account.userID == originalTweet.getUser().getId()) { builder.addScreenName(account.screenName); } - builder.addScreenNames(originalTweet.getMentioningScreenNames(account.screenName)); + builder.addScreenNames(originalTweet.getMentions()); String text = builder.buildText(); int selStart = originalTweet.getUser().getScreenName().length() + 2; // "@" and " " diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusMenuDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusMenuDialogFragment.java index 77c3ea29..55959e36 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusMenuDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusMenuDialogFragment.java @@ -38,11 +38,11 @@ import net.lacolaco.smileessence.entity.Tweet; import net.lacolaco.smileessence.view.adapter.CustomListAdapter; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import twitter4j.HashtagEntity; import twitter4j.MediaEntity; -import twitter4j.URLEntity; public class StatusMenuDialogFragment extends MenuDialogFragment { @@ -86,20 +86,19 @@ public class StatusMenuDialogFragment extends MenuDialogFragment { public void addBottomCommands(Activity activity, Tweet tweet, Account account, ArrayList commands) { commands.add(new CommandSaveAsTemplate(activity, tweet.getOriginalTweet().getText())); //User - for (String screenName : tweet.getMentioningScreenNames()) { + commands.add(new CommandOpenUserDetail(activity, tweet.getUser().getScreenName(), account)); + for (String screenName : new ArrayList<>(new LinkedHashSet<>(tweet.getMentions()))) { // Array#uniq commands.add(new CommandOpenUserDetail(activity, screenName, account)); } for (Command command : getHashtagCommands(activity, tweet)) { commands.add(command); } // Media - if (tweet.getUrls() != null) { - for (URLEntity urlEntity : tweet.getUrls()) { - commands.add(new CommandOpenURL(activity, urlEntity.getExpandedURL())); - } + for (String url : tweet.getUrlsExpanded()) { + commands.add(new CommandOpenURL(activity, url)); } - for (MediaEntity mediaEntity : tweet.getMedia()) { - commands.add(new CommandOpenURL(activity, mediaEntity.getMediaURL())); + for (String url : tweet.getMediaUrls()) { + commands.add(new CommandOpenURL(activity, url)); } } @@ -116,10 +115,8 @@ public class StatusMenuDialogFragment extends MenuDialogFragment { private ArrayList getHashtagCommands(Activity activity, Tweet tweet) { ArrayList commands = new ArrayList<>(); - if (tweet.getHashtags() != null) { - for (HashtagEntity hashtagEntity : tweet.getHashtags()) { - commands.add(new CommandOpenHashtagDialog(activity, hashtagEntity)); - } + for (String hashtag : tweet.getHashtags()) { + commands.add(new CommandOpenHashtagDialog(activity, hashtag)); } return commands; } diff --git a/app/src/main/java/net/lacolaco/smileessence/viewmodel/StatusViewModel.java b/app/src/main/java/net/lacolaco/smileessence/viewmodel/StatusViewModel.java index 5680ccc7..6f372562 100644 --- a/app/src/main/java/net/lacolaco/smileessence/viewmodel/StatusViewModel.java +++ b/app/src/main/java/net/lacolaco/smileessence/viewmodel/StatusViewModel.java @@ -52,8 +52,6 @@ import net.lacolaco.smileessence.view.dialog.StatusDetailDialogFragment; import net.lacolaco.smileessence.view.dialog.UserDetailDialogFragment; import net.lacolaco.smileessence.view.listener.ListItemClickListener; -import twitter4j.*; - import java.util.ArrayList; import java.util.List; @@ -79,8 +77,8 @@ public class StatusViewModel implements IViewModel { private List getEmbeddedStatusIDs() { ArrayList list = new ArrayList<>(); - for (URLEntity url : tweet.getUrls()) { - Uri uri = Uri.parse(url.getExpandedURL()); + for (String url : tweet.getUrlsExpanded()) { + Uri uri = Uri.parse(url); if (uri.getHost().equals("twitter.com")) { String[] arr = uri.toString().split("/"); if (arr[arr.length - 2].equals("status")) { @@ -244,15 +242,7 @@ public class StatusViewModel implements IViewModel { } public boolean isMention(String screenName) { - if (tweet.getMentions() == null) { - return false; - } - for (UserMentionEntity mention : tweet.getMentions()) { - if (mention.getScreenName().equals(screenName)) { - return true; - } - } - return false; + return tweet.getMentions().contains(screenName); } private boolean isReadMorseEnabled(MainActivity activity) { -- cgit v1.2.3