package com.tuit.ar.models.timeline; import java.util.ArrayList; import java.util.Collection; import org.json.JSONArray; import org.json.JSONObject; import org.json.JSONTokener; import android.os.Handler; import com.tuit.ar.api.TwitterAccount; import com.tuit.ar.api.TwitterRequest; import com.tuit.ar.api.request.Options; import com.tuit.ar.models.Timeline; abstract public class Status extends Timeline { protected ArrayList<com.tuit.ar.models.Status> tweets = new ArrayList<com.tuit.ar.models.Status>(); protected Status(TwitterAccount account) { super(account); } @Override public void requestHasFinished(final TwitterRequest request) { if (!request.getUrl().equals(this.getTimeline())) return; final Handler handler = new Handler(); final StatusRunnable runnable = new StatusRunnable(); new Thread() { public void run() { try { JSONArray tweets = new JSONArray(new JSONTokener(request.getResponse())); int c = tweets.length(); if (c > 0) { for (int i = c-1; i >= 0; i--) { com.tuit.ar.models.Status tweet = new com.tuit.ar.models.Status(tweets.getJSONObject(i)); //is_home INTEGER, is_reply INTEGER, belongs_to_user tweet.setBelongsToUser(account.getUser().getId()); // FIXME: some kind of way to recognize this with more abstraction? if (request.getUrl().equals(Options.FRIENDS_TIMELINE) || request.getUrl().equals(Options.REPLIES_TIMELINE)) { tweet.setHome(request.getUrl().equals(Options.FRIENDS_TIMELINE)); tweet.setReply(request.getUrl().equals(Options.REPLIES_TIMELINE)); tweet.replace(); } if (i == 0) newestTweet = tweet.getId(); Status.this.tweets.add(0, tweet); } if (Status.this.tweets.size() > MAX_SIZE) { Status.this.tweets.subList(MAX_SIZE, Status.this.tweets.size()).clear(); } } runnable.success = true; } catch (Exception e) { try { JSONObject response = new JSONObject(new JSONTokener(request.getResponse())); runnable.error = response.getString("error"); } catch (Exception ex) { runnable.error = e.getLocalizedMessage(); } runnable.success = false; } handler.post(runnable); } }.start(); } public ArrayList<com.tuit.ar.models.Status> getTweets() { return tweets; } public Collection<com.tuit.ar.models.Status> getTweetsNewerThan(com.tuit.ar.models.Status status) { return tweets.subList(0, tweets.indexOf(status)); } private class StatusRunnable implements Runnable { public boolean success; public String error = null; public void run() { if (success) timelineChanged(); else failedToUpdate(error); finishedUpdate(); } }; }