/* * Copyright 2010-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.android.twitterclient; import org.springframework.social.connect.Connection; import org.springframework.social.connect.ConnectionRepository; import org.springframework.social.connect.DuplicateConnectionException; import org.springframework.social.oauth1.AuthorizedRequestToken; import org.springframework.social.oauth1.OAuth1Parameters; import org.springframework.social.oauth1.OAuthToken; import org.springframework.social.twitter.api.Twitter; import org.springframework.social.twitter.connect.TwitterConnectionFactory; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; /** * @author Roy Clarkson */ public class TwitterWebOAuthActivity extends AbstractWebViewActivity { @SuppressWarnings("unused") private static final String TAG = TwitterWebOAuthActivity.class.getSimpleName(); private static final String REQUEST_TOKEN_KEY = "request_token"; private static final String REQUEST_TOKEN_SECRET_KEY = "request_token_secret"; private ConnectionRepository connectionRepository; private TwitterConnectionFactory connectionFactory; private SharedPreferences twitterPreferences; // *************************************** // Activity methods // *************************************** @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.connectionRepository = getApplicationContext().getConnectionRepository(); this.connectionFactory = getApplicationContext().getTwitterConnectionFactory(); this.twitterPreferences = getSharedPreferences("TwitterConnectPreferences", Context.MODE_PRIVATE); } @Override public void onStart() { super.onStart(); Uri uri = getIntent().getData(); if (uri != null) { String oauthVerifier = uri.getQueryParameter("oauth_verifier"); if (oauthVerifier != null) { getWebView().clearView(); new TwitterPostConnectTask().execute(oauthVerifier); } } else { new TwitterPreConnectTask().execute(); } } // *************************************** // Private methods // *************************************** private String getOAuthCallbackUrl() { return getString(R.string.twitter_oauth_callback_url); } private void displayTwitterAuthorization(OAuthToken requestToken) { // save for later use saveRequestToken(requestToken); // Generate the Twitter authorization URL to be used in the browser or web view String authUrl = this.connectionFactory.getOAuthOperations().buildAuthorizeUrl(requestToken.getValue(), OAuth1Parameters.NONE); // display the twitter authorization screen getWebView().loadUrl(authUrl); } private void displayTwitterOptions() { Intent intent = new Intent(); intent.setClass(this, TwitterActivity.class); startActivity(intent); finish(); } private void saveRequestToken(OAuthToken requestToken) { SharedPreferences.Editor editor = this.twitterPreferences.edit(); editor.putString(REQUEST_TOKEN_KEY, requestToken.getValue()); editor.putString(REQUEST_TOKEN_SECRET_KEY, requestToken.getSecret()); editor.commit(); } private OAuthToken retrieveRequestToken() { String token = this.twitterPreferences.getString(REQUEST_TOKEN_KEY, null); String secret = this.twitterPreferences.getString(REQUEST_TOKEN_SECRET_KEY, null); return new OAuthToken(token, secret); } private void deleteRequestToken() { this.twitterPreferences.edit().clear().commit(); } // *************************************** // Private classes // *************************************** private class TwitterPreConnectTask extends AsyncTask<Void, Void, OAuthToken> { @Override protected void onPreExecute() { showProgressDialog("Initializing OAuth Connection..."); } @Override protected OAuthToken doInBackground(Void... params) { // Fetch a one time use Request Token from Twitter return connectionFactory.getOAuthOperations().fetchRequestToken(getOAuthCallbackUrl(), null); } @Override protected void onPostExecute(OAuthToken requestToken) { dismissProgressDialog(); displayTwitterAuthorization(requestToken); } } private class TwitterPostConnectTask extends AsyncTask<String, Void, Void> { @Override protected void onPreExecute() { showProgressDialog("Finalizing OAuth Connection..."); } @Override protected Void doInBackground(String... params) { if (params.length <= 0) { return null; } final String verifier = params[0]; OAuthToken requestToken = retrieveRequestToken(); // Authorize the Request Token AuthorizedRequestToken authorizedRequestToken = new AuthorizedRequestToken(requestToken, verifier); // Exchange the Authorized Request Token for the Access Token OAuthToken accessToken = connectionFactory.getOAuthOperations().exchangeForAccessToken( authorizedRequestToken, null); deleteRequestToken(); // Persist the connection and Access Token to the repository Connection<Twitter> connection = connectionFactory.createConnection(accessToken); try { connectionRepository.addConnection(connection); } catch (DuplicateConnectionException e) { // connection already exists in repository! } return null; } @Override protected void onPostExecute(Void v) { dismissProgressDialog(); displayTwitterOptions(); } } }