private void fetchTokens() {
    log("Requesting tokens via client credentials");

    sso.getAuthorization()
        .clientCredentials(
            new TokenSetResponseHandler() {
              @Override
              public void onSuccess(TokenSet tokenSet) {
                log("Successfully received the token set: ", tokenSet.toString());
                clientCredentialsTokens = tokenSet;

                View view = getView();

                if (view != null) {
                  Button registerButton = (Button) view.findViewById(R.id.register_button);
                  registerButton.setEnabled(true);
                }
              }

              @Override
              public void onFailure(EndpointCallbackException result) {
                log("Failed to fetch the token set: ", result.getMessage());
              }
            });
  }
  private void attemptRegistration() {
    CredentialsClient credentialsClient = sso.getCredentialsClient(clientCredentialsTokens);

    firstNameField = (EditText) getView().findViewById(R.id.first_name);

    CreateAccountParams createAccountParams =
        new CreateAccountParams.Builder()
            .addDefaultScopes()
            .setEmail(emailField.getText().toString())
            .setFirstName(firstNameField.getText().toString())
            .setPassword(passwordField.getText().toString())
            .build();

    credentialsClient.createAccount(
        createAccountParams,
        new EndpointAsyncResponseHandler<CreateAccountResponse>(CreateAccountResponse.class) {
          @Override
          public void onSuccess(CreateAccountResponse response) {
            TokenSet tokenSet = response.getTokenSet(standardConfiguration);
            log(
                "Successfully created a new account and received the token set: ",
                tokenSet.toString());
            fetchMeDetails(tokenSet);
          }

          @Override
          public void onFailure(EndpointCallbackException result) {
            log("Failed to create a new account: ", result.getMessage());
          }
        });
  }
  private void fetchMeDetails(final TokenSet tokenSet) {
    AccountClient accountClient = sso.getAccountClient(tokenSet);

    log("Requesting /me");

    accountClient.getAccount(
        new EndpointAsyncResponseHandler<AccountResponse>(AccountResponse.class) {
          @Override
          public void onSuccess(AccountResponse response) {
            log("Successfully requested /me and got: ", response.toString());
          }

          @Override
          public void onFailure(EndpointCallbackException result) {
            log("Failed to request /me ", result.getMessage());
          }
        });
  }
  private void checkPassword() {
    CredentialsClient credentialsClient = sso.getCredentialsClient(clientCredentialsTokens);

    credentialsClient.checkPassword(
        passwordField.getText().toString(),
        new EndpointAsyncResponseHandler<CheckPasswordResponse>(CheckPasswordResponse.class) {
          @Override
          public void onSuccess(CheckPasswordResponse response) {
            if (response.isAccepted()) {
              log("The password is valid, proceeding...");
              attemptRegistration();
            } else {
              log("The provided password is not valid: ", response.toString());
            }
          }

          @Override
          public void onFailure(EndpointCallbackException result) {
            log("Failed to validate the password: ", result.getMessage());
          }
        });
  }
  private void checkMail() {
    // hide the keyboard first
    InputMethodManager inputManager =
        (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);

    inputManager.hideSoftInputFromWindow(
        getView().getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);

    CredentialsClient credentialsClient = sso.getCredentialsClient(clientCredentialsTokens);

    emailField = (EditText) getView().findViewById(R.id.email);

    CheckMailParams checkMailParams =
        new CheckMailParams.Builder().setEmail(emailField.getText().toString()).build();

    credentialsClient.checkMail(
        checkMailParams,
        new EndpointAsyncResponseHandler<CheckMailResponse>(CheckMailResponse.class) {
          @Override
          public void onSuccess(CheckMailResponse response) {

            if (response.isAvailable()) {
              log("The email address is available, proceeding...");
              checkPassword();
            } else {
              log("The email address is NOT available because: ", response.getError());
            }

            if (response.getSuggestion() != null) {
              log("An email address suggestion: ", response.getSuggestion());
            }
          }

          @Override
          public void onFailure(EndpointCallbackException result) {
            log("Failed to validate the email address: ", result.getMessage());
          }
        });
  }