Mholloway has uploaded a new change for review. https://gerrit.wikimedia.org/r/318111
Change subject: Retrofit edit token fetching ...................................................................... Retrofit edit token fetching Change-Id: I5fb3d6e824c4a2ac0d278dd847f34495c704f0da --- M app/src/main/java/org/wikipedia/editing/EditClient.java A app/src/main/java/org/wikipedia/editing/EditToken.java M app/src/main/java/org/wikipedia/editing/EditTokenStorage.java D app/src/main/java/org/wikipedia/editing/FetchEditTokenTask.java M app/src/main/java/org/wikipedia/useroption/dataclient/DefaultUserOptionDataClient.java 5 files changed, 75 insertions(+), 51 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia refs/changes/11/318111/1 diff --git a/app/src/main/java/org/wikipedia/editing/EditClient.java b/app/src/main/java/org/wikipedia/editing/EditClient.java index 05348a7..ad27f73 100644 --- a/app/src/main/java/org/wikipedia/editing/EditClient.java +++ b/app/src/main/java/org/wikipedia/editing/EditClient.java @@ -13,6 +13,7 @@ import org.wikipedia.server.mwapi.ApiResponsePage; import org.wikipedia.server.restbase.RbPageEndpointsCache; +import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.Map; @@ -31,6 +32,31 @@ public class EditClient { @NonNull private final MwCachedService<Service> cachedService = new MwCachedService<>(Service.class); @NonNull private final Retrofit retrofit = RbPageEndpointsCache.INSTANCE.getRetrofit(); + + public void editToken(@NonNull final WikiSite wiki, @NonNull final EditToken.Callback cb) { + Call<EditToken> call = cachedService.service(wiki).editToken(); + call.enqueue(new Callback<EditToken>() { + @Override + public void onResponse(Call<EditToken> call, Response<EditToken> response) { + if (response.isSuccessful()) { + cb.success(response.body().query().tokens().token()); + } else { + cb.failure(RetrofitException.httpError(response, retrofit)); + } + } + + @Override + public void onFailure(Call<EditToken> call, Throwable t) { + cb.failure(t); + } + }); + } + + @NonNull + public String editTokenSync(@NonNull final WikiSite wiki) throws IOException { + Call<EditToken> call = cachedService.service(wiki).editToken(); + return call.execute().body().query().tokens().token(); + } public void wikitext(@NonNull final WikiSite wiki, @NonNull final PageTitle title, final int sectionID, @NonNull final Wikitext.Callback cb) { @@ -62,7 +88,7 @@ } - void previewEdit(@NonNull final WikiSite wiki, @NonNull final PageTitle title, + public void previewEdit(@NonNull final WikiSite wiki, @NonNull final PageTitle title, @NonNull final String wikitext, @NonNull final EditPreview.Callback cb) { Call<EditPreview> call = cachedService.service(wiki).previewEdit("parse", "json", true, true, true, "text", title.getPrefixedText(), wikitext); @@ -84,6 +110,10 @@ } private interface Service { + @GET("w/api.php?action=query&format=json&meta=tokens&type=csrf") + Call<EditToken> editToken(); + + @GET("w/api.php?action=query&format=json&prop=revisions&rvprop=content&rvlimit=1") Call<Wikitext> wikitext(@NonNull @Query("titles") String title, @Query("rvsection") int section); diff --git a/app/src/main/java/org/wikipedia/editing/EditToken.java b/app/src/main/java/org/wikipedia/editing/EditToken.java new file mode 100644 index 0000000..f679480 --- /dev/null +++ b/app/src/main/java/org/wikipedia/editing/EditToken.java @@ -0,0 +1,29 @@ +package org.wikipedia.editing; + +import android.support.annotation.NonNull; + +public class EditToken { + @SuppressWarnings("unused,NullableProblems") @NonNull private Query query; + @NonNull protected Query query() { + return query; + } + + protected class Query { + @SuppressWarnings("unused,NullableProblems") @NonNull private Tokens tokens; + @NonNull protected Tokens tokens() { + return tokens; + } + } + + protected class Tokens { + @SuppressWarnings("unused,NullableProblems") @NonNull private String csrftoken; + @NonNull protected String token() { + return csrftoken; + } + } + + public interface Callback { + void success(@NonNull String token); + void failure(@NonNull Throwable caught); + } +} diff --git a/app/src/main/java/org/wikipedia/editing/EditTokenStorage.java b/app/src/main/java/org/wikipedia/editing/EditTokenStorage.java index 197285c..da4f397 100644 --- a/app/src/main/java/org/wikipedia/editing/EditTokenStorage.java +++ b/app/src/main/java/org/wikipedia/editing/EditTokenStorage.java @@ -50,18 +50,19 @@ return; } - new FetchEditTokenTask(context, wiki) { + EditClient apiService = new EditClient(); + apiService.editToken(wiki, new EditToken.Callback() { @Override - public void onFinish(String result) { - token(wiki, result); - callback.onTokenRetrieved(result); + public void success(@NonNull String token) { + token(wiki, token); + callback.onTokenRetrieved(token); } @Override - public void onCatch(Throwable caught) { + public void failure(@NonNull Throwable caught) { callback.onTokenFailed(caught); } - }.execute(); + }); } public void clearEditTokenForDomain(String wiki) { diff --git a/app/src/main/java/org/wikipedia/editing/FetchEditTokenTask.java b/app/src/main/java/org/wikipedia/editing/FetchEditTokenTask.java deleted file mode 100644 index 953cbfa..0000000 --- a/app/src/main/java/org/wikipedia/editing/FetchEditTokenTask.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.wikipedia.editing; - -import android.content.Context; - -import org.mediawiki.api.json.Api; -import org.mediawiki.api.json.ApiResult; -import org.mediawiki.api.json.RequestBuilder; -import org.wikipedia.WikipediaApp; -import org.wikipedia.dataclient.ApiTask; -import org.wikipedia.dataclient.WikiSite; - -public class FetchEditTokenTask extends ApiTask<String> { - public FetchEditTokenTask(Context context, WikiSite wiki) { - super(((WikipediaApp)context.getApplicationContext()).getAPIForSite(wiki)); - } - - @Override - public RequestBuilder buildRequest(Api api) { - return api.action("tokens") - .param("type", "edit"); - } - - @Override - public String processResult(ApiResult result) throws Throwable { - return result.asObject().optJSONObject("tokens").optString("edittoken"); - } -} diff --git a/app/src/main/java/org/wikipedia/useroption/dataclient/DefaultUserOptionDataClient.java b/app/src/main/java/org/wikipedia/useroption/dataclient/DefaultUserOptionDataClient.java index 6196502..39c306f 100644 --- a/app/src/main/java/org/wikipedia/useroption/dataclient/DefaultUserOptionDataClient.java +++ b/app/src/main/java/org/wikipedia/useroption/dataclient/DefaultUserOptionDataClient.java @@ -10,7 +10,7 @@ import org.wikipedia.dataclient.mwapi.MwPostResponse; import org.wikipedia.dataclient.mwapi.MwQueryResponse; import org.wikipedia.dataclient.retrofit.RetrofitFactory; -import org.wikipedia.editing.FetchEditTokenTask; +import org.wikipedia.editing.EditClient; import org.wikipedia.server.ServiceError; import org.wikipedia.useroption.UserOption; @@ -80,22 +80,13 @@ } private void requestToken() { - new FetchEditTokenTask(app(), wiki) { - @Override - public void onFinish(String result) { - app().getEditTokenStorage().token(wiki, result); - } - - @Override - public void execute() { - super.executeOnExecutor(new SynchronousExecutor()); - } - - @Override - public void onCatch(Throwable throwable) { - // Don't worry about it; will be retried next time. - } - }.execute(); + EditClient apiService = new EditClient(); + try { + String token = apiService.editTokenSync(wiki); + app().getEditTokenStorage().token(wiki, token); + } catch (IOException e) { + // Don't worry about it; will be retried next time. + } } private static WikipediaApp app() { -- To view, visit https://gerrit.wikimedia.org/r/318111 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I5fb3d6e824c4a2ac0d278dd847f34495c704f0da Gerrit-PatchSet: 1 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: Mholloway <mhollo...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits