package org.societies.platfrom.sns.android.socialapp;
import org.scribe.builder.ServiceBuilder;
import org.scribe.builder.api.FacebookApi;
import org.scribe.builder.api.Foursquare2Api;
import org.scribe.builder.api.LinkedInApi;
import org.scribe.builder.api.TwitterApi;
import org.scribe.model.Token;
import org.scribe.model.Verifier;
import org.scribe.oauth.OAuthService;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.webkit.HttpAuthHandler;
import android.webkit.SslErrorHandler;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
public class WebActivity extends Activity{
private static final String TAG = "WebActivity";
private String socialNetworkRequested = null;
private OAuthService service;
private LinearLayout progressBar;
private WebView webView;
// facebook
private static final Token EMPTY_TOKEN = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.ssolib_web);
// read parameters
socialNetworkRequested = getIntent().getStringExtra(Constants.SSO_URL);
Log.d(TAG, "[onCreate] socialNetworkRequested="+socialNetworkRequested);
progressBar = (LinearLayout) findViewById(R.id.loading);
progressBar.setVisibility(View.GONE);
webView = (WebView) findViewById(R.id.webview);
webView.setVisibility(View.GONE);
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setLoadsImagesAutomatically(true);
settings.setSupportMultipleWindows(true);
settings.setDomStorageEnabled(true);
settings.setUserAgent(0);
settings.setSaveFormData(true);
settings.setLoadWithOverviewMode(true);
if(socialNetworkRequested != null){
this.doConnectToSocialNetwork(socialNetworkRequested);
}
}
private void doConnectToSocialNetwork(String socialNetworkRequested){
if(socialNetworkRequested == null){
//no socialnetwork to connect
finish();
return;
}
TokenListener tokenListener = new TokenListener(socialNetworkRequested);
if(socialNetworkRequested.equals(Constants.FB_URL)){
Log.d(Constants.DEBUG_TAG, "[onClick] fb_connector");
progressBar.setVisibility(View.VISIBLE);
service = new ServiceBuilder()
.provider(FacebookApi.class)
.apiKey(Constants.FB_CLIENT_ID)
.apiSecret(Constants.FB_CLIENT_SECRET)
.callback(Constants.FB_CALLBACK_URL)
.scope(Constants.FB_SCOPES)
.build();
String fbauthURL = service.getAuthorizationUrl(EMPTY_TOKEN);
Log.d(Constants.DEBUG_TAG, "[onClick] fbauthURL="+fbauthURL);
webView.setVisibility(View.VISIBLE);
webView.setWebViewClient(new InnerWebViewClient(EMPTY_TOKEN, tokenListener));
//send user to authorization page
webView.loadUrl(fbauthURL);
} else if(socialNetworkRequested.equals(Constants.FQ_URL)){
Log.d(Constants.DEBUG_TAG, "[onClick] fq_connector");
progressBar.setVisibility(View.VISIBLE);
service = new ServiceBuilder()
.provider(Foursquare2Api.class)
.apiKey(Constants.FQ_CLIENT_ID)
.apiSecret(Constants.FQ_CLIENT_SECRET)
.callback(Constants.FQ_CALLBACK_URL)
.build();
String fqauthURL = service.getAuthorizationUrl(EMPTY_TOKEN);
Log.d(Constants.DEBUG_TAG, "[onClick] fqauthURL="+fqauthURL);
webView.setVisibility(View.VISIBLE);
webView.setWebViewClient(new InnerWebViewClient(EMPTY_TOKEN, tokenListener));
//send user to authorization page
webView.loadUrl(fqauthURL);
} else if(socialNetworkRequested.equals(Constants.TW_URL)){
Log.d(Constants.DEBUG_TAG, "[onClick] tw_connector");
progressBar.setVisibility(View.VISIBLE);
service = new ServiceBuilder()
.provider(TwitterApi.class)
.apiKey(Constants.TW_CLIENT_ID)
.apiSecret(Constants.TW_CLIENT_SECRET)
.callback(Constants.TW_CALLBACK_URL)
.build();
Token requestToken = service.getRequestToken();
String twauthURL = service.getAuthorizationUrl(requestToken);
webView.setVisibility(View.VISIBLE);
webView.setWebViewClient(new InnerWebViewClient(requestToken, tokenListener));
//send user to authorization page
webView.loadUrl(twauthURL);
} else if(socialNetworkRequested.equals(Constants.LK_URL)){
Log.d(Constants.DEBUG_TAG, "[onClick] lk_connector");
progressBar.setVisibility(View.VISIBLE);
service = new ServiceBuilder()
.provider(LinkedInApi.class)
.apiKey(Constants.LK_CLIENT_ID)
.apiSecret(Constants.LK_CLIENT_SECRET)
.callback(Constants.LK_CALLBACK_URL)
.build();
Token lkrequestToken = service.getRequestToken();
String lkurl = service.getAuthorizationUrl(lkrequestToken);
Log.d(Constants.DEBUG_TAG, "[onClick] lkurl="+lkurl);
webView.setVisibility(View.VISIBLE);
webView.setWebViewClient(new InnerWebViewClient(lkrequestToken, tokenListener));
//send user to authorization page
webView.loadUrl(lkurl);
}
}
private class InnerWebViewClient extends WebViewClient {
private static final String InnerTAG = "InnerWebViewClient";
private Token requestToken = null;
private SocialNetworkTokenListener listener;
public InnerWebViewClient(Token requestToken, SocialNetworkTokenListener listener){
this.requestToken = requestToken;
this.listener = listener;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d(InnerTAG, "[shouldOverrideUrlLoading] view="+view+", url="+url);
//check for our custom callback protocol otherwise use default behavior
if(url.startsWith(Constants.TW_CALLBACK_URL)){
//authorization complete hide webview for now.
webView.setVisibility(View.GONE);
Uri uri = Uri.parse(url);
String verifier = uri.getQueryParameter("oauth_verifier");
Token accessToken = null;
if(verifier != null){
Verifier v = new Verifier(verifier);
//save this token for practical use.
accessToken = service.getAccessToken(requestToken, v);
}
if(listener != null){
listener.onTokenAvailable(accessToken);
}
return true;
} else if(url.startsWith(Constants.FB_CALLBACK_URL)){
//authorization complete hide webview for now.
webView.setVisibility(View.GONE);
Log.d(InnerTAG, "[shouldOverrideUrlLoading] FB_CALLBACK_URL="+Constants.FB_CALLBACK_URL);
Uri uri = Uri.parse(url);
String verifier = uri.getQueryParameter("code");
Token accessToken = null;
if(verifier != null){
Log.d(InnerTAG, "[shouldOverrideUrlLoading] verifier="+verifier);
Verifier v = new Verifier(verifier);
accessToken = service.getAccessToken(EMPTY_TOKEN, v);
}
if(listener != null){
listener.onTokenAvailable(accessToken);
}
return true;
} else if(url.startsWith(Constants.FQ_CALLBACK_URL)){
//authorization complete hide webview for now.
webView.setVisibility(View.GONE);
Log.d(InnerTAG, "[shouldOverrideUrlLoading] FQ_CALLBACK_URL="+Constants.FQ_CALLBACK_URL);
Uri uri = Uri.parse(url);
String verifier = uri.getQueryParameter("code");
Token accessToken = null;
if(verifier != null){
Log.d(InnerTAG, "[shouldOverrideUrlLoading] verifier="+verifier);
Verifier v = new Verifier(verifier);
accessToken = service.getAccessToken(EMPTY_TOKEN, v);
}
if(listener != null){
listener.onTokenAvailable(accessToken);
}
return true;
} else if(url.startsWith(Constants.LK_CALLBACK_URL)){
//authorization complete hide webview for now.
webView.setVisibility(View.GONE);
Log.d(InnerTAG, "[shouldOverrideUrlLoading] LK_CALLBACK_URL="+Constants.LK_CALLBACK_URL);
//http://127.0.0.1:8080/societies-test/doConnect.html?type=lk&oauth_token=8b2e784d-78f4-44fd-9d98-e7fed60b5cbc&oauth_verifier=49273
Uri uri = Uri.parse(url);
String verifier = uri.getQueryParameter("oauth_verifier");
Token accessToken = null;
if(verifier != null){
Verifier v = new Verifier(verifier);
//save this token for practical use.
accessToken = service.getAccessToken(requestToken, v);
}
if(listener != null){
listener.onTokenAvailable(accessToken);
}
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Log.d(InnerTAG, "[onPageFinished] view="+view+", url="+url);
if(progressBar != null){
progressBar.setVisibility(View.GONE);
}
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
Log.e(InnerTAG, "[onReceivedError] errorCode="+errorCode+", description="+description+", failingUrl="+failingUrl);
if(progressBar != null){
progressBar.setVisibility(View.GONE);
}
if(listener != null){
listener.onTokenAvailable(null);
}
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
Log.d(InnerTAG, "[onReceivedSslError] view="+view+", handler="+handler+", error="+error);
handler.proceed(); // Ignore SSL certificate errors
}
@Override
public void onLoadResource(WebView view, String url) {
super.onLoadResource(view, url);
Log.d(InnerTAG, "[onLoadResource] view="+view+", url="+url);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
Log.d(InnerTAG, "[onPageStarted] view="+view+", url="+url+", favicon="+favicon);
}
@Override
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
super.onReceivedHttpAuthRequest(view, handler, host, realm);
Log.d(InnerTAG, "[onReceivedHttpAuthRequest] view="+view+", handler="+handler+", host="+host+", realm="+realm);
}
@Override
public void onTooManyRedirects(WebView view, Message cancelMsg, Message continueMsg) {
Log.d(InnerTAG, "[onTooManyRedirects] view="+view+", cancelMsg="+cancelMsg+", continueMsg="+continueMsg);
super.onTooManyRedirects(view, cancelMsg, continueMsg);
}
@Override
public void onUnhandledKeyEvent(WebView view, KeyEvent event) {
Log.d(InnerTAG, "[onUnhandledKeyEvent] view="+view+", event="+event);
super.onUnhandledKeyEvent(view, event);
}
@Override
public void onFormResubmission(WebView view, Message dontResend, Message resend) {
Log.d(InnerTAG, "[onFormResubmission] view="+view+", dontResend="+dontResend+", resend="+resend);
super.onFormResubmission(view, dontResend, resend);
}
}
private int getCodeFromSnRequested(String from){
int code = Constants.FB_CODE;
if ("twitter".equalsIgnoreCase(from)) code = Constants.TW_CODE;
if ("foursquare".equalsIgnoreCase(from)) code = Constants.FQ_CODE;
if ("linkedin".equalsIgnoreCase(from)) code = Constants.LK_CODE;
if ("facebook".equalsIgnoreCase(from)) code = Constants.FB_CODE;
if ("googleplus".equalsIgnoreCase(from)) code = Constants.GP_CODE;
return code;
}
private class TokenListener implements SocialNetworkTokenListener{
private String snRequested = null;
public TokenListener(String snRequested){
this.snRequested = snRequested;
}
@Override
public void onTokenAvailable(Token accessToken) {
String finalAccessToken = "";
int tokenExpiration = -1;
if(accessToken != null){
tokenExpiration = 3600;
if(socialNetworkRequested.equals(Constants.FB_URL) || socialNetworkRequested.equals(Constants.FQ_URL)){
// oauth1
finalAccessToken = accessToken.getToken();
} else if(socialNetworkRequested.equals(Constants.TW_URL) || socialNetworkRequested.equals(Constants.LK_URL)){
// oauth2
finalAccessToken = accessToken.getToken()+","+accessToken.getSecret();
}
}
Intent intent = WebActivity.this.getIntent();
intent.putExtra(Constants.ACCESS_TOKEN, finalAccessToken);
intent.putExtra(Constants.TOKEN_EXPIRATION, tokenExpiration);
setResult(getCodeFromSnRequested(snRequested), intent);
finish();
}
}
}