package org.wordpress.android.ui.accounts;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.Html;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Patterns;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.analytics.AnalyticsTracker;
import org.wordpress.android.fluxc.Dispatcher;
import org.wordpress.android.fluxc.action.AccountAction;
import org.wordpress.android.fluxc.generated.AccountActionBuilder;
import org.wordpress.android.fluxc.generated.AuthenticationActionBuilder;
import org.wordpress.android.fluxc.generated.SiteActionBuilder;
import org.wordpress.android.fluxc.network.rest.wpcom.site.DomainSuggestionResponse;
import org.wordpress.android.fluxc.store.AccountStore;
import org.wordpress.android.fluxc.store.AccountStore.AuthenticatePayload;
import org.wordpress.android.fluxc.store.AccountStore.NewAccountPayload;
import org.wordpress.android.fluxc.store.AccountStore.NewUserErrorType;
import org.wordpress.android.fluxc.store.AccountStore.OnAccountChanged;
import org.wordpress.android.fluxc.store.AccountStore.OnAuthenticationChanged;
import org.wordpress.android.fluxc.store.AccountStore.OnNewUserCreated;
import org.wordpress.android.fluxc.store.SiteStore;
import org.wordpress.android.fluxc.store.SiteStore.NewSiteErrorType;
import org.wordpress.android.fluxc.store.SiteStore.NewSitePayload;
import org.wordpress.android.fluxc.store.SiteStore.OnNewSiteCreated;
import org.wordpress.android.fluxc.store.SiteStore.OnSiteChanged;
import org.wordpress.android.fluxc.store.SiteStore.OnSuggestedDomains;
import org.wordpress.android.fluxc.store.SiteStore.SiteVisibility;
import org.wordpress.android.fluxc.store.SiteStore.SuggestDomainsPayload;
import org.wordpress.android.ui.ActivityLauncher;
import org.wordpress.android.ui.notifications.services.NotificationsUpdateService;
import org.wordpress.android.ui.reader.services.ReaderUpdateService;
import org.wordpress.android.ui.reader.services.ReaderUpdateService.UpdateTask;
import org.wordpress.android.util.AlertUtils;
import org.wordpress.android.util.AnalyticsUtils;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
import org.wordpress.android.util.EditTextUtils;
import org.wordpress.android.util.HelpshiftHelper;
import org.wordpress.android.util.LanguageUtils;
import org.wordpress.android.util.ToastUtils;
import org.wordpress.android.util.ToastUtils.Duration;
import org.wordpress.android.util.UserEmailUtils;
import org.wordpress.android.widgets.WPTextView;
import org.wordpress.emailchecker2.EmailChecker;
import org.wordpress.persistentedittext.PersistentEditTextHelper;
import java.util.EnumSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.inject.Inject;
public class NewUserFragment extends AbstractFragment {
public static final int NEW_USER = 1;
private AutoCompleteTextView mSiteUrlTextField;
private ArrayAdapter<String> mSiteUrlSuggestionAdapter;
private static final String KEY_SITES_FETCHED = "KEY_SITES_FETCHED";
private static final String KEY_ACCOUNT_SETTINGS_FETCHED = "KEY_ACCOUNT_SETTINGS_FETCHED";
private static final String KEY_ACCOUNT_FETCHED = "KEY_ACCOUNT_FETCHED";
private EditText mEmailTextField;
private EditText mPasswordTextField;
private EditText mUsernameTextField;
private WPTextView mSignupButton;
private WPTextView mProgressTextSignIn;
private RelativeLayout mProgressBarSignIn;
private boolean mEmailAutoCorrected;
private boolean mAutoCompleteUrl;
protected boolean mSitesFetched = false;
protected boolean mAccountSettingsFetched = false;
protected boolean mAccountFetched = false;
protected @Inject SiteStore mSiteStore;
protected @Inject AccountStore mAccountStore;
protected @Inject Dispatcher mDispatcher;
public static NewUserFragment newInstance() {
return new NewUserFragment();
}
private boolean fieldsFilled() {
return EditTextUtils.getText(mEmailTextField).trim().length() > 0
&& EditTextUtils.getText(mPasswordTextField).trim().length() > 0
&& EditTextUtils.getText(mUsernameTextField).trim().length() > 0
&& EditTextUtils.getText(mSiteUrlTextField).trim().length() > 0;
}
protected void startProgress(String message) {
mProgressBarSignIn.setVisibility(View.VISIBLE);
mProgressTextSignIn.setVisibility(View.VISIBLE);
mSignupButton.setVisibility(View.GONE);
mProgressBarSignIn.setEnabled(false);
mProgressTextSignIn.setText(message);
mEmailTextField.setEnabled(false);
mPasswordTextField.setEnabled(false);
mUsernameTextField.setEnabled(false);
mSiteUrlTextField.setEnabled(false);
}
protected void updateProgress(String message) {
mProgressTextSignIn.setText(message);
}
protected void endProgress() {
mProgressBarSignIn.setVisibility(View.GONE);
mProgressTextSignIn.setVisibility(View.GONE);
mSignupButton.setVisibility(View.VISIBLE);
mEmailTextField.setEnabled(true);
mPasswordTextField.setEnabled(true);
mUsernameTextField.setEnabled(true);
mSiteUrlTextField.setEnabled(true);
}
protected void clearErrors() {
mEmailTextField.setError(null);
mUsernameTextField.setError(null);
mPasswordTextField.setError(null);
mSiteUrlTextField.setError(null);
}
protected boolean isUserDataValid() {
// try to create the user
final String email = EditTextUtils.getText(mEmailTextField).trim();
final String password = EditTextUtils.getText(mPasswordTextField).trim();
final String username = EditTextUtils.getText(mUsernameTextField).trim();
final String siteUrl = EditTextUtils.getText(mSiteUrlTextField).trim();
boolean retValue = true;
if (email.equals("")) {
showEmailError(getString(R.string.required_field));
retValue = false;
}
final Pattern emailRegExPattern = Patterns.EMAIL_ADDRESS;
Matcher matcher = emailRegExPattern.matcher(email);
if (!matcher.find() || email.length() > 100) {
showEmailError(getString(R.string.invalid_email_message));
retValue = false;
}
if (username.equals("")) {
showUsernameError(getString(R.string.required_field));
retValue = false;
}
if (username.length() < 4) {
showUsernameError(getString(R.string.invalid_username_too_short));
retValue = false;
}
if (username.length() > 60) {
showUsernameError(getString(R.string.invalid_username_too_long));
retValue = false;
}
if (username.contains(" ")) {
showUsernameError(getString(R.string.invalid_username_no_spaces));
retValue = false;
}
if (siteUrl.contains(" ")) {
showSiteUrlError(getString(R.string.blog_name_no_spaced_allowed));
retValue = false;
}
if (siteUrl.length() < 4) {
showSiteUrlError(getString(R.string.blog_name_must_be_at_least_four_characters));
retValue = false;
}
if (password.equals("")) {
showPasswordError(getString(R.string.required_field));
retValue = false;
}
if (password.length() < 4) {
showPasswordError(getString(R.string.invalid_password_message));
retValue = false;
}
return retValue;
}
protected void onDoneAction() {
validateAndCreateUserAndBlog();
}
private final OnClickListener mSignupClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
validateAndCreateUserAndBlog();
}
};
private final TextView.OnEditorActionListener mEditorAction = new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
return onDoneEvent(actionId, event);
}
};
private String siteUrlToSiteName(String siteUrl) {
return siteUrl;
}
private void showPasswordError(String message) {
mPasswordTextField.setError(message);
mPasswordTextField.requestFocus();
}
private void showEmailError(String message) {
mEmailTextField.setError(message);
mEmailTextField.requestFocus();
}
private void showUsernameError(String message) {
mUsernameTextField.setError(message);
mUsernameTextField.requestFocus();
}
private void showSiteUrlError(String message) {
mSiteUrlTextField.setError(message);
mSiteUrlTextField.requestFocus();
}
private void showSiteError(NewSiteErrorType newUserError, String message) {
if (!isAdded()) {
return;
}
switch (newUserError) {
case SITE_NAME_REQUIRED:
showSiteUrlError(getString(R.string.blog_name_required));
break;
case SITE_NAME_NOT_ALLOWED:
showSiteUrlError(getString(R.string.blog_name_not_allowed));
break;
case SITE_NAME_MUST_BE_AT_LEAST_FOUR_CHARACTERS:
showSiteUrlError(getString(R.string.blog_name_must_be_at_least_four_characters));
break;
case SITE_NAME_MUST_BE_LESS_THAN_SIXTY_FOUR_CHARACTERS:
showSiteUrlError(getString(R.string.blog_name_must_be_less_than_sixty_four_characters));
break;
case SITE_NAME_CONTAINS_INVALID_CHARACTERS:
showSiteUrlError(getString(R.string.blog_name_contains_invalid_characters));
break;
case SITE_NAME_CANT_BE_USED:
showSiteUrlError(getString(R.string.blog_name_cant_be_used));
break;
case SITE_NAME_ONLY_LOWERCASE_LETTERS_AND_NUMBERS:
showSiteUrlError(getString(R.string.blog_name_only_lowercase_letters_and_numbers));
break;
case SITE_NAME_MUST_INCLUDE_LETTERS:
showSiteUrlError(getString(R.string.blog_name_must_include_letters));
break;
case SITE_NAME_EXISTS:
showSiteUrlError(getString(R.string.blog_name_exists));
break;
case SITE_NAME_RESERVED:
showSiteUrlError(getString(R.string.blog_name_reserved));
break;
case SITE_NAME_RESERVED_BUT_MAY_BE_AVAILABLE:
showSiteUrlError(getString(R.string.blog_name_reserved_but_may_be_available));
break;
case SITE_NAME_INVALID:
showSiteUrlError(getString(R.string.blog_name_invalid));
break;
case SITE_TITLE_INVALID:
showSiteUrlError(getString(R.string.blog_title_invalid));
break;
default:
case GENERIC_ERROR:
// Show other errors on the URL field
showSiteUrlError(message);
break;
}
}
private void showUserError(NewUserErrorType newUserError, String message) {
if (!isAdded()) {
return;
}
switch (newUserError) {
case USERNAME_ONLY_LOWERCASE_LETTERS_AND_NUMBERS:
showUsernameError(getString(R.string.username_only_lowercase_letters_and_numbers));
break;
case USERNAME_REQUIRED:
showUsernameError(getString(R.string.username_required));
break;
case USERNAME_NOT_ALLOWED:
showUsernameError(getString(R.string.username_not_allowed));
break;
case USERNAME_MUST_BE_AT_LEAST_FOUR_CHARACTERS:
showUsernameError(getString(R.string.username_must_be_at_least_four_characters));
break;
case USERNAME_CONTAINS_INVALID_CHARACTERS:
showUsernameError(getString(R.string.username_contains_invalid_characters));
break;
case USERNAME_MUST_INCLUDE_LETTERS:
showUsernameError(getString(R.string.username_must_include_letters));
break;
case USERNAME_RESERVED_BUT_MAY_BE_AVAILABLE:
showUsernameError(getString(R.string.username_reserved_but_may_be_available));
break;
case USERNAME_INVALID:
showUsernameError(getString(R.string.username_invalid));
break;
case USERNAME_EXISTS:
showUsernameError(getString(R.string.username_exists));
AnalyticsTracker.track(AnalyticsTracker.Stat.CREATE_ACCOUNT_USERNAME_EXISTS);
break;
case PASSWORD_INVALID:
showPasswordError(getString(R.string.password_invalid));
break;
case EMAIL_CANT_BE_USED_TO_SIGNUP:
showEmailError(getString(R.string.email_cant_be_used_to_signup));
break;
case EMAIL_INVALID:
showEmailError(getString(R.string.email_invalid));
break;
case EMAIL_NOT_ALLOWED:
showEmailError(getString(R.string.email_not_allowed));
break;
case EMAIL_RESERVED:
showEmailError(getString(R.string.email_reserved));
break;
case EMAIL_EXISTS:
showEmailError(getString(R.string.email_exists));
AnalyticsTracker.track(AnalyticsTracker.Stat.CREATE_ACCOUNT_EMAIL_EXISTS);
break;
default:
case GENERIC_ERROR:
// Show other errors on the first field (email)
showEmailError(message);
break;
}
}
private void validateAndCreateUserAndBlog() {
if (mSystemService.getActiveNetworkInfo() == null) {
AlertUtils.showAlert(getActivity(), R.string.no_network_title, R.string.no_network_message);
return;
}
if (!isUserDataValid()) {
return;
}
// Prevent double tapping of the "done" btn in keyboard for those clients that don't dismiss the keyboard.
// Samsung S4 for example
if (View.VISIBLE == mProgressBarSignIn.getVisibility()) {
return;
}
startProgress(getString(R.string.validating_user_data));
clearErrors();
mSitesFetched = false;
mAccountSettingsFetched = false;
mAccountFetched = false;
String username = getUsername();
String email = getEmail();
NewAccountPayload newAccountPayload = new NewAccountPayload(username, getPassword(), getEmail(), true);
mDispatcher.dispatch(AccountActionBuilder.newCreateNewAccountAction(newAccountPayload));
updateProgress(getString(R.string.validating_site_data));
AppLog.i(T.NUX, "User starts account creation, username: " + username + ", email: " + email
+ ", site title: " + getSiteTitle() + ", site URL: " + getSiteUrl());
}
private String getSiteUrl() {
return EditTextUtils.getText(mSiteUrlTextField).trim();
}
private String getSiteTitle() {
return siteUrlToSiteName(getSiteUrl());
}
private String getUsername() {
return EditTextUtils.getText(mUsernameTextField).trim();
}
private String getPassword() {
return EditTextUtils.getText(mPasswordTextField).trim();
}
private String getEmail() {
return EditTextUtils.getText(mEmailTextField).trim();
}
private void finishCurrentActivity() {
if (!isAdded()) {
return;
}
getActivity().setResult(Activity.RESULT_OK);
getActivity().finish();
PersistentEditTextHelper persistentEditTextHelper = new PersistentEditTextHelper(getActivity());
persistentEditTextHelper.clearSavedText(mEmailTextField, null);
persistentEditTextHelper.clearSavedText(mUsernameTextField, null);
persistentEditTextHelper.clearSavedText(mSiteUrlTextField, null);
}
/**
* In case an error happened after the user creation steps, we don't want to show the sign up screen.
* Show the log in screen with username and password prefilled, plus a toast message to explain what happened.
*
* Note: this should be called only if the user has been created.
*/
private void finishAndShowSignInScreen() {
if (!isAdded()) {
return;
}
endProgress();
Intent intent = new Intent();
intent.putExtra("username", getUsername());
intent.putExtra("password", getPassword());
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intent);
try {
getFragmentManager().popBackStack();
} catch (IllegalStateException e) {
// Catch the ISE exception, because we can't check for the fragment state here
// finishAndShowSignInScreen will be called in an Network onError callback so we can't guarantee, the
// fragment transaction will be executed. In that case the user already is back on the Log In screen.
AppLog.e(T.NUX, e);
}
ToastUtils.showToast(getActivity(), R.string.signup_succeed_signin_failed, Duration.LONG);
}
private void autocorrectEmail() {
if (mEmailAutoCorrected) {
return;
}
final String email = EditTextUtils.getText(mEmailTextField).trim();
String suggest = EmailChecker.suggestDomainCorrection(email);
if (suggest.compareTo(email) != 0) {
mEmailAutoCorrected = true;
mEmailTextField.setText(suggest);
mEmailTextField.setSelection(suggest.length());
}
}
private void initInfoButton(View rootView) {
ImageView infoButton = (ImageView) rootView.findViewById(R.id.info_button);
infoButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent newAccountIntent = new Intent(getActivity(), HelpActivity.class);
newAccountIntent.putExtra(HelpshiftHelper.ORIGIN_KEY, HelpshiftHelper.Tag.ORIGIN_SIGNUP_SCREEN);
startActivity(newAccountIntent);
}
});
}
@Override
public void onDestroy() {
mDispatcher.unregister(this);
super.onDestroy();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((WordPress) getActivity().getApplication()).component().inject(this);
mDispatcher.register(this);
if (savedInstanceState != null) {
mSitesFetched = savedInstanceState.getBoolean(KEY_SITES_FETCHED, false);
mAccountFetched = savedInstanceState.getBoolean(KEY_ACCOUNT_FETCHED, false);
mAccountSettingsFetched = savedInstanceState.getBoolean(KEY_ACCOUNT_SETTINGS_FETCHED, false);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout containing a title and body text.
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.new_account_user_fragment_screen, container, false);
WPTextView termsOfServiceTextView = (WPTextView) rootView.findViewById(R.id.l_agree_terms_of_service);
termsOfServiceTextView.setText(Html.fromHtml(String.format(getString(R.string.agree_terms_of_service), "<u>",
"</u>")));
termsOfServiceTextView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ActivityLauncher.openUrlExternal(getContext(),
getString(R.string.wordpresscom_tos_url));
}
}
);
mSignupButton = (WPTextView) rootView.findViewById(R.id.signup_button);
mSignupButton.setOnClickListener(mSignupClickListener);
mSignupButton.setEnabled(false);
mProgressTextSignIn = (WPTextView) rootView.findViewById(R.id.nux_sign_in_progress_text);
mProgressBarSignIn = (RelativeLayout) rootView.findViewById(R.id.nux_sign_in_progress_bar);
mEmailTextField = (EditText) rootView.findViewById(R.id.email_address);
mEmailTextField.setText(UserEmailUtils.getPrimaryEmail(getActivity()));
mEmailTextField.setSelection(EditTextUtils.getText(mEmailTextField).length());
mPasswordTextField = (EditText) rootView.findViewById(R.id.password);
mUsernameTextField = (EditText) rootView.findViewById(R.id.username);
mSiteUrlTextField = (AutoCompleteTextView) rootView.findViewById(R.id.site_url);
mSiteUrlSuggestionAdapter = new ArrayAdapter<>(getActivity(), R.layout.domain_suggestion_dropdown);
mSiteUrlTextField.setAdapter(mSiteUrlSuggestionAdapter);
mEmailTextField.addTextChangedListener(mCheckFieldsFilledWatcher);
mPasswordTextField.addTextChangedListener(mCheckFieldsFilledWatcher);
mSiteUrlTextField.setOnEditorActionListener(mEditorAction);
mUsernameTextField.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
checkIfFieldsFilled();
}
@Override
public void afterTextChanged(Editable editable) {
mSiteUrlSuggestionAdapter.clear();
mSiteUrlSuggestionAdapter.notifyDataSetChanged();
}
});
mSiteUrlTextField.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
checkIfFieldsFilled();
}
@Override
public void afterTextChanged(Editable editable) {
lowerCaseEditable(editable);
}
});
mUsernameTextField.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus && isAdded()) {
getDomainSuggestionsFromTitle();
}
}
});
mSiteUrlTextField.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus && isAdded()) {
mSiteUrlTextField.showDropDown();
}
}
});
mEmailTextField.setOnFocusChangeListener(new View.OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus && isAdded()) {
autocorrectEmail();
}
}
});
initPasswordVisibilityButton(rootView, mPasswordTextField);
initInfoButton(rootView);
return rootView;
}
private final TextWatcher mCheckFieldsFilledWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
checkIfFieldsFilled();
}
@Override
public void afterTextChanged(Editable s) {
}
};
private void checkIfFieldsFilled() {
if (fieldsFilled()) {
mSignupButton.setEnabled(true);
} else {
mSignupButton.setEnabled(false);
}
}
private SmartLockHelper getSmartLockHelper() {
if (getActivity() != null && getActivity() instanceof SignInActivity) {
return ((SignInActivity) getActivity()).getSmartLockHelper();
}
return null;
}
private void fetchSiteAndAccount() {
// User has been created. From this point, all errors should close this screen and display the
// sign in screen
AnalyticsUtils.refreshMetadataNewUser(getUsername(), getEmail());
AnalyticsTracker.track(AnalyticsTracker.Stat.CREATED_ACCOUNT);
// Save credentials to smart lock
SmartLockHelper smartLockHelper = getSmartLockHelper();
if (smartLockHelper != null) {
smartLockHelper.saveCredentialsInSmartLock(getUsername(), getPassword(), getUsername(), null);
}
// Fetch user infos
mDispatcher.dispatch(AccountActionBuilder.newFetchAccountAction());
mDispatcher.dispatch(AccountActionBuilder.newFetchSettingsAction());
// Fetch sites
mDispatcher.dispatch(SiteActionBuilder.newFetchSitesAction());
}
private void getDomainSuggestionsFromTitle() {
String username = EditTextUtils.getText(mUsernameTextField);
if (!TextUtils.isEmpty(username)) {
SuggestDomainsPayload payload = new SuggestDomainsPayload(username, true, false, 5);
mDispatcher.dispatch(SiteActionBuilder.newSuggestDomainsAction(payload));
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// Save fetch state
outState.putBoolean(KEY_SITES_FETCHED, mSitesFetched);
outState.putBoolean(KEY_ACCOUNT_FETCHED, mAccountFetched);
outState.putBoolean(KEY_ACCOUNT_SETTINGS_FETCHED, mAccountSettingsFetched);
}
// OnChanged events
@SuppressWarnings("unused")
@Subscribe(threadMode = ThreadMode.MAIN)
public void onAuthenticationChanged(OnAuthenticationChanged event) {
if (event.isError()) {
endProgress();
finishAndShowSignInScreen();
return;
}
if (mAccountStore.hasAccessToken()) {
// Account created and user authenticated, now create the site
updateProgress(getString(R.string.creating_your_site));
String deviceLanguage = LanguageUtils.getPatchedCurrentDeviceLanguage(getActivity());
NewSitePayload newSitePayload = new NewSitePayload(getSiteUrl(), getSiteUrl(), deviceLanguage,
SiteVisibility.PUBLIC, false);
mDispatcher.dispatch(SiteActionBuilder.newCreateNewSiteAction(newSitePayload));
// Get reader tags so they're available as soon as the Reader is accessed - done for
// both wp.com and self-hosted (self-hosted = "logged out" reader) - note that this
// uses the application context since the activity is finished immediately below
ReaderUpdateService.startService(getActivity().getApplicationContext(),
EnumSet.of(UpdateTask.TAGS));
// Start the notification service
NotificationsUpdateService.startService(getActivity().getApplicationContext());
}
}
@SuppressWarnings("unused")
@Subscribe(threadMode = ThreadMode.MAIN)
public void onNewUserCreated(OnNewUserCreated event) {
if (event.isError()) {
endProgress();
AnalyticsTracker.track(AnalyticsTracker.Stat.CREATE_ACCOUNT_FAILED);
showUserError(event.error.type, event.error.message);
return;
}
if (event.dryRun) {
// User Validated, now try to validate site creation
String deviceLanguage = LanguageUtils.getPatchedCurrentDeviceLanguage(getActivity());
NewSitePayload newSitePayload = new NewSitePayload(getSiteUrl(), getSiteUrl(), deviceLanguage,
SiteVisibility.PUBLIC, true);
mDispatcher.dispatch(SiteActionBuilder.newCreateNewSiteAction(newSitePayload));
updateProgress(getString(R.string.validating_site_data));
return;
}
// User created, now authenticate the newly created user
AuthenticatePayload payload = new AuthenticatePayload(getUsername(), getPassword());
mDispatcher.dispatch(AuthenticationActionBuilder.newAuthenticateAction(payload));
}
@SuppressWarnings("unused")
@Subscribe(threadMode = ThreadMode.MAIN)
public void onNewSiteCreated(OnNewSiteCreated event) {
if (event.isError()) {
endProgress();
AnalyticsTracker.track(AnalyticsTracker.Stat.CREATE_ACCOUNT_FAILED);
showSiteError(event.error.type, event.error.message);
return;
}
if (event.dryRun) {
// User and Site validated, dispatch the same actions with dryRun disabled
updateProgress(getString(R.string.creating_your_account));
NewAccountPayload newAccountPayload = new NewAccountPayload(getUsername(), getPassword(), getEmail(),
false);
mDispatcher.dispatch(AccountActionBuilder.newCreateNewAccountAction(newAccountPayload));
return;
}
AnalyticsTracker.track(AnalyticsTracker.Stat.CREATED_SITE);
// Site created, time to wrap up
fetchSiteAndAccount();
}
@SuppressWarnings("unused")
@Subscribe(threadMode = ThreadMode.MAIN)
public void onAccountChanged(OnAccountChanged event) {
mAccountSettingsFetched |= event.causeOfChange == AccountAction.FETCH_SETTINGS;
mAccountFetched |= event.causeOfChange == AccountAction.FETCH_ACCOUNT;
// Finish activity if sites have been fetched
if (mSitesFetched && mAccountSettingsFetched && mAccountFetched) {
finishCurrentActivity();
}
}
@SuppressWarnings("unused")
@Subscribe(threadMode = ThreadMode.MAIN)
public void onSiteChanged(OnSiteChanged event) {
mSitesFetched = true;
// Finish activity if account settings have been fetched
if (mAccountSettingsFetched && mAccountFetched) {
finishCurrentActivity();
}
}
@SuppressWarnings("unused")
@Subscribe(threadMode = ThreadMode.MAIN)
public void onSuggestedDomains(OnSuggestedDomains event) {
if (!isAdded() || event.isError()) {
return;
}
mSiteUrlSuggestionAdapter.clear();
for (DomainSuggestionResponse suggestion : event.suggestions) {
// Only add free suggestions ending by .wordpress.com
if (suggestion.is_free && !TextUtils.isEmpty(suggestion.domain_name)
&& suggestion.domain_name.endsWith(".wordpress.com")) {
mSiteUrlSuggestionAdapter.add(suggestion.domain_name.replace(".wordpress.com", ""));
}
}
if (!mSiteUrlSuggestionAdapter.isEmpty() && mSiteUrlTextField.hasFocus()) {
mSiteUrlTextField.showDropDown();
}
}
}