private void setUpParseLoginAndSignup() {
    parseLogin.setVisibility(View.VISIBLE);

    if (config.isParseLoginEmailAsUsername()) {
      usernameField.setHint(R.string.com_parse_ui_email_input_hint);
      usernameField.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
    }

    if (config.getParseLoginButtonText() != null) {
      parseLoginButton.setText(config.getParseLoginButtonText());
    }

    parseLoginButton.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            String username = usernameField.getText().toString();
            String password = passwordField.getText().toString();

            if (username.length() == 0) {
              if (config.isParseLoginEmailAsUsername()) {
                showToast(R.string.com_parse_ui_no_email_toast);
              } else {
                showToast(R.string.com_parse_ui_no_username_toast);
              }
            } else if (password.length() == 0) {
              showToast(R.string.com_parse_ui_no_password_toast);
            } else {
              loadingStart(true);
              ParseUser.logInInBackground(
                  username,
                  password,
                  new LogInCallback() {
                    @Override
                    public void done(ParseUser user, ParseException e) {
                      if (isActivityDestroyed()) {
                        return;
                      }

                      if (user != null) {
                        loadingFinish();
                        loginSuccess();
                      } else {
                        loadingFinish();
                        if (e != null) {
                          debugLog(
                              getString(R.string.com_parse_ui_login_warning_parse_login_failed)
                                  + e.toString());
                          if (e.getCode() == ParseException.OBJECT_NOT_FOUND) {
                            if (config.getParseLoginInvalidCredentialsToastText() != null) {
                              showToast(config.getParseLoginInvalidCredentialsToastText());
                            } else {
                              showToast(
                                  R.string.com_parse_ui_parse_login_invalid_credentials_toast);
                            }
                            passwordField.selectAll();
                            passwordField.requestFocus();
                          } else {
                            showToast(R.string.com_parse_ui_parse_login_failed_unknown_toast);
                          }
                        }
                      }
                    }
                  });
            }
          }
        });

    if (config.getParseSignupButtonText() != null) {
      parseSignupButton.setText(config.getParseSignupButtonText());
    }

    parseSignupButton.setOnClickListener(
        new OnClickListener() {
          @Override
          public void onClick(View v) {
            String username = usernameField.getText().toString();
            String password = passwordField.getText().toString();

            loginFragmentListener.onSignUpClicked(username, password);
          }
        });

    if (config.getParseLoginHelpText() != null) {
      parseLoginHelpButton.setText(config.getParseLoginHelpText());
    }

    parseLoginHelpButton.setOnClickListener(
        new OnClickListener() {
          @Override
          public void onClick(View v) {
            loginFragmentListener.onLoginHelpClicked();
          }
        });
  }