Mholloway has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/317286

Change subject: Retrofit language links fetch
......................................................................

Retrofit language links fetch

Change-Id: I5428066ecfca61c90a22214d946a03fe1f54072b
---
A app/src/main/java/org/wikipedia/language/LangLinks.java
M app/src/main/java/org/wikipedia/language/LangLinksActivity.java
A app/src/main/java/org/wikipedia/language/LangLinksClient.java
D app/src/main/java/org/wikipedia/language/LangLinksFetchTask.java
A app/src/main/java/org/wikipedia/server/mwapi/ApiResponsePage.java
5 files changed, 163 insertions(+), 64 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/86/317286/1

diff --git a/app/src/main/java/org/wikipedia/language/LangLinks.java 
b/app/src/main/java/org/wikipedia/language/LangLinks.java
new file mode 100644
index 0000000..b62ece2
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/language/LangLinks.java
@@ -0,0 +1,28 @@
+package org.wikipedia.language;
+
+import android.support.annotation.NonNull;
+
+import com.google.gson.JsonObject;
+
+import org.wikipedia.page.PageTitle;
+
+import java.util.ArrayList;
+
+public class LangLinks {
+    @SuppressWarnings("unused,NullableProblems") @NonNull private Query query;
+    @NonNull protected Query query() {
+        return query;
+    }
+
+    protected class Query {
+        @SuppressWarnings("unused,NullableProblems") @NonNull private 
JsonObject pages;
+        @NonNull protected JsonObject pages() {
+            return pages;
+        }
+    }
+
+    public interface Callback {
+        void success(@NonNull ArrayList<PageTitle> links);
+        void failure(@NonNull Throwable caught);
+    }
+}
diff --git a/app/src/main/java/org/wikipedia/language/LangLinksActivity.java 
b/app/src/main/java/org/wikipedia/language/LangLinksActivity.java
index 90b6193..6ba5eaa 100644
--- a/app/src/main/java/org/wikipedia/language/LangLinksActivity.java
+++ b/app/src/main/java/org/wikipedia/language/LangLinksActivity.java
@@ -2,6 +2,7 @@
 
 import android.content.Intent;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
 import android.text.Editable;
 import android.text.TextWatcher;
 import android.view.LayoutInflater;
@@ -167,19 +168,18 @@
 
     private void fetchLangLinks() {
         if (languageEntries == null) {
-            new LangLinksFetchTask(this, title) {
+            LangLinksClient apiService = new LangLinksClient();
+            apiService.langLinks(title.getWikiSite(), title, new 
LangLinks.Callback() {
                 @Override
-                public void onFinish(ArrayList<PageTitle> result) {
-                    languageEntries = result;
-
+                public void success(@NonNull ArrayList<PageTitle> links) {
+                    languageEntries = links;
                     updateLanguageEntriesSupported(languageEntries);
                     sortLanguageEntriesByMru(languageEntries);
-
                     displayLangLinks();
                 }
 
                 @Override
-                public void onCatch(Throwable caught) {
+                public void failure(@NonNull Throwable caught) {
                     ViewAnimations.crossFade(langLinksProgress, 
langLinksError);
                     langLinksError.setError(caught);
                 }
@@ -215,7 +215,7 @@
                         }
                     }
                 }
-            }.execute();
+            });
         } else {
             displayLangLinks();
         }
@@ -232,7 +232,7 @@
             this.app = app;
         }
 
