package com.ipragmatech.oauthmagentorestapi;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import com.google.api.client.auth.oauth.OAuthAuthorizeTemporaryTokenUrl;
import com.google.api.client.auth.oauth.OAuthCredentialsResponse;
import com.google.api.client.auth.oauth.OAuthGetAccessToken;
import com.google.api.client.auth.oauth.OAuthGetTemporaryToken;
import com.google.api.client.auth.oauth.OAuthHmacSigner;
import com.google.api.client.http.apache.ApacheHttpTransport;
import com.ipragmatech.oauthmagentorestapi.utils.AuthToken;
import com.ipragmatech.oauthmagentorestapi.utils.Constants;
import com.ipragmatech.oauthmagentorestapi.utils.LocalCredentialStore;
import java.io.IOException;
public class WebActivity extends BaseActivity {
private boolean handled;
private WebView webView;
private ProgressBar progress;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web);
webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.setVisibility(View.VISIBLE);
progress = (ProgressBar) findViewById(R.id.progressBar);
progress.setVisibility(View.GONE);
progress.setIndeterminate(true);
progress.setProgress(0);
}
@Override
protected void onResume() {
super.onResume();
handled = false;
new PreProcessToken().execute();
}
private class PreProcessToken extends AsyncTask<Uri, Void, Void> {
final OAuthHmacSigner signer = new OAuthHmacSigner();
private String authorizationUrl;
@Override
protected Void doInBackground(Uri... params) {
try {
signer.clientSharedSecret = Constants.CONSUMER_SECRET;
OAuthGetTemporaryToken temporaryToken = new OAuthGetTemporaryToken(Constants.REQUEST_URL);
temporaryToken.transport = new ApacheHttpTransport();
temporaryToken.signer = signer;
temporaryToken.consumerKey = Constants.CONSUMER_KEY;
temporaryToken.callback = Constants.OAUTH_CALLBACK_URL;
OAuthCredentialsResponse tempCredentials = temporaryToken.execute();
signer.tokenSharedSecret = tempCredentials.tokenSecret;
OAuthAuthorizeTemporaryTokenUrl authorizeUrl = new OAuthAuthorizeTemporaryTokenUrl(Constants.AUTHORIZE_URL);
authorizeUrl.temporaryToken = tempCredentials.token;
authorizationUrl = authorizeUrl.build();
handled = false;
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* When we're done and we've retrieved either a valid token or an error from the server,
* we'll return to our original activity
*/
@Override
protected void onPostExecute(Void result) {
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
progress.setVisibility(View.VISIBLE);
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(final WebView view, final String url) {
if (url.startsWith(Constants.OAUTH_CALLBACK_URL)) {
if (url.indexOf("oauth_token=") != -1) {
webView.setVisibility(View.INVISIBLE);
if (!handled) {
new ProcessToken(url, signer).execute();
}
} else {
webView.setVisibility(View.VISIBLE);
}
}
progress.setProgress(100);
progress.setVisibility(View.GONE);
}
});
webView.loadUrl(authorizationUrl);
}
}
private class ProcessToken extends AsyncTask<Uri, Void, Void> {
String url;
private OAuthHmacSigner signer;
public ProcessToken(String url, OAuthHmacSigner signer) {
this.url = url;
this.signer = signer;
}
@Override
protected Void doInBackground(Uri... params) {
Log.i(TAG, "doInbackground called with url " + url);
if (url.startsWith(Constants.OAUTH_CALLBACK_URL) && !handled) {
try {
if (url.indexOf("oauth_token=") != -1) {
handled = true;
String requestToken = extractParamFromUrl(url, "oauth_token");
String verifier = extractParamFromUrl(url, "oauth_verifier");
OAuthGetAccessToken accessToken = getOAuthAccessToken(requestToken);
accessToken.verifier = verifier;
OAuthCredentialsResponse credentials = accessToken.execute();
signer.tokenSharedSecret = credentials.tokenSecret;
LocalCredentialStore localStore = new LocalCredentialStore(prefs);
localStore.store(new AuthToken(credentials.token, credentials.tokenSecret));
} else if (url.indexOf("error=") != -1) {
new LocalCredentialStore(prefs).clear();
}
} catch (IOException e) {
Log.e(TAG, e.getMessage(), e);
}
}
return null;
}
public OAuthGetAccessToken getOAuthAccessToken(String requestToken) {
signer.clientSharedSecret = Constants.CONSUMER_SECRET;
OAuthGetAccessToken accessToken = new OAuthGetAccessToken(Constants.ACCESS_URL);
accessToken.transport = new ApacheHttpTransport();
accessToken.temporaryToken = requestToken;
accessToken.signer = signer;
accessToken.consumerKey = Constants.CONSUMER_KEY;
return accessToken;
}
private String extractParamFromUrl(String url, String paramName) {
Uri uri = Uri.parse(url);
return uri.getQueryParameter(paramName);
}
@Override
protected void onPreExecute() {
}
/**
* When we're done and we've retrieved either a valid token or an error from the server,
* we'll return to our original activity
*/
@Override
protected void onPostExecute(Void result) {
startActivity(new Intent(WebActivity.this, MainActivity.class));
finish();
}
}
}