blob: 24442912927d6d1f6e86700ed073b1852722fadf [file] [log] [blame]
package org.wordpress.android.ui.accounts;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.analytics.AnalyticsTracker;
import org.wordpress.android.models.AccountHelper;
import org.wordpress.android.ui.accounts.helpers.CreateUserAndBlog;
import org.wordpress.android.ui.plans.PlansConstants;
import org.wordpress.android.util.AlertUtils;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
import org.wordpress.android.util.EditTextUtils;
import org.wordpress.android.util.ToastUtils;
import org.wordpress.android.widgets.WPTextView;
public class NewBlogFragment extends AbstractFragment implements TextWatcher {
private EditText mSiteUrlTextField;
private EditText mSiteTitleTextField;
private WPTextView mSignupButton;
private WPTextView mProgressTextSignIn;
private WPTextView mCancelButton;
private RelativeLayout mProgressBarSignIn;
private boolean mSignoutOnCancelMode;
private boolean mAutoCompleteUrl;
public NewBlogFragment() {
}
@Override
public void afterTextChanged(Editable s) {
}
@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();
}
public void setSignoutOnCancelMode(boolean mode) {
mSignoutOnCancelMode = mode;
mCancelButton.setVisibility(View.VISIBLE);
}
public boolean isSignoutOnCancelMode() {
return mSignoutOnCancelMode;
}
public void onBackPressed() {
signoutAndFinish();
}
protected void onDoneAction() {
validateAndCreateUserAndBlog();
}
private void signoutAndFinish() {
if (mSignoutOnCancelMode) {
WordPress.WordPressComSignOut(getActivity());
getActivity().setResult(Activity.RESULT_CANCELED);
getActivity().finish();
}
}
private boolean fieldsFilled() {
return EditTextUtils.getText(mSiteUrlTextField).trim().length() > 0
&& EditTextUtils.getText(mSiteTitleTextField).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);
mSiteTitleTextField.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);
mSiteTitleTextField.setEnabled(true);
mSiteUrlTextField.setEnabled(true);
}
private void showSiteUrlError(int messageId) {
mSiteUrlTextField.setError(getString(messageId));
mSiteUrlTextField.requestFocus();
}
private void showSiteTitleError(int messageId) {
mSiteTitleTextField.setError(getString(messageId));
mSiteTitleTextField.requestFocus();
}
protected boolean specificShowError(int messageId) {
switch (getErrorType(messageId)) {
case TITLE:
showSiteTitleError(messageId);
return true;
case SITE_URL:
showSiteUrlError(messageId);
return true;
}
return false;
}
protected boolean isUserDataValid() {
final String siteTitle = EditTextUtils.getText(mSiteTitleTextField).trim();
final String siteUrl = EditTextUtils.getText(mSiteUrlTextField).trim();
boolean retValue = true;
if (siteTitle.equals("")) {
mSiteTitleTextField.setError(getString(R.string.required_field));
mSiteTitleTextField.requestFocus();
retValue = false;
}
if (siteUrl.equals("")) {
mSiteUrlTextField.setError(getString(R.string.required_field));
mSiteUrlTextField.requestFocus();
retValue = false;
}
return retValue;
}
private String titleToUrl(String siteUrl) {
return siteUrl.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();
}
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_site_data));
final String siteUrl = EditTextUtils.getText(mSiteUrlTextField).trim();
final String siteName = EditTextUtils.getText(mSiteTitleTextField).trim();
final String language = CreateUserAndBlog.getDeviceLanguage(getActivity());
CreateUserAndBlog createUserAndBlog = new CreateUserAndBlog("", "", "", siteUrl, siteName, language,
getRestClientUtils(), new ErrorListener(), new CreateUserAndBlog.Callback() {
@Override
public void onStepFinished(CreateUserAndBlog.Step step) {
if (getActivity() != null) {
updateProgress(getString(R.string.create_new_blog_wpcom));
}
}
@Override
public void onSuccess(JSONObject createSiteResponse) {
if (getActivity() == null) {
return;
}
endProgress();
try {
JSONObject details = createSiteResponse.getJSONObject("blog_details");
String blogName = details.getString("blogname");
String xmlRpcUrl = details.getString("xmlrpc");
String homeUrl = details.getString("url");
String blogId = details.getString("blogid");
String username = AccountHelper.getDefaultAccount().getUserName();
BlogUtils.addOrUpdateBlog(blogName, xmlRpcUrl, homeUrl, blogId, username, null, null, null,
true, true, PlansConstants.DEFAULT_PLAN_ID_FOR_NEW_BLOG, null, null);
AnalyticsTracker.track(AnalyticsTracker.Stat.CREATED_SITE);
ToastUtils.showToast(getActivity(), R.string.new_blog_wpcom_created);
} catch (JSONException e) {
AppLog.e(T.NUX, "Invalid JSON response from site/new", e);
}
getActivity().setResult(Activity.RESULT_OK);
getActivity().finish();
}
@Override
public void onError(int messageId) {
if (getActivity() == null) {
return;
}
endProgress();
showError(getString(messageId));
}
});
AppLog.i(T.NUX, "User tries to create a new site, name: " + siteName + ", URL: " + siteUrl);
createUserAndBlog.startCreateBlogProcess();
}
@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.create_blog_fragment, container, false);
mSignupButton = (WPTextView) rootView.findViewById(R.id.signup_button);
mSignupButton.setOnClickListener(mSignupClickListener);
mSignupButton.setEnabled(false);
mCancelButton = (WPTextView) rootView.findViewById(R.id.cancel_button);
mCancelButton.setOnClickListener(mCancelClickListener);
mProgressTextSignIn = (WPTextView) rootView.findViewById(R.id.nux_sign_in_progress_text);
mProgressBarSignIn = (RelativeLayout) rootView.findViewById(R.id.nux_sign_in_progress_bar);
mSiteUrlTextField = (EditText) rootView.findViewById(R.id.site_url);
mSiteUrlTextField.setOnKeyListener(mSiteUrlKeyListener);
mSiteUrlTextField.setOnEditorActionListener(mEditorAction);
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 s) {
BlogUtils.convertToLowercase(s);
}
});
mSiteTitleTextField = (EditText) rootView.findViewById(R.id.site_title);
mSiteTitleTextField.addTextChangedListener(this);
mSiteTitleTextField.addTextChangedListener(mSiteTitleWatcher);
mSiteTitleTextField.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
mAutoCompleteUrl = EditTextUtils.getText(mSiteTitleTextField)
.equals(EditTextUtils.getText(mSiteUrlTextField))
|| EditTextUtils.isEmpty(mSiteUrlTextField);
}
}
});
return rootView;
}
private void checkIfFieldsFilled() {
if (fieldsFilled()) {
mSignupButton.setEnabled(true);
} else {
mSignupButton.setEnabled(false);
}
}
private final OnClickListener mSignupClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
validateAndCreateUserAndBlog();
}
};
private final OnClickListener mCancelClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
signoutAndFinish();
}
};
private final TextWatcher mSiteTitleWatcher = 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) {
// auto fill blog address from title if user hasn't modified url
if (mAutoCompleteUrl) {
mSiteUrlTextField.setText(titleToUrl(EditTextUtils.getText(mSiteTitleTextField)));
}
}
@Override
public void afterTextChanged(Editable s) {
}
};
private final OnKeyListener mSiteUrlKeyListener = new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
mAutoCompleteUrl = EditTextUtils.isEmpty(mSiteUrlTextField);
return false;
}
};
private final TextView.OnEditorActionListener mEditorAction = new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
return onDoneEvent(actionId, event);
}
};
}