/*
* Copyright 2011 Adi Sayoga.
*
* 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 com.adisayoga.earthquake.wrapper;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.widget.Toast;
import com.adisayoga.earthquake.R;
import com.adisayoga.earthquake.utils.BrowserActivityClient;
public class TwitterLoginActivity extends Activity {
private static final String TAG = "TwitterLoginActivity";
private static Prefs prefs;
private Twitter twitter;
private WebView webView;
/** Request token sebagai tanda id unik dari request yang dikirim ke Twitter */
private RequestToken reqToken;
/** Url yang akan di-redirect oleh Twitter setelah user log in - ini akan
* diambil oleh manifest aplikasi dan di-redirect ke activity ini */
public static final String CALLBACK_URL = "http://adisayoga.xtreemhost.com";
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate");
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
requestWindowFeature(Window.FEATURE_PROGRESS);
super.onCreate(savedInstanceState);
setContentView(R.layout.webview);
prefs = Prefs.getInstance(this);
twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(EarthquakeTwitter.CONSUMER_KEY,
EarthquakeTwitter.CONSUMER_SECRET);
BrowserActivityClient client = new BrowserActivityClient(CALLBACK_URL);
client.setCallbackListener(new BrowserActivityClient.CallbackListener() {
@Override
public void onRedirect(Uri uri) {
dealWithResponse(uri);
}
});
webView = (WebView) findViewById(R.id.webview);
webView.setWebViewClient(client);
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int progress) {
setProgress(progress * 100);
if(progress == 100) {
setProgressBarIndeterminateVisibility(false);
setProgressBarVisibility(false);
}
}
});
loginNewUser();
}
/**
* Buat sebuah request yang akan dikirim ke Twitter menanyakan
* <i>'apakah aplikasi ini punya ijin untuk menggunakan Twitter untuk user ini?</i>
* <p>
* Akan dikembalikan ke {@link #reqToken} yaitu sebuah pengenal unik
* pada request ini.
* Browse kemudian muncul pada website Twitter dan user login (kita tidak
* pernah melihat informasi ini).
* Twitter kemudian redirect ke callbackUrl jika login sukses.
*/
private void loginNewUser() {
try {
Log.d(TAG, "Request app authentication...");
reqToken = twitter.getOAuthRequestToken(CALLBACK_URL);
String url = reqToken.getAuthenticationURL();
Log.d(TAG, "Authentication url: " + url);
webView.loadUrl(url);
} catch (TwitterException e) {
Log.e(TAG, "Twitter login error: " + e.getMessage(), e);
Toast.makeText(this, R.string.auth_fail, Toast.LENGTH_SHORT).show();
finish();
}
}
/**
* Twitter telah mengirim kembali ke aplikasi.
* <p>
* Dengan ini kita mendapatkan 'key' untuk digunakan untuk autentikasi user.
*
* @param uri Uri
* @param callbackUrl Callback Url
* @param callbackListener Listener callback
*/
private void dealWithResponse(Uri uri) {
if (uri != null && uri.toString().startsWith(CALLBACK_URL)) {
String oauthVerifier = uri.getQueryParameter("oauth_verifier");
try {
AccessToken accessToken = twitter.getOAuthAccessToken(reqToken,
oauthVerifier);
twitter.setOAuthAccessToken(accessToken);
saveAccessToken(accessToken);
Log.d(TAG, "login ke Twitter berhasil");
Toast.makeText(this, R.string.auth_success, Toast.LENGTH_SHORT).show();
setResult(Activity.RESULT_OK);
} catch (Exception e) {
Log.e(TAG, "Twitter login error: " + e.getMessage(), e);
Toast.makeText(this, R.string.auth_fail, Toast.LENGTH_SHORT).show();
}
finish();
}
}
/**
* Simpan akses token ke preference.
*
* @param accessToken Akses token
*/
private void saveAccessToken(AccessToken accessToken) {
String token = accessToken.getToken();
String secret = accessToken.getTokenSecret();
prefs.setTwitterToken(token, secret);
Log.d(TAG, "AccessToken disimpan: token=" + token + ", secret=" + secret);
}
}