package com.vaguehope.onosendai.ui.pref; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.webkit.CookieManager; import android.webkit.CookieSyncManager; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.LinearLayout; import android.widget.ProgressBar; import com.vaguehope.onosendai.provider.twitter.TwitterOauth; import com.vaguehope.onosendai.util.LogWrapper; /** * With thanks to Yoshiki for example at: * https://github.com/yoshiki/android-twitter-oauth-demo */ public class TwitterLoginActivity extends Activity { private static final int MAX_PRG = 100; private static final LogWrapper LOG = new LogWrapper("TLA"); public static LogWrapper getLog () { return LOG; } @SuppressLint("SetJavaScriptEnabled") @Override protected void onCreate (final Bundle bundle) { super.onCreate(bundle); CookieSyncManager.createInstance(this); final LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); final ProgressBar prgBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal); prgBar.setMax(MAX_PRG); prgBar.setProgress(0); prgBar.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); layout.addView(prgBar); final WebView webView = new WebView(this); layout.addView(webView); setContentView(layout); final WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setSaveFormData(false); webView.setWebChromeClient(new LoginWebChromeClient(prgBar)); webView.setWebViewClient(new LoginWebViewClient(this)); webView.loadUrl(this.getIntent().getExtras().getString(TwitterOauth.IEXTRA_AUTH_URL)); } @Override protected void onDestroy () { CookieManager.getInstance().removeAllCookie(); LOG.i("Cleared cookies."); super.onDestroy(); } private static class LoginWebChromeClient extends WebChromeClient { private final ProgressBar prgBar; public LoginWebChromeClient (final ProgressBar prgBar) { this.prgBar = prgBar; } @Override public void onProgressChanged (final WebView view, final int newProgress) { super.onProgressChanged(view, newProgress); if (newProgress < MAX_PRG && this.prgBar.getVisibility() == View.GONE) { this.prgBar.setVisibility(View.VISIBLE); } this.prgBar.setProgress(newProgress); if (newProgress == MAX_PRG) { this.prgBar.setVisibility(View.GONE); } } } private static class LoginWebViewClient extends WebViewClient { private final Activity activity; public LoginWebViewClient (final Activity activity) { this.activity = activity; } @Override public boolean shouldOverrideUrlLoading (final WebView view, final String url) { boolean result = true; if (url != null && url.startsWith(TwitterOauth.CALLBACK_URL)) { final Uri uri = Uri.parse(url); if (uri.getQueryParameter("denied") != null) { this.activity.setResult(RESULT_CANCELED); getLog().i("Twitter login canceled."); this.activity.finish(); } else { final String oauthToken = uri.getQueryParameter("oauth_token"); final String oauthVerifier = uri.getQueryParameter("oauth_verifier"); final Intent intent = this.activity.getIntent(); intent.putExtra(TwitterOauth.IEXTRA_OAUTH_TOKEN, oauthToken); intent.putExtra(TwitterOauth.IEXTRA_OAUTH_VERIFIER, oauthVerifier); this.activity.setResult(RESULT_OK, intent); getLog().i("Twitter login successful."); this.activity.finish(); } } else { result = super.shouldOverrideUrlLoading(view, url); } return result; } } }