jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/332392 )

Change subject: Retrofit CreateAccountInfoTask
......................................................................


Retrofit CreateAccountInfoTask

Bug: T152396
Change-Id: Ic194830ca25592c3fe29e8b30755bd2b208588e5
---
D 
app/src/androidTest/java/org/wikipedia/createaccount/CreateAccountInfoTaskTest.java
M app/src/main/java/org/wikipedia/createaccount/CreateAccountActivity.java
A app/src/main/java/org/wikipedia/createaccount/CreateAccountInfo.java
A app/src/main/java/org/wikipedia/createaccount/CreateAccountInfoClient.java
D app/src/main/java/org/wikipedia/createaccount/CreateAccountInfoTask.java
A app/src/main/java/org/wikipedia/dataclient/mwapi/MwApiException.java
6 files changed, 171 insertions(+), 162 deletions(-)

Approvals:
  Niedzielski: Looks good to me, approved
  jenkins-bot: Verified



diff --git 
a/app/src/androidTest/java/org/wikipedia/createaccount/CreateAccountInfoTaskTest.java
 
b/app/src/androidTest/java/org/wikipedia/createaccount/CreateAccountInfoTaskTest.java
deleted file mode 100644
index 53b0800..0000000
--- 
a/app/src/androidTest/java/org/wikipedia/createaccount/CreateAccountInfoTaskTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.wikipedia.createaccount;
-
-import android.content.Context;
-import android.net.Uri;
-import android.support.annotation.NonNull;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-
-import com.facebook.drawee.view.SimpleDraweeView;
-
-import org.junit.Test;
-import org.mediawiki.api.json.Api;
-import org.wikipedia.WikipediaApp;
-import org.wikipedia.captcha.CaptchaResult;
-import org.wikipedia.dataclient.WikiSite;
-import org.wikipedia.testlib.TestLatch;
-import org.wikipedia.util.log.L;
-
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.fail;
-
-/**
- * Automated tests for the account creation flow.
- *
- * Note that we won't be able to test for successful account creation 
directly, since the WPs are
- * configured to require a CAPTCHA for account creation and by design we won't 
be able to pass
- * a CAPTCHA.  The most we can do is check that we are able to retrieve the 
createaccount token and
- * CAPTCHA image as expected.
- */
-@SmallTest public class CreateAccountInfoTaskTest {
-    private static WikiSite TEST_WIKI = WikiSite.forLanguageCode("test");
-    private static Api TEST_API = 
WikipediaApp.getInstance().getAPIForSite(TEST_WIKI);
-    private Context context = 
InstrumentationRegistry.getInstrumentation().getTargetContext();
-
-    private CreateAccountTestInfoTask createAccountInfoTask
-            = new CreateAccountTestInfoTask(TEST_API) {
-        @Override
-        public void onCatch(Throwable caught) {
-            L.e(caught);
-            fail();
-        }
-    };
-
-    @Test
-    public void testCreateAccountInfoFetch() {
-        createAccountInfoTask.execute();
-        CreateAccountInfoResult result = createAccountInfoTask.await();
-        assertNotNull(result.token());
-        assertTrue(result.hasCaptcha());
-        assertNotNull(result.captchaId());
-    }
-
-    @Test
-    public void testFetchCaptchaImage() {
-        createAccountInfoTask.execute();
-        CreateAccountInfoResult result = createAccountInfoTask.await();
-        CaptchaResult captcha = new CaptchaResult(result.captchaId());
-        SimpleDraweeView captchaView = new SimpleDraweeView(context);
-        captchaView.setImageURI(Uri.parse(captcha.getCaptchaUrl(TEST_WIKI)));
-        assertNotNull(captchaView.getDrawable());
-    }
-
-    private static class CreateAccountTestInfoTask extends 
CreateAccountInfoTask {
-        @NonNull private final TestLatch latch = new TestLatch();
-        private CreateAccountInfoResult result;
-
-        CreateAccountTestInfoTask(Api api) {
-            super(api);
-        }
-
-        @Override
-        public void onFinish(CreateAccountInfoResult result) {
-            super.onFinish(result);
-            this.result = result;
-            latch.countDown();
-        }
-
-        public CreateAccountInfoResult await() {
-            latch.await();
-            return result;
-        }
-    }
-}
diff --git 
a/app/src/main/java/org/wikipedia/createaccount/CreateAccountActivity.java 
b/app/src/main/java/org/wikipedia/createaccount/CreateAccountActivity.java
index 824bcd1..7acfedc 100644
--- a/app/src/main/java/org/wikipedia/createaccount/CreateAccountActivity.java
+++ b/app/src/main/java/org/wikipedia/createaccount/CreateAccountActivity.java
@@ -27,11 +27,15 @@
 import org.wikipedia.analytics.CreateAccountFunnel;
 import org.wikipedia.captcha.CaptchaHandler;
 import org.wikipedia.captcha.CaptchaResult;
