package com.tuit.ar.models; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import org.json.JSONException; import org.json.JSONObject; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteException; import com.tuit.ar.api.Twitter; import com.tuit.ar.api.TwitterAccount; import com.tuit.ar.api.TwitterAccountRequestsObserver; import com.tuit.ar.api.TwitterRequest; import com.tuit.ar.api.request.Options; import com.tuit.ar.databases.Model; public class Status extends ListElement implements TwitterAccountRequestsObserver { private static final String[] columns = new String[]{ "date", "favorited", "id", "in_reply_to_screen_name", "in_reply_to_status_id", "in_reply_to_user_id", "message", "source", "user_id", "is_home", "is_reply", "belongs_to_user" }; private JSONObject dataSourceJSON; private Date createDate; private long dateMillis = 0; private boolean favorited = false; private long id = 0; private String in_reply_to_screen_name; private long in_reply_to_status_id = 0; private long in_reply_to_user_id = 0; private String message; private String source; private long user_id = 0; private User user; private boolean is_home; private boolean is_reply; private long belongs_to_user; public Status(Cursor query) { super(); setDateMillis(query.getLong(0) * 1000); setFavorited(query.getInt(1) == 1); setId(query.getLong(2)); setInReplyToScreenName(query.getString(3)); setInReplyToStatusId(query.getLong(4)); setInReplyToUserId(query.getLong(5)); setMessage(query.getString(6)); setSource(query.getString(7)); setUserId(query.getLong(8)); setHome(query.getInt(9) == 1); setReply(query.getInt(10) == 1); setBelongsToUser(query.getLong(11)); } public Status(JSONObject object) { super(); this.dataSourceJSON = object; } public User getUser() { if (user != null) return user; user = User.get(getUserId()); if (user != null) return user; if (dataSourceJSON != null) { try { return user = new User(dataSourceJSON.getJSONObject("user")); } catch (JSONException e) { e.printStackTrace(); } } ArrayList<User> searchUser = User.select("id = ?", new String[] { String.valueOf(getUserId()) }, null, null, null, "1"); if (searchUser.size() > 0) return user = searchUser.get(0); return null; } public boolean isFavorited() { if (favorited != false) return favorited; try { return favorited = dataSourceJSON.getBoolean("favorited"); } catch (Exception e) { return false; } } public void setFavorited(boolean favorited) { this.favorited = favorited; } public String getInReplyToScreenName() { if (in_reply_to_screen_name != null) return in_reply_to_screen_name; try { return in_reply_to_screen_name = dataSourceJSON.isNull("in_reply_to_screen_name") ? null : dataSourceJSON.getString("in_reply_to_screen_name"); } catch (Exception e) { return null; } } public void setInReplyToScreenName(String inReplyToScreenName) { in_reply_to_screen_name = inReplyToScreenName; } public long getInReplyToStatusId() { if (in_reply_to_status_id != 0) return in_reply_to_status_id; try { return in_reply_to_status_id = dataSourceJSON.getLong("in_reply_to_status_id"); } catch (Exception e) { return 0; } } public void setInReplyToStatusId(long inReplyToStatusId) { in_reply_to_status_id = inReplyToStatusId; } public long getInReplyToUserId() { if (in_reply_to_user_id != 0) return in_reply_to_user_id; try { return in_reply_to_user_id = dataSourceJSON.getLong("in_reply_to_user_id"); } catch (Exception e) { return 0; } } public void setInReplyToUserId(long inReplyToUserId) { in_reply_to_user_id = inReplyToUserId; } public String getSource() { if (source != null) return source; try { return source = dataSourceJSON.isNull("source") ? null : dataSourceJSON.getString("source"); } catch (Exception e) { return null; } } public void setSource(String source) { this.source = source; } public long getUserId() { if (user_id != 0) return user_id; try { return user_id = dataSourceJSON.getJSONObject("user").getLong("id"); } catch (Exception e) { return 0; } } public void setUserId(long userId) { user_id = userId; } public long getId() { if (id != 0) return id; try { return id = dataSourceJSON.getLong("id"); } catch (Exception e) { return 0; } } public void setId(long id) { this.id = id; } public String getMessage() { if (message != null) return message; try { setMessage(dataSourceJSON.isNull("text") ? null : dataSourceJSON.getString("text")); return message; } catch (Exception e) { return null; } } public void setMessage(String message) { this.message = sanitize(message); } public boolean isHome() { return is_home; } public void setHome(boolean isHome) { is_home = isHome; } public boolean isReply() { return is_reply; } public void setReply(boolean isReply) { is_reply = isReply; } public long getBelongsToUser() { return belongs_to_user; } public void setBelongsToUser(long belongsToUser) { belongs_to_user = belongsToUser; } @SuppressWarnings("unchecked") static public ArrayList<Status> select(String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) { return (ArrayList<Status>)Model.select(Status.class, columns, selection, selectionArgs, groupBy, having, orderBy, limit); } public String getUsername() { try { return getUser().getScreenName(); } catch (Exception e) { return null; } } public Date getDate() { try { if (createDate != null) return createDate; SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss Z yyyy", Locale.ENGLISH); return createDate = sdf.parse(dataSourceJSON.getString("created_at")); } catch (Exception e) { return null; } } public void setDateMillis(long dateMillis) { this.dateMillis = dateMillis; } public long getDateMillis() { if (dateMillis == 0) { Date date = this.getDate(); if (date == null) return (long)0; dateMillis = date.getTime(); } return dateMillis; } @Override public long replace() { try { User user = getUser(); user.setBelongsToUser(getBelongsToUser()); user.replace(); } catch (SQLiteException e) {} // TODO: some kind of factory to avoid having twice the same instance? try { Status status = Status.select("id = ?", new String [] { String.valueOf(getId()) }, null, null, null, "1").get(0); boolean reply = status.isReply() || this.isReply(); status.setReply(reply); this.setReply(reply); boolean home = status.isHome() || this.isHome(); status.setHome(home); this.setHome(home); } catch (Exception e) { } return super.replace(); } @Override protected ContentValues getValues() { ContentValues fields = new ContentValues(); fields.put(columns[0], getDateMillis() / 1000); fields.put(columns[1], isFavorited() ? 1 : 0); fields.put(columns[2], getId()); fields.put(columns[3], getInReplyToScreenName()); fields.put(columns[4], getInReplyToStatusId()); fields.put(columns[5], getInReplyToUserId()); fields.put(columns[6], getMessage()); fields.put(columns[7], getSource()); fields.put(columns[8], getUserId()); fields.put(columns[9], isHome() ? 1 : 0); fields.put(columns[10], isReply() ? 1 : 0); fields.put(columns[11], getBelongsToUser()); return fields; } static public int deleteBelongsToUser(String user) { return Model.delete(Status.class, "belongs_to_user = ?", new String[]{user}); } @Override public String getText() { return getMessage(); } @Override public String getDisplayDate() { return calculateElapsed(getDateMillis()); } public void addToFavorites() { ArrayList<NameValuePair> nvps = new ArrayList<NameValuePair> (); nvps.add(new BasicNameValuePair("id", String.valueOf(getId()))); Options option = Options.ADD_TO_FAVORITES; option.setParameters(nvps); TwitterAccount account = Twitter.getInstance().getDefaultAccount(); account.addRequestObserver(this); if (this.isHome()) com.tuit.ar.models.timeline.Friends.getInstance(account).startedUpdate(); if (this.isReply()) com.tuit.ar.models.timeline.Replies.getInstance(account).startedUpdate(); try { account.requestUrl(option, nvps, TwitterRequest.METHOD_POST); } catch (Exception e) { e.printStackTrace(); } } public void removeFromFavorites() { ArrayList<NameValuePair> nvps = new ArrayList<NameValuePair> (); nvps.add(new BasicNameValuePair("id", String.valueOf(getId()))); Options option = Options.REMOVE_FROM_FAVORITES; option.setParameters(nvps); TwitterAccount account = Twitter.getInstance().getDefaultAccount(); account.addRequestObserver(this); if (this.isHome()) com.tuit.ar.models.timeline.Friends.getInstance(account).startedUpdate(); if (this.isReply()) com.tuit.ar.models.timeline.Replies.getInstance(account).startedUpdate(); com.tuit.ar.models.timeline.Favorites.getInstance(account).startedUpdate(); try { account.requestUrl(option, nvps, TwitterRequest.METHOD_POST); } catch (Exception e) { e.printStackTrace(); } } public void requestHasFinished(TwitterRequest request) { if (request.getUrl().equals(Options.ADD_TO_FAVORITES) || request.getUrl().equals(Options.REMOVE_FROM_FAVORITES)) { TwitterAccount account = Twitter.getInstance().getDefaultAccount(); com.tuit.ar.models.timeline.Favorites f = (com.tuit.ar.models.timeline.Favorites) com.tuit.ar.models.timeline.Favorites.getInstance(account); if (request.getUrl().equals(Options.ADD_TO_FAVORITES)) { this.setFavorited(true); f.getTweets().add(this); } else { this.setFavorited(false); f.getTweets().remove(this); } this.replace(); account.removeRequestObserver(this); if (this.isHome()) com.tuit.ar.models.timeline.Friends.getInstance(account).finishedUpdate(); if (this.isReply()) com.tuit.ar.models.timeline.Replies.getInstance(account).finishedUpdate(); com.tuit.ar.models.timeline.Favorites.getInstance(account).finishedUpdate(); } } public void requestHasStarted(TwitterRequest request) { } public void retweet() { ArrayList<NameValuePair> nvps = new ArrayList<NameValuePair> (); nvps.add(new BasicNameValuePair("id", String.valueOf(getId()))); Options option = Options.RETWEET; option.setParameters(nvps); TwitterAccount account = Twitter.getInstance().getDefaultAccount(); try { account.requestUrl(option, nvps, TwitterRequest.METHOD_POST); } catch (Exception e) { e.printStackTrace(); } } @Override public String getAvatarUrl() { try { return getUser().getProfileImageUrl(); } catch (Exception e) { return null; } } public ArrayList<String> getNamedUsers() { String message = getMessage(); Pattern p = Pattern.compile("@[A-Za-z0-9\\_]+"); Matcher m = p.matcher(message); ArrayList<String> users = new ArrayList<String>(); while (m.find()) { String user = m.group(); if (users.contains(user) == false) { users.add(user); } } return users; } }