package net.dev123.yibo;
import java.net.URI;
import java.util.Map;
import net.dev123.commons.ServiceProvider;
import net.dev123.commons.http.auth.OAuth2AuthorizeHelper;
import net.dev123.commons.oauth.OAuth;
import net.dev123.commons.oauth2.OAuth2;
import net.dev123.commons.util.StringUtil;
import net.dev123.commons.util.UrlUtil;
import net.dev123.yibo.common.Constants;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
import android.webkit.CookieManager;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class AuthorizeActivity extends BaseActivity {
private static final String TAG = AuthorizeActivity.class.getSimpleName();
private static final String IPHONE_USERAGENT =
"Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us)"
+ " AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0"
+ " Mobile/7A341 Safari/528.16";
private String authorizeUrl;
private String callbackUrl;
private ServiceProvider serviceProvider;
private WebView wvAuthorize;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.authorize);
initComponents();
}
private void initComponents() {
Intent intent = getIntent();
authorizeUrl = intent.getStringExtra("Authorize_Url");
callbackUrl = intent.getStringExtra("Callback_Url");
String spStr = intent.getStringExtra("ServiceProvider");
serviceProvider = ServiceProvider.valueOf(spStr);
wvAuthorize = (WebView) findViewById(R.id.wvAuthorize);
WebSettings settings = wvAuthorize.getSettings();
settings.setBuiltInZoomControls(true);
settings.setJavaScriptEnabled(true);
settings.setSupportZoom(true);
settings.setUserAgentString(IPHONE_USERAGENT);
WebViewClient wvClient = new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onReceivedSslError(WebView view,
SslErrorHandler handler, SslError error) {
handler.proceed();
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
if (StringUtil.isEmpty(url)) {
return;
}
if (StringUtil.isEquals(url, authorizeUrl)) {
progressDialog = ProgressDialog.show(
view.getContext(), null,
view.getContext().getString(R.string.label_loading),
true, true);
} else if (url.indexOf(callbackUrl) == 0) {
Intent intent = new Intent();
intent.putExtra("ServiceProvider", serviceProvider.toString());
if (serviceProvider.isSns() || serviceProvider == ServiceProvider.Sina) {
String code = OAuth2AuthorizeHelper.retrieveAuthorizationCodeFromQueryString(url);
intent.putExtra(OAuth2.CODE, code);
} else {
Map<String, String> parameters =
UrlUtil.extractQueryStringParameters(URI.create(url));
String oauthToken = parameters.get(OAuth.OAUTH_TOKEN);
String verifier = parameters.get(OAuth.OAUTH_VERIFIER);
intent.putExtra(OAuth.OAUTH_TOKEN, oauthToken);
intent.putExtra(OAuth.OAUTH_VERIFIER, verifier);
}
AuthorizeActivity.this.setResult(Constants.RESULT_CODE_SUCCESS, intent);
AuthorizeActivity.this.finish();
}
}
};
wvAuthorize.setWebViewClient(wvClient);
wvAuthorize.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int progress) {
if (progress == 100) {
if (progressDialog != null && progressDialog.isShowing()) {
try {
progressDialog.dismiss();
} catch (Exception e) {
if (Constants.DEBUG) {
Log.d(TAG, e.getMessage(), e);
}
}
}
}
AuthorizeActivity.this.setProgress(progress * 100);
}
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
if (StringUtil.isNotEmpty(title)) {
AuthorizeActivity.this.setTitle(title);
}
}
});
wvAuthorize.loadUrl(authorizeUrl);
}
@Override
public void finish() {
// 清空授权后留下的Cookie
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
super.finish();
}
}