+import org.wikipedia.dataclient.WikiSite;
+import org.wikipedia.dataclient.mwapi.MwQueryResponse;
 import org.wikipedia.util.FeedbackUtil;
 import org.wikipedia.util.log.L;
 import org.wikipedia.views.NonEmptyValidator;
 
 import java.util.List;
+
+import retrofit2.Call;
 
 import static org.wikipedia.util.DeviceUtil.hideSoftKeyboard;
 import static org.wikipedia.util.FeedbackUtil.setErrorPopup;
@@ -44,6 +48,8 @@
 
     public static final String LOGIN_REQUEST_SOURCE = "login_request_source";
     public static final String LOGIN_SESSION_TOKEN = "login_session_token";
+
+    private CreateAccountInfoClient createAccountInfoClient;
 
     @NotEmpty
     private EditText usernameEdit;
@@ -60,16 +66,13 @@
 
     private TextView createAccountButton;
     private TextView createAccountButtonCaptcha;
-
     private ProgressDialog progressDialog;
-
     private CaptchaHandler captchaHandler;
 
     private CreateAccountResult createAccountResult;
-
     private Validator validator;
-
     private CreateAccountFunnel funnel;
+    private WikiSite wiki;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -91,6 +94,9 @@
         progressDialog.setIndeterminate(true);
         progressDialog.setCancelable(false);
         
