package com.zegoggles.smssync.activity.auth;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.SslErrorHandler;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.zegoggles.smssync.App;
import com.zegoggles.smssync.R;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static com.zegoggles.smssync.App.TAG;
public class OAuth2WebAuthActivity extends Activity {
private WebView mWebview;
private ProgressDialog mProgress;
public static final String EXTRA_CODE = "code";
public static final String EXTRA_ERROR = "error";
// Success code=4/8imH8gQubRYrWu_Fpv6u4Yri5kTNEWmm_XyhytJqlJw
// Denied error=access_denied
private static final Pattern TITLE = Pattern.compile("(code|error)=(.+)\\Z");
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.auth_activity);
final Uri urlToLoad = getIntent().getData();
mWebview = (WebView) findViewById(R.id.webview);
mWebview.getSettings().setJavaScriptEnabled(true);
mWebview.getSettings().setLoadsImagesAutomatically(true);
mProgress = new ProgressDialog(this);
mProgress.setIndeterminate(true);
mProgress.setMessage(getString(R.string.loading));
mProgress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mWebview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); // fix white bar
mWebview.clearSslPreferences();
mWebview.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
showConnectionError(description);
}
@Override
@TargetApi(Build.VERSION_CODES.FROYO)
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
Log.w(TAG, "onReceiveSslError(" + error + ")");
// pre-froyo devices don't trust the cert used by google
// see https://knowledge.verisign.com/support/mpki-for-ssl-support/index?page=content&id=SO17511&actp=AGENT_REFERAL
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO &&
error.getPrimaryError() == SslError.SSL_IDMISMATCH) {
handler.proceed();
} else {
handler.cancel();
showConnectionError(getString(R.string.ssl_error));
}
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
if (App.LOCAL_LOGV) Log.d(TAG, "onPageStarted(" + url + ")");
if (!isFinishing()) mProgress.show();
}
@Override
public void onPageFinished(WebView view, String url) {
final String pageTitle = view.getTitle();
final Matcher matcher = TITLE.matcher(pageTitle);
if (matcher.find()) {
String status = matcher.group(1);
String value = matcher.group(2);
if ("code".equals(status)) {
onCodeReceived(value);
} else if ("error".equals(status)) {
onError(value);
}
}
if (!isFinishing()) mProgress.dismiss();
}
});
removeAllCookies();
// finally load url
mWebview.loadUrl(urlToLoad.toString());
}
private void onCodeReceived(String code) {
if (!TextUtils.isEmpty(code)) {
setResult(RESULT_OK, new Intent().putExtra(EXTRA_CODE, code));
finish();
}
}
private void onError(String error) {
Log.e(TAG, "onError("+error+")");
setResult(RESULT_OK, new Intent().putExtra(EXTRA_ERROR, error));
finish();
}
private void showConnectionError(final String message) {
if (isFinishing()) return;
new AlertDialog.Builder(this).
setMessage(message).
setTitle(getString(R.string.status_unknown_error)).
setIcon(android.R.drawable.ic_dialog_alert).
setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
}).
create().
show();
}
private void removeAllCookies() {
CookieSyncManager.createInstance(this);
CookieManager.getInstance().removeAllCookie();
}
@Override
protected void onDestroy() {
super.onDestroy();
mWebview.stopLoading();
mProgress.dismiss();
}
}