package com.novoda.magicmirror.modules.twitter;
import android.content.Context;
import android.preference.PreferenceManager;
import com.novoda.magicmirror.BuildConfig;
import com.novoda.magicmirror.R;
import com.novoda.magicmirror.modules.DashboardModule;
import com.novoda.notils.logger.simple.Log;
import twitter4j.StallWarning;
import twitter4j.Status;
import twitter4j.StatusDeletionNotice;
import twitter4j.StatusListener;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;
public class TwitterModule implements DashboardModule {
private static final String DEFAULT_QUERY = "novoda";
private final TwitterStream twitterStream;
private final String query;
private final TwitterListener listener;
private boolean running = false;
private TweetsFlowRegulator tweetsFlowRegulator;
public static TwitterModule newInstance(Context context, TwitterListener listener) {
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
Configuration configuration = configurationBuilder
.setOAuthConsumerKey(BuildConfig.TWITTER_CONSUMER_KEY)
.setOAuthConsumerSecret(BuildConfig.TWITTER_CONSUMER_SECRET)
.setOAuthAccessToken(BuildConfig.TWITTER_ACCESS_TOKEN)
.setOAuthAccessTokenSecret(BuildConfig.TWITTER_ACCESS_TOKEN_SECRET)
.build();
TwitterStream twitterStream = new TwitterStreamFactory(configuration).getInstance();
String preferencesKey = context.getString(R.string.preference_key_tweet_filter);
String query = PreferenceManager.getDefaultSharedPreferences(context).getString(preferencesKey, DEFAULT_QUERY);
return new TwitterModule(twitterStream, query, listener);
}
TwitterModule(TwitterStream twitterStream, String query, TwitterListener listener) {
this.twitterStream = twitterStream;
this.query = query;
this.listener = listener;
initStream();
}
private void initStream() {
tweetsFlowRegulator = TweetsFlowRegulator.newInstance(listener);
twitterStream.addListener(new StatusListener() {
@Override
public void onStatus(Status status) {
tweetsFlowRegulator.addTweet(status);
}
@Override
public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) {
// No-op
}
@Override
public void onTrackLimitationNotice(int numberOfLimitedStatuses) {
// No-op
}
@Override
public void onScrubGeo(long userId, long upToStatusId) {
// No-op
}
@Override
public void onStallWarning(StallWarning warning) {
Log.w(warning);
}
@Override
public void onException(Exception ex) {
Log.e(ex);
}
});
}
@Override
public void update() {
if (running) {
return;
}
running = true;
tweetsFlowRegulator.startTweetPicker();
twitterStream.filter(query);
}
@Override
public void stop() {
tweetsFlowRegulator.stopTweetPicker();
twitterStream.cleanUp();
running = false;
}
public interface TwitterListener {
void onNextTweet(Status tweet);
}
}