diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/accounts/helpers/CreateUserAndBlog.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/ui/accounts/helpers/CreateUserAndBlog.java | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/helpers/CreateUserAndBlog.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/helpers/CreateUserAndBlog.java new file mode 100644 index 000000000..f2c6d2de3 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/helpers/CreateUserAndBlog.java @@ -0,0 +1,263 @@ +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); + } + } +} |