Dbrant has submitted this change and it was merged.
Change subject: Disambig items have thumbnail, title, and Wikidata description
......................................................................
Disambig items have thumbnail, title, and Wikidata description
Collecting the disambig titles and the link html in JS code
to avoid having to parse the HTML in Java.
Using page titles to request page images (thumbnails) of
the disambig items.
Using page titles to request wikidata IDs from Wikipedia,
then using the Wikidata IDS to request Wikidata descriptions.
TODO for later:
The page images cache should probably be centralized and refactored.
Change-Id: Ic06de893a4ff6aa3faad57d7999ebf5f74b82d0a
---
M wikipedia/assets/bundle.js
M wikipedia/assets/preview.js
M wikipedia/res/layout/dialog_page_info.xml
M wikipedia/res/layout/item_disambig.xml
M wikipedia/res/layout/item_full_search_result.xml
M wikipedia/res/layout/item_issue.xml
M wikipedia/src/main/java/org/wikipedia/page/DisambigListAdapter.java
A wikipedia/src/main/java/org/wikipedia/page/DisambigResult.java
M wikipedia/src/main/java/org/wikipedia/page/PageInfo.java
M wikipedia/src/main/java/org/wikipedia/page/PageInfoDialog.java
M wikipedia/src/main/java/org/wikipedia/page/PageInfoHandler.java
M wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java
A wikipedia/src/main/java/org/wikipedia/wikidata/WikidataIdsTask.java
M www/js/actions.js
14 files changed, 340 insertions(+), 144 deletions(-)
Approvals:
Dbrant: Looks good to me, approved
diff --git a/wikipedia/assets/bundle.js b/wikipedia/assets/bundle.js
index f10493e..7dc88e8 100644
--- a/wikipedia/assets/bundle.js
+++ b/wikipedia/assets/bundle.js
@@ -106,11 +106,11 @@
function collectDisambig( sourceNode ) {
var res = [];
- var hatnotes = sourceNode.querySelectorAll( 'div.hatnote' );
+ var links = sourceNode.querySelectorAll( 'div.hatnote > a' );
var i = 0,
- len = hatnotes.length;
+ len = links.length;
for (; i < len; i++) {
- res.push( hatnotes[i].innerHTML );
+ res.push( links[i].innerHTML );
}
return res;
}
diff --git a/wikipedia/assets/preview.js b/wikipedia/assets/preview.js
index 30dbc81..898b749 100644
--- a/wikipedia/assets/preview.js
+++ b/wikipedia/assets/preview.js
@@ -106,11 +106,11 @@
function collectDisambig( sourceNode ) {
var res = [];
- var hatnotes = sourceNode.querySelectorAll( 'div.hatnote' );
+ var links = sourceNode.querySelectorAll( 'div.hatnote > a' );
var i = 0,
- len = hatnotes.length;
+ len = links.length;
for (; i < len; i++) {
- res.push( hatnotes[i].innerHTML );
+ res.push( links[i].innerHTML );
}
return res;
}
diff --git a/wikipedia/res/layout/dialog_page_info.xml
b/wikipedia/res/layout/dialog_page_info.xml
index 715ee66..74ff9c2 100644
--- a/wikipedia/res/layout/dialog_page_info.xml
+++ b/wikipedia/res/layout/dialog_page_info.xml
@@ -76,23 +76,13 @@
>
<ListView
android:id="@+id/disambig_list"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_gravity="start"
- android:paddingBottom="0dp"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:paddingTop="0dp"
/>
<ListView
android:id="@+id/page_issues_list"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_gravity="start"
- android:paddingBottom="0dp"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:paddingTop="0dp"
/>
</ViewFlipper>
diff --git a/wikipedia/res/layout/item_disambig.xml
b/wikipedia/res/layout/item_disambig.xml
index 2645ead..2e335ab 100644
--- a/wikipedia/res/layout/item_disambig.xml
+++ b/wikipedia/res/layout/item_disambig.xml
@@ -1,26 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:padding="8dp">
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@drawable/selectable_item_background"
+ android:orientation="horizontal">
<ImageView
- android:id="@+id/disambig_icon"
+ android:id="@+id/disambig_icon"
+ android:layout_width="@dimen/defaultListItemSize"
+ android:layout_height="@dimen/defaultListItemSize"
+ android:layout_gravity="top"
+ android:contentDescription="@null"
+ android:scaleType="centerCrop"
+ android:src="@drawable/ic_pageimage_placeholder" />
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top"
+ android:layout_marginBottom="6dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
+ android:layout_marginTop="6dp"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/disambig_title"
+ style="?android:textAppearanceMedium"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ <TextView
+ android:id="@+id/disambig_description"
+ style="?android:textAppearanceSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginLeft="8dp"
- android:layout_gravity="center_vertical"
- android:src="@drawable/link" />
+ android:layout_marginTop="0dp"
+ android:ellipsize="end"
+ android:maxLines="3"
+ android:textColor="@color/reference_text" />
- <TextView
- android:id="@+id/disambig_text"
- android:padding="8dp"
- style="?android:textAppearanceMedium"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:textColorLink="?attr/link_color"/>
+ </LinearLayout>
-</LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/wikipedia/res/layout/item_full_search_result.xml
b/wikipedia/res/layout/item_full_search_result.xml
index f1a60b6..c706f81 100644
--- a/wikipedia/res/layout/item_full_search_result.xml
+++ b/wikipedia/res/layout/item_full_search_result.xml
@@ -1,43 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="@dimen/defaultListItemSize"
- android:background="@drawable/selectable_item_background">
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/defaultListItemSize"
+ android:background="@drawable/selectable_item_background"
+ android:orientation="horizontal">
- <ImageView android:id="@+id/result_image"
- android:layout_width="@dimen/defaultListItemSize"
- android:layout_height="match_parent"
- android:layout_gravity="top"
- android:scaleType="centerCrop"
- android:contentDescription="@null"
- />
+ <ImageView
+ android:id="@+id/result_image"
+ android:layout_width="@dimen/defaultListItemSize"
+ android:layout_height="match_parent"
+ android:layout_gravity="top"
+ android:contentDescription="@null"
+ android:scaleType="centerCrop" />
+
<LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top"
+ android:layout_marginBottom="6dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
+ android:layout_marginTop="6dp"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/result_title"
+ style="?android:textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_marginTop="6dp"
- android:layout_marginBottom="6dp"
- android:layout_marginLeft="8dp"
- android:layout_marginRight="8dp"
- android:layout_gravity="top"
- >
- <TextView android:id="@+id/result_title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- style="?android:textAppearanceMedium"
- android:maxLines="2"
- android:ellipsize="middle"
- />
- <TextView android:id="@+id/result_description"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textColor="@color/reference_text"
- style="?android:textAppearanceSmall"
- android:maxLines="2"
- android:ellipsize="end"
- />
+ android:ellipsize="middle"
+ android:maxLines="2" />
+
+ <TextView
+ android:id="@+id/result_description"
+ style="?android:textAppearanceSmall"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:maxLines="2"
+ android:textColor="@color/reference_text" />
</LinearLayout>
diff --git a/wikipedia/res/layout/item_issue.xml
b/wikipedia/res/layout/item_issue.xml
index 029802d..42c1c94 100644
--- a/wikipedia/res/layout/item_issue.xml
+++ b/wikipedia/res/layout/item_issue.xml
@@ -4,14 +4,18 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
- android:padding="8dp">
+ android:paddingBottom="16dp"
+ android:paddingLeft="24dp"
+ android:paddingRight="24dp"
+ android:paddingTop="16dp">
<ImageView
android:id="@+id/issue_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
- android:src="@drawable/ic_flag" />
+ android:src="@drawable/ic_flag"
+ android:contentDescription="@null" />
<LinearLayout
android:orientation="vertical"
diff --git
a/wikipedia/src/main/java/org/wikipedia/page/DisambigListAdapter.java
b/wikipedia/src/main/java/org/wikipedia/page/DisambigListAdapter.java
index ed27f5b..0eb8b7b 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/DisambigListAdapter.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/DisambigListAdapter.java
@@ -1,42 +1,157 @@
package org.wikipedia.page;
+import org.wikipedia.PageTitle;
+import org.wikipedia.ParcelableLruCache;
import org.wikipedia.R;
+import org.wikipedia.Site;
import org.wikipedia.WikipediaApp;
+import org.wikipedia.pageimages.PageImagesTask;
+import org.wikipedia.wikidata.WikidataCache;
+import org.wikipedia.wikidata.WikidataIdsTask;
+import com.squareup.picasso.Picasso;
import android.app.Activity;
-import android.text.Html;
-import android.text.Spannable;
-import android.text.TextPaint;
-import android.text.style.URLSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
/**
- *
+ * ListAdapter for disambiguation items.
*/
-class DisambigListAdapter extends ArrayAdapter<String> {
+class DisambigListAdapter extends ArrayAdapter<DisambigResult> {
+ private static final int MAX_CACHE_SIZE_IMAGES = 24;
+ private final ParcelableLruCache<String> pageImagesCache
+ = new ParcelableLruCache<String>(MAX_CACHE_SIZE_IMAGES,
String.class);
private final Activity activity;
- private final String[] items;
- private LinkMovementMethodExt movementMethod;
+ private final DisambigResult[] items;
+ private final WikipediaApp app;
+ private final Site site;
+ private final Map<PageTitle, String> titleWikidataIdMap = new
HashMap<PageTitle, String>();
+ private final WikidataCache wikidataCache;
/**
* Constructor
* @param activity The current activity.
* @param items The objects to represent in the ListView.
*/
- public DisambigListAdapter(Activity activity, String[] items,
LinkMovementMethodExt movementMethod) {
+ public DisambigListAdapter(Activity activity, DisambigResult[] items) {
super(activity, 0, items);
this.activity = activity;
this.items = items;
- this.movementMethod = movementMethod;
+ app = (WikipediaApp) getContext().getApplicationContext();
+ site = app.getPrimarySite();
+ requestPageImages();
+ wikidataCache = app.getWikidataCache();
+ fetchWikiDataIds();
+ }
+
+ private void requestPageImages() {
+ List<PageTitle> titleList = new ArrayList<PageTitle>();
+ for (DisambigResult r : items) {
+ if (pageImagesCache.get(r.getTitle().getPrefixedText()) == null) {
+ // not in our cache yet
+ titleList.add(r.getTitle());
+ }
+ }
+ if (titleList.isEmpty()) {
+ return;
+ }
+
+ PageImagesTask imagesTask = new PageImagesTask(
+ app.getAPIForSite(site),
+ site,
+ titleList,
+ (int)(WikipediaApp.PREFERRED_THUMB_SIZE *
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());
+ }
+ notifyDataSetInvalidated();
+ }
+
+ @Override
+ public void onCatch(Throwable caught) {
+ // Don't actually do anything.
+ // Thumbnails are expendable
+ }
+ };
+ imagesTask.execute();
+ }
+
+ /**
+ * Start getting Wikidata ID, so that we can request Wikidata descriptions.
+ */
+ private void fetchWikiDataIds() {
+ List<PageTitle> titleList = new ArrayList<PageTitle>();
+ for (DisambigResult r : items) {
+ titleList.add(r.getTitle());
+ }
+ if (titleList.isEmpty()) {
+ return;
+ }
+
+ WikidataIdsTask wikidataIdsTask = new WikidataIdsTask(
+ app.getAPIForSite(site),
+ site,
+ titleList) {
+ @Override
+ public void onFinish(Map<PageTitle, String> result) {
+ List<String> wikidataIds = new
ArrayList<String>(result.size());
+ for (Map.Entry<PageTitle, String> entry : result.entrySet()) {
+ if (entry.getValue() == null) {
+ continue;
+ }
+ titleWikidataIdMap.put(entry.getKey(), entry.getValue());
+ wikidataIds.add(entry.getValue());
+ }
+ fetchWikiDataDescription(wikidataIds);
+ }
+
+ @Override
+ public void onCatch(Throwable caught) {
+ // Don't actually do anything.
+ // Thumbnails are expendable
+ }
+ };
+ wikidataIdsTask.execute();
+ }
+
+ /**
+ * Start the task of fetching the WikiData description for our page, if it
has one.
+ * This should be done after the lead image view is laid out, but can be
done independently
+ * of loading the WebView contents.
+ */
+ private void fetchWikiDataDescription(final List<String> wikiDataIds) {
+ if (!wikiDataIds.isEmpty()) {
+ wikidataCache.get(wikiDataIds,
+ new WikidataCache.OnWikidataReceiveListener() {
+ @Override
+ public void onWikidataReceived(Map<String, String>
result) {
+ notifyDataSetChanged();
+ }
+
+ @Override
+ public void onWikidataFailed(Throwable caught) {
+ // don't care
+ }
+ });
+ }
}
class ViewHolder {
private ImageView icon;
- private TextView text;
+ private TextView title;
+ private TextView description;
}
@Override
@@ -51,37 +166,47 @@
convertView = inflater.inflate(R.layout.item_disambig, null);
holder = new ViewHolder();
holder.icon = (ImageView)
convertView.findViewById(R.id.disambig_icon);
- holder.text = (TextView)
convertView.findViewById(R.id.disambig_text);
+ holder.title = (TextView)
convertView.findViewById(R.id.disambig_title);
+ holder.description = (TextView)
convertView.findViewById(R.id.disambig_description);
convertView.setTag(holder);
} else {
// view already defined, retrieve view holder
holder = (ViewHolder) convertView.getTag();
}
- holder.text.setText(Html.fromHtml(items[position]));
- holder.text.setMovementMethod(movementMethod);
- stripUnderlines(holder.text);
- final WikipediaApp app = (WikipediaApp)
activity.getApplicationContext();
- app.adjustLinkDrawableToTheme(holder.icon.getDrawable());
- return convertView;
- }
+ final DisambigResult item = items[position];
+ holder.title.setText(item.getTitle().getPrefixedText());
- private void stripUnderlines(TextView textView) {
- Spannable s = (Spannable)textView.getText();
- URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
- for (URLSpan span: spans) {
- int start = s.getSpanStart(span);
- int end = s.getSpanEnd(span);
- s.removeSpan(span);
- span = new URLSpan(span.getURL()) {
- @Override
- public void updateDrawState(TextPaint ds) {
- super.updateDrawState(ds);
- ds.setUnderlineText(false);
- }
- };
- s.setSpan(span, start, end, 0);
+// convertView.setOnClickListener(new View.OnClickListener() {
+// @Override
+// public void onClick(View v) {
+// PageTitle title = item.getTitle();
+// HistoryEntry historyEntry = new HistoryEntry(title,
HistoryEntry.SOURCE_INTERNAL_LINK);
+//// dismiss();
+//// activity.displayNewPage(title, historyEntry);
+// }
+// });
+
+ String description = null;
+ String wikidataId = titleWikidataIdMap.get(item.getTitle());
+ if (wikidataId != null) {
+ description = wikidataCache.get(wikidataId);
}
- textView.setText(s);
+ holder.description.setText(description);
+
+ String thumbnail =
pageImagesCache.get(item.getTitle().getPrefixedText());
+ if (thumbnail == null) {
+ Picasso.with(parent.getContext())
+ .load(R.drawable.ic_pageimage_placeholder)
+ .into(holder.icon);
+ } else {
+ Picasso.with(parent.getContext())
+ .load(thumbnail)
+ .placeholder(R.drawable.ic_pageimage_placeholder)
+ .error(R.drawable.ic_pageimage_placeholder)
+ .into(holder.icon);
+ }
+
+ return convertView;
}
}
diff --git a/wikipedia/src/main/java/org/wikipedia/page/DisambigResult.java
b/wikipedia/src/main/java/org/wikipedia/page/DisambigResult.java
new file mode 100644
index 0000000..83d3695
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikipedia/page/DisambigResult.java
@@ -0,0 +1,15 @@
+package org.wikipedia.page;
+
+import org.wikipedia.PageTitle;
+
+public class DisambigResult {
+ private final PageTitle title;
+
+ public DisambigResult(PageTitle title) {
+ this.title = title;
+ }
+
+ public PageTitle getTitle() {
+ return title;
+ }
+}
diff --git a/wikipedia/src/main/java/org/wikipedia/page/PageInfo.java
b/wikipedia/src/main/java/org/wikipedia/page/PageInfo.java
index 31f12c7..afe274b 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/PageInfo.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/PageInfo.java
@@ -1,18 +1,18 @@
package org.wikipedia.page;
/**
- *
+ * Holds information about disambigs and page issues for a page.
*/
public class PageInfo {
- private final String[] disambigs;
+ private final DisambigResult[] disambigs;
private final String[] issues;
- public PageInfo(String[] disambigs, String[] issues) {
+ public PageInfo(DisambigResult[] disambigs, String[] issues) {
this.disambigs = disambigs;
this.issues = issues;
}
- public String[] getDisambigs() {
+ public DisambigResult[] getDisambigs() {
return disambigs;
}
diff --git a/wikipedia/src/main/java/org/wikipedia/page/PageInfoDialog.java
b/wikipedia/src/main/java/org/wikipedia/page/PageInfoDialog.java
index 8006e31..5654253 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/PageInfoDialog.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/PageInfoDialog.java
@@ -1,9 +1,12 @@
package org.wikipedia.page;
+import org.wikipedia.PageTitle;
import org.wikipedia.R;
-import android.app.Activity;
+import org.wikipedia.history.HistoryEntry;
+import org.wikipedia.search.FullSearchResult;
import android.graphics.Typeface;
import android.view.View;
+import android.widget.AdapterView;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.TextView;
@@ -17,12 +20,12 @@
private final TextView disambigHeading;
private final TextView issuesHeading;
- PageInfoDialog(Activity activity, PageInfo pageInfo, int height,
LinkMovementMethodExt movementMethod) {
+ PageInfoDialog(final PageActivity activity, PageInfo pageInfo, int height)
{
super(activity, R.layout.dialog_page_info);
View parentView = getDialogLayout();
flipper = (ViewFlipper)
parentView.findViewById(R.id.page_info_flipper);
- ListView disambigList = (ListView)
parentView.findViewById(R.id.disambig_list);
+ final ListView disambigList = (ListView)
parentView.findViewById(R.id.disambig_list);
ListView issuesList = (ListView)
parentView.findViewById(R.id.page_issues_list);
disambigHeading = (TextView)
parentView.findViewById(R.id.page_info_similar_titles_heading);
issuesHeading = (TextView)
parentView.findViewById(R.id.page_info_page_issues_heading);
@@ -36,12 +39,21 @@
}
});
-// parentView.setMinimumHeight(height);
parentView.setLayoutParams(new
FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, height));
- disambigList.setAdapter(new DisambigListAdapter(activity,
pageInfo.getDisambigs(), movementMethod));
+ disambigList.setAdapter(new DisambigListAdapter(activity,
pageInfo.getDisambigs()));
issuesList.setAdapter(new IssuesListAdapter(activity,
pageInfo.getIssues()));
+ disambigList.setOnItemClickListener(new
AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int
position, long id) {
+ PageTitle title = ((FullSearchResult)
disambigList.getAdapter().getItem(position)).getTitle();
+ HistoryEntry historyEntry = new HistoryEntry(title,
HistoryEntry.SOURCE_INTERNAL_LINK);
+ dismiss();
+ activity.displayNewPage(title, historyEntry);
+ }
+ });
+
if (pageInfo.getDisambigs().length > 0) {
disambigHeading.setOnClickListener(new View.OnClickListener() {
@Override
diff --git a/wikipedia/src/main/java/org/wikipedia/page/PageInfoHandler.java
b/wikipedia/src/main/java/org/wikipedia/page/PageInfoHandler.java
index ece0850..58eeba8 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/PageInfoHandler.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/PageInfoHandler.java
@@ -1,13 +1,12 @@
package org.wikipedia.page;
+import org.wikipedia.PageTitle;
+import org.wikipedia.Site;
import org.wikipedia.Utils;
import org.wikipedia.bridge.CommunicationBridge;
+import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
-import android.app.Activity;
-import android.text.Spannable;
-import android.view.MotionEvent;
-import android.widget.TextView;
/**
* A handler for both disambiguation and page issues information.
@@ -15,33 +14,23 @@
* When clicked it shows the PageInfoDialog with the respective list.
*/
abstract class PageInfoHandler implements CommunicationBridge.JSEventListener {
- private final Activity activity;
- private PageInfoDialog dialog;
+ private final PageActivity activity;
+ private final Site site;
- PageInfoHandler(Activity activity, CommunicationBridge bridge) {
+ PageInfoHandler(PageActivity activity, CommunicationBridge bridge, Site
site) {
this.activity = activity;
+ this.site = site;
bridge.addListener("disambigClicked", this);
bridge.addListener("issuesClicked", this);
}
-
- private LinkMovementMethodExt movementMethod = new
LinkMovementMethodExt(getLinkHandler()) {
- @Override
- public boolean onTouchEvent(final TextView widget, final Spannable
buffer, final MotionEvent event) {
- boolean ret = super.onTouchEvent(widget, buffer, event);
- if (ret && event.getAction() == MotionEvent.ACTION_UP) {
- dialog.dismiss();
- }
- return ret;
- }
- };
// message from JS bridge:
@Override
public void onMessage(String messageType, JSONObject messagePayload) {
try {
- PageInfo info = new
PageInfo(Utils.jsonArrayToStringArray(messagePayload.getJSONArray("hatnotes")),
+ PageInfo info = new
PageInfo(parseDisambigJson(messagePayload.getJSONArray("hatnotes")),
Utils.jsonArrayToStringArray(messagePayload.getJSONArray("issues")));
- dialog = new PageInfoDialog(activity, info, getDialogHeight(),
movementMethod);
+ PageInfoDialog dialog = new PageInfoDialog(activity, info,
getDialogHeight());
dialog.show();
if ("disambigClicked".equals(messageType)) {
dialog.showDisambig();
@@ -53,7 +42,16 @@
}
}
- abstract LinkHandler getLinkHandler();
+ private DisambigResult[] parseDisambigJson(JSONArray array) throws
JSONException {
+ if (array == null) {
+ return null;
+ }
+ DisambigResult[] stringArray = new DisambigResult[array.length()];
+ for (int i = 0; i < array.length(); i++) {
+ stringArray[i] = new DisambigResult(new
PageTitle(array.getString(i), site));
+ }
+ return stringArray;
+ }
abstract int getDialogHeight();
}
diff --git
a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java
b/wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java
index 0d48321..14f6eb7 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java
@@ -347,12 +347,7 @@
}
};
- new PageInfoHandler(getActivity(), bridge) {
- @Override
- LinkHandler getLinkHandler() {
- return linkHandler;
- }
-
+ new PageInfoHandler(getActivity(), bridge, title.getSite()) {
@Override
int getDialogHeight() {
// could have scrolled up a bit but the page info links must
still be visible else they couldn't have been clicked
diff --git
a/wikipedia/src/main/java/org/wikipedia/wikidata/WikidataIdsTask.java
b/wikipedia/src/main/java/org/wikipedia/wikidata/WikidataIdsTask.java
new file mode 100644
index 0000000..c606c85
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikipedia/wikidata/WikidataIdsTask.java
@@ -0,0 +1,35 @@
+package org.wikipedia.wikidata;
+
+import org.wikipedia.PageQueryTask;
+import org.wikipedia.PageTitle;
+import org.wikipedia.Site;
+import org.mediawiki.api.json.Api;
+import org.mediawiki.api.json.RequestBuilder;
+import org.json.JSONObject;
+import java.util.List;
+
+/**
+ * Retrieves Wikidata IDs from Wikipedia: PageTitles -> Wikidata IDs.
+ */
+public class WikidataIdsTask extends PageQueryTask<String> {
+
+ public WikidataIdsTask(Api api, Site site, List<PageTitle> titles) {
+ super(LOW_CONCURRENCY, api, site, titles);
+ }
+
+ @Override
+ public void buildQueryParams(RequestBuilder builder) {
+ builder.param("prop", "pageprops")
+ .param("ppprop", "wikibase_item");
+ }
+
+ @Override
+ public String processPage(int pageId, PageTitle pageTitle, JSONObject
pageData) throws Throwable {
+ JSONObject pageProps = pageData.optJSONObject("pageprops");
+ if (pageProps == null) {
+ return null;
+ } else {
+ return pageProps.optString("wikibase_item");
+ }
+ }
+}
diff --git a/www/js/actions.js b/www/js/actions.js
index 01c3037..dfcda0c 100644
--- a/www/js/actions.js
+++ b/www/js/actions.js
@@ -105,11 +105,11 @@
function collectDisambig( sourceNode ) {
var res = [];
- var hatnotes = sourceNode.querySelectorAll( 'div.hatnote' );
+ var links = sourceNode.querySelectorAll( 'div.hatnote > a' );
var i = 0,
- len = hatnotes.length;
+ len = links.length;
for (; i < len; i++) {
- res.push( hatnotes[i].innerHTML );
+ res.push( links[i].innerHTML );
}
return res;
}
--
To view, visit https://gerrit.wikimedia.org/r/171876
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Ic06de893a4ff6aa3faad57d7999ebf5f74b82d0a
Gerrit-PatchSet: 5
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: BearND <[email protected]>
Gerrit-Reviewer: Dbrant <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits