package im.zico.wingtwitter.ui.fragment; import android.app.AlertDialog; import android.app.Fragment; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.widget.SwipeRefreshLayout; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.tjerkw.slideexpandable.library.ActionSlideExpandableListView; import java.util.ArrayList; import im.zico.wingtwitter.R; import im.zico.wingtwitter.WingApp; import im.zico.wingtwitter.adapter.UserTimeLineAdapter; import im.zico.wingtwitter.dao.WingDataHelper; import im.zico.wingtwitter.dao.WingStore; import im.zico.wingtwitter.type.WingTweet; import im.zico.wingtwitter.ui.TweetComposeActivity; import im.zico.wingtwitter.ui.view.LoadingFooter; import im.zico.wingtwitter.ui.view.TweetListView; import twitter4j.AsyncTwitter; import twitter4j.Paging; import twitter4j.ResponseList; import twitter4j.Status; import twitter4j.TwitterAdapter; import twitter4j.TwitterListener; /** * Created by tinyao on 1/9/15. */ public class UserTimeLineFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener, TweetListView.ScrollDetectCallback{ private TweetListView mListView; private LoadingFooter mLoadingFooter; private AsyncTwitter mAsyncTwitter; public SwipeRefreshLayout mSwipeRefresh; public UserTimeLineAdapter mAdapter; public ArrayList<WingTweet> userTweets; public String mScreenName; public UserTimeLineFragment(){ } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mScreenName = getActivity().getIntent().getStringExtra(WingStore.UserColumns.SCREEN_NAME); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_blank, container, false); mListView = (TweetListView) rootView.findViewById(R.id.list); mLoadingFooter = new LoadingFooter(getActivity()); mListView.addFooterView(mLoadingFooter.getView()); return rootView; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mAsyncTwitter = WingApp.newTwitterInstance(); mAsyncTwitter.addListener(listener); bindSwipeToRefresh((ViewGroup) view); userTweets = new ArrayList<>(); mAdapter = new UserTimeLineAdapter(mListView, userTweets); mListView.setScrollCallback(this); mListView.setAdapter(mAdapter); loadLatest(); mListView.setItemActionListener(new ActionSlideExpandableListView.OnActionClickListener() { @Override public void onClick(View itemView, View clickedView, final int position) { final WingTweet tweet = mAdapter.getItem(position); switch (clickedView.getId()) { case R.id.expand_action_reply: Bundle bundle = new Bundle(); bundle.putString("user", "@" + tweet.screen_name); bundle.putLong("inReplyId", tweet.tweet_id); TweetComposeActivity.showDialog(getActivity(), bundle); break; case R.id.expand_action_share: Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "@" + tweet.screen_name + ": " + tweet.content); sendIntent.setType("text/plain"); startActivity(sendIntent); break; case R.id.expand_action_favorite: WingTweet favTweet = mAdapter.getItem(position); if (!favTweet.favorited) { mAsyncTwitter.createFavorite(tweet.tweet_id); } else { mAsyncTwitter.destroyFavorite(tweet.tweet_id); } break; case R.id.expand_action_retweet: new AlertDialog.Builder(getActivity()) .setMessage("Retweet or Quote ?") .setNeutralButton(R.string.cancel, null) .setPositiveButton(R.string.retweet, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mAsyncTwitter.retweetStatus(tweet.tweet_id); } }) .setNegativeButton(R.string.quote, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Bundle bnd = new Bundle(); bnd.putString("quote", "RT " + tweet.content); TweetComposeActivity.showDialog(getActivity(), bnd); } }).create().show(); break; case R.id.expand_action_copy: ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("wing", tweet.content); clipboard.setPrimaryClip(clip); Toast.makeText(getActivity(), "Copyed to clipboard !", Toast.LENGTH_SHORT).show(); break; case R.id.expand_action_delete: new AlertDialog.Builder(getActivity()) .setTitle("Delete") .setMessage("Do you want to delete this Tweet?") .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mAsyncTwitter.destroyStatus(tweet.tweet_id); } }) .setNegativeButton(R.string.no, null) .create().show(); break; case R.id.expand_action_filter: // ToDo: Filter user or source new AlertDialog.Builder(getActivity()) .setTitle("Add to filter") .setMessage("User: " + tweet.user_name + "\nSoure: " + tweet.source) .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }) .setNegativeButton(R.string.no, null) .create().show(); break; } mListView.collapse(); } }); } /** * Listener for TwitterMethod Callback */ private TwitterListener listener = new TwitterAdapter() { @Override public void gotUserTimeline(ResponseList<Status> statuses) { super.gotUserTimeline(statuses); Log.d("DEBUG", "user timeline: " + statuses); ArrayList<WingTweet> wingTweets = new ArrayList<>(); for (Status ss : statuses) { WingTweet tweet = new WingTweet(ss); wingTweets.add(tweet); } Message msg = new Message(); msg.obj = wingTweets; mHandler.sendMessage(msg); } }; Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); ArrayList<WingTweet> wingTweets = (ArrayList<WingTweet>) msg.obj; new WingDataHelper(getActivity()).saveAll(wingTweets, WingStore.TYPE_COMMON_TWEET); if(mLoadingFooter.getState() == LoadingFooter.State.Loading) { userTweets.addAll(wingTweets); } else { userTweets.addAll(0, wingTweets); mSwipeRefresh.setRefreshing(false); } if (wingTweets == null || wingTweets.size() < 10) { Log.d("DEBUG", "the end"); mLoadingFooter.setState(LoadingFooter.State.TheEnd); } else { mLoadingFooter.setState(LoadingFooter.State.Idle, 3000); } mAdapter.notifyDataSetChanged(); } }; /** * Bind a SwipeRefreshLayout to the contentView * @param v */ protected void bindSwipeToRefresh(ViewGroup v) { mSwipeRefresh = new SwipeRefreshLayout(getActivity()); // Move child to SwipeRefreshLayout, and add SwipeRefreshLayout to root view v.removeViewInLayout(mListView); v.addView(mSwipeRefresh, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); mSwipeRefresh.addView(mListView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); mSwipeRefresh.setColorSchemeResources( R.color.refresh_progress_1, R.color.refresh_progress_2, R.color.refresh_progress_3); mSwipeRefresh.setOnRefreshListener(this); } @Override public void onRefresh() { loadLatest(); } private void loadLatest() { mAsyncTwitter.getUserTimeline(mScreenName); } @Override public void onScrollDown() { } @Override public void onScrollUp() { } @Override public void onScrollFooter() { if (mAdapter.getCount() == 0){ return; } if (mLoadingFooter.getState() != LoadingFooter.State.Loading && mLoadingFooter.getState() != LoadingFooter.State.TheEnd) { mLoadingFooter.setState(LoadingFooter.State.Loading); loadNext(); } } private void loadNext() { WingTweet tweet = mAdapter.getItem(mAdapter.getCount()-1); Log.d("DEBUG", "tweet content: " + tweet.content); mAsyncTwitter.getUserTimeline(mScreenName, new Paging(1, 20).maxId(mAdapter.getItem(mAdapter.getCount() - 1).tweet_id - 1)); } }