Java tutorial
/* * 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.ui; import java.io.IOException; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import android.widget.Toast; import android.widget.ToggleButton; import com.adisayoga.earthquake.R; import com.adisayoga.earthquake.utils.BaseRequestListener; import com.adisayoga.earthquake.utils.SessionEvents; import com.adisayoga.earthquake.wrapper.EarthquakeFacebook; import com.adisayoga.earthquake.wrapper.EarthquakeTwitter; import com.adisayoga.earthquake.wrapper.Prefs; import com.facebook.android.AsyncFacebookRunner; import com.facebook.android.FacebookError; import com.facebook.android.Util; /** * Activity login/logout dari jejaring sosial (Facebook dan Twitter). * * @author Adi Sayoga */ public class SocialConnectActivity extends Activity { private static final String TAG = "SocialConnectActivity"; private static Prefs prefs; private EarthquakeFacebook facebook; private AsyncFacebookRunner runner; private EarthquakeTwitter twitter; private ToggleButton facebookLoginButton; private TextView facebookLoginStatus; private ToggleButton twitterLoginButton; private TextView twitterLoginStatus; private boolean twitterLoggedIn = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); prefs = Prefs.getInstance(this); setTheme(prefs.getTheme().resId); setContentView(R.layout.social_connect); facebook = new EarthquakeFacebook(this); runner = new AsyncFacebookRunner(facebook.getFacebook()); twitter = new EarthquakeTwitter(this); setListeners(); updateFacebookView(); // Coba login authorized user twitter.loginAuthorizedUser(new EarthquakeTwitter.AuthListener() { @Override public void onAuthComplete() { twitterLoggedIn = true; updateTwitterView(); } @Override public void onAuthFail() { // Abaikan } }); } /** * Set listener untuk masing-masing tombol. */ private void setListeners() { facebookLoginButton = (ToggleButton) findViewById(R.id.facebook_connect); facebookLoginStatus = (TextView) findViewById(R.id.facebook_status); facebookLoginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Kembalikan keadaan seperti semula, saat login berhasil baru // view akan diupdate facebookLoginButton.setChecked(!facebookLoginButton.isChecked()); if (facebook.isSessionValid()) { facebookLogout(); } else { facebookLogin(); } } }); twitterLoginButton = (ToggleButton) findViewById(R.id.twitter_connect); twitterLoginStatus = (TextView) findViewById(R.id.twitter_status); twitterLoginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Kembalikan keadaan seperti semula, saat login berhasil baru // view akan diupdate twitterLoginButton.setChecked(!twitterLoginButton.isChecked()); if (twitterLoggedIn) { twitterLogout(); } else { twitterLogin(); } } }); } /** * Update view Facebook, sudah login atau belum. */ private void updateFacebookView() { if (facebook.isSessionValid()) { facebookLoginButton.setChecked(true); showFacebookInfo(); } else { facebookLoginButton.setChecked(false); facebookLoginStatus.setText(R.string.not_login); } } /** * Tampilkan informasi Facebook sebagai tanda user telah login. */ private void showFacebookInfo() { facebookLoginStatus.setText(R.string.loading); // Tampilkan nama user yang login runner.request("me", new BaseRequestListener() { @Override public void onComplete(String response, Object state) { try { Log.d(TAG, "Response: " + response.toString()); JSONObject json = Util.parseJson(response); final String name = json.getString("name"); runOnUiThread(new Runnable() { @Override public void run() { facebookLoginStatus.setText(getText(R.string.welcome) + " " + name); } }); } catch (JSONException e) { Log.w(TAG, "JSON Error pada response"); } catch (FacebookError e) { Log.w(TAG, "Facebook Error: " + e.getMessage()); runOnUiThread(new Runnable() { @Override public void run() { facebookLoginStatus.setText(R.string.facebook_error); } }); } } @Override public void onIOException(IOException e, Object state) { runOnUiThread(new Runnable() { @Override public void run() { facebookLoginStatus.setText(R.string.network_error); } }); super.onIOException(e, state); } }); } /** * Login ke Facebook. */ private void facebookLogin() { Log.d(TAG, "Login..."); SessionEvents.AuthListener listener = new SessionEvents.AuthListener() { @Override public void onAuthSucceed() { Log.d(TAG, "Auth success!"); updateFacebookView(); } @Override public void onAuthFail(String error) { Toast.makeText(SocialConnectActivity.this, R.string.auth_fail, Toast.LENGTH_LONG).show(); facebookLoginStatus.setText(R.string.auth_fail); Log.w(TAG, error); } }; SessionEvents.addAuthListener(listener); facebook.login(this); } /** * Logout dari Facebook. */ private void facebookLogout() { Log.d(TAG, "Logout..."); SessionEvents.LogoutListener listener = new SessionEvents.LogoutListener() { @Override public void onLogoutBegin() { Log.d(TAG, "Logout begin..."); facebookLoginStatus.setText(R.string.logging_out); } @Override public void onLogoutFinish() { Log.d(TAG, "Logout finish."); updateFacebookView(); } }; SessionEvents.addLogoutListener(listener); facebook.logout(); } /** * Update view Twitter sudah login/belum. */ private void updateTwitterView() { if (twitterLoggedIn) { twitterLoginButton.setChecked(true); showTwitterInfo(); } else { twitterLoginButton.setChecked(false); twitterLoginStatus.setText(R.string.not_login); } } /** * Tampilkan informasi Twitter sebagai tanda sudah login/belum. */ private void showTwitterInfo() { new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... params) { publishProgress(); return twitter.getScreenName(); } @Override protected void onProgressUpdate(Void... values) { twitterLoginStatus.setText(R.string.loading); } @Override protected void onPostExecute(String result) { twitterLoginStatus.setText(getText(R.string.welcome) + " " + result); } }.execute(); } /** * Login ke Twitter. */ private void twitterLogin() { twitter.login(this, new EarthquakeTwitter.AuthListener() { @Override public void onAuthComplete() { twitterLoggedIn = true; updateTwitterView(); } @Override public void onAuthFail() { twitterLoggedIn = false; updateTwitterView(); } }); } /** * Logout dari Twitter. */ private void twitterLogout() { // Hapus token dari preference prefs.setTwitterToken("", ""); twitterLoggedIn = false; updateTwitterView(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { facebook.getFacebook().authorizeCallback(requestCode, resultCode, data); twitter.authorizeCallback(requestCode, resultCode, data); } }