package pt.codebits.park.alert; import java.io.FileNotFoundException; import java.io.IOException; import java.net.MalformedURLException; import org.json.JSONException; import org.json.JSONObject; import com.facebook.android.AsyncFacebookRunner; import com.facebook.android.AsyncFacebookRunner.RequestListener; import com.facebook.android.DialogError; import com.facebook.android.Facebook; import com.facebook.android.FacebookError; import com.facebook.android.Facebook.DialogListener; import com.facebook.android.Util; import pt.codebits.park.alert.R; import pt.codebits.park.alert.comm.REST; import pt.codebits.park.alert.twitter.TwitterUtils; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.Toast; public class LoginActivity extends Activity { private final class AuthorizationListener implements DialogListener { public void onComplete(Bundle values) { SharedPreferences.Editor editor = mPrefs.edit(); editor.putString("fb_access_token", mFacebook.getAccessToken()); editor.putLong("fb_access_expires", mFacebook.getAccessExpires()); editor.commit(); loginWithFacebook(); } public void onFacebookError(FacebookError error) { reportError(error); } public void onError(DialogError e) { reportError(e); } public void onCancel() {} private void reportError(Throwable tr) { Log.e("[FacebookConnect]", "Error connecting: ", tr); Toast.makeText(LoginActivity.this, "Não foi possível ligá-lo via Facebook", Toast.LENGTH_LONG).show(); } } // Hard-coded because we cannot get strings before the activity is initialized, what a pain! protected final Facebook mFacebook = new Facebook("414209645276563"); protected final AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(mFacebook); private SharedPreferences mPrefs; public static final String PREFS_NAME = "ValuesPreferences"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get existing access_token if any mPrefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); String access_token = mPrefs.getString("fb_access_token", null); long expires = mPrefs.getLong("fb_access_expires", 0); if(access_token != null) { mFacebook.setAccessToken(access_token); } if(expires != 0) { mFacebook.setAccessExpires(expires); } if (mFacebook.isSessionValid()) { loginWithFacebook(); } else if(TwitterUtils.isAuthenticated(mPrefs)){ TwitterUtils.loginWithTwitter(LoginActivity.this, mPrefs); } setContentView(R.layout.login); final Button loginBtn = (Button) findViewById(R.id.loginbtn); final Button registerBtn = (Button) findViewById(R.id.registerbtn); loginBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { final EditText userForm = (EditText) findViewById(R.id.utilizadorform); final EditText pwForm = (EditText) findViewById(R.id.palavrachaveform); final android.widget.TextView warningView = (android.widget.TextView) findViewById(R.id.warningMsg); // Verify if the form is correctly filled in if (userForm.getText().toString().equals("") || pwForm.getText().toString().equals("")) { warningView.setText(R.string.fillFields); return; } new Thread() { @Override public void run() { String token = REST.loginUser(LoginActivity.this, userForm.getText().toString(), pwForm.getText().toString()); if (REST.checkForStopConditions(LoginActivity.this, token)) { return; } SharedPreferences.Editor editor = mPrefs.edit(); editor.putString("regular_access_token", token); editor.commit(); LoginActivity.this.runOnUiThread(new Runnable() { public void run() { Intent intent = new Intent(LoginActivity.this, MainMapActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); LoginActivity.this.startActivity(intent); LoginActivity.this.finish(); } }); } }.start(); } }); registerBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent intent = new Intent(LoginActivity.this, RegisterActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); LoginActivity.this.startActivity(intent); LoginActivity.this.finish(); } }); final ImageButton fbBtn = (ImageButton) findViewById(R.id.fbbtn); fbBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { if(!mFacebook.isSessionValid()) { mFacebook.authorize(LoginActivity.this, new String[] {"user_about_me", "email"}, new AuthorizationListener()); } } }); final ImageButton twitBtn = (ImageButton) findViewById(R.id.twitterbtn); twitBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { if (!TwitterUtils.isAuthenticated(mPrefs)) { Intent i = new Intent(getApplicationContext(), TwitterPrepareRequestActivity.class); startActivity(i); } } }); } private void loginWithFacebook() { mAsyncRunner.request("me", new RequestListener(){ public void onComplete(final String response, final Object state) { // Since we are not sure which Thread may serve this callback of the // facebook SDK, we must conservatively run it in a concurrent Thread // to ensure we do not block the UI thread new Thread() { @Override public void run() { JSONObject json = null; String id = null; String name = null; String email = null; try { json = Util.parseJson(response); id = json.getString("id"); name = json.getString("name"); email = json.getString("email"); } catch (FacebookError e) { mFacebook.authorize(LoginActivity.this, new String[] {"user_about_me", "email"}, new AuthorizationListener()); return; } catch (JSONException e) { mFacebook.authorize(LoginActivity.this, new String[] {"user_about_me", "email"}, new AuthorizationListener()); return; } String result = REST.loginFacebook(LoginActivity.this, id, name, email); if (REST.checkForStopConditions(LoginActivity.this, result)) { return; } SharedPreferences.Editor editor = mPrefs.edit(); editor.putString("regular_access_token", result); editor.commit(); MainMapActivity.redirectToLogin(LoginActivity.this); } }.start(); } public void onIOException(IOException e, Object state) { reportError(e); } public void onFileNotFoundException(FileNotFoundException e, Object state) { reportError(e); } public void onMalformedURLException(MalformedURLException e, Object state) { reportError(e); } public void onFacebookError(FacebookError e, Object state) { mFacebook.authorize(LoginActivity.this, new String[] {"user_about_me", "email"}, new AuthorizationListener()); } private void reportError(Throwable tr) { Log.e("[FacebookConnect]", "Error connecting: ", tr); Toast.makeText(LoginActivity.this, "Não foi possível ligá-lo via Facebook", Toast.LENGTH_LONG).show(); } }); } @Override public void onResume() { super.onResume(); mFacebook.extendAccessTokenIfNeeded(this, null); if (getIntent().getBooleanExtra("registerFB", false)) { mFacebook.authorize(LoginActivity.this, new String[] {"user_about_me", "email"}, new AuthorizationListener()); } else if(getIntent().getBooleanExtra("registerTwitter", false)){ Intent i = new Intent(getApplicationContext(), TwitterPrepareRequestActivity.class); startActivity(i); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); mFacebook.authorizeCallback(requestCode, resultCode, data); } public static void redirectToLogin(final Activity activity) { activity.runOnUiThread(new Runnable(){ public void run() { Intent intent = new Intent(activity, LoginActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); activity.startActivity(intent); // remove this activity from the stack activity.finish(); } }); } }