package info.justaway.model;
import android.os.AsyncTask;
import android.os.Handler;
import de.greenrobot.event.EventBus;
import info.justaway.JustawayApplication;
import info.justaway.R;
import info.justaway.adapter.MyUserStreamAdapter;
import info.justaway.event.action.AccountChangeEvent;
import info.justaway.event.connection.StreamingConnectionEvent;
import info.justaway.settings.BasicSettings;
import info.justaway.util.MessageUtil;
import twitter4j.ConnectionLifeCycleListener;
import twitter4j.Twitter;
import twitter4j.TwitterFactory;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;
import twitter4j.auth.AccessToken;
import twitter4j.conf.ConfigurationBuilder;
/**
* Twitterインスタンス管理
*/
public class TwitterManager {
private static MyUserStreamAdapter sUserStreamAdapter;
private static TwitterStream sTwitterStream;
private static Twitter mTwitter;
private static boolean sTwitterStreamConnected;
public static void switchAccessToken(final AccessToken accessToken) {
AccessTokenManager.setAccessToken(accessToken);
if (BasicSettings.getStreamingMode()) {
MessageUtil.showToast(R.string.toast_destroy_streaming);
sUserStreamAdapter.stop();
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
sTwitterStream.cleanUp();
sTwitterStream.shutdown();
return null;
}
@Override
protected void onPostExecute(Void status) {
sTwitterStream.setOAuthAccessToken(accessToken);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
MessageUtil.showToast(R.string.toast_create_streaming);
sUserStreamAdapter.start();
sTwitterStream.user();
}
}, 5000);
}
}.execute();
}
EventBus.getDefault().post(new AccountChangeEvent());
}
private static String getConsumerKey() {
return JustawayApplication.getApplication().getString(R.string.twitter_consumer_key);
}
private static String getConsumerSecret() {
return JustawayApplication.getApplication().getString(R.string.twitter_consumer_secret);
}
public static Twitter getTwitter() {
if (mTwitter != null) {
return mTwitter;
}
Twitter twitter = getTwitterInstance();
AccessToken token = AccessTokenManager.getAccessToken();
if (token != null) {
twitter.setOAuthAccessToken(token);
// アクセストークンまである時だけキャッシュしておく
mTwitter = twitter;
}
return twitter;
}
public static Twitter getTwitterInstance() {
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
twitter4j.conf.Configuration conf = configurationBuilder.setOAuthConsumerKey(getConsumerKey())
.setOAuthConsumerSecret(getConsumerSecret())
.setTweetModeExtended(true)
.build();
TwitterFactory factory = new TwitterFactory(conf);
Twitter twitter = factory.getInstance();
return twitter;
}
public static TwitterStream getTwitterStream() {
AccessToken token = AccessTokenManager.getAccessToken();
if (token == null) {
return null;
}
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
twitter4j.conf.Configuration conf = configurationBuilder.setOAuthConsumerKey(getConsumerKey())
.setOAuthConsumerSecret(getConsumerSecret())
.setOAuthAccessToken(token.getToken())
.setOAuthAccessTokenSecret(token.getTokenSecret())
.setTweetModeExtended(true)
.build();
return new TwitterStreamFactory(conf).getInstance();
}
public static boolean getTwitterStreamConnected() {
return sTwitterStreamConnected;
}
public static void startStreaming() {
if (sTwitterStream != null) {
if (!sTwitterStreamConnected) {
sUserStreamAdapter.start();
sTwitterStream.setOAuthAccessToken(AccessTokenManager.getAccessToken());
sTwitterStream.user();
}
return;
}
sTwitterStream = getTwitterStream();
sUserStreamAdapter = new MyUserStreamAdapter();
sTwitterStream.addListener(sUserStreamAdapter);
sTwitterStream.addConnectionLifeCycleListener(new MyConnectionLifeCycleListener());
sTwitterStream.user();
BasicSettings.resetNotification();
}
public static void stopStreaming() {
if (sTwitterStream == null) {
return;
}
BasicSettings.setStreamingMode(false);
sUserStreamAdapter.stop();
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
sTwitterStream.cleanUp();
sTwitterStream.shutdown();
return null;
}
@Override
protected void onPostExecute(Void status) {
}
}.execute();
}
public static void pauseStreaming() {
if (sUserStreamAdapter != null) {
sUserStreamAdapter.pause();
}
}
public static void resumeStreaming() {
if (sUserStreamAdapter != null) {
sUserStreamAdapter.resume();
}
}
public static class MyConnectionLifeCycleListener implements ConnectionLifeCycleListener {
@Override
public void onConnect() {
sTwitterStreamConnected = true;
EventBus.getDefault().post(StreamingConnectionEvent.onConnect());
}
@Override
public void onDisconnect() {
sTwitterStreamConnected = false;
EventBus.getDefault().post(StreamingConnectionEvent.onDisconnect());
}
@Override
public void onCleanUp() {
sTwitterStreamConnected = false;
EventBus.getDefault().post(StreamingConnectionEvent.onCleanUp());
}
}
}