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