BearND has uploaded a new change for review.

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

Change subject: Just thumbnail and title for disambig items
......................................................................

Just thumbnail and title for disambig items

Design wants to just display the thumbnail,title, and Wikidata description,
The latter will come in later commit.

Collecting the disambig titles and the link html in JS code
to avoid having to parse the HTML in Java.

Using the title to request page images (thumbnails) of
the disambig items.

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/PageInfoHandler.java
M www/js/actions.js
11 files changed, 203 insertions(+), 83 deletions(-)


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

diff --git a/wikipedia/assets/bundle.js b/wikipedia/assets/bundle.js
index bf925e2..823e22a 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( { "title": links[i].innerHTML, "html": links[i].outerHTML } 
);
     }
     return res;
 }
diff --git a/wikipedia/assets/preview.js b/wikipedia/assets/preview.js
index 4c2d353..160b976 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( { "title": links[i].innerHTML, "html": links[i].outerHTML } 
);
     }
     return res;
 }
diff --git a/wikipedia/res/layout/dialog_page_info.xml 
b/wikipedia/res/layout/dialog_page_info.xml
index 715ee66..65c245f 100644
--- a/wikipedia/res/layout/dialog_page_info.xml
+++ b/wikipedia/res/layout/dialog_page_info.xml
@@ -79,20 +79,12 @@
             android:layout_width="wrap_content"
             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_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..ddea079 100644
--- a/wikipedia/res/layout/item_disambig.xml
+++ b/wikipedia/res/layout/item_disambig.xml
@@ -1,26 +1,50 @@
 <?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:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginLeft="8dp"
-            android:layout_gravity="center_vertical"
-            android:src="@drawable/link" />
+        android:id="@+id/disambig_icon"
+        android:layout_width="@dimen/defaultListItemSize"
+        android:layout_height="@dimen/defaultListItemSize"
+        android:layout_gravity="top"
+        android:contentDescription="@null"
+        android:src="@drawable/ic_pageimage_placeholder"
+        android:scaleType="centerCrop" />
 
-    <TextView
-            android:id="@+id/disambig_text"
-            android:padding="8dp"
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_gravity="top"
+        android:layout_marginBottom="0dp"
+        android:layout_marginLeft="16dp"
+        android:layout_marginRight="16dp"
+        android:layout_marginTop="24dp"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/disambig_title"
             style="?android:textAppearanceMedium"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_gravity="center_vertical"
-            android:textColorLink="?attr/link_color"/>
+            android:textSize="16sp"
+            android:textStyle="bold"
+            android:textColorLink="?attr/link_color" />
 
-</LinearLayout>
+        <!--<TextView-->
+            <!--android:id="@+id/disambig_description"-->
+            <!--style="?android:textAppearanceSmall"-->
+            <!--android:layout_width="match_parent"-->
+            <!--android:layout_height="wrap_content"-->
+            <!--android:textSize="12sp"-->
+            <!--android:ellipsize="end"-->
+            <!--android:maxLines="2"-->
+            <!--android:textColor="@color/reference_text" />-->
+
+    </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..5270d48 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/DisambigListAdapter.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/DisambigListAdapter.java
@@ -1,7 +1,12 @@
 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 com.squareup.picasso.Picasso;
 import android.app.Activity;
 import android.text.Html;
 import android.text.Spannable;
@@ -13,30 +18,78 @@
 import android.widget.ArrayAdapter;
 import android.widget.ImageView;
 import android.widget.TextView;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 
 /**
  *
  */
-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 LinkMovementMethodExt movementMethod;
+    private final WikipediaApp app;
+    private final Site site;
 
     /**
      * 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, 
LinkMovementMethodExt movementMethod) {
         super(activity, 0, items);
         this.activity = activity;
         this.items = items;
         this.movementMethod = movementMethod;
+        app = (WikipediaApp) getContext().getApplicationContext();
+        site = app.getPrimarySite();
+        requestPageImages();
+    }
+
+    private void requestPageImages() {
+        List<PageTitle> titleList = new ArrayList<PageTitle>();
+        for (DisambigResult r : items) {
+            if (pageImagesCache.get(r.getTitleString()) == null) {
+                // not in our cache yet
+                titleList.add(new PageTitle(r.getTitleString(), site));
+            }
+        }
+        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();
     }
 
     class ViewHolder {
         private ImageView icon;
-        private TextView text;
+        private TextView title;
     }
 
     @Override
@@ -51,18 +104,31 @@
             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);
             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());
+        DisambigResult item = items[position];
+        holder.title.setText(Html.fromHtml(item.getHtml()));
+        holder.title.setMovementMethod(movementMethod);
+        stripUnderlines(holder.title);
+
+        String thumbnail = pageImagesCache.get(item.getTitleString());
+        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..e4a3696
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikipedia/page/DisambigResult.java
@@ -0,0 +1,19 @@
+package org.wikipedia.page;
+
+public class DisambigResult {
+    private final String titleString;
+    private final String html;
+
+    public DisambigResult(String titleString, String html) {
+        this.titleString = titleString;
+        this.html = html;
+    }
+
+    public String getTitleString() {
+        return titleString;
+    }
+
+    public String getHtml() {
+        return html;
+    }
+}
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/PageInfoHandler.java 
b/wikipedia/src/main/java/org/wikipedia/page/PageInfoHandler.java
index ece0850..7eb323e 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/PageInfoHandler.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/PageInfoHandler.java
@@ -2,6 +2,7 @@
 
 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;
@@ -39,7 +40,7 @@
     @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);
             dialog.show();
@@ -53,6 +54,18 @@
         }
     }
 
+    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++) {
+            JSONObject object = array.getJSONObject(i);
+            stringArray[i] = new DisambigResult(object.getString("title"), 
object.getString("html"));
+        }
+        return stringArray;
+    }
+
     abstract LinkHandler getLinkHandler();
 
     abstract int getDialogHeight();
diff --git a/www/js/actions.js b/www/js/actions.js
index 1ba8269..225b63a 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( { "title": links[i].innerHTML, "html": links[i].outerHTML } 
);
     }
     return res;
 }

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic06de893a4ff6aa3faad57d7999ebf5f74b82d0a
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: BearND <bsitzm...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to