package info.justaway.adapter; import android.os.AsyncTask; import android.os.Handler; import java.util.ArrayList; import de.greenrobot.event.EventBus; import info.justaway.event.model.NotificationEvent; import info.justaway.event.model.StreamingCreateFavoriteEvent; import info.justaway.event.model.StreamingCreateStatusEvent; import info.justaway.event.model.StreamingDestroyMessageEvent; import info.justaway.event.model.StreamingDestroyStatusEvent; import info.justaway.event.model.StreamingUnFavoriteEvent; import info.justaway.model.AccessTokenManager; import info.justaway.model.FavRetweetManager; import info.justaway.model.Relationship; import info.justaway.model.Row; import info.justaway.model.TwitterManager; import info.justaway.settings.MuteSettings; import twitter4j.DirectMessage; import twitter4j.Status; import twitter4j.StatusDeletionNotice; import twitter4j.User; import twitter4j.UserStreamAdapter; public class MyUserStreamAdapter extends UserStreamAdapter { private boolean mStopped; private boolean mPause; private ArrayList<StreamingCreateStatusEvent> mStreamingCreateStatusEvents = new ArrayList<>(); private ArrayList<StreamingDestroyStatusEvent> mStreamingDestroyStatusEvents = new ArrayList<>(); private ArrayList<StreamingCreateFavoriteEvent> mStreamingCreateFavoriteEvents = new ArrayList<>(); private ArrayList<StreamingUnFavoriteEvent> mStreamingUnFavoriteEvents = new ArrayList<>(); private ArrayList<StreamingDestroyMessageEvent> mStreamingDestroyMessageEvents = new ArrayList<>(); public void stop() { mStopped = true; } public void start() { mStopped = false; } public void pause() { mPause = true; } public void resume() { mPause = false; new Handler().post(new Runnable() { @Override public void run() { for (StreamingCreateStatusEvent event : mStreamingCreateStatusEvents) { EventBus.getDefault().post(event); } for (StreamingDestroyStatusEvent event : mStreamingDestroyStatusEvents) { EventBus.getDefault().post(event); } for (StreamingCreateFavoriteEvent event : mStreamingCreateFavoriteEvents) { EventBus.getDefault().post(event); } for (StreamingUnFavoriteEvent event : mStreamingUnFavoriteEvents) { EventBus.getDefault().post(event); } for (StreamingDestroyMessageEvent event : mStreamingDestroyMessageEvents) { EventBus.getDefault().post(event); } mStreamingCreateStatusEvents.clear(); mStreamingDestroyStatusEvents.clear(); mStreamingCreateFavoriteEvents.clear(); mStreamingUnFavoriteEvents.clear(); mStreamingDestroyMessageEvents.clear(); } }); } @Override public void onStatus(Status status) { if (mStopped) { return; } if (!Relationship.isVisible(status)) { return; } Row row = Row.newStatus(status); if (MuteSettings.isMute(row)) { return; } long userId = AccessTokenManager.getUserId(); Status retweetedStatus = status.getRetweetedStatus(); if (status.getInReplyToUserId() == userId || (retweetedStatus != null && retweetedStatus.getUser().getId() == userId)) { EventBus.getDefault().post(new NotificationEvent(row)); } if (mPause) { mStreamingCreateStatusEvents.add(new StreamingCreateStatusEvent(row)); } else { EventBus.getDefault().post(new StreamingCreateStatusEvent(row)); } } @Override public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) { if (mStopped) { return; } if (mPause) { mStreamingDestroyStatusEvents.add(new StreamingDestroyStatusEvent(statusDeletionNotice.getStatusId())); } else { EventBus.getDefault().post(new StreamingDestroyStatusEvent(statusDeletionNotice.getStatusId())); } } @Override public void onFavorite(User source, User target, Status status) { if (mStopped) { return; } Row row = Row.newFavorite(source, target, status); // 自分の fav を反映 if (source.getId() == AccessTokenManager.getUserId()) { FavRetweetManager.setFav(status.getId()); EventBus.getDefault().post(new StreamingCreateFavoriteEvent(row)); return; } EventBus.getDefault().post(new NotificationEvent(row)); new AsyncTask<Row, Void, twitter4j.Status>(){ private Row mRow; @Override protected twitter4j.Status doInBackground(Row... params) { mRow = params[0]; try { return TwitterManager.getTwitter().showStatus(mRow.getStatus().getId()); } catch (Exception e) { e.printStackTrace(); return null; } } @Override protected void onPostExecute(twitter4j.Status status) { if (status != null) { mRow.setStatus(status); } if (mPause) { mStreamingCreateFavoriteEvents.add(new StreamingCreateFavoriteEvent(mRow)); } else { EventBus.getDefault().post(new StreamingCreateFavoriteEvent(mRow)); } } }.execute(row); } @Override public void onUnfavorite(User arg0, User arg1, Status arg2) { if (mStopped) { return; } // 自分の unfav を反映 if (arg0.getId() == AccessTokenManager.getUserId()) { FavRetweetManager.removeFav(arg2.getId()); } if (mPause) { mStreamingUnFavoriteEvents.add(new StreamingUnFavoriteEvent(arg0, arg2)); } else { EventBus.getDefault().post(new StreamingUnFavoriteEvent(arg0, arg2)); } } @Override public void onDirectMessage(DirectMessage directMessage) { if (mStopped) { return; } Row row = Row.newDirectMessage(directMessage); if (MuteSettings.isMute(row)) { return; } EventBus.getDefault().post(new NotificationEvent(row)); if (mPause) { mStreamingCreateStatusEvents.add(new StreamingCreateStatusEvent(row)); } else { EventBus.getDefault().post(new StreamingCreateStatusEvent(row)); } } @Override public void onDeletionNotice(long directMessageId, long userId) { if (mStopped) { return; } if (mPause) { mStreamingDestroyMessageEvents.add(new StreamingDestroyMessageEvent(directMessageId)); } else { EventBus.getDefault().post(new StreamingDestroyMessageEvent(directMessageId)); } } }