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

Reply via email to