package de.vanmar.android.yarrn.ravelry; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.net.http.SslError; import android.os.Build; import android.webkit.SslErrorHandler; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; import com.androidquery.util.AQUtility; import org.androidannotations.annotations.Background; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.UiThread; import org.androidannotations.annotations.sharedpreferences.Pref; import org.scribe.builder.ServiceBuilder; import org.scribe.exceptions.OAuthException; import org.scribe.model.Token; import org.scribe.model.Verifier; import org.scribe.oauth.OAuthService; import de.vanmar.android.yarrn.R; import de.vanmar.android.yarrn.YarrnPrefs_; @EActivity(resName = "activity_get_access") public class GetAccessTokenActivity extends Activity { public static final String EXTRA_USERNAME = "username"; public static final String EXTRA_ACCESSTOKEN = "accessToken"; public static final String EXTRA_ACCESSSECRET = "accessSecret"; public static final String EXTRA_REQUESTTOKEN = "requestToken"; @Pref YarrnPrefs_ prefs; @UiThread protected void callAuthPage(final String callback, final OAuthService service, final Token requestToken, final String authURL) { final WebView webview = (WebView) findViewById(R.id.webview); if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) { webview.getSettings().setSaveFormData(false); } webview.setWebViewClient(new WebViewClient() { @Override public void onReceivedSslError(final WebView view, final SslErrorHandler handler, final SslError error) { handler.proceed(); } @Override public boolean shouldOverrideUrlLoading(final WebView view, final String url) { if (url.startsWith(callback)) { getAccessToken(service, requestToken, url); return true; } return super.shouldOverrideUrlLoading(view, url); } }); webview.loadUrl(authURL); } @Background protected void getAccessToken(final OAuthService service, final Token requestToken, final String url) { final Uri uri = Uri.parse(url); final String verifier = uri.getQueryParameter("oauth_verifier"); final String username = uri.getQueryParameter("username"); final Verifier v = new Verifier(verifier); try { final Token accessToken = service.getAccessToken(requestToken, v); prefs.username().put(username); prefs.accessToken().put(accessToken.getToken()); prefs.accessSecret().put(accessToken.getSecret()); prefs.requestToken().put(requestToken.getToken()); final Intent result = new Intent(); result.putExtra(EXTRA_USERNAME, username); result.putExtra(EXTRA_ACCESSTOKEN, accessToken.getToken()); result.putExtra(EXTRA_ACCESSSECRET, accessToken.getSecret()); result.putExtra(EXTRA_REQUESTTOKEN, requestToken.getToken()); setResult(Activity.RESULT_OK, result); finish(); } catch (OAuthException e) { reportOAuthError(); } } @UiThread public void reportOAuthError() { Toast.makeText(getApplicationContext(), R.string.oauth_exception, Toast.LENGTH_LONG).show(); } @Background public void getToken() { final String apiKey = getString(R.string.api_key); final String apiSecret = getString(R.string.api_secret); final String callback = getString(R.string.api_callback); final OAuthService service = new ServiceBuilder() .provider(new RavelryApi(getString(R.string.ravelry_url))) .apiKey(apiKey).apiSecret(apiSecret).callback(callback).build(); final Token requestToken; try { requestToken = service.getRequestToken(); } catch (Exception e) { AQUtility.report(e); moveTaskToBack(true); return; } final String authURL = service.getAuthorizationUrl(requestToken); callAuthPage(callback, service, requestToken, authURL); } @Override protected void onResume() { super.onResume(); getToken(); } }