package net.londatiga.android.twitter;
import java.net.URL;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import net.londatiga.android.twitter.oauth.OauthAccessToken;
import net.londatiga.android.twitter.oauth.OauthConsumer;
import net.londatiga.android.twitter.oauth.OauthProvider;
import net.londatiga.android.twitter.oauth.OauthUtil;
/**
* Main twitter android lib interface.
*
* @author Lorensius W. L. T <lorenz@londatiga.ent>
*
*/
public class Twitter {
private Context mContext;
private SharedPreferences mSharedPref;
private Editor mEditor;
private OauthConsumer mConsumer;
private OauthAccessToken mAccessToken;
private OauthProvider mProvider;
private SigninListener mListener;
private RequestTokenTask mRequestTokenTask;
private AccesTokenTask mAccesTokenTask;
private boolean mIsLoading = false;
private static final String SHARED_PREF = "Android_Twitter_Preferences";
private static final String ACCESS_TOKEN = "access_token";
private static final String ACCESS_TOKEN_SECRET = "access_token_secret";
public Twitter(Context context, String clientId, String clientSecret, String callbackUrl, boolean signinOnly) {
init(context, clientId, clientSecret, callbackUrl, signinOnly);
}
public Twitter(Context context, String clientId, String clientSecret, String callbackUrl) {
init(context, clientId, clientSecret, callbackUrl, false);
}
public OauthConsumer getConsumer() {
return mConsumer;
}
public OauthAccessToken getAccessToken() {
return mAccessToken;
}
public boolean sessionActive() {
return (mAccessToken == null) ? false : true;
}
public void clearSession() {
mEditor.putString(ACCESS_TOKEN, null);
mEditor.putString(ACCESS_TOKEN_SECRET, null);
mEditor.commit();
}
public void signin(SigninListener listener) {
mListener = listener;
(mRequestTokenTask = new RequestTokenTask()).execute();
}
public void cancel() {
if (mIsLoading) {
if (mAccesTokenTask != null) {
mAccesTokenTask.cancel(true);
}
if (mRequestTokenTask == null) {
mRequestTokenTask.cancel(true);
}
}
}
private void init(Context context, String clientId, String clientSecret, String callbackUrl, boolean signinOnly) {
String url = (signinOnly) ? OauthUtil.OAUTH_AUTHENTICATION_URL : OauthUtil.OAUTH_AUTHORIZATION_URL;
mContext = context;
mConsumer = new OauthConsumer(clientId, clientSecret, callbackUrl);
mProvider = new OauthProvider(mConsumer, OauthUtil.OAUTH_REQUEST_URL, url, OauthUtil.OAUTH_ACCESSTOKEN_URL);
mSharedPref = context.getSharedPreferences(SHARED_PREF, Context.MODE_PRIVATE);
mEditor = mSharedPref.edit();
loadAccessToken();
}
private void loadAccessToken() {
String token = mSharedPref.getString(ACCESS_TOKEN, null);
String tokenSecret = mSharedPref.getString(ACCESS_TOKEN_SECRET, null);
if (token != null && tokenSecret != null) {
mAccessToken = new OauthAccessToken(token, tokenSecret);
}
}
private void storeAccessToken(String token, String tokenSecret) {
mEditor.putString(ACCESS_TOKEN, token);
mEditor.putString(ACCESS_TOKEN_SECRET, tokenSecret);
mEditor.commit();
}
private void openAuthorizationDialog(final String url) {
TwitterDialog dialog = new TwitterDialog(mContext,
mConsumer.getCallbackUrl(),
url, new TwitterDialog.TwDialogListener() {
@Override
public void onError(String value) {
mListener.onError("Authorization failed");
}
@Override
public void onComplete(String verifier) {
(mAccesTokenTask = new AccesTokenTask(verifier)).execute();
}
});
dialog.show();
}
public class RequestTokenTask extends AsyncTask<URL, Integer, Long> {
ProgressDialog progressDlg;
String authUrl ="";
public RequestTokenTask() {
progressDlg = new ProgressDialog(mContext);
progressDlg.setMessage("Signing in Twitter...");
progressDlg.setCancelable(true);
}
protected void onCancelled() {
progressDlg.dismiss();
mIsLoading = false;
}
protected void onPreExecute() {
progressDlg.show();
mIsLoading = true;
}
protected Long doInBackground(URL... urls) {
long result = 0;
try {
authUrl = mProvider.getAuthorizationUrl();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
protected void onProgressUpdate(Integer... progress) {
}
protected void onPostExecute(Long result) {
mIsLoading = false;
progressDlg.dismiss();
if (!authUrl.equals("")) {
openAuthorizationDialog(authUrl);
} else {
mListener.onError("Failed to get request token");
}
}
}
public class AccesTokenTask extends AsyncTask<URL, Integer, Long> {
ProgressDialog progressDlg;
String verifier="";
OauthAccessToken accessToken;
public AccesTokenTask(String verifier) {
this.verifier = verifier;
progressDlg = new ProgressDialog(mContext);
progressDlg.setMessage("Signing in Twitter...");
progressDlg.setCancelable(true);
}
protected void onCancelled() {
progressDlg.dismiss();
mIsLoading = false;
}
protected void onPreExecute() {
progressDlg.show();
mIsLoading = true;
}
protected Long doInBackground(URL... urls) {
long result = 0;
try {
accessToken = mProvider.retreiveAccessToken(verifier);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
protected void onProgressUpdate(Integer... progress) {
}
protected void onPostExecute(Long result) {
mIsLoading = false;
progressDlg.dismiss();
if (accessToken != null) {
mAccessToken = accessToken;
storeAccessToken(accessToken.getToken(), accessToken.getSecret());
mListener.onSuccess(accessToken, mProvider.getUserId(), mProvider.getScreenName());
} else {
mListener.onError("Failed to get access token");
}
}
}
public interface SigninListener {
public abstract void onSuccess(OauthAccessToken accessToken, String userId, String screenName);
public abstract void onError(String error);
}
}