/*
* Copyright (c) 2014, Facebook, Inc. All rights reserved.
*
* You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
* copy, modify, and distribute this software in source code or binary form for use
* in connection with the web services and APIs provided by Facebook.
*
* As with any software that integrates with the Facebook platform, your use of
* this software is subject to the Facebook Developer Principles and Policies
* [http://developers.facebook.com/policy/]. This copyright notice shall be
* included in all copies or substantial portions of the software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
package com.parse.ui;
import android.app.Activity;
import android.os.Bundle;
import android.text.InputType;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import com.parse.ParseException;
import com.parse.ParseUser;
import com.parse.SignUpCallback;
/**
* Fragment for the user signup screen.
*/
public class ParseSignupFragment extends ParseLoginFragmentBase implements OnClickListener {
public static final String USERNAME = "com.parse.ui.ParseSignupFragment.USERNAME";
public static final String PASSWORD = "com.parse.ui.ParseSignupFragment.PASSWORD";
private EditText usernameField;
private EditText passwordField;
private EditText confirmPasswordField;
private EditText emailField;
private EditText nameField;
private Button createAccountButton;
private ParseOnLoginSuccessListener onLoginSuccessListener;
private ParseLoginConfig config;
private int minPasswordLength;
private static final String LOG_TAG = "ParseSignupFragment";
private static final int DEFAULT_MIN_PASSWORD_LENGTH = 6;
private static final String USER_OBJECT_NAME_FIELD = "name";
public static ParseSignupFragment newInstance(Bundle configOptions, String username, String password) {
ParseSignupFragment signupFragment = new ParseSignupFragment();
Bundle args = new Bundle(configOptions);
args.putString(ParseSignupFragment.USERNAME, username);
args.putString(ParseSignupFragment.PASSWORD, password);
signupFragment.setArguments(args);
return signupFragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) {
Bundle args = getArguments();
config = ParseLoginConfig.fromBundle(args, getActivity());
minPasswordLength = DEFAULT_MIN_PASSWORD_LENGTH;
if (config.getParseSignupMinPasswordLength() != null) {
minPasswordLength = config.getParseSignupMinPasswordLength();
}
String username = (String) args.getString(USERNAME);
String password = (String) args.getString(PASSWORD);
View v = inflater.inflate(R.layout.com_parse_ui_parse_signup_fragment,
parent, false);
ImageView appLogo = (ImageView) v.findViewById(R.id.app_logo);
usernameField = (EditText) v.findViewById(R.id.signup_username_input);
passwordField = (EditText) v.findViewById(R.id.signup_password_input);
confirmPasswordField = (EditText) v
.findViewById(R.id.signup_confirm_password_input);
emailField = (EditText) v.findViewById(R.id.signup_email_input);
nameField = (EditText) v.findViewById(R.id.signup_name_input);
createAccountButton = (Button) v.findViewById(R.id.create_account);
usernameField.setText(username);
passwordField.setText(password);
if (appLogo != null && config.getAppLogo() != null) {
appLogo.setImageResource(config.getAppLogo());
}
if (config.isParseLoginEmailAsUsername()) {
usernameField.setHint(R.string.com_parse_ui_email_input_hint);
usernameField.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
if (emailField != null) {
emailField.setVisibility(View.GONE);
}
}
if (config.getParseSignupSubmitButtonText() != null) {
createAccountButton.setText(config.getParseSignupSubmitButtonText());
}
createAccountButton.setOnClickListener(this);
return v;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (activity instanceof ParseOnLoginSuccessListener) {
onLoginSuccessListener = (ParseOnLoginSuccessListener) activity;
} else {
throw new IllegalArgumentException(
"Activity must implemement ParseOnLoginSuccessListener");
}
if (activity instanceof ParseOnLoadingListener) {
onLoadingListener = (ParseOnLoadingListener) activity;
} else {
throw new IllegalArgumentException(
"Activity must implemement ParseOnLoadingListener");
}
}
@Override
public void onClick(View v) {
String username = usernameField.getText().toString();
String password = passwordField.getText().toString();
String passwordAgain = confirmPasswordField.getText().toString();
String email = null;
if (config.isParseLoginEmailAsUsername()) {
email = usernameField.getText().toString();
} else if (emailField != null) {
email = emailField.getText().toString();
}
String name = null;
if (nameField != null) {
name = nameField.getText().toString();
}
if (username.length() == 0) {
showToast(R.string.com_parse_ui_no_username_toast);
} else if (password.length() == 0) {
showToast(R.string.com_parse_ui_no_password_toast);
} else if (password.length() < minPasswordLength) {
showToast(getResources().getQuantityString(
R.plurals.com_parse_ui_password_too_short_toast,
minPasswordLength, minPasswordLength));
} else if (passwordAgain.length() == 0) {
showToast(R.string.com_parse_ui_reenter_password_toast);
} else if (!password.equals(passwordAgain)) {
showToast(R.string.com_parse_ui_mismatch_confirm_password_toast);
confirmPasswordField.selectAll();
confirmPasswordField.requestFocus();
} else if (email != null && email.length() == 0) {
showToast(R.string.com_parse_ui_no_email_toast);
} else if (name != null && name.length() == 0) {
showToast(R.string.com_parse_ui_no_name_toast);
} else {
ParseUser user = new ParseUser();
// Set standard fields
user.setUsername(username);
user.setPassword(password);
user.setEmail(email);
// Set additional custom fields only if the user filled it out
if (name.length() != 0) {
user.put(USER_OBJECT_NAME_FIELD, name);
}
loadingStart();
user.signUpInBackground(new SignUpCallback() {
@Override
public void done(ParseException e) {
if (isActivityDestroyed()) {
return;
}
if (e == null) {
loadingFinish();
signupSuccess();
} else {
loadingFinish();
if (e != null) {
debugLog(getString(R.string.com_parse_ui_login_warning_parse_signup_failed) +
e.toString());
switch (e.getCode()) {
case ParseException.INVALID_EMAIL_ADDRESS:
showToast(R.string.com_parse_ui_invalid_email_toast);
break;
case ParseException.USERNAME_TAKEN:
showToast(R.string.com_parse_ui_username_taken_toast);
break;
case ParseException.EMAIL_TAKEN:
showToast(R.string.com_parse_ui_email_taken_toast);
break;
default:
showToast(R.string.com_parse_ui_signup_failed_unknown_toast);
}
}
}
}
});
}
}
@Override
protected String getLogTag() {
return LOG_TAG;
}
private void signupSuccess() {
onLoginSuccessListener.onLoginSuccess();
}
}