package com.trovebox.android.app.oauth;
import java.net.URLEncoder;
import oauth.signpost.OAuthConsumer;
import oauth.signpost.OAuthProvider;
import oauth.signpost.basic.DefaultOAuthConsumer;
import org.holoeverywhere.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import com.trovebox.android.app.Preferences;
import com.trovebox.android.app.R;
import com.trovebox.android.app.util.LoginUtils;
import com.trovebox.android.common.net.ITroveboxApi;
import com.trovebox.android.common.util.GuiUtils;
import com.trovebox.android.common.util.LoadingControl;
import com.trovebox.android.common.util.concurrent.AsyncTaskEx;
public class OAuthUtils
{
static final String TAG = OAuthUtils.class.getSimpleName();
static String getCallbackUrl(Context context)
{
return context.getString(R.string.trovebox_oauth_callback_url);
}
/**
* Open the browser and asks the user to authorize the app. Afterwards, we
* redirect the user back to activity!
*
* @param activity
*/
public static void askOAuth(Activity activity)
{
try
{
ITroveboxApi mTrovebox = Preferences.getApi(activity);
String url = mTrovebox.getOAuthUrl(
URLEncoder.encode("Trovebox Android App", "UTF-8"),
URLEncoder.encode(getCallbackUrl(activity), "UTF-8"),
activity);
activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri
.parse(url)));
} catch (Exception ex)
{
GuiUtils.error(TAG, null, ex, activity);
}
}
/**
* Verify received response from the browser
*
* @param activity
* @param loadingControl
* @param uri
* @param runOnSuccess
*/
public static void verifyOAuthResponse(Activity activity,
LoadingControl loadingControl, Uri uri,
Runnable runOnSuccess)
{
if (uri != null && uri.toString().startsWith(getCallbackUrl(activity)))
{
if (uri.getQueryParameter("oauth_token") != null)
{
new PostTask(uri,
loadingControl, activity,
runOnSuccess).execute();
} else
{
String errorMsg = uri.getQueryParameter("error");
if (errorMsg == null)
{
errorMsg = "";
}
GuiUtils.alert(String.format(
activity.getString(R.string.errorSimple), errorMsg),
activity);
}
}
}
private static class PostTask extends AsyncTaskEx<Void, Void, Boolean>
{
private final Uri mUri;
private OAuthConsumer mUsedConsumer;
LoadingControl loadingControl;
Activity activity;
Runnable runOnSuccess;
public PostTask(Uri uri, LoadingControl loadingControl,
Activity activity,
Runnable runOnSuccess)
{
mUri = uri;
this.loadingControl = loadingControl;
this.activity = activity;
this.runOnSuccess = runOnSuccess;
}
@Override
protected void onPreExecute()
{
super.onPreExecute();
if (loadingControl != null)
{
loadingControl.startLoading();
}
}
@Override
protected Boolean doInBackground(Void... params)
{
try
{
String oAuthConsumerKey = mUri
.getQueryParameter("oauth_consumer_key");
String oAuthConsumerSecret = mUri
.getQueryParameter("oauth_consumer_secret");
String oAuthToken = mUri.getQueryParameter("oauth_token");
String oAuthTokenSecret = mUri
.getQueryParameter("oauth_token_secret");
String oAuthVerifier = mUri.getQueryParameter("oauth_verifier");
mUsedConsumer = new DefaultOAuthConsumer(oAuthConsumerKey,
oAuthConsumerSecret);
mUsedConsumer.setTokenWithSecret(oAuthToken, oAuthTokenSecret);
OAuthProvider provider = Preferences
.getOAuthProvider(activity);
provider.retrieveAccessToken(mUsedConsumer, oAuthVerifier);
return true;
} catch (Exception e)
{
GuiUtils.error(TAG,
R.string.errorWithAuthentication,
e, activity);
return false;
}
}
@Override
protected void onPostExecute(Boolean result)
{
if (loadingControl != null)
{
loadingControl.stopLoading();
}
if (result.booleanValue())
{
Preferences.setLoginInformation(activity,
mUsedConsumer);
LoginUtils.sendLoggedInBroadcast(activity);
if (runOnSuccess != null)
{
runOnSuccess.run();
}
}
}
}
}