package com.moupress.app.friendshost.sns.twitter;
import java.io.File;
import oauth.signpost.OAuth;
import oauth.signpost.OAuthConsumer;
import oauth.signpost.OAuthProvider;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import oauth.signpost.commonshttp.CommonsHttpOAuthProvider;
import oauth.signpost.exception.OAuthCommunicationException;
import oauth.signpost.exception.OAuthExpectationFailedException;
import oauth.signpost.exception.OAuthMessageSignerException;
import oauth.signpost.exception.OAuthNotAuthorizedException;
import twitter4j.AccountTotals;
import twitter4j.AsyncTwitter;
import twitter4j.AsyncTwitterFactory;
import twitter4j.ProfileImage;
import twitter4j.ResponseList;
import twitter4j.Status;
import twitter4j.StatusUpdate;
import twitter4j.Twitter;
import twitter4j.TwitterAdapter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.TwitterListener;
import twitter4j.TwitterMethod;
import twitter4j.User;
import twitter4j.auth.AccessToken;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;
import twitter4j.media.ImageUpload;
import twitter4j.media.ImageUploadFactory;
import twitter4j.media.MediaProvider;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import com.moupress.app.friendshost.Const;
import com.moupress.app.friendshost.FriendsHostActivity;
import com.moupress.app.friendshost.PubSub;
import com.moupress.app.friendshost.R;
import com.moupress.app.friendshost.sns.FeedEntry;
import com.moupress.app.friendshost.sns.SnsUtil;
import com.moupress.app.friendshost.sns.Listener.SnsEventListener;
import com.moupress.app.friendshost.util.NotificationTask;
import com.moupress.app.friendshost.util.Pref;
public class TwitterUtil extends SnsUtil{
//private SharedPreferences prefs;
//private Activity zActivity;
//private Context zContext;
//friendshost
//private static final String CONSUMER_KEY = "g6dQOeQIPrT7eXpSE7FGQ";
//private static final String CONSUMER_SECRET= "8MUOI1ShvCyj1IlUWQDlFEfFzSOjNQIugClDGLLUop4";
//melonfriends
private static final String CONSUMER_KEY = "XovyfTP04DfpmxPeeRfbg";
private static final String CONSUMER_SECRET= "ZmJRoKUKkf69QvXd3zGVRhkdl8VT3FsgBp3Ky5JQJ8";
private OAuthConsumer consumer;
private OAuthProvider provider;
//private String msgSend;
//private static enum AUTH_METHODS {GET_FEEDS, UPDATE_STATUS};
//private AUTH_METHODS authMethod = AUTH_METHODS.GET_FEEDS;
//private PubSub zPubSub;
private static final String TAG = "TwitterUtil";
private boolean isAuthenticated = false;
private AsyncTwitter twitterAsync;
private Twitter twitter;
private NotificationTask notificationTask;
public TwitterUtil(PubSub zPubSub) {
super(zPubSub,Const.SNS_TWITTER);
//this.prefs = PreferenceManager.getDefaultSharedPreferences(zActivity);
this.logImg = R.drawable.fh_twitter_logo;
if(this.isSelected())
fSnsAuth(null, false);
}
private TwitterListener listener = new TwitterAdapter() {
@Override
public void onException(TwitterException ex, TwitterMethod method) {
if(method == TwitterMethod.ACCOUNT_TOTALS) {
if(!isAuthenticated) {
isAuthenticated = true;
//Authentication();
}
}
else if(method == TwitterMethod.UPDATE_STATUS) {
Log.i(TAG, "Update Status Exception");
stopNotification();
}
else if(method == TwitterMethod.HOME_TIMELINE)
{
Log.i(TAG, "Home Timeline Exception");
}
}
@Override
public void updatedStatus(Status statuses) {
Log.i(TAG, "Status Published" + statuses.getText());
//mTwitterHandler.post(mUpdateTwitterNotification);
stopNotification();
}
@Override
public void gotHomeTimeline(ResponseList<Status> statuses) {
//mTwitterHandler.post(mFetchTwitterNotification);
//onSnsListener.OnSnsTwitterFeedsLoaded(statuses);
Log.i(TAG, "Twitters are downloaded! " + statuses.size());
zPubSub.fGetFeedOrganisor().fSaveNewFeeds(statuses, zContext);
}
@Override
public void gotProfileImage(ProfileImage image) {
String headUrl = image.getURL();
Pref.setMyStringPref(zContext, Const.LOGIN_HEAD_TWITTER, headUrl);
}
};
public class RetrieveAccessTokenTask extends AsyncTask<Uri, Void, Void> {
private Context context;
private OAuthProvider provider;
private OAuthConsumer consumer;
private SharedPreferences prefs;
public RetrieveAccessTokenTask(Context context, OAuthConsumer consumer,OAuthProvider provider, SharedPreferences prefs) {
this.context = context;
this.consumer = consumer;
this.provider = provider;
this.prefs=prefs;
}
/**
* Retrieve the oauth_verifier, and store the oauth and oauth_token_secret
* for future API calls.
*/
@Override
protected Void doInBackground(Uri...params) {
final Uri uri = params[0];
final String oauth_verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
try {
provider.retrieveAccessToken(consumer, oauth_verifier);
final Editor edit = prefs.edit();
edit.putString(OAuth.OAUTH_TOKEN, consumer.getToken());
edit.putString(OAuth.OAUTH_TOKEN_SECRET, consumer.getTokenSecret());
edit.commit();
String token = prefs.getString(OAuth.OAUTH_TOKEN, "");
String secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, "");
consumer.setTokenWithSecret(token, secret);
context.startActivity(new Intent(context,FriendsHostActivity.class));
//executeAfterAccessTokenRetrieval();
} catch (Exception e) {
}
return null;
}
// private void executeAfterAccessTokenRetrieval() {
// Log.i(TAG, "Execute after access token Retrieval");
// //followActions();
// }
}
public void CallBackTrigger(Uri uri, int requestCode, int resultCode,
Intent data) {
//new RetrieveAccessTokenTask(zActivity,consumer,provider,prefs).execute(uri);
String oauth_verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
try {
provider.retrieveAccessToken(consumer, oauth_verifier);
this.sTokenKey = consumer.getToken();
this.sTokenSecret = consumer.getTokenSecret();
Pref.setMyStringPref(this.zContext, OAuth.OAUTH_TOKEN, this.sTokenKey);
Pref.setMyStringPref(this.zContext, OAuth.OAUTH_TOKEN_SECRET, this.sTokenSecret);
sTokenKey = Pref.getMyStringPref(zPubSub.fGetContext().getApplicationContext(), OAuth.OAUTH_TOKEN);
sTokenSecret = Pref.getMyStringPref(zPubSub.fGetContext().getApplicationContext(), OAuth.OAUTH_TOKEN_SECRET);
this.SnsAddEventCallback(snsEventListener, uptPref);
} catch (OAuthMessageSignerException e) {
e.printStackTrace();
} catch (OAuthNotAuthorizedException e) {
e.printStackTrace();
} catch (OAuthExpectationFailedException e) {
e.printStackTrace();
} catch (OAuthCommunicationException e) {
e.printStackTrace();
}
}
//Variables that passing to call back function
private SnsEventListener snsEventListener = null;
private boolean uptPref = false;
private static String sTokenKey = "";
private static String sTokenSecret = "";
@Override
protected void fSnsAuth(SnsEventListener snsEventListener, boolean uptPref) {
this.snsEventListener = snsEventListener;
this.uptPref = uptPref;
sTokenKey = Pref.getMyStringPref(zPubSub.fGetContext().getApplicationContext(), OAuth.OAUTH_TOKEN);
sTokenSecret = Pref.getMyStringPref(zPubSub.fGetContext().getApplicationContext(), OAuth.OAUTH_TOKEN_SECRET);
if ( sTokenKey.length() > 0 && sTokenSecret.length() > 0) {
Authentication();
if ( isSessionValid() ) {
this.SnsAddEventCallback(snsEventListener, uptPref);
return;
}
}
try {
this.consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
this.provider = new CommonsHttpOAuthProvider(Const.REQUEST_URL,Const.ACCESS_URL,Const.AUTHORIZE_URL);
} catch (Exception e) {
System.out.println("Erro creating consumer / provider" + e);
}
zActivity.runOnUiThread(new Runnable(){
@Override
public void run() {
new OAuthRequestTokenTask(zActivity,consumer,provider).execute();
}});
}
public void Authentication() {
//super.Autentication(prefs);
// String token = Pref.getMyStringPref(this.zContext, OAuth.OAUTH_TOKEN);
// String secret = Pref.getMyStringPref(this.zContext, OAuth.OAUTH_TOKEN_SECRET);
AccessToken a = new AccessToken(sTokenKey,sTokenSecret);
//Twitter twitter = new TwitterFactory().getInstance();
//AsyncTwitterFactory factory = new AsyncTwitterFactory(listener);
AsyncTwitterFactory factory = new AsyncTwitterFactory();
twitterAsync = factory.getInstance();
twitterAsync.addListener(listener);
twitterAsync.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
twitterAsync.setOAuthAccessToken(a);
twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
twitter.setOAuthAccessToken(a);
// try {
// String screenName= twitter.getScreenName();
// twitterAsync.getProfileImage(screenName, ProfileImage.NORMAL);
// } catch (IllegalStateException e) {
// e.printStackTrace();
// } catch (TwitterException e) {
// e.printStackTrace();
// }
}
@Override
public boolean isSessionValid() {
//return checkAuthenticated(prefs,false);
if (twitter != null ) {
try {
return twitter.test();
} catch (TwitterException e) {
return false;
}
} else {
return false;
}
}
@Override
public void fGetNewsFeed(Context applicationContext) {
if(twitterAsync == null) {
Authentication();
}
twitterAsync.getHomeTimeline();
}
@Override
public void fPublishFeeds(Bundle params, final Context context) {
if(twitterAsync == null) {
Authentication();
}
startNotification(1,"Tweet");
twitterAsync.updateStatus(params.getString(Const.SMSGBODY));
}
public void fPostComments(Bundle params) {
String message = params.getString(Const.COMMENTED_MSG);
if(twitterAsync == null) {
Authentication();
}
twitterAsync.updateStatus(new StatusUpdate(message)
.inReplyToStatusId(Long.valueOf(params.getString(Const.SFEEDID))));
}
//Upload Photo to Twitter
public void fUploadPic(String message, String selectedImagePath) {
Configuration conf = new ConfigurationBuilder()
.setOAuthConsumerKey( CONSUMER_KEY )
.setOAuthConsumerSecret( CONSUMER_SECRET )
.setOAuthAccessToken(Pref.getMyStringPref(this.zContext, OAuth.OAUTH_TOKEN))
.setOAuthAccessTokenSecret(Pref.getMyStringPref(this.zContext, OAuth.OAUTH_TOKEN_SECRET))
.build();
(new UploadPhotoTaskTask(conf,message,selectedImagePath)).execute("");
}
private void startNotification(int notificationId,String fileType) {
notificationTask = new NotificationTask(this.zContext);
if(notificationTask != null) {
notificationTask.SetNotificationTask(notificationId, "Twitter", fileType);
notificationTask.execute(0);
}
}
private void stopNotification() {
if(notificationTask != null) {
notificationTask.setTaskDone(true);
}
}
public class UploadPhotoTaskTask extends AsyncTask<String,String,String> {
private Configuration conf;
private String message;
private String ImagePath;
public UploadPhotoTaskTask(Configuration conf, String message, String ImagePath) {
this.conf = conf;
this.message = message;
this.ImagePath = ImagePath;
}
@Override
protected void onPostExecute(String result) {
stopNotification();
}
@Override
protected void onPreExecute() {
startNotification(2,"Picture");
}
@Override
protected String doInBackground(String... params) {
try {
ImageUpload upload = new ImageUploadFactory(conf).getInstance(MediaProvider.TWITTER);
String mediaUrl;
mediaUrl = upload.upload(new File(ImagePath),message);
Log.i(TAG, "Media URL is "+mediaUrl);
} catch (TwitterException e) {
e.printStackTrace();
}
return null;
}
}
@Override
public void fResend(FeedEntry feed) {
//this.fPublishFeeds(feed.getsMsgBody());
}
@Override
public void fLikeFeeds(Bundle params, final Context context) {
try {
twitter.createFavorite(Long.valueOf(params.getString(Const.SFEEDID)));
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (TwitterException e) {
e.printStackTrace();
}
}
public void fUnLikeFeeds(Bundle params) {
try {
twitter.destroyFavorite(Long.valueOf(params.getString(Const.SFEEDID)));
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (TwitterException e) {
e.printStackTrace();
}
}
@Override
public void fShareFeeds(Bundle params, final Context context) {
try {
twitter.retweetStatus(Long.valueOf(params.getString(Const.SFEEDID)));
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (TwitterException e) {
e.printStackTrace();
}
}
//public void fDisplayTwitterFeed() {
// @Override
// public void fDisplayFeed(){
// zPubSub.fGetActivity().runOnUiThread(new Runnable() {
// public void run() {
//
// LstViewFeedAdapter feedAdapter = zPubSub.fGetAdapterFeedPreview();
// feedAdapter.clear();
// ArrayList<FeedEntry> feeds = zPubSub.fGetFeedOrganisor().fGetUnReadNewsFeed(Const.SNS_TWITTER);
// for (FeedEntry item : feeds ) {
// feedAdapter.addItem(item);
// }
// feedAdapter.notifyDataSetChanged();
// }
// });
// }
// public boolean checkAuthenticated(SharedPreferences prefs,boolean isFollowUp) {
//
// Log.i(TAG, "Authentication " + this.isAuthenticated);
// if(!this.isAuthenticated) {
// if(twitterAsync == null) {
// twitterAsync = Authentication(prefs);
// twitterAsync.getAccountTotals();
// }
// } else {
// //Authentication(prefs,null);
// if(isFollowUp)
// this.followActions();
// }
// return this.isAuthenticated;
//}
// private void setMessage(String msg)
// {
// this.msgSend = msg;
// }
//
// private String getTweetMsg() {
// if(msgSend.length()>0)
// return msgSend;
// else return null;
// }
//
// /**
// * Send Tweets to Twitter , this is called after Authentication
// * @param prefs
// * @param msg
// */
// public void sendTweet(SharedPreferences prefs,String msg) {
//
// if(twitterAsync == null) {
// twitterAsync = Authentication(prefs);
// }
//
// startNotification(1,"Tweet");
// twitterAsync.updateStatus(msg);
// }
//
// /**
// * Get Tweets from Twitter, this is called after Authentication
// * @param prefs
// */
// public void getTweets(SharedPreferences prefs)
// {
// if(twitterAsync == null) {
// twitterAsync = Authentication(prefs);
// }
// twitterAsync.getHomeTimeline();
// }
// private void followActions() {
// if(authMethod.equals(AUTH_METHODS.UPDATE_STATUS)) {
// Log.i(TAG, "Send Tweets!");
// sendTweet(prefs,getTweetMsg());
// }
// else if(authMethod.equals(AUTH_METHODS.GET_FEEDS)) {
// getTweets(prefs);
// }
//}
// public void SendFeed(String feed) {
// setMessage(feed);
// authMethod = AUTH_METHODS.UPDATE_STATUS;
// checkAuthenticated(prefs,true);;
// }
}