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.FetchedNewTweetsEvent;
import com.path.android.jobqueue.examples.twitter.models.TweetModel;
import de.greenrobot.event.EventBus;
import twitter4j.Status;
import twitter4j.TwitterException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class FetchTweetsJob extends Job {
private static final AtomicInteger jobCounter = new AtomicInteger(0);
private final int id;
public FetchTweetsJob() {
super(new Params(Priority.LOW).requireNetwork().groupBy("fetch-tweets"));
id = jobCounter.incrementAndGet();
}
@Override
public void onAdded() {
}
@Override
public void onRun() throws Throwable {
if(id != jobCounter.get()) {
//looks like other fetch jobs has been added after me. no reason to keep fetching
//many times, cancel me, let the other one fetch tweets.
return;
}
TweetModel tweetModel = TweetModel.getInstance();
Tweet lastTweet = tweetModel.getLastTweet();
List<Status> statusList = TwitterController.getInstance().loadTweets(lastTweet == null ? null : lastTweet.getServerId());
if(statusList.size() > 0) {
List<Tweet> tweets = new ArrayList<Tweet>(statusList.size());
for(Status status : statusList) {
Tweet tweet = new Tweet(status);
tweets.add(tweet);
}
tweetModel.insertOrReplaceAll(tweets);
EventBus.getDefault().post(new FetchedNewTweetsEvent());
}
}
@Override
protected void onCancel() {
//TODO show error notification
}
@Override
protected boolean shouldReRunOnThrowable(Throwable throwable) {
if(throwable instanceof TwitterException) {
//if it is a 4xx error, stop
TwitterException twitterException = (TwitterException) throwable;
return twitterException.getErrorCode() < 400 || twitterException.getErrorCode() > 499;
}
return true;
}
}