package net.mms_projects.copy_it.ui.android; import java.util.UUID; import net.mms_projects.copy_it.LoginResponse; import net.mms_projects.copy_it.R; import net.mms_projects.copy_it.activities.BrowserLoginActivity; import net.mms_projects.copy_it.android.tasks.SetupDeviceTask; import net.mms_projects.copy_it.api.ServerApi; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.app.NavUtils; import android.view.View; import android.widget.Toast; import com.actionbarsherlock.app.SherlockActivity; import com.actionbarsherlock.view.MenuItem; import com.facebook.Session; import com.facebook.SessionState; import com.facebook.UiLifecycleHelper; import com.google.analytics.tracking.android.EasyTracker; public class LoginActivity extends SherlockActivity { private static final int ACTIVITY_LOGIN = 1; private final Logger log = LoggerFactory.getLogger(this.getClass()); private Session.StatusCallback callback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { onSessionStateChange(session, state, exception); } }; private UiLifecycleHelper uiHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.uiHelper = new UiLifecycleHelper(this, callback); this.uiHelper.onCreate(savedInstanceState); setContentView(R.layout.activity_login); // Show the Up button in the action bar. getSupportActionBar().setDisplayHomeAsUpEnabled(true); } private void onSessionStateChange(final Session session, final SessionState state, final Exception exception) { if (state.isOpened()) { this.log.info("Logged in..."); Builder builder = new AlertDialog.Builder(this); builder.setMessage(this.getString( R.string.login_dialog_text_automatic_service_login, "Facebook")); builder.setCancelable(true); builder.setPositiveButton(R.string.dialog_button_yes, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { /* * Close the dialog because it is no longer needed */ dialog.dismiss(); /* * Start the browser login with Facebook as login * service and the Facebook accesstoken */ openBrowserLogin("facebook", session.getAccessToken()); } }); builder.setNegativeButton(R.string.dialog_button_no, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { /* * Close the dialog because it is no longer needed */ dialog.dismiss(); } }); AlertDialog dialog = builder.create(); dialog.show(); } else if (state.isClosed()) { this.log.info("Logged out..."); } } @Override protected void onStart() { super.onStart(); EasyTracker.getInstance().activityStart(this); } @Override protected void onStop() { super.onStop(); EasyTracker.getInstance().activityStop(this); } @Override public void onResume() { super.onResume(); // For scenarios where the main activity is launched and user // session is not null, the session state change notification // may not be triggered. Trigger it if it's open/closed. Session session = Session.getActiveSession(); if (session != null && (session.isOpened() || session.isClosed())) { onSessionStateChange(session, session.getState(), null); } this.uiHelper.onResume(); } @Override public void onPause() { super.onPause(); this.uiHelper.onPause(); } @Override public void onDestroy() { super.onDestroy(); this.uiHelper.onDestroy(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); this.uiHelper.onSaveInstanceState(outState); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // This ID represents the Home or Up button. In the case of this // activity, the Up button is shown. Use NavUtils to allow users // to navigate up one level in the application structure. For // more details, see the Navigation pattern on Android Design: // // http://developer.android.com/design/patterns/navigation.html#up-vs-back // NavUtils.navigateUpFromSameTask(this); return true; } return super.onOptionsItemSelected(item); } public void openBrowserLogin(View view) { Intent intent = new Intent(this, BrowserLoginActivity.class); startActivityForResult(intent, LoginActivity.ACTIVITY_LOGIN); } public void openBrowserLogin(String loginProvider, String accesstoken) { log.info("Openening browser login using provider and accesstoken"); Intent intent = new Intent(this, BrowserLoginActivity.class); intent.putExtra(BrowserLoginActivity.EXTRA_PROVIDER, loginProvider); intent.putExtra(BrowserLoginActivity.EXTRA_ACCESS_TOKEN, accesstoken); startActivityForResult(intent, LoginActivity.ACTIVITY_LOGIN); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case LoginActivity.ACTIVITY_LOGIN: if (resultCode == RESULT_OK) { LoginResponse response = new LoginResponse(); response.deviceId = UUID.fromString(data .getStringExtra("device_id")); response.devicePassword = data .getStringExtra("device_password"); SharedPreferences preferences = PreferenceManager .getDefaultSharedPreferences(this); try { Editor preferenceEditor = preferences.edit(); preferenceEditor.putString("device.id", response.deviceId.toString()); preferenceEditor.putString("device.password", response.devicePassword); preferenceEditor.commit(); } catch (Exception event) { // TODO Auto-generated catch block event.printStackTrace(); } ServerApi api = new ServerApi(); api.deviceId = response.deviceId; api.devicePassword = response.devicePassword; api.apiUrl = preferences.getString("server.baseurl", this .getResources().getString(R.string.default_baseurl)); LoginTask task = new LoginTask(this, api); task.execute(); break; } } this.uiHelper.onActivityResult(requestCode, resultCode, data); } private class LoginTask extends SetupDeviceTask { public LoginTask(Context context, ServerApi api) { super(context, api); this.setProgressDialigMessage(context.getResources().getString( R.string.text_logging_in)); } @Override protected void onPostExecute(Boolean result) { try { this.doExceptionCheck(); if (result) { Toast.makeText( this.context, this.context.getResources().getString( R.string.text_login_successful), Toast.LENGTH_SHORT).show(); } } catch (Exception exception) { // TODO Auto-generated catch block exception.printStackTrace(); AlertDialog alertDialog = new AlertDialog.Builder(this.context) .create(); alertDialog.setTitle(this.context.getResources().getString( R.string.dialog_title_error)); alertDialog.setMessage(this.context.getResources().getString( R.string.error_device_setup_failed, exception.getMessage())); alertDialog.setButton( DialogInterface.BUTTON_POSITIVE, this.context.getResources().getString( R.string.dialog_button_okay), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); alertDialog.setIcon(R.drawable.ic_launcher); alertDialog.show(); return; } super.onPostExecute(result); LoginActivity.this.finish(); } } }