package com.path.android.jobqueue.examples.twitter.jobs; import com.path.android.jobqueue.BaseJob; import com.path.android.jobqueue.Job; import com.path.android.jobqueue.Params; import com.path.android.jobqueue.examples.twitter.controllers.TwitterController; import com.path.android.jobqueue.examples.twitter.entities.Tweet; import com.path.android.jobqueue.examples.twitter.events.DeletedTweetEvent; import com.path.android.jobqueue.examples.twitter.events.PostedTweetEvent; import com.path.android.jobqueue.examples.twitter.events.PostingTweetEvent; import com.path.android.jobqueue.examples.twitter.models.TweetModel; import de.greenrobot.event.EventBus; import twitter4j.Status; import twitter4j.TwitterException; import java.util.Date; public class PostTweetJob extends Job { private long localId; private String text; public PostTweetJob(String text) { super(new Params(Priority.MID).requireNetwork().persist().groupBy("post_tweet"));//order of tweets matter, we don't want to send two in parallel //use a negative id so that it cannot collide w/ twitter ids //we have to set local id here so it gets serialized into job (to find tweet later on) localId = -System.currentTimeMillis(); this.text = text; } @Override public void onAdded() { //job has been secured to disk, add item to database try { Tweet tweet = new Tweet( localId, null, text, TwitterController.getInstance().getUserId(), null, new Date(System.currentTimeMillis()) ); TweetModel.getInstance().insertOrReplace(tweet); EventBus.getDefault().post(new PostingTweetEvent(tweet)); } catch (TwitterException exception) { //if we cannot get user id, we won't add it locally for now. } } @Override public void onRun() throws Throwable { Status status = TwitterController.getInstance().postTweet(text); Tweet newTweet = new Tweet(status); TweetModel tweetModel = TweetModel.getInstance(); Tweet existingTweet = tweetModel.getTweetByLocalId(localId); if(existingTweet != null) { existingTweet.updateNotNull(newTweet); //don't set local to false. this way, next time we ask for history update, we'll send proper tweet id tweetModel.insertOrReplace(existingTweet); } else { //somewhat local tweet does not exist. we might have crashed before onAdded is called. //just insert as if it is a new tweet tweetModel.insertOrReplace(newTweet); } EventBus.getDefault().post(new PostedTweetEvent(newTweet, localId)); } @Override protected void onCancel() { //delete local tweet Tweet localTweet = TweetModel.getInstance().getTweetByLocalId(localId); if(localTweet != null) { TweetModel.getInstance().deleteTweetById(localId); EventBus.getDefault().post(new DeletedTweetEvent(localId)); } } @Override protected boolean shouldReRunOnThrowable(Throwable throwable) { if(throwable instanceof TwitterException) { //if it is a 4xx error, stop TwitterException twitterException = (TwitterException) throwable; return twitterException.getStatusCode() < 400 || twitterException.getStatusCode() > 499; } return true; } }