package com.example.twitterclient.fragments; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.InflateException; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import com.example.twitterclient.R; import com.example.twitterclient.adapters.TweetListAdapter; import com.example.twitterclient.apps.TwitterApp; import com.example.twitterclient.handlers.AsyncTweetListHandler; import com.example.twitterclient.models.Tweet; import com.example.twitterclient.models.User; import com.example.twitterclient.net.TwitterClient; import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshListView; import java.util.List; /** * Created on 10/23/13. */ public class TimelineFragment extends Fragment implements PullToRefreshBase.OnRefreshListener<ListView>, PullToRefreshBase.OnLastItemVisibleListener, AsyncTweetListHandler.OnTweetListListener, TweetListAdapter.HandlesTweet { TweetListAdapter listAdapter; PullToRefreshListView listView; public static enum TimelineType { HOME, MENTIONS, USER } public static int getNameResource(TimelineType type) { if (type.equals(TimelineType.HOME)) return R.string.home; else if (type.equals(TimelineType.MENTIONS)) return R.string.mentions; else if (type.equals(TimelineType.USER)) return R.string.profile; return -1; } public static int getIconResource(TimelineType type) { if (type.equals(TimelineType.HOME)) return R.drawable.ic_home_symbol; else if (type.equals(TimelineType.MENTIONS)) return R.drawable.ic_at_symbol; else if (type.equals(TimelineType.USER)) return R.drawable.ic_action_profile; return -1; } final User user; final TimelineType timelineType; private TweetListAdapter.HandlesTweet tweetHandler; public TimelineFragment(TimelineType type) { this.user = null; this.timelineType = type; } public TimelineFragment(User user) { this.user = user; timelineType = TimelineType.USER; } public void setTweetHandler(TweetListAdapter.HandlesTweet tweetHandler) { this.tweetHandler = tweetHandler; } public void recallLastTweets() { List<Tweet> tweets = null; Integer limit = Integer.valueOf(getString(R.integer.page_size)); if (timelineType == TimelineType.HOME) tweets = Tweet.getRecentTweets(limit); else if (timelineType == TimelineType.MENTIONS) tweets = Tweet.getRecentMentions(limit); else if (timelineType == TimelineType.USER) tweets = Tweet.getRecentUserTweets(limit, user); if (tweets != null) onTweetList(tweets); } public void loadNewerTweets() { Tweet loadBefore = null; if (listAdapter.getCount() > 0) loadBefore = listAdapter.getItem(0); loadTweets(loadBefore, null); } public void loadOlderTweets() { Tweet loadAfter = null; int count = listAdapter.getCount(); if (count > 0) loadAfter = listAdapter.getItem(count - 1); loadTweets(null, loadAfter); } public void loadTweets(Tweet loadBefore, Tweet loadAfter) { TwitterClient client = TwitterApp.getClient(); AsyncTweetListHandler handler = new AsyncTweetListHandler(this); Integer count = Integer.valueOf(getString(R.integer.page_size)); if (timelineType == TimelineType.HOME) client.getHomeTimeline(count, loadBefore, loadAfter, handler); else if (timelineType == TimelineType.MENTIONS) client.getMentionsTimeline(count, loadBefore, loadAfter, handler); else if (timelineType == TimelineType.USER) client.getUserTimeline(count, user, loadBefore, loadAfter, handler); } public void endRefresh() { if (listView.isRefreshing()) listView.onRefreshComplete(); } @Override public void onResume() { super.onResume(); recallLastTweets(); loadNewerTweets(); } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (!(activity instanceof TweetListAdapter.HandlesTweet)) throw new IllegalArgumentException("Activity must be able to handle Timeline tweets"); setTweetHandler((TweetListAdapter.HandlesTweet) activity); listAdapter = new TweetListAdapter(activity, this); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_timeline, container, false); if (v == null) { onError(new InflateException("Unable to inflate TweetList")); return null; } listView = (PullToRefreshListView) v.findViewById(R.id.listView); listView.setOnLastItemVisibleListener(this); listView.setOnRefreshListener(this); listView.setAdapter(listAdapter); return v; } @Override public void onTweetList(List<Tweet> tweets) { listAdapter.addAll(tweets); listAdapter.sort(new Tweet.ByDateCreatedDesc()); endRefresh(); } @Override public User getCurrentUser() { return tweetHandler.getCurrentUser(); } @Override public void onLastItemVisible() { loadOlderTweets(); } @Override public void onRefresh(PullToRefreshBase refreshView) { loadNewerTweets(); } @Override public void onError(Throwable error) { endRefresh(); tweetHandler.onError(error); } @Override public void onProfileClick(User user) { tweetHandler.onProfileClick(user); } @Override public void onReplyClick(Tweet tweet) { tweetHandler.onReplyClick(tweet); } }