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