package com.bennyguitar.onions_android.Session;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import com.bennyguitar.onions_android.Security.OCSecurity;
import com.bennyguitar.onions_android.Objects.Onion;
import com.bennyguitar.onions_android.Utilities.ParseConstants;
import com.parse.FindCallback;
import com.parse.LogInCallback;
import com.parse.Parse;
import com.parse.ParseException;
import com.parse.ParseFacebookUtils;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseUser;
import com.parse.SignUpCallback;
import java.util.List;
/**
* Created by BenG on 5/31/14.
*/
public class OCSession {
// Properties
public List Onions;
public String Password;
public String UserId;
public String Username;
public ParseUser User;
// Singleton Instance
public static OCSession mainSession;
public static OCSession getInstance(Context c) {
if (mainSession == null) {
mainSession = new OCSession();
mainSession.createSession(c);
}
return mainSession;
}
// Set Up
public static void setUp(Context c) {
if (mainSession == null) {
mainSession = new OCSession();
mainSession.createSession(c);
}
}
// Start Parse
public void createSession(Context c) {
ParseObject.registerSubclass(Onion.class);
Parse.initialize(c, ParseConstants.parseAppId(), ParseConstants.parseClientKey());
}
// Sign Up
public void signUpWithUserAndPass(final String username, final String pass, final Handler.Callback callback) {
AsyncTask bgTask = new AsyncTask() {
Handler signUpHandler = new Handler(callback);
Message signUpMessage = new Message();
boolean success;
@Override
protected Object doInBackground(Object[] objects) {
final ParseUser user = new ParseUser();
user.setUsername(OCSecurity.stretchedSha256String(username, OCSecurity.defaultShaIterations));
user.setPassword(OCSecurity.stretchedSha256String(pass + username, OCSecurity.defaultShaIterations));
user.put("Pro", true);
user.signUpInBackground(new SignUpCallback() {
public void done(ParseException e) {
if (e == null) {
// Hooray! Let them use the app now.
signUpMessage.arg1 = 1;
Username = username;
UserId = user.getObjectId();
Password = pass;
User = user;
} else {
// Sign up didn't succeed. Look at the ParseException
// to figure out what went wrong
}
onPostExecute();
}
});
return null;
}
protected void onPostExecute() {
signUpHandler.sendMessage(signUpMessage);
}
};
bgTask.execute();
}
// Login
public void loginWithUserAndPass(final String username, final String pass, final Handler.Callback callback) {
AsyncTask bgTask = new AsyncTask() {
// Set up
Handler loginHandler = new Handler(callback);
int success = 0;
Message loginMsg = new Message();
String u = username;
String p = pass;
@Override
protected Object doInBackground(Object[] objects) {
String stretchedUser = OCSecurity.stretchedSha256String(u, OCSecurity.defaultShaIterations);
String stretchedPass = OCSecurity.stretchedSha256String(p + u, OCSecurity.defaultShaIterations);
ParseUser.logInInBackground(stretchedUser, stretchedPass, new LogInCallback() {
public void done(ParseUser user, ParseException e) {
if (user != null) {
// Hooray! The user is logged in.
Username = username;
UserId = user.getObjectId();
Password = p;
success = 1;
User = user;
}
onPostExecute();
}
});
return null;
}
protected void onPostExecute() {
// Send it
loginMsg.arg1 = success;
loginHandler.sendMessage(loginMsg);
}
};
// Execute It
bgTask.execute();
}
// Load Onions
public void loadOnionsFromParse(final Handler.Callback callback) {
// Set Up
final Handler loadHandler = new Handler(callback);
// Must be logged in
if (UserId == null) {
Message msg = new Message();
loadHandler.sendMessage(msg);
return;
}
// Load the objects
ParseQuery<ParseObject> query = ParseQuery.getQuery("Onion");
query.whereEqualTo("userId", UserId);
query.orderByAscending("createdAt");
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> onionList, ParseException e) {
Message msg = new Message();
if (e == null) {
Onions = onionList;
msg.arg1 = 1;
}
loadHandler.sendMessage(msg);
}
});
}
// Decrypt Onions
public void decryptOnions(final Handler.Callback callback) {
AsyncTask bgTask = new AsyncTask() {
// Set Up
Handler decryptHandler = new Handler(callback);
Message msg = new Message();
// Background
@Override
protected Object doInBackground(Object[] objects) {
for (int i = 0; i < Onions.size(); i++) {
Onion onion = (Onion)Onions.get(i);
onion.decryptOnion();
}
msg.arg1 = 1;
onPostExecute();
return null;
}
// Finished
protected void onPostExecute() {
decryptHandler.sendMessage(msg);
}
};
bgTask.execute();
}
// Logout
public void logout() {
Onions = null;
Password = null;
UserId = null;
Username = null;
User = null;
}
}