-        public void setFilterText(String filter) {
+        void setFilterText(String filter) {
             languageEntries.clear();
             filter = filter.toLowerCase();
             for (PageTitle entry : originalLanguageEntries) {
diff --git a/app/src/main/java/org/wikipedia/language/LangLinksClient.java 
b/app/src/main/java/org/wikipedia/language/LangLinksClient.java
new file mode 100644
index 0000000..8e219d4
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/language/LangLinksClient.java
@@ -0,0 +1,79 @@
+package org.wikipedia.language;
+
+
+import android.support.annotation.NonNull;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+
+import org.wikipedia.dataclient.WikiSite;
+import org.wikipedia.dataclient.retrofit.MwCachedService;
+import org.wikipedia.dataclient.retrofit.RetrofitException;
+import org.wikipedia.json.GsonUnmarshaller;
+import org.wikipedia.page.PageTitle;
+import org.wikipedia.server.mwapi.ApiResponsePage;
+import org.wikipedia.server.restbase.RbPageEndpointsCache;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+import retrofit2.Retrofit;
+import retrofit2.http.GET;
+import retrofit2.http.Query;
+
+class LangLinksClient {
+    @NonNull private final MwCachedService<Service> cachedService = new 
MwCachedService<>(Service.class);
+    @NonNull private final Retrofit retrofit = 
RbPageEndpointsCache.INSTANCE.getRetrofit();
+
+    void langLinks(@NonNull final WikiSite wiki, @NonNull final PageTitle 
title,
+                          @NonNull final LangLinks.Callback cb) {
+        Call<LangLinks> call = 
cachedService.service(wiki).langLinks(title.getPrefixedText());
+        call.enqueue(new Callback<LangLinks>() {
+            @Override
+            public void onResponse(Call<LangLinks> call, Response<LangLinks> 
response) {
+                if (response.isSuccessful()) {
+                    ArrayList<PageTitle> links = new ArrayList<>();
+                    JsonObject pages = response.body().query().pages();
+                    Set<Map.Entry<String, JsonElement>> entries = 
pages.entrySet();
+                    if (!entries.isEmpty()) {
+                        Iterator<Map.Entry<String, JsonElement>> i = 
entries.iterator();
+                        Map.Entry<String, JsonElement> entry = i.next();
+                        String value = 
entry.getValue().getAsJsonObject().toString();
+                        ApiResponsePage page = 
GsonUnmarshaller.unmarshal(ApiResponsePage.class, value);
+
+                        if (page.langLinks() == null) {
+                            // No links found
+                            cb.success(links);
+                        }
+
+                        ArrayList<ApiResponsePage.LangLink> langLinks = new 
ArrayList(page.langLinks());
+                        for (ApiResponsePage.LangLink link : langLinks) {
+                            PageTitle linkTitle = new PageTitle(
+                                    link.localizedTitle(),
+                                    WikiSite.forLanguageCode(link.lang()));
+                            links.add(linkTitle);
+                        }
+                    }
+                    cb.success(links);
+                } else {
+                    cb.failure(RetrofitException.httpError(response, 
retrofit));
+                }
+            }
+
+            @Override
+            public void onFailure(Call<LangLinks> call, Throwable t) {
+                cb.failure(t);
+            }
+        });
+    }
+
+    private interface Service {
+        
@GET("w/api.php?action=query&format=json&prop=langlinks&lllimit=500&continue=")
+        Call<LangLinks> langLinks(@NonNull @Query("titles") String title);
+    }
+}
diff --git a/app/src/main/java/org/wikipedia/language/LangLinksFetchTask.java 
b/app/src/main/java/org/wikipedia/language/LangLinksFetchTask.java
deleted file mode 100644
index fd9878c..0000000
--- a/app/src/main/java/org/wikipedia/language/LangLinksFetchTask.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.wikipedia.language;
-
-import android.content.Context;
-import org.json.JSONArray;
-import org.json.JSONObject;
-import org.mediawiki.api.json.Api;
-import org.mediawiki.api.json.ApiResult;
-import org.mediawiki.api.json.RequestBuilder;
-import org.wikipedia.dataclient.ApiTask;
-import org.wikipedia.page.PageTitle;
-import org.wikipedia.dataclient.WikiSite;
-import org.wikipedia.WikipediaApp;
-
-import java.util.ArrayList;
-
-public class LangLinksFetchTask extends ApiTask<ArrayList<PageTitle>> {
-    private final PageTitle title;
-    public LangLinksFetchTask(Context context, PageTitle title) {
-        
super(((WikipediaApp)context.getApplicationContext()).getAPIForSite(title.getWikiSite()));
-        this.title = title;
-    }
-
-    @Override
-    public RequestBuilder buildRequest(Api api) {
-        return api.action("query")
-                .param("prop", "langlinks")
-                .param("titles", title.getPrefixedText())
-                .param("lllimit", "500")
-                .param("continue", ""); // to avoid warning about new 
continuation syntax
-    }
-
-    @Override
-    public ArrayList<PageTitle> processResult(ApiResult result) throws 
Throwable {
-        ArrayList<PageTitle> linkTitles = new ArrayList<>();
-        JSONObject pagesJSON = result.asObject()
-                .optJSONObject("query")
-                .optJSONObject("pages");
-        String pageId = pagesJSON.keys().next();
-        if (!pagesJSON.optJSONObject(pageId).has("langlinks")) {
-            // No links found
-            return linkTitles;
-        }
-
-        JSONArray langlinksJSON = 
pagesJSON.optJSONObject(pageId).optJSONArray("langlinks");
-
-        for (int i = 0; i < langlinksJSON.length(); i++) {
-            JSONObject langlinkJSON = langlinksJSON.optJSONObject(i);
-            PageTitle linkTitle = new PageTitle(
-                    langlinkJSON.optString("*"),
-                    WikiSite.forLanguageCode(langlinkJSON.optString("lang")));
-            linkTitles.add(linkTitle);
-        }
-
-        return linkTitles;
-    }
-}
diff --git a/app/src/main/java/org/wikipedia/server/mwapi/ApiResponsePage.java 
b/app/src/main/java/org/wikipedia/server/mwapi/ApiResponsePage.java
new file mode 100644
index 0000000..84d18fa
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/server/mwapi/ApiResponsePage.java
@@ -0,0 +1,48 @@
+package org.wikipedia.server.mwapi;
+
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class ApiResponsePage {
+    @SuppressWarnings("unused") private int pageid;
+    @SuppressWarnings("unused") private int ns;
+    @SuppressWarnings("unused,NullableProblems") @NonNull private String title;
+
+    @SuppressWarnings("unused") @Nullable private List<LangLink> langlinks;
+    @Nullable
+    public List<LangLink> langLinks() {
+        return langlinks;
+    }
+
+    @SuppressWarnings("unused") @Nullable private List<Revision> revisions;
+    @Nullable
+    public List<Revision> revisions() {
+        return revisions;
+    }
+
+    public class Revision {
+        @SuppressWarnings("unused,NullableProblems") @NonNull private String 
contentformat;
+        @SuppressWarnings("unused,NullableProblems") @NonNull private String 
contentmodel;
+        @SerializedName("*") @SuppressWarnings("unused,NullableProblems") 
@NonNull private String content;
+        @NonNull public String content() {
+            return content;
+        }
+    }
+
+    public class LangLink {
+        @SuppressWarnings("unused,NullableProblems") @NonNull private String 
lang;
+        @NonNull public String lang() {
+            return lang;
+        }
+
+        @SerializedName("*") @SuppressWarnings("unused,NullableProblems") 
@NonNull private String localizedTitle;
+        @NonNull public String localizedTitle() {
+            return localizedTitle;
+        }
+    }
+}

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I5428066ecfca61c90a22214d946a03fe1f54072b
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