progressDialog.setMessage(getString(R.string.dialog_create_account_checking_progress));
+
+        wiki = WikipediaApp.getInstance().getWikiSite();
+        createAccountInfoClient = new CreateAccountInfoClient();
 
         captchaHandler = new CaptchaHandler(this, 
WikipediaApp.getInstance().getWikiSite(),
                 progressDialog, primaryContainer, 
getString(R.string.create_account_activity_title),
@@ -218,15 +224,10 @@
     }
 
     public void getCreateAccountInfo() {
-        new CreateAccountInfoTask() {
+        createAccountInfoClient.request(wiki, new 
CreateAccountInfoClient.Callback() {
             @Override
-            public void onCatch(Throwable caught) {
-                handleError(caught.getMessage());
-                L.e(caught);
-            }
-
-            @Override
-            public void onFinish(CreateAccountInfoResult result) {
+            public void success(@NonNull 
Call<MwQueryResponse<CreateAccountInfo>> call,
+                                @NonNull CreateAccountInfoResult result) {
                 if (result.token() == null) {
                     
handleError(getString(R.string.create_account_generic_error));
                 } else if (result.hasCaptcha()) {
@@ -235,7 +236,14 @@
                     doCreateAccount(result.token());
                 }
             }
-        }.execute();
+
+            @Override
+            public void failure(@NonNull 
Call<MwQueryResponse<CreateAccountInfo>> call,
+                                @NonNull Throwable caught) {
+                handleError(caught.getMessage());
+                L.e(caught);
+            }
+        });
     }
 
     public void doCreateAccount(@NonNull String token) {
@@ -248,7 +256,7 @@
         String passwordRepeat = passwordInput.isPasswordVisible() ? password : 
passwordRepeatEdit.getText().toString();
 
         new CreateAccountTask(usernameEdit.getText().toString(), 
passwordEdit.getText().toString(),
-                              passwordRepeat, token, email) {
+                passwordRepeat, token, email) {
             @Override
             public void onBeforeExecute() {
                 progressDialog.show();
diff --git 
a/app/src/main/java/org/wikipedia/createaccount/CreateAccountInfo.java 
b/app/src/main/java/org/wikipedia/createaccount/CreateAccountInfo.java
new file mode 100644
index 0000000..e089203
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/createaccount/CreateAccountInfo.java
@@ -0,0 +1,62 @@
+package org.wikipedia.createaccount;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import java.util.List;
+import java.util.Map;
+
+class CreateAccountInfo {
+    @SuppressWarnings("unused,NullableProblems") @NonNull private Tokens 
tokens;
+    @SuppressWarnings("unused,NullableProblems") @NonNull private AMInfo 
authmanagerinfo;
+
+    @NonNull String token() {
+        return tokens.token();
+    }
+
+    @Nullable String captchaId() {
+        String captchaId = null;
+        for (CreateAccountInfo.Request request : authmanagerinfo.requests()) {
+            if ("CaptchaAuthenticationRequest".equals(request.id())) {
+                captchaId = request.fields().get("captchaId").value();
+            }
+        }
+        return captchaId;
+    }
+
+    static class Tokens {
+        @SuppressWarnings("unused,NullableProblems") @NonNull private String 
createaccounttoken;
+        @NonNull String token() {
+            return createaccounttoken;
+        }
+    }
+
+    static class AMInfo {
+        @SuppressWarnings("unused,NullableProblems") @NonNull private 
List<Request> requests;
+        @NonNull List<Request> requests() {
+            return requests;
+        }
+    }
+
+    static class Request {
+        @SuppressWarnings("unused,NullableProblems") @NonNull private String 
id;
+        @SuppressWarnings("unused,NullableProblems") @NonNull private 
Map<String, Field> fields;
+        @NonNull String id() {
+            return id;
+        }
+        @NonNull Map<String, Field> fields() {
+            return fields;
+        }
+    }
+
+    static class Field {
+        @SuppressWarnings("unused") @Nullable private String type;
+        @SuppressWarnings("unused") @Nullable private String value;
+        @SuppressWarnings("unused") @Nullable private String label;
+        @SuppressWarnings("unused") @Nullable private String help;
+
+        @Nullable String value() {
+            return value;
+        }
+    }
+}
diff --git 
a/app/src/main/java/org/wikipedia/createaccount/CreateAccountInfoClient.java 
b/app/src/main/java/org/wikipedia/createaccount/CreateAccountInfoClient.java
new file mode 100644
index 0000000..7f65b78
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/createaccount/CreateAccountInfoClient.java
@@ -0,0 +1,65 @@
+package org.wikipedia.createaccount;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.VisibleForTesting;
+
+import org.wikipedia.dataclient.WikiSite;
+import org.wikipedia.dataclient.mwapi.MwApiException;
+import org.wikipedia.dataclient.mwapi.MwQueryResponse;
+import org.wikipedia.dataclient.retrofit.MwCachedService;
+import org.wikipedia.dataclient.retrofit.RetrofitException;
+
+import java.io.IOException;
+
+import retrofit2.Call;
+import retrofit2.Response;
+import retrofit2.http.GET;
+
+class CreateAccountInfoClient {
+    @NonNull private MwCachedService<Service> cachedService = new 
MwCachedService<>(Service.class);
+
+    public interface Callback {
+        void success(@NonNull Call<MwQueryResponse<CreateAccountInfo>> call, 
@NonNull CreateAccountInfoResult result);
+        void failure(@NonNull Call<MwQueryResponse<CreateAccountInfo>> call, 
@NonNull Throwable caught);
+    }
+
+    Call<MwQueryResponse<CreateAccountInfo>> request(@NonNull WikiSite wiki,
+                                                     @NonNull Callback cb) {
+        return request(cachedService.service(wiki), cb);
+    }
+
+    @VisibleForTesting Call<MwQueryResponse<CreateAccountInfo>> 
request(@NonNull Service service,
+                                                                        
@NonNull final Callback cb) {
+        Call<MwQueryResponse<CreateAccountInfo>> call = service.request();
+        call.enqueue(new 
retrofit2.Callback<MwQueryResponse<CreateAccountInfo>>() {
+            @Override
+            public void onResponse(Call<MwQueryResponse<CreateAccountInfo>> 
call,
+                                   
Response<MwQueryResponse<CreateAccountInfo>> response) {
+                if (response.isSuccessful()) {
+                    if (response.body().success()) {
+                        String token = response.body().query().token();
+                        String captchaId = response.body().query().captchaId();
+                        cb.success(call, new CreateAccountInfoResult(token, 
captchaId));
+                    } else if (response.body().hasError()) {
+                        cb.failure(call, new 
MwApiException(response.body().getError()));
+                    } else {
+                        cb.failure(call, new IOException("An unknown error 
occurred."));
+                    }
+                } else {
+                    cb.failure(call, RetrofitException.httpError(response, 
cachedService.retrofit()));
+                }
+            }
+
+            @Override
+            public void onFailure(Call<MwQueryResponse<CreateAccountInfo>> 
call, Throwable t) {
+                cb.failure(call, t);
+            }
+        });
+        return call;
+    }
+
+    @VisibleForTesting interface Service {
+        
@GET("w/api.php?action=query&format=json&meta=authmanagerinfo|tokens&amirequestsfor=create&type=createaccount")
+        Call<MwQueryResponse<CreateAccountInfo>> request();
+    }
+}
diff --git 
a/app/src/main/java/org/wikipedia/createaccount/CreateAccountInfoTask.java 
b/app/src/main/java/org/wikipedia/createaccount/CreateAccountInfoTask.java
deleted file mode 100644
index e680e9b..0000000
--- a/app/src/main/java/org/wikipedia/createaccount/CreateAccountInfoTask.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.wikipedia.createaccount;
-
-import android.support.annotation.VisibleForTesting;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.mediawiki.api.json.Api;
-import org.mediawiki.api.json.ApiException;
-import org.mediawiki.api.json.ApiResult;
-import org.mediawiki.api.json.RequestBuilder;
-import org.wikipedia.WikipediaApp;
-import org.wikipedia.dataclient.ApiTask;
-import org.wikipedia.util.log.L;
-
-public class CreateAccountInfoTask extends ApiTask<CreateAccountInfoResult> {
-
-    public CreateAccountInfoTask() {
-        super(WikipediaApp.getInstance().getSiteApi());
-    }
-
-    @VisibleForTesting
-    public CreateAccountInfoTask(Api api) {
-        super(api);
-    }
-
-    @Override
-    public RequestBuilder buildRequest(Api api) {
-        return api.action("query")
-                .param("meta", "authmanagerinfo|tokens")
-                .param("amirequestsfor", "create")
-                .param("type", "createaccount");
-    }
-
-    @Override
-    protected ApiResult makeRequest(RequestBuilder builder) throws 
ApiException {
-        return builder.post();
-    }
-
-    @Override
-    public CreateAccountInfoResult processResult(ApiResult result) throws 
Throwable {
-        String token = null;
-        String captchaId = null;
-        try {
-            JSONObject query = result.asObject().getJSONObject("query");
-
-            token = 
query.getJSONObject("tokens").getString("createaccounttoken");
-
-            JSONObject authManagerInfo = 
query.getJSONObject("authmanagerinfo");
-            JSONArray requests = authManagerInfo.getJSONArray("requests");
-            for (int i = 0; i < requests.length(); i++) {
-                JSONObject request = requests.getJSONObject(i);
-                if 
(request.getString("id").equals("CaptchaAuthenticationRequest")) {
-                    JSONObject fields = request.getJSONObject("fields");
-                    captchaId = 
fields.getJSONObject("captchaId").getString("value");
-                    break;
-                }
-            }
-        } catch (JSONException e) {
-            L.e("Error parsing createaccountinfo json", e);
-        }
-        return new CreateAccountInfoResult(token, captchaId);
-    }
-}
diff --git 
a/app/src/main/java/org/wikipedia/dataclient/mwapi/MwApiException.java 
b/app/src/main/java/org/wikipedia/dataclient/mwapi/MwApiException.java
new file mode 100644
index 0000000..944db69
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/dataclient/mwapi/MwApiException.java
@@ -0,0 +1,22 @@
+package org.wikipedia.dataclient.mwapi;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import org.wikipedia.server.mwapi.MwServiceError;
+
+public class MwApiException extends RuntimeException {
+    @SuppressWarnings("unused") @NonNull private MwServiceError error;
+
+    public MwApiException(@NonNull MwServiceError error) {
+        this.error = error;
+    }
+
+    @Nullable String getTitle() {
+        return error.getTitle();
+    }
+
+    @Override @Nullable public String getMessage() {
+        return error.getDetails();
+    }
+}
\ No newline at end of file

-- 
To view, visit https://gerrit.wikimedia.org/r/332392
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ic194830ca25592c3fe29e8b30755bd2b208588e5
Gerrit-PatchSet: 6
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Mholloway <[email protected]>
Gerrit-Reviewer: BearND <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[email protected]>
Gerrit-Reviewer: Dbrant <[email protected]>
Gerrit-Reviewer: Mholloway <[email protected]>
Gerrit-Reviewer: Niedzielski <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to