package com.magnet.messagingsample.activities;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.Profile;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import com.magnet.messagingsample.R;
import com.magnet.messagingsample.models.MyProfile;
import com.magnet.mmx.client.api.MMX;
import com.magnet.mmx.client.api.MMXUser;
import org.json.JSONObject;
import java.util.HashSet;
import java.util.concurrent.atomic.AtomicBoolean;
public class LoginActivity extends AppCompatActivity {
final String TAG = "LoginActivity";
Button btLogin;
LoginButton btFacebookLogin;
Button btRegister;
EditText etEmail;
EditText etPassword;
private AtomicBoolean mLoginSuccess = new AtomicBoolean(false);
private CallbackManager mCallbackManager = null;
private MyProfile mProfile = null;
private FacebookCallback<LoginResult> mLoginCallback = new FacebookCallback<LoginResult>() {
public void onSuccess(LoginResult loginResult) {
Log.d(TAG, "LoginCallback.onSuccess() " + loginResult.getAccessToken().getUserId());
final GraphRequest request = new GraphRequest(loginResult.getAccessToken(), "me");
Bundle params = new Bundle();
params.putString("fields", "id,name,email");
request.setParameters(params);
AsyncTask.execute(new Runnable() {
public void run() {
Log.d(TAG, "LoginCallback.onSuccess() lookup email");
GraphResponse response = request.executeAndWait();
JSONObject jsonResp = response.getJSONObject();
try {
String email = jsonResp.getString("email");
String name = jsonResp.getString("name");
String id = jsonResp.getString("id");
mProfile.setUsername(email);
mProfile.setPassword(id.getBytes()); //FIXME: Find a better way to generate this password
mProfile.setDisplayName(name);
attemptRegister(mProfile.getUsername(), mProfile.getPassword(), false);
} catch (final Exception ex) {
Log.e(TAG, "LoginCallback.onSuccess(): exception caught while getting identity", ex);
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(LoginActivity.this, "Exception caught while getting identity: " +
ex.getMessage(), Toast.LENGTH_LONG).show();
LoginActivity.this.finish();
}
});
}
}
});
}
public void onCancel() {
Log.d(TAG, "LoginCallback.onCancel()");
LoginActivity.this.finish();
}
public void onError(FacebookException e) {
Log.e(TAG, "LoginCallback.onError() ", e);
Toast.makeText(LoginActivity.this, "Exception: " + e.getMessage(), Toast.LENGTH_LONG).show();
LoginActivity.this.finish();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());
mProfile = MyProfile.getInstance(this);
if (mProfile.getUsername() != null && Profile.getCurrentProfile() != null) {
attemptRegister(mProfile.getUsername(), mProfile.getPassword(), false);
}
setContentView(R.layout.activity_login);
btLogin = (Button) findViewById(R.id.btLogin);
btFacebookLogin = (LoginButton) findViewById(R.id.btFacebookLogin);
btRegister = (Button) findViewById(R.id.btRegister);
etEmail = (EditText) findViewById(R.id.etEmail);
etPassword = (EditText) findViewById(R.id.etPassword);
btLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String username = etEmail.getText().toString();
String password = etPassword.getText().toString();
attemptLogin(username, password.getBytes());
}
});
btRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String username = etEmail.getText().toString();
String password = etPassword.getText().toString();
attemptRegister(username, password.getBytes(), true);
}
});
mCallbackManager = CallbackManager.Factory.create();
btFacebookLogin.registerCallback(mCallbackManager, mLoginCallback);
}
@Override
protected void onResume() {
super.onResume();
if (mProfile.getUsername() != null && Profile.getCurrentProfile() != null) {
attemptRegister(mProfile.getUsername(), mProfile.getPassword(), false);
}
}
private void attemptLogin(String user, byte[] pass) {
MMX.login(user, pass, new MMX.OnFinishedListener<Void>() {
public void onSuccess(Void aVoid) {
//if an EventListener has already been registered, start receiving messages
MMX.start();
goToUserSelectActivity();
}
public void onFailure(MMX.FailureCode failureCode, Throwable throwable) {
Log.e(TAG, "attemptLogin() error: " + failureCode, throwable);
if (MMX.FailureCode.SERVER_AUTH_FAILED.equals(failureCode)) {
//login failed, probably an incorrect password
Toast.makeText(LoginActivity.this, "Invalid username and/or password.", Toast.LENGTH_LONG).show();
}
}
});
}
private void attemptRegister(final String user, final byte[] pass, final boolean isNewUser) {
MMXUser mmxUser = new MMXUser.Builder().username(user).displayName(user).build();
mmxUser.register(pass, new MMXUser.OnFinishedListener<Void>() {
public void onSuccess(Void aVoid) {
Log.e(TAG, "attemptRegister() success");
mLoginSuccess.set(true);
attemptLogin(user, pass);
}
public void onFailure(MMXUser.FailureCode failureCode, Throwable throwable) {
if (MMXUser.FailureCode.REGISTRATION_INVALID_USERNAME.equals(failureCode)) {
Log.e(TAG, "attemptRegister() error: " + failureCode, throwable);
Toast.makeText(LoginActivity.this, "Sorry, that's not a valid username.", Toast.LENGTH_LONG).show();
}
if (MMXUser.FailureCode.REGISTRATION_USER_ALREADY_EXISTS.equals(failureCode)) {
if (isNewUser) {
Log.e(TAG, "attemptRegister() error: " + failureCode, throwable);
Toast.makeText(LoginActivity.this, "Sorry, this user already exists.", Toast.LENGTH_LONG).show();
} else {
attemptLogin(user, pass);
}
}
mLoginSuccess.set(false);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mCallbackManager.onActivityResult(requestCode, resultCode, data);
}
public void goToUserSelectActivity() {
Intent intent;
intent = new Intent(LoginActivity.this, UserSelectActivity.class);
startActivity(intent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_login, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
return super.onOptionsItemSelected(item);
}
}