package im.zico.wingtwitter.ui.fragment;
import android.app.ActivityOptions;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Html;
import android.text.Spannable;
import android.text.TextPaint;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.util.Log;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
import de.hdodenhof.circleimageview.CircleImageView;
import im.zico.wingtwitter.R;
import im.zico.wingtwitter.WingApp;
import im.zico.wingtwitter.dao.WingDataHelper;
import im.zico.wingtwitter.type.WingTweet;
import im.zico.wingtwitter.ui.ProfileActivity;
import im.zico.wingtwitter.ui.view.HtmlTextView;
import im.zico.wingtwitter.utils.TweetUtils;
import im.zico.wingtwitter.utils.Utils;
import im.zico.wingtwitter.dao.WingStore.*;
import twitter4j.AsyncTwitter;
import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.ResponseList;
import twitter4j.Status;
import twitter4j.TwitterAdapter;
import twitter4j.TwitterListener;
import twitter4j.User;
/**
* Created by tinyao on 12/10/14.
*/
public class TweetDetailFragment extends Fragment {
private WingTweet tweet;
private AsyncTwitter asyncTwitter;
public TweetDetailFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getActivity().getIntent();
long tweet_id = intent.getLongExtra("tweet_id", 0);
WingDataHelper dbHelper = new WingDataHelper(getActivity());
tweet = dbHelper.getTweet(tweet_id);
if (tweet == null) {
Toast.makeText(getActivity(), "Tweet not found", Toast.LENGTH_SHORT).show();
getActivity().finishAfterTransition();
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_tweet_detail, container, false);
final Holder holder = new Holder(rootView);
Picasso.with(getActivity())
.load(tweet.avatar_url)
.into(holder.avatar);
if (tweet.retweet_id != -1) {
holder.retweeted.setVisibility(View.VISIBLE);
holder.retweeted.setText(tweet.retweeted_by_user_name + " retweeted");
} else {
holder.retweeted.setVisibility(View.GONE);
}
holder.name.setText(tweet.user_name);
holder.screenName.setText("@" + tweet.screen_name);
holder.content.setText(String.valueOf(tweet.content));
holder.time.setText(Utils.getTimeAgo(tweet.created_at));
holder.content.setHtmlText(tweet.content_html);
Spannable s = (Spannable) Html.fromHtml(tweet.source);
for (URLSpan u : s.getSpans(0, s.length(), URLSpan.class)) {
s.setSpan(new UnderlineSpan() {
public void updateDrawState(TextPaint tp) {
tp.setUnderlineText(false);
}
}, s.getSpanStart(u), s.getSpanEnd(u), 0);
}
if (tweet.source.equals(WingApp.TWITTER_APP_NAME)) {
holder.tvia.setText(Html.fromHtml(WingApp.TWITTER_APP_SOURCE));
} else {
holder.tvia.setText(tweet.source);
}
holder.counts.setText("" + tweet.retweet_count);
holder.favorites.setText("" + tweet.favorite_count);
if (tweet.mediaUrls != null && tweet.mediaUrls.length > 0) {
holder.gallery.removeAllViews();
for (int i = 0; i < tweet.mediaUrls.length; i++) {
Log.d("DEBUG", tweet.user_name + " media load: " + tweet.mediaUrls[i]);
TweetUtils.insertPhoto(getActivity(), holder.gallery,
tweet.mediaUrls, i);
}
holder.gallery.setVisibility(View.VISIBLE);
} else {
holder.gallery.setVisibility(View.GONE);
}
holder.avatar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent profileIntent = new Intent(getActivity(), ProfileActivity.class);
profileIntent.putExtra(TweetColumns.USER_AVATAR_URL, tweet.avatar_url);
profileIntent.putExtra(TweetColumns.USER_ID, tweet.user_id);
profileIntent.putExtra(TweetColumns.USER_NAME, tweet.user_name);
profileIntent.putExtra(TweetColumns.USER_SCREEN_NAME, tweet.screen_name);
ActivityOptions options = ActivityOptions
.makeSceneTransitionAnimation(getActivity(),
Pair.create((View) holder.avatar, "avatar"));
startActivity(profileIntent, options.toBundle());
}
});
return rootView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
fetchConversation();
}
private void fetchConversation() {
asyncTwitter = WingApp.newTwitterInstance();
asyncTwitter.addListener(listener);
Log.d("DEBUG", "1. Fetch conversation");
if (tweet.in_reply_status_id != 0) {
// has conversation before this
asyncTwitter.showStatus(tweet.in_reply_status_id);
} else {
// conversation all after this
searchAfterReplies();
}
}
private void searchAfterReplies() {
Query query = new Query("@" + tweet.screen_name).sinceId(tweet.tweet_id);
asyncTwitter.search(query);
}
private TwitterListener listener = new TwitterAdapter() {
@Override
public void gotRetweets(ResponseList<Status> retweets) {
Log.d("DEBUG", "retweets: " + retweets);
super.gotRetweets(retweets);
}
@Override
public void gotUserDetail(User user) {
Log.d("DEBUG", "users: " + user);
super.gotUserDetail(user);
}
@Override
public void gotShowStatus(Status status) {
if (status == null) return;
conversations.add(0, new WingTweet(status));
if (status.getInReplyToStatusId() != 0) {
asyncTwitter.showStatus(status.getInReplyToStatusId());
} else {
mHandler.sendEmptyMessage(GOT_BEFORE_REPLIES);
}
super.gotShowStatus(status);
}
@Override
public void searched(QueryResult queryResult) {
ArrayList<WingTweet> afterReplies = new ArrayList<WingTweet>();
List<Status> statuses = queryResult.getTweets();
Log.d("DEBUG", "Replies Searched: " + statuses.size());
for (Status status : statuses) {
if (status.getInReplyToStatusId() == tweet.tweet_id) {
afterReplies.add(new WingTweet(status));
}
}
conversations.addAll(afterReplies);
mHandler.sendEmptyMessage(GOT_AFTER_REPLIES);
super.searched(queryResult);
}
};
private static final int GOT_BEFORE_REPLIES = 1;
private static final int GOT_AFTER_REPLIES = 2;
private ArrayList<WingTweet> conversations = new ArrayList<>();
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case GOT_AFTER_REPLIES:
Log.d("DEBUG", "GOT AFTER REPLIES, SHOW UI");
Log.d("DEBUG", "Conversation (" + conversations.size() + "): " + conversations);
break;
case GOT_BEFORE_REPLIES:
Log.d("DEBUG", "GOT BEFORE REPLIES");
searchAfterReplies();
break;
}
}
};
private class Holder {
public TextView retweeted;
public CircleImageView avatar;
public TextView name;
public TextView screenName;
public HtmlTextView content;
public TextView time;
public TextView tvia;
public TextView counts;
public TextView favorites;
public LinearLayout gallery;
public Holder(View view) {
retweeted = (TextView) view.findViewById(R.id.retweet_hint);
avatar = (CircleImageView) view.findViewById(R.id.user_avatar);
name = (TextView) view.findViewById(R.id.user_name);
screenName = (TextView) view.findViewById(R.id.user_screen_name);
content = (HtmlTextView) view.findViewById(R.id.tweet_content);
time = (TextView) view.findViewById(R.id.tweet_time);
tvia = (TextView) view.findViewById(R.id.tweet_via);
counts = (TextView) view.findViewById(R.id.retweet_count);
favorites = (TextView) view.findViewById(R.id.favorite_count);
gallery = (LinearLayout) view.findViewById(R.id.tweet_gallery);
}
}
@Override
public void onDetach() {
asyncTwitter.shutdown();
super.onDetach();
}
@Override
public void onDestroy() {
super.onDestroy();
}
}