package com.mhacks.android.login;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.FragmentManager;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.facebook.Request;
import com.facebook.Response;
import com.facebook.model.GraphUser;
import com.mhacks.android.MainActivity;
import com.mhacks.android.R;
import com.parse.LogInCallback;
import com.parse.ParseException;
import com.parse.ParseFacebookUtils;
import com.parse.ParseTwitterUtils;
import com.parse.ParseUser;
import com.parse.SignUpCallback;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Timer;
import java.util.TimerTask;
public class LoginActivity extends Activity implements GuestNameFragment.GuestnameDialogListener{
private View mLoginFormView;
private View mLoginStatusView;
private TextView mLoginStatusMessageView;
private LinearLayout mLoginWelcomeView;
private TextView mLoginWelcomeText;
String username = "Anonymous";
String avatar_url = "http://www.genengnews.com/app_themes/genconnect/images/default_profile.jpg";
SharedPreferences mPrefs;
ParseUser mUser;
@Override
protected void onCreate(Bundle savedInstanceState) {
// Check if the user is already logged in
mUser = ParseUser.getCurrentUser();
if (mUser != null) {
Intent intent = new Intent(this, MainActivity.class);
finish();
startActivity(intent);
}
super.onCreate(savedInstanceState);
mPrefs = getSharedPreferences("login", MODE_PRIVATE);
setContentView(R.layout.activity_login);
getActionBar().hide();
mLoginFormView = findViewById(R.id.login_form);
mLoginStatusView = findViewById(R.id.login_status);
mLoginStatusMessageView = (TextView) findViewById(R.id.login_status_message);
mLoginWelcomeView = (LinearLayout) findViewById(R.id.login_welcome);
mLoginWelcomeText = (TextView) findViewById(R.id.login_welcome_message);
findViewById(R.id.fb_sign_in_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
attemptFBLogin();
}
});
findViewById(R.id.twitter_sign_in_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
attemptTwitterLogin();
}
});
findViewById(R.id.guest_sign_in_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
attemptGuestLogin();
}
});
showWelcome(true);
TimerTask task = new TimerTask(){
@Override
public void run(){
LoginActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
showWelcome(false);
}
});
}
};
Timer delay = new Timer();
delay.schedule(task, 2000);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
ParseFacebookUtils.finishAuthentication(requestCode, resultCode, data);
}
public void attemptGuestLogin() {
FragmentManager fm = getFragmentManager();
GuestNameFragment dialog = new GuestNameFragment();
dialog.show(fm, "guestname_dialog");
}
@Override
public void onFinishEditDialog(final String inputText) {
showProgress(true);
ParseUser.logInInBackground(inputText, "testpass1", new LogInCallback() {
@Override
public void done(ParseUser parseUser, ParseException e) {
if (e == null) {
setupAndComplete();
} else {
attemptGuestRegistration(inputText);
}
}
});
}
public void attemptGuestRegistration(String inputText) {
ParseUser user = new ParseUser();
user.setUsername(inputText);
user.setPassword("testpass1");
user.signUpInBackground(new SignUpCallback() {
public void done(ParseException e) {
if (e == null) {
setupAndComplete();
} else {
showProgress(false);
Toast.makeText(LoginActivity.this, getString(R.string.error_guestname), Toast.LENGTH_SHORT).show();
}
}
});
}
public void attemptFBLogin() {
// Show a progress spinner, and kick off a background task to
// perform the user login attempt.
mLoginStatusMessageView.setText(R.string.login_progress_signing_in);
showProgress(true);
ParseFacebookUtils.logIn(this, new LogInCallback() {
@Override
public void done(ParseUser user, ParseException err) {
if (user == null) {
showProgress(false);
Log.d("Facebook", "User is null!");
} else {
setupAndComplete();
Log.d("FacebookLogin", user.toString());
}
}
});
}
//TODO: toast error on failed login
public void attemptTwitterLogin() {
View focusView = null;
mLoginStatusMessageView.setText(R.string.login_progress_signing_in);
showWelcome(false);
showProgress(true);
ParseTwitterUtils.logIn(this, new LogInCallback() {
@Override
public void done(ParseUser user, ParseException err) {
if (user == null) {
showProgress(false);
} else {
setupAndComplete();
}
}
});
}
private void completeLogin() {
SharedPreferences.Editor editor = mPrefs.edit();
editor.putString("username", username);
editor.putString("avatar_url", avatar_url);
editor.commit();
showProgress(false);
showWelcome(true);
mLoginWelcomeText.setText(getString(R.string.login_welcome_post) + username);
TimerTask task = new TimerTask(){
@Override
public void run(){
LoginActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
});
}
};
Timer delay = new Timer();
delay.schedule(task, 2000);
}
private void setupAndComplete() {
final Runnable completer = new Runnable() {
@Override
public void run() {
completeLogin();
}
};
Log.d("Facebook", String.valueOf(ParseFacebookUtils.isLinked(ParseUser.getCurrentUser())));
if (ParseFacebookUtils.isLinked(ParseUser.getCurrentUser())) {
Request request = Request.newMeRequest(ParseFacebookUtils.getSession(), new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user, Response response) {
username = user.getName();
avatar_url = "http://graph.facebook.com/" + user.getId() + "/picture?type=square";
LoginActivity.this.runOnUiThread(completer);
}
});
request.executeAsync();
}
else if (ParseTwitterUtils.isLinked(ParseUser.getCurrentUser())) {
username = "@" + ParseTwitterUtils.getTwitter().getScreenName();
AsyncTask avatar_task = new AsyncTask() {
@Override
protected Object doInBackground(Object[] params) {
HttpClient client = new DefaultHttpClient();
HttpGet verifyGet = new HttpGet(
"https://api.twitter.com/1.1/account/verify_credentials.json");
ParseTwitterUtils.getTwitter().signRequest(verifyGet);
try {
HttpResponse response = client.execute(verifyGet);
InputStream stream = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
JSONObject profile = new JSONObject(sb.toString());
Log.d("Twitter", sb.toString());
avatar_url = profile.getString("profile_image_url");
} catch (Exception e) {
Log.d("Twitter", e.toString());
// TODO: add a toast error? logout?
// do nothing, stay anonymous
}
LoginActivity.this.runOnUiThread(completer);
return "";
}
};
avatar_task.execute();
}
else if (ParseUser.getCurrentUser().isAuthenticated()) {
username = ParseUser.getCurrentUser().getUsername();
runOnUiThread(completer);
}
}
/**
* Shows the progress UI and hides the login form.
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
private void showProgress(final boolean show) {
// On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
// for very easy animations. If available, use these APIs to fade-in
// the progress spinner.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime);
mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE);
mLoginStatusView.animate()
.setDuration(shortAnimTime)
.alpha(show ? 1 : 0)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE);
}
});
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
mLoginFormView.animate()
.setDuration(shortAnimTime)
.alpha(show ? 0 : 1)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
}
});
} else {
// The ViewPropertyAnimator APIs are not available, so simply show
// and hide the relevant UI components.
mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE);
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
}
}
/**
* Shows the progress UI and hides the login form.
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
private void showWelcome(final boolean show) {
showProgress(false);
// On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
// for very easy animations. If available, use these APIs to fade-in
// the progress spinner.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
int shortAnimTime = getResources().getInteger(android.R.integer.config_longAnimTime);
mLoginWelcomeView.setVisibility(show ? View.VISIBLE : View.GONE);
mLoginWelcomeView.animate()
.setDuration(shortAnimTime)
.alpha(show ? 1 : 0)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mLoginWelcomeView.setVisibility(show ? View.VISIBLE : View.GONE);
}
});
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
mLoginFormView.animate()
.setDuration(shortAnimTime)
.alpha(show ? 0 : 1)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
}
});
} else {
// The ViewPropertyAnimator APIs are not available, so simply show
// and hide the relevant UI components.
mLoginWelcomeView.setVisibility(show ? View.VISIBLE : View.GONE);
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
}
}
}