package io.evercam.connect.signin;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.Locale;
import java.util.Set;
import java.util.TreeMap;
import io.evercam.API;
import io.evercam.ApiKeyPair;
import io.evercam.EvercamException;
import io.evercam.User;
import io.evercam.UserDetail;
import io.evercam.connect.EvercamDiscover;
import io.evercam.connect.R;
import io.evercam.connect.helper.Constants;
import io.evercam.connect.helper.SharedPrefsManager;
import io.evercam.connect.helper.account.AccountUtils;
import io.evercam.connect.helper.account.UserProfile;
public class SignUpActivity extends Activity
{
private final String TAG = "SignUpActivity";
// Auto filled profiles
private String filledFirstname = "";
private String filledLastname = "";
private String filledEmail = "";
private EditText firstnameEdit;
private EditText lastnameEdit;
private EditText usernameEdit;
private EditText emailEdit;
private EditText passwordEdit;
private EditText repasswordEdit;
private Button signupBtn;
private Spinner countrySpinner;
private TreeMap<String, String> countryMap;
private View signUpFormView;
private View signUpStatusView;
private CreateUserTask createUserTask;
private View focusView = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_user);
readFromAccount();
initialPage();
EvercamDiscover.sendScreenAnalytics(this, getString(R.string.screen_sign_up));
}
private void initialPage()
{
signUpFormView = findViewById(R.id.signup_form);
signUpStatusView = findViewById(R.id.signup_status);
firstnameEdit = (EditText) findViewById(R.id.firstname_edit);
lastnameEdit = (EditText) findViewById(R.id.lastname_edit);
usernameEdit = (EditText) findViewById(R.id.username_edit);
emailEdit = (EditText) findViewById(R.id.email_edit);
passwordEdit = (EditText) findViewById(R.id.password_edit);
repasswordEdit = (EditText) findViewById(R.id.repassword_edit);
signupBtn = (Button) findViewById(R.id.sign_up_button);
countrySpinner = (Spinner) findViewById(R.id.country_spinner);
fillDefaultProfile();
setSpinnerAdapter();
signupBtn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
UserDetail userDetail = checkDetails();
if(userDetail != null)
{
if(createUserTask != null)
{
createUserTask = null;
}
createUserTask = new CreateUserTask(userDetail);
createUserTask.execute();
}
else
{
if(focusView != null)
{
focusView.requestFocus();
}
}
}
});
}
private UserDetail checkDetails()
{
UserDetail user = new UserDetail();
String firstname = firstnameEdit.getText().toString();
String lastname = lastnameEdit.getText().toString();
String username = usernameEdit.getText().toString();
String email = emailEdit.getText().toString();
String countryname = countrySpinner.getSelectedItem().toString();
String password = passwordEdit.getText().toString();
String repassword = repasswordEdit.getText().toString();
firstnameEdit.setError(null);
lastnameEdit.setError(null);
usernameEdit.setError(null);
emailEdit.setError(null);
passwordEdit.setError(null);
repasswordEdit.setError(null);
if(TextUtils.isEmpty(firstname))
{
firstnameEdit.setError(getString(R.string.error_field_required));
focusView = firstnameEdit;
return null;
}
else
{
user.setFirstname(firstname);
}
if(TextUtils.isEmpty(lastname))
{
lastnameEdit.setError(getString(R.string.error_field_required));
focusView = lastnameEdit;
return null;
}
else
{
user.setLastname(lastname);
}
if(countryname.equals(getResources().getString(R.string.spinnerFistItem)))
{
makeShortToast(R.string.countryNotSelected);
return null;
}
else
{
String countrycode = countryMap.get(countryname).toLowerCase(Locale.UK);
user.setCountrycode(countrycode);
}
if(TextUtils.isEmpty(username))
{
usernameEdit.setError(getString(R.string.error_field_required));
focusView = usernameEdit;
return null;
}
else if(username.contains(" "))
{
usernameEdit.setError(getString(R.string.error_invalid_username));
focusView = usernameEdit;
return null;
}
else
{
user.setUsername(username);
}
if(TextUtils.isEmpty(email))
{
emailEdit.setError(getString(R.string.error_field_required));
focusView = emailEdit;
return null;
}
else if(!email.contains("@"))
{
makeShortToast(R.string.invalidEmail);
focusView = emailEdit;
return null;
}
else
{
user.setEmail(email);
}
if(TextUtils.isEmpty(password))
{
passwordEdit.setError(getString(R.string.error_field_required));
focusView = passwordEdit;
return null;
}
if(TextUtils.isEmpty(repassword))
{
repasswordEdit.setError(getString(R.string.error_field_required));
focusView = passwordEdit;
return null;
}
else if(!password.equals(repassword))
{
makeShortToast(R.string.passwordNotMatch);
return null;
}
else
{
user.setPassword(password);
}
return user;
}
private void initCountryMap()
{
countryMap = new TreeMap<String, String>();
for(String countryCode : Locale.getISOCountries())
{
Locale locale = new Locale("", countryCode);
countryMap.put(locale.getDisplayName(), countryCode);
}
}
@SuppressWarnings({"rawtypes", "unchecked"})
private String[] join(String[]... arrays)
{
int size = 0;
for(String[] array : arrays)
{
size += array.length;
}
java.util.List list = new java.util.ArrayList(size);
for(String[] array : arrays)
{
list.addAll(java.util.Arrays.asList(array));
}
return (String[]) list.toArray(new String[size]);
}
private void makeShortToast(int message)
{
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
private void makeShortToast(String message)
{
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
private void setSpinnerAdapter()
{
initCountryMap();
Set<String> set = countryMap.keySet();
String[] countryArray = join(new String[]{getResources().getString(R.string
.spinnerFistItem)}, set.toArray(new String[0]));
ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(SignUpActivity.this,
R.layout.country_spinner, countryArray);
spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
countrySpinner.setAdapter(spinnerArrayAdapter);
}
public class CreateUserTask extends AsyncTask<Void, Void, String>
{
UserDetail userDetail;
public CreateUserTask(UserDetail userDetail)
{
this.userDetail = userDetail;
}
@Override
protected void onPostExecute(String message)
{
if(message == null)
{
makeShortToast(R.string.confirmSignUp);
setResult(Constants.RESULT_TRUE);
finish();
}
else
{
showProgress(false);
makeShortToast(message);
}
}
@Override
protected void onPreExecute()
{
showProgress(true);
}
@Override
protected String doInBackground(Void... args)
{
try
{
User.create(userDetail);
ApiKeyPair userKeyPair = API.requestUserKeyPairFromEvercam(userDetail.getUsername
(), userDetail.getPassword());
String userApiKey = userKeyPair.getApiKey();
String userApiId = userKeyPair.getApiId();
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(SignUpActivity.this);
SharedPrefsManager.saveEvercamUserKeyPair(sharedPrefs, userApiKey, userApiId);
API.setUserKeyPair(userApiKey, userApiId);
User evercamUser = new User(userDetail.getUsername());
SharedPrefsManager.saveEvercamCredential(sharedPrefs, evercamUser, userDetail.getPassword());
return null;
}
catch(EvercamException e)
{
return e.getMessage();
}
}
}
private void readFromAccount()
{
try
{
UserProfile profile = AccountUtils.getUserProfile(this);
if(profile.primaryEmail() != null)
{
filledEmail = profile.primaryEmail();
}
else if(profile.possibleEmails().size() > 0)
{
filledEmail = profile.possibleEmails().get(0);
}
if(profile.possibleNames().size() > 0)
{
String name = profile.possibleNames().get(0);
String[] nameArray = name.split("\\s+");
if(nameArray.length >= 2)
{
filledFirstname = nameArray[0];
filledLastname = nameArray[1];
}
}
Log.d(TAG, "emails" + profile.possibleEmails().size() + "\nnames" + profile.possibleNames().size() + profile.primaryEmail());
}
catch(Exception e)
{
// If exceptions happen here, will not influence app functionality.
// Just catch it to avoid crashing.
Log.e(TAG, e.toString());
}
catch(NoClassDefFoundError e)
{
//Temporarily catching this error because it crashes on a 4.4 device
}
}
private void fillDefaultProfile()
{
firstnameEdit.setText(filledFirstname);
lastnameEdit.setText(filledLastname);
emailEdit.setText(filledEmail);
}
private void showProgress(boolean show)
{
signUpStatusView.setVisibility(show ? View.VISIBLE : View.GONE);
signUpFormView.setVisibility(show ? View.GONE : View.VISIBLE);
}
}