Dbrant has uploaded a new change for review.
https://gerrit.wikimedia.org/r/153809
Change subject: Use generator:prefixsearch instead of opensearch.
......................................................................
Use generator:prefixsearch instead of opensearch.
Change-Id: I44863416a57e03f8f2053685af6e70c012c84830
---
D wikipedia/src/main/java/org/wikipedia/PageQueryTask.java
M wikipedia/src/main/java/org/wikipedia/PageTitle.java
M wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java
D wikipedia/src/main/java/org/wikipedia/pageimages/PageImageSaveTask.java
D wikipedia/src/main/java/org/wikipedia/pageimages/PageImagesTask.java
M wikipedia/src/main/java/org/wikipedia/search/SearchArticlesFragment.java
M wikipedia/src/main/java/org/wikipedia/search/SearchArticlesTask.java
7 files changed, 73 insertions(+), 166 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia
refs/changes/09/153809/1
diff --git a/wikipedia/src/main/java/org/wikipedia/PageQueryTask.java
b/wikipedia/src/main/java/org/wikipedia/PageQueryTask.java
deleted file mode 100644
index 3661e27..0000000
--- a/wikipedia/src/main/java/org/wikipedia/PageQueryTask.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.wikipedia;
-
-import android.text.TextUtils;
-import org.json.JSONObject;
-import org.mediawiki.api.json.Api;
-import org.mediawiki.api.json.ApiResult;
-import org.mediawiki.api.json.RequestBuilder;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-public abstract class PageQueryTask<T> extends ApiTask<Map<PageTitle, T>> {
- private final List<PageTitle> titles;
- private final Site site;
-
- public PageQueryTask(int concurrencyLevel, Api api, Site site,
List<PageTitle> titles) {
- super(concurrencyLevel, api);
- this.titles = titles;
- this.site = site;
- }
-
- @Override
- public RequestBuilder buildRequest(Api api) {
- RequestBuilder builder = api.action("query").param("titles",
TextUtils.join("|", titles));
- buildQueryParams(builder);
- return builder;
- }
-
- @Override
- public Map<PageTitle, T> processResult(ApiResult result) throws Throwable {
- Map<PageTitle, T> map = new HashMap<PageTitle, T>();
- JSONObject data = result.asObject();
- JSONObject query = data.getJSONObject("query");
- JSONObject pages = query.getJSONObject("pages");
-
- // You would think you could use foreach on an Iterator, but you can't.
- Iterator<String> keys = pages.keys();
- while (keys.hasNext()) {
- String key = keys.next();
- int pageId = Integer.parseInt(key);
- JSONObject pageData = pages.getJSONObject(key);
- String titleString = pageData.getString("title");
- PageTitle pageTitle = new PageTitle(null, titleString, site);
- T pageResult = processPage(pageId, pageTitle, pageData);
- map.put(pageTitle, pageResult);
- }
-
- return map;
- }
-
- public abstract void buildQueryParams(RequestBuilder buildQueryParams);
-
- public abstract T processPage(int pageId, PageTitle pageTitle, JSONObject
page) throws Throwable;
-}
diff --git a/wikipedia/src/main/java/org/wikipedia/PageTitle.java
b/wikipedia/src/main/java/org/wikipedia/PageTitle.java
index 96b9682..13a35d9 100644
--- a/wikipedia/src/main/java/org/wikipedia/PageTitle.java
+++ b/wikipedia/src/main/java/org/wikipedia/PageTitle.java
@@ -24,20 +24,22 @@
private final String namespace;
private final String text;
private final String fragment;
+ private final String thumbUrl;
private final Site site;
- public PageTitle(final String namespace, final String text, final String
fragment, final Site site) {
+ public PageTitle(final String namespace, final String text, final String
fragment, final String thumbUrl, final Site site) {
this.namespace = namespace;
this.text = text;
this.fragment = fragment;
+ this.thumbUrl = thumbUrl;
this.site = site;
}
public PageTitle(final String namespace, final String text, final Site
site) {
- this(namespace, text, null, site);
+ this(namespace, text, null, null, site);
}
- public PageTitle(String text, final Site site) {
+ public PageTitle(String text, final Site site, String thumbUrl) {
// FIXME: Does not handle mainspace articles with a colon in the title
well at all
if (TextUtils.isEmpty(text)) {
// If empty, this refers to the main page.
@@ -66,7 +68,12 @@
this.text = parts[0];
}
+ this.thumbUrl = thumbUrl;
this.site = site;
+ }
+
+ public PageTitle(String text, final Site site) {
+ this(text, site, null);
}
public String getNamespace() {
@@ -83,6 +90,10 @@
public String getFragment() { return fragment; }
+ public String getThumbUrl() {
+ return thumbUrl;
+ }
+
public String getDisplayText() {
return getPrefixedText().replace("_", " ");
}
@@ -98,6 +109,7 @@
json.put("namespace", getNamespace());
json.put("text", getText());
json.put("fragment", getFragment());
+ json.put("thumbUrl", getThumbUrl());
return json;
} catch (JSONException e) {
// This will also never happen
@@ -110,6 +122,7 @@
this.namespace = json.optString("namespace", null);
this.fragment = json.optString("fragment", null);
this.text = json.optString("text", null);
+ this.thumbUrl = json.optString("thumbUrl", null);
}
private String getUriForDomain(String domain) {
@@ -210,6 +223,7 @@
text = in.readString();
fragment = in.readString();
site = in.readParcelable(Site.class.getClassLoader());
+ thumbUrl = in.readString();
}
@Override
@@ -218,6 +232,7 @@
parcel.writeString(text);
parcel.writeString(fragment);
parcel.writeParcelable(site, flags);
+ parcel.writeString(thumbUrl);
}
@Override
diff --git a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java
b/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java
index 780f9d0..a6f88a0 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java
@@ -18,6 +18,7 @@
import org.mediawiki.api.json.RequestBuilder;
import org.wikipedia.NightModeHandler;
import org.wikipedia.analytics.ConnectionIssueFunnel;
+import org.wikipedia.pageimages.PageImage;
import org.wikipedia.views.ObservableWebView;
import org.wikipedia.PageTitle;
import org.wikipedia.QuickReturnHandler;
@@ -33,7 +34,6 @@
import org.wikipedia.events.NewWikiPageNavigationEvent;
import org.wikipedia.events.OverflowMenuUpdateEvent;
import org.wikipedia.history.HistoryEntry;
-import org.wikipedia.pageimages.PageImageSaveTask;
import org.wikipedia.savedpages.ImageUrlMap;
import org.wikipedia.savedpages.LoadSavedPageTask;
import org.wikipedia.savedpages.LoadSavedPageUrlMapTask;
@@ -558,13 +558,10 @@
new HistorySaveTask(curEntry).execute();
// Save image for this page title
- new PageImageSaveTask(app, app.getAPIForSite(title.getSite()),
title) {
- @Override
- public void onCatch(Throwable caught) {
- // Don't actually do anything.
- // Thumbnails are expendable
- }
- }.execute();
+ if (title.getThumbUrl() != null) {
+ PageImage pi = new PageImage(title, title.getThumbUrl());
+ app.getPersister(PageImage.class).upsert(pi);
+ }
}
@Override
diff --git
a/wikipedia/src/main/java/org/wikipedia/pageimages/PageImageSaveTask.java
b/wikipedia/src/main/java/org/wikipedia/pageimages/PageImageSaveTask.java
deleted file mode 100644
index 3f4b1bd..0000000
--- a/wikipedia/src/main/java/org/wikipedia/pageimages/PageImageSaveTask.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.wikipedia.pageimages;
-
-import org.mediawiki.api.json.Api;
-import org.wikipedia.PageTitle;
-import org.wikipedia.WikipediaApp;
-
-import java.util.Arrays;
-import java.util.Map;
-
-public class PageImageSaveTask extends PageImagesTask {
- private static final int SIZE = 96;
-
- private final WikipediaApp app;
-
- public PageImageSaveTask(WikipediaApp app, Api api, PageTitle title) {
- super(api, title.getSite(), Arrays.asList(new PageTitle[] {title}),
SIZE);
- this.app = app;
- }
-
- @Override
- public void onFinish(Map<PageTitle, String> result) {
- for (Map.Entry<PageTitle, String> item : result.entrySet()) {
- PageImage pi = new PageImage(item.getKey(), item.getValue());
- app.getPersister(PageImage.class).upsert(pi);
- }
- }
-}
diff --git
a/wikipedia/src/main/java/org/wikipedia/pageimages/PageImagesTask.java
b/wikipedia/src/main/java/org/wikipedia/pageimages/PageImagesTask.java
deleted file mode 100644
index e8f44e7..0000000
--- a/wikipedia/src/main/java/org/wikipedia/pageimages/PageImagesTask.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.wikipedia.pageimages;
-
-import org.json.JSONObject;
-import org.mediawiki.api.json.Api;
-import org.mediawiki.api.json.RequestBuilder;
-import org.wikipedia.PageQueryTask;
-import org.wikipedia.PageTitle;
-import org.wikipedia.Site;
-
-import java.util.List;
-
-public class PageImagesTask extends PageQueryTask<String> {
- private final int thumbSize;
- private final int thumbsCount;
-
- public PageImagesTask(Api api, Site site, List<PageTitle> titles, int
thumbSize) {
- super(LOW_CONCURRENCY, api, site, titles);
- this.thumbSize = thumbSize;
- this.thumbsCount = titles.size();
- }
-
- @Override
- public void buildQueryParams(RequestBuilder builder) {
- builder.param("prop", "pageimages")
- .param("piprop", "thumbnail")
- .param("pithumbsize", Integer.toString(thumbSize))
- .param("pilimit", Integer.toString(thumbsCount));
- }
-
- @Override
- public String processPage(int pageId, PageTitle pageTitle, JSONObject
pageData) throws Throwable {
- JSONObject thumbnail = pageData.optJSONObject("thumbnail");
- if (thumbnail == null) {
- return null;
- } else {
- return thumbnail.getString("source");
- }
- }
-}
diff --git
a/wikipedia/src/main/java/org/wikipedia/search/SearchArticlesFragment.java
b/wikipedia/src/main/java/org/wikipedia/search/SearchArticlesFragment.java
index f68dbec..827315c 100644
--- a/wikipedia/src/main/java/org/wikipedia/search/SearchArticlesFragment.java
+++ b/wikipedia/src/main/java/org/wikipedia/search/SearchArticlesFragment.java
@@ -36,16 +36,13 @@
import org.wikipedia.history.HistoryEntry;
import org.wikipedia.page.PageActionsHandler;
import org.wikipedia.page.PopupMenu;
-import org.wikipedia.pageimages.PageImagesTask;
import java.util.List;
-import java.util.Map;
public class SearchArticlesFragment extends Fragment {
private static final int DELAY_MILLIS = 300;
private static final int MAX_CACHE_SIZE_SEARCH_RESULTS = 4;
private static final int MAX_CACHE_SIZE_IMAGES = 48;
- private static final float THUMB_SIZE_DP = 48f;
private static final int LEFT_MARGIN_BASE_DP = 10;
private static final float INITIAL_OFFSET_WINDOW = 0.5f;
private static final int MESSAGE_SEARCH = 1;
@@ -101,35 +98,20 @@
*/
private void displayResults(List<PageTitle> results) {
adapter.setResults(results);
-
((BaseAdapter)searchResultsList.getAdapter()).notifyDataSetInvalidated();
if (results.size() == 0) {
searchNoResults.setVisibility(View.VISIBLE);
} else {
searchResultsList.setVisibility(View.VISIBLE);
- PageImagesTask imagesTask = new PageImagesTask(
- app.getAPIForSite(app.getPrimarySite()),
- app.getPrimarySite(),
- results,
- (int)(THUMB_SIZE_DP *
WikipediaApp.getInstance().getScreenDensity())) {
- @Override
- public void onFinish(Map<PageTitle, String> result) {
- for (Map.Entry<PageTitle, String> entry :
result.entrySet()) {
- if (entry.getValue() == null) {
- continue;
- }
- pageImagesCache.put(entry.getKey().getPrefixedText(),
entry.getValue());
- }
-
((BaseAdapter)searchResultsList.getAdapter()).notifyDataSetInvalidated();
- }
- @Override
- public void onCatch(Throwable caught) {
- // Don't actually do anything.
- // Thumbnails are expendable
+ //cache page thumbnails!
+ for (PageTitle title : results) {
+ if (title.getThumbUrl() == null) {
+ continue;
}
- };
- imagesTask.execute();
+ pageImagesCache.put(title.getPrefixedText(),
title.getThumbUrl());
+ }
}
+
((BaseAdapter)searchResultsList.getAdapter()).notifyDataSetInvalidated();
}
@Override
diff --git
a/wikipedia/src/main/java/org/wikipedia/search/SearchArticlesTask.java
b/wikipedia/src/main/java/org/wikipedia/search/SearchArticlesTask.java
index 1c6d649..3c36fb9 100644
--- a/wikipedia/src/main/java/org/wikipedia/search/SearchArticlesTask.java
+++ b/wikipedia/src/main/java/org/wikipedia/search/SearchArticlesTask.java
@@ -1,8 +1,10 @@
package org.wikipedia.search;
import android.content.Context;
-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.ApiTask;
@@ -11,8 +13,7 @@
import org.wikipedia.Utils;
import org.wikipedia.WikipediaApp;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
public class SearchArticlesTask extends ApiTask<List<PageTitle>> {
private final String prefix;
@@ -29,17 +30,51 @@
@Override
public RequestBuilder buildRequest(Api api) {
- return api.action("opensearch").param("search", prefix).param("limit",
"12");
+ return api.action("query")
+ .param("generator", "prefixsearch")
+ .param("gpssearch", prefix)
+ .param("gpsnamespace", "0")
+ .param("gpslimit", "12")
+ .param("prop", "pageimages")
+ .param("piprop", "thumbnail")
+ .param("pithumbsize", "48")
+ .param("pilimit", "12");
}
@Override
public List<PageTitle> processResult(final ApiResult result) throws
Throwable {
- JSONArray searchResults = result.asArray().optJSONArray(1);
-
ArrayList<PageTitle> pageTitles = new ArrayList<PageTitle>();
- for (int i = 0; i < searchResults.length(); i++) {
- pageTitles.add(new PageTitle(searchResults.optString(i), site));
+ JSONObject data = null;
+ try {
+ data = result.asObject();
+ } catch (ApiException e) {
+ if (e.getCause() instanceof JSONException) {
+ // the only reason for a JSONException is if the response is
an empty array.
+ return pageTitles;
+ } else {
+ throw new RuntimeException(e);
+ }
}
+ JSONObject query = data.optJSONObject("query");
+ JSONObject pages = query.getJSONObject("pages");
+
+ Iterator<String> keys = pages.keys();
+ while (keys.hasNext()) {
+ String key = keys.next();
+ JSONObject page = pages.getJSONObject(key);
+ String thumbUrl = null;
+ if (page.has("thumbnail")) {
+ thumbUrl = page.getJSONObject("thumbnail").getString("source");
+ }
+ pageTitles.add(new PageTitle(page.getString("title"), site,
thumbUrl));
+ }
+
+ Collections.sort(pageTitles, new Comparator<PageTitle>(){
+ @Override
+ public int compare(PageTitle pageTitle, PageTitle pageTitle2) {
+ return
pageTitle.getDisplayText().compareTo(pageTitle2.getDisplayText());
+ }
+ });
if (WikipediaApp.isWikipediaZeroDevmodeOn()) {
Utils.processHeadersForZero(app, result);
--
To view, visit https://gerrit.wikimedia.org/r/153809
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I44863416a57e03f8f2053685af6e70c012c84830
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits