package info.justaway.fragment.main.tab;
import android.os.AsyncTask;
import android.view.View;
import java.util.ArrayList;
import info.justaway.event.model.StreamingCreateFavoriteEvent;
import info.justaway.event.model.StreamingUnFavoriteEvent;
import info.justaway.model.AccessTokenManager;
import info.justaway.model.Row;
import info.justaway.model.TabManager;
import info.justaway.model.TwitterManager;
import info.justaway.settings.BasicSettings;
import info.justaway.util.StatusUtil;
import twitter4j.Paging;
import twitter4j.ResponseList;
import twitter4j.Status;
/**
* 将来「つながり」タブ予定のタブ、現在はリプしか表示されない
*/
public class InteractionsFragment extends BaseFragment {
/**
* このタブを表す固有のID、ユーザーリストで正数を使うため負数を使う
*/
public long getTabId() {
return TabManager.INTERACTIONS_TAB_ID;
}
/**
* このタブに表示するツイートの定義
* @param row ストリーミングAPIから受け取った情報(ツイート+ふぁぼ)
* CreateFavoriteEventをキャッチしている為、ふぁぼイベントを受け取ることが出来る
* @return trueは表示しない、falseは表示する
*/
@Override
protected boolean isSkip(Row row) {
if (row.isFavorite()) {
return row.getSource().getId() == AccessTokenManager.getUserId();
}
if (row.isStatus()) {
Status status = row.getStatus();
Status retweet = status.getRetweetedStatus();
/**
* 自分のツイートがRTされた時
*/
if (retweet != null && retweet.getUser().getId() == AccessTokenManager.getUserId()) {
return false;
}
/**
* 自分宛のメンション(但し「自分をメンションに含むツイートがRTされた時」はうざいので除く)
*/
if (retweet == null && StatusUtil.isMentionForMe(status)) {
return false;
}
}
return true;
}
@Override
protected void taskExecute() {
new MentionsTimelineTask().execute();
}
private class MentionsTimelineTask extends AsyncTask<Void, Void, ResponseList<Status>> {
@Override
protected ResponseList<twitter4j.Status> doInBackground(Void... params) {
try {
Paging paging = new Paging();
if (mMaxId > 0 && !mReloading) {
paging.setMaxId(mMaxId - 1);
paging.setCount(BasicSettings.getPageCount());
}
return TwitterManager.getTwitter().getMentionsTimeline(paging);
} catch (OutOfMemoryError e) {
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(ResponseList<twitter4j.Status> statuses) {
mFooter.setVisibility(View.GONE);
if (statuses == null || statuses.size() == 0) {
mReloading = false;
mPullToRefreshLayout.setRefreshComplete();
mListView.setVisibility(View.VISIBLE);
return;
}
if (mReloading) {
clear();
for (twitter4j.Status status : statuses) {
if (mMaxId <= 0L || mMaxId > status.getId()) {
mMaxId = status.getId();
}
mAdapter.add(Row.newStatus(status));
}
mReloading = false;
mPullToRefreshLayout.setRefreshComplete();
} else {
for (twitter4j.Status status : statuses) {
if (mMaxId <= 0L || mMaxId > status.getId()) {
mMaxId = status.getId();
}
mAdapter.extensionAdd(Row.newStatus(status));
}
mAutoLoader = true;
mListView.setVisibility(View.VISIBLE);
}
}
}
/**
* ストリーミングAPIからふぁぼを受け取った時のイベント
* @param event ふぁぼイベント
*/
public void onEventMainThread(StreamingCreateFavoriteEvent event) {
addStack(event.getRow());
}
/**
* ストリーミングAPIからあんふぁぼイベントを受信
* @param event ツイート
*/
public void onEventMainThread(StreamingUnFavoriteEvent event) {
ArrayList<Integer> removePositions = mAdapter.removeStatus(event.getStatus().getId());
for (Integer removePosition : removePositions) {
if (removePosition >= 0) {
int visiblePosition = mListView.getFirstVisiblePosition();
if (visiblePosition > removePosition) {
View view = mListView.getChildAt(0);
int y = view != null ? view.getTop() : 0;
mListView.setSelectionFromTop(visiblePosition - 1, y);
break;
}
}
}
}
}