blob: f2c6d2de3550f8fa10195fca0964601869952cc6 [file] [log] [blame]
package org.wordpress.android.ui.accounts.helpers;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import com.android.volley.VolleyError;
import com.wordpress.rest.RestRequest;
import org.json.JSONException;
import org.json.JSONObject;
import org.wordpress.android.BuildConfig;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.util.LanguageUtils;
import org.wordpress.android.networking.RestClientUtils;
import org.wordpress.android.ui.accounts.AbstractFragment.ErrorListener;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
import org.xmlpull.v1.XmlPullParser;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
public class CreateUserAndBlog {
public static final int WORDPRESS_COM_API_BLOG_VISIBILITY_PUBLIC = 1;
private String mEmail;
private String mUsername;
private String mPassword;
private String mSiteUrl;
private String mSiteName;
private String mLanguage;
private Callback mCallback;
private ErrorListener mErrorListener;
private RestClientUtils mRestClient;
private ResponseHandler mResponseHandler;
public CreateUserAndBlog(String email, String username, String password, String siteUrl, String siteName,
String language, RestClientUtils restClient,
ErrorListener errorListener, Callback callback) {
mEmail = email;
mUsername = username;
mPassword = password;
mSiteUrl = siteUrl;
mSiteName = siteName;
mLanguage = language;
mCallback = callback;
mErrorListener = errorListener;
mRestClient = restClient;
mResponseHandler = new ResponseHandler();
}
public static String getDeviceLanguage(Context context) {
Resources resources = context.getResources();
XmlResourceParser parser = resources.getXml(R.xml.wpcom_languages);
Hashtable<String, String> entries = new Hashtable<String, String>();
String matchedDeviceLanguage = "en - English";
try {
int eventType = parser.getEventType();
String deviceLanguageCode = LanguageUtils.getPatchedCurrentDeviceLanguage(context);
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
String name = parser.getName();
if (name.equals("language")) {
String currentID = null;
boolean currentLangIsDeviceLanguage = false;
int i = 0;
while (i < parser.getAttributeCount()) {
if (parser.getAttributeName(i).equals("id")) {
currentID = parser.getAttributeValue(i);
}
if (parser.getAttributeName(i).equals("code") &&
parser.getAttributeValue(i).equalsIgnoreCase(deviceLanguageCode)) {
currentLangIsDeviceLanguage = true;
}
i++;
}
while (eventType != XmlPullParser.END_TAG) {
if (eventType == XmlPullParser.TEXT) {
entries.put(parser.getText(), currentID);
if (currentLangIsDeviceLanguage) {
matchedDeviceLanguage = parser.getText();
}
}
eventType = parser.next();
}
}
}
eventType = parser.next();
}
} catch (Exception e) {
// do nothing
}
return matchedDeviceLanguage;
}
public void startCreateUserAndBlogProcess() {
validateUser();
}
public void startCreateBlogProcess() {
mResponseHandler.setMode(Mode.CREATE_BLOG_ONLY);
validateSite();
}
private void validateUser() {
String path = "users/new";
Map<String, String> params = new HashMap<String, String>();
params.put("username", mUsername);
params.put("password", mPassword);
params.put("email", mEmail);
params.put("validate", "1");
params.put("client_id", BuildConfig.OAUTH_APP_ID);
params.put("client_secret", BuildConfig.OAUTH_APP_SECRET);
mResponseHandler.setStep(Step.VALIDATE_USER);
mRestClient.post(path, params, null, mResponseHandler, mErrorListener);
}
private void validateSite() {
String path = "sites/new";
Map<String, String> params = new HashMap<String, String>();
params.put("blog_name", mSiteUrl);
params.put("blog_title", mSiteName);
params.put("lang_id", mLanguage);
params.put("public", String.valueOf(WORDPRESS_COM_API_BLOG_VISIBILITY_PUBLIC));
params.put("validate", "1");
params.put("client_id", BuildConfig.OAUTH_APP_ID);
params.put("client_secret", BuildConfig.OAUTH_APP_SECRET);
mResponseHandler.setStep(Step.VALIDATE_SITE);
mRestClient.post(path, params, null, mResponseHandler, mErrorListener);
}
private void createUser() {
String path = "users/new";
Map<String, String> params = new HashMap<String, String>();
params.put("username", mUsername);
params.put("password", mPassword);
params.put("email", mEmail);
params.put("validate", "0");
params.put("client_id", BuildConfig.OAUTH_APP_ID);
params.put("client_secret", BuildConfig.OAUTH_APP_SECRET);
mResponseHandler.setStep(Step.CREATE_USER);
mRestClient.post(path, params, null, mResponseHandler, mErrorListener);
}
private void authenticateUser() {
LoginWPCom login = new LoginWPCom(mUsername, mPassword, null, false, null);
login.execute(new LoginAbstract.Callback() {
@Override
public void onSuccess() {
try {
mResponseHandler.nextStep(new JSONObject("{\"success\":true}"));
} catch (JSONException e) {
AppLog.e(T.API, "Could not parse JSON in new user setup");
}
}
@Override
public void onError(int errorMessageId, boolean twoStepCodeRequired, boolean httpAuthRequired, boolean erroneousSslCertificate) {
mErrorListener.onErrorResponse(new VolleyError("Sign in failed."));
}
});
mResponseHandler.setStep(Step.AUTHENTICATE_USER);
}
private void createBlog() {
String path = "sites/new";
Map<String, String> params = new HashMap<String, String>();
params.put("blog_name", mSiteUrl);
params.put("blog_title", mSiteName);
params.put("lang_id", mLanguage);
params.put("public", String.valueOf(WORDPRESS_COM_API_BLOG_VISIBILITY_PUBLIC));
params.put("validate", "0");
params.put("client_id", BuildConfig.OAUTH_APP_ID);
params.put("client_secret", BuildConfig.OAUTH_APP_SECRET);
mResponseHandler.setStep(Step.CREATE_SITE);
WordPress.getRestClientUtils().post(path, params, null, mResponseHandler, mErrorListener);
}
public enum Step {
VALIDATE_USER, VALIDATE_SITE, CREATE_USER, AUTHENTICATE_USER, CREATE_SITE
}
private enum Mode {CREATE_USER_AND_BLOG, CREATE_BLOG_ONLY}
public interface Callback {
void onStepFinished(Step step);
void onSuccess(JSONObject createSiteResponse);
void onError(int messageId);
}
private class ResponseHandler implements RestRequest.Listener {
public ResponseHandler() {
super();
}
public void setMode(Mode mode) {
mMode = mode;
}
private Step mStep = Step.VALIDATE_USER;
public void setStep(Step step) {
mStep = step;
}
private void nextStep(JSONObject response) {
try {
if (mStep == Step.AUTHENTICATE_USER) {
mCallback.onStepFinished(Step.AUTHENTICATE_USER);
createBlog();
} else {
// steps VALIDATE_USER and VALIDATE_SITE could be run simultaneously in
// CREATE_USER_AND_BLOG mode
if (response.getBoolean("success")) {
switch (mStep) {
case VALIDATE_USER:
mCallback.onStepFinished(Step.VALIDATE_USER);
validateSite();
break;
case VALIDATE_SITE:
mCallback.onStepFinished(Step.VALIDATE_SITE);
if (mMode == Mode.CREATE_BLOG_ONLY) {
createBlog();
} else {
createUser();
}
break;
case CREATE_USER:
mCallback.onStepFinished(Step.CREATE_USER);
authenticateUser();
break;
case CREATE_SITE:
mCallback.onStepFinished(Step.CREATE_SITE);
mCallback.onSuccess(response);
break;
default:
break;
}
} else {
mCallback.onError(R.string.error_generic);
}
}
} catch (JSONException e) {
mCallback.onError(R.string.error_generic);
}
}
private Mode mMode = Mode.CREATE_USER_AND_BLOG;
@Override
public void onResponse(JSONObject response) {
AppLog.d(T.NUX, String.format("Create Account step %s", mStep.name()));
nextStep(response);
}
}
}