BearND has uploaded a new change for review.

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

Change subject: [WIP] Show page issues
......................................................................

[WIP] Show page issues

Add a link to a page that has issues.
When it's pressed show a dialog with the issues.

Change-Id: Ibd3054cc3e7142447de8d35021a006fbccd12bb9
---
A icon-svgs/32/ic_flag.svg
M wikipedia/assets/bundle.js
M wikipedia/assets/preview.js
A wikipedia/res/drawable-hdpi/ic_flag.png
A wikipedia/res/drawable-ldpi/ic_flag.png
A wikipedia/res/drawable-ldrtl-hdpi/ic_flag.png
A wikipedia/res/drawable-ldrtl-ldpi/ic_flag.png
A wikipedia/res/drawable-ldrtl-mdpi/ic_flag.png
A wikipedia/res/drawable-ldrtl-xhdpi/ic_flag.png
A wikipedia/res/drawable-ldrtl-xxhdpi/ic_flag.png
A wikipedia/res/drawable-mdpi/ic_flag.png
A wikipedia/res/drawable-xhdpi/ic_flag.png
A wikipedia/res/drawable-xxhdpi/ic_flag.png
A wikipedia/res/layout/dialog_issues.xml
A wikipedia/res/layout/item_issue.xml
M wikipedia/res/values-qq/strings.xml
M wikipedia/res/values/color.xml
M wikipedia/res/values/strings.xml
M wikipedia/src/main/java/org/wikipedia/Utils.java
M wikipedia/src/main/java/org/wikipedia/WikipediaApp.java
A wikipedia/src/main/java/org/wikipedia/page/IssuesHandler.java
M wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java
M www/Gruntfile.js
M www/js/actions.js
A www/js/issues.js
M www/js/sections.js
26 files changed, 335 insertions(+), 58 deletions(-)


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

diff --git a/icon-svgs/32/ic_flag.svg b/icon-svgs/32/ic_flag.svg
new file mode 100644
index 0000000..2494112
--- /dev/null
+++ b/icon-svgs/32/ic_flag.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.0.2, SVG Export Plug-In . SVG Version: 
6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd";>
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg"; 
xmlns:xlink="http://www.w3.org/1999/xlink"; x="0px" y="0px"
+        width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 
0 0 32 32" xml:space="preserve">
+<path 
d="M16.569,6.62c-5.162-2.593-9.306-2.23-9.306-2.23v23.193c0,0,1.939,0.339,1.939-0.848c0-1.188,0-9.888,0-9.888
+       
c1.115-0.364,3.054-0.679,7.392,2.133c5.574,3.272,8.143-0.994,8.143-0.994V5.626C24.711,5.627,21.755,9.092,16.569,6.62z"/>
+</svg>
diff --git a/wikipedia/assets/bundle.js b/wikipedia/assets/bundle.js
index 1817830..0c8f4fc 100644
--- a/wikipedia/assets/bundle.js
+++ b/wikipedia/assets/bundle.js
@@ -26,6 +26,40 @@
         }
         curNode = curNode.parentNode;
     }
+
+    function collectIssues( sourceNode ) {
+        var res = [];
+        var issues = sourceNode.parentNode.querySelectorAll( 'table.ambox' );
+        var i = 0,
+            len = issues.length;
+        for (; i < len; i++) {
+            // .ambox- is used e.g. on eswiki
+            res.push( issues[i].querySelector( '.mbox-text, .ambox-text' 
).innerHTML );
+        }
+
+        bridge.sendMessage( 'issuesClicked', { "issues": res } );
+    }
+
+    function handleReference( targetId ) {
+        var target = document.getElementById(targetId);
+        if ( target === null ) {
+            console.log( "reference target not found: " + targetId );
+        } else if ( href.slice(0, 10) === "#cite_note" ) {
+            try {
+                var refTexts = target.getElementsByClassName( "reference-text" 
);
+                if (refTexts.length > 0) {
+                    target = refTexts[0];
+                }
+                bridge.sendMessage( 'referenceClicked', { "ref": 
target.innerHTML } );
+            } catch (e) {
+                target.scrollIntoView();
+            }
+        } else {
+            // If it is a link to an anchor in the current page, just scroll 
to it
+            target.scrollIntoView();
+        }
+    }
+
     if (sourceNode) {
         if ( sourceNode.hasAttribute( "data-action" ) ) {
             var action = sourceNode.getAttribute( "data-action" );
@@ -37,22 +71,10 @@
             var href = sourceNode.getAttribute( "href" );
             if ( href[0] === "#" ) {
                 var targetId = href.slice(1);
-                var target = document.getElementById( targetId );
-                if ( target === null ) {
-                    console.log( "reference target not found: " + targetId );
-                } else if ( href.slice(0, 10) === "#cite_note" ) {
-                    try {
-                        var refTexts = target.getElementsByClassName( 
"reference-text" );
-                        if ( refTexts.length > 0 ) {
-                            target = refTexts[0];
-                        }
-                        bridge.sendMessage( 'referenceClicked', { "ref": 
target.innerHTML } );
-                    } catch (e) {
-                        target.scrollIntoView();
-                    }
+                if ( "issues" === targetId ) {
+                    collectIssues( sourceNode );
                 } else {
-                    // If it is a link to an anchor in the current page, just 
scroll to it
-                    target.scrollIntoView();
+                    handleReference( targetId );
                 }
             } else {
                 bridge.sendMessage( 'linkClicked', { "href": href } );
@@ -112,6 +134,29 @@
 } );
 
 },{"./actions":1,"./bridge":2}],4:[function(require,module,exports){
+var transformer = require('./transformer');
+
+transformer.register( 'displayIssuesLink', function( content ) {
+    var issues = content.querySelectorAll( "table.ambox" );
+    if ( issues.length > 0 ) {
+        var el = issues[0];
+        var wrapper = document.createElement( 'div' );
+        var link = document.createElement( 'a' );
+        link.setAttribute( 'href', '#issues') ;
+        link.innerHTML = 'Issues';
+        wrapper.appendChild( link );
+        el.parentNode.replaceChild( wrapper, el );
+
+        var i = 0,
+            len = issues.length;
+        for (; i < len; i++) {
+            wrapper.appendChild( issues[i] );
+        }
+    }
+    return content;
+} );
+
+},{"./transformer":10}],5:[function(require,module,exports){
 var bridge = require( "./bridge" );
 
 function addStyleLink( href ) {
@@ -133,7 +178,7 @@
 module.exports = {
        addStyleLink: addStyleLink
 };
-},{"./bridge":2}],5:[function(require,module,exports){
+},{"./bridge":2}],6:[function(require,module,exports){
 var bridge = require( "./bridge" );
 bridge.registerListener( "displayAttribution", function( payload ) {
     var directionality = document.getElementsByTagName( "html" 
)[0].classList.contains( "ui-rtl" ) ? "rtl" : "ltr";
@@ -200,7 +245,7 @@
 
 } );
 
-},{"./bridge":2}],6:[function(require,module,exports){
+},{"./bridge":2}],7:[function(require,module,exports){
 var parseCSSColor = require("../lib/js/css-color-parser");
 var bridge = require("./bridge");
 var loader = require("./loader");
@@ -279,7 +324,7 @@
        invertElement: invertElement
 };
 
-},{"../lib/js/css-color-parser":12,"./bridge":2,"./loader":4}],7:[function(require,module,exports){
+},{"../lib/js/css-color-parser":13,"./bridge":2,"./loader":5}],8:[function(require,module,exports){
 var bridge = require("./bridge");
 
 bridge.registerListener( "setDirectionality", function( payload ) {
@@ -289,7 +334,7 @@
     html.classList.add( "ui-" + payload.uiDirection );
 } );
 
-},{"./bridge":2}],8:[function(require,module,exports){
+},{"./bridge":2}],9:[function(require,module,exports){
 var bridge = require("./bridge");
 var transformer = require("./transformer");
 
@@ -319,6 +364,7 @@
     content.id = "#content_block_0";
     content = transformer.transform( "leadSection", content );
     content = transformer.transform( "section", content );
+    content = transformer.transform( "displayIssuesLink", content );
     document.getElementById( "content" ).appendChild( content );
 
     document.getElementById( "loading_sections").className = "loading";
@@ -419,7 +465,7 @@
     bridge.sendMessage( "currentSectionResponse", { sectionID: 
getCurrentSection() } );
 } );
 
-},{"./bridge":2,"./transformer":9}],9:[function(require,module,exports){
+},{"./bridge":2,"./transformer":10}],10:[function(require,module,exports){
 function Transformer() {
 }
 
@@ -443,7 +489,7 @@
 
 module.exports = new Transformer();
 
-},{}],10:[function(require,module,exports){
+},{}],11:[function(require,module,exports){
 var transformer = require("./transformer");
 var night = require("./night");
 
@@ -481,7 +527,7 @@
        return content;
 } );
 
-},{"./night":6,"./transformer":9}],11:[function(require,module,exports){
+},{"./night":7,"./transformer":10}],12:[function(require,module,exports){
 /**
  * MIT LICENSCE
  * From: https://github.com/remy/polyfills
@@ -558,7 +604,7 @@
 
 })();
 
-},{}],12:[function(require,module,exports){
+},{}],13:[function(require,module,exports){
 // (c) Dean McNamee <[email protected]>, 2012.
 //
 // https://github.com/deanm/css-color-parser-js
@@ -760,4 +806,4 @@
 
 try { module.exports = parseCSSColor } catch(e) { }
 
-},{}]},{},[4,12,5,6,9,10,2,1,3,8,7,11])
\ No newline at end of file
+},{}]},{},[5,13,6,7,10,11,2,1,3,4,9,8,12])
\ No newline at end of file
diff --git a/wikipedia/assets/preview.js b/wikipedia/assets/preview.js
index 83fd816..b0dedb6 100644
--- a/wikipedia/assets/preview.js
+++ b/wikipedia/assets/preview.js
@@ -26,6 +26,40 @@
         }
         curNode = curNode.parentNode;
     }
+
+    function collectIssues( sourceNode ) {
+        var res = [];
+        var issues = sourceNode.parentNode.querySelectorAll( 'table.ambox' );
+        var i = 0,
+            len = issues.length;
+        for (; i < len; i++) {
+            // .ambox- is used e.g. on eswiki
+            res.push( issues[i].querySelector( '.mbox-text, .ambox-text' 
).innerHTML );
+        }
+
+        bridge.sendMessage( 'issuesClicked', { "issues": res } );
+    }
+
+    function handleReference( targetId ) {
+        var target = document.getElementById(targetId);
+        if ( target === null ) {
+            console.log( "reference target not found: " + targetId );
+        } else if ( href.slice(0, 10) === "#cite_note" ) {
+            try {
+                var refTexts = target.getElementsByClassName( "reference-text" 
);
+                if (refTexts.length > 0) {
+                    target = refTexts[0];
+                }
+                bridge.sendMessage( 'referenceClicked', { "ref": 
target.innerHTML } );
+            } catch (e) {
+                target.scrollIntoView();
+            }
+        } else {
+            // If it is a link to an anchor in the current page, just scroll 
to it
+            target.scrollIntoView();
+        }
+    }
+
     if (sourceNode) {
         if ( sourceNode.hasAttribute( "data-action" ) ) {
             var action = sourceNode.getAttribute( "data-action" );
@@ -37,22 +71,10 @@
             var href = sourceNode.getAttribute( "href" );
             if ( href[0] === "#" ) {
                 var targetId = href.slice(1);
-                var target = document.getElementById( targetId );
-                if ( target === null ) {
-                    console.log( "reference target not found: " + targetId );
-                } else if ( href.slice(0, 10) === "#cite_note" ) {
-                    try {
-                        var refTexts = target.getElementsByClassName( 
"reference-text" );
-                        if ( refTexts.length > 0 ) {
-                            target = refTexts[0];
-                        }
-                        bridge.sendMessage( 'referenceClicked', { "ref": 
target.innerHTML } );
-                    } catch (e) {
-                        target.scrollIntoView();
-                    }
+                if ( "issues" === targetId ) {
+                    collectIssues( sourceNode );
                 } else {
-                    // If it is a link to an anchor in the current page, just 
scroll to it
-                    target.scrollIntoView();
+                    handleReference( targetId );
                 }
             } else {
                 bridge.sendMessage( 'linkClicked', { "href": href } );
diff --git a/wikipedia/res/drawable-hdpi/ic_flag.png 
b/wikipedia/res/drawable-hdpi/ic_flag.png
new file mode 100644
index 0000000..e00898c
--- /dev/null
+++ b/wikipedia/res/drawable-hdpi/ic_flag.png
Binary files differ
diff --git a/wikipedia/res/drawable-ldpi/ic_flag.png 
b/wikipedia/res/drawable-ldpi/ic_flag.png
new file mode 100644
index 0000000..250d105
--- /dev/null
+++ b/wikipedia/res/drawable-ldpi/ic_flag.png
Binary files differ
diff --git a/wikipedia/res/drawable-ldrtl-hdpi/ic_flag.png 
b/wikipedia/res/drawable-ldrtl-hdpi/ic_flag.png
new file mode 100644
index 0000000..6a56544
--- /dev/null
+++ b/wikipedia/res/drawable-ldrtl-hdpi/ic_flag.png
Binary files differ
diff --git a/wikipedia/res/drawable-ldrtl-ldpi/ic_flag.png 
b/wikipedia/res/drawable-ldrtl-ldpi/ic_flag.png
new file mode 100644
index 0000000..61167f0
--- /dev/null
+++ b/wikipedia/res/drawable-ldrtl-ldpi/ic_flag.png
Binary files differ
diff --git a/wikipedia/res/drawable-ldrtl-mdpi/ic_flag.png 
b/wikipedia/res/drawable-ldrtl-mdpi/ic_flag.png
new file mode 100644
index 0000000..631e677
--- /dev/null
+++ b/wikipedia/res/drawable-ldrtl-mdpi/ic_flag.png
Binary files differ
diff --git a/wikipedia/res/drawable-ldrtl-xhdpi/ic_flag.png 
b/wikipedia/res/drawable-ldrtl-xhdpi/ic_flag.png
new file mode 100644
index 0000000..02f6035
--- /dev/null
+++ b/wikipedia/res/drawable-ldrtl-xhdpi/ic_flag.png
Binary files differ
diff --git a/wikipedia/res/drawable-ldrtl-xxhdpi/ic_flag.png 
b/wikipedia/res/drawable-ldrtl-xxhdpi/ic_flag.png
new file mode 100644
index 0000000..322812b
--- /dev/null
+++ b/wikipedia/res/drawable-ldrtl-xxhdpi/ic_flag.png
Binary files differ
diff --git a/wikipedia/res/drawable-mdpi/ic_flag.png 
b/wikipedia/res/drawable-mdpi/ic_flag.png
new file mode 100644
index 0000000..9ef1b71
--- /dev/null
+++ b/wikipedia/res/drawable-mdpi/ic_flag.png
Binary files differ
diff --git a/wikipedia/res/drawable-xhdpi/ic_flag.png 
b/wikipedia/res/drawable-xhdpi/ic_flag.png
new file mode 100644
index 0000000..5fdfe6b
--- /dev/null
+++ b/wikipedia/res/drawable-xhdpi/ic_flag.png
Binary files differ
diff --git a/wikipedia/res/drawable-xxhdpi/ic_flag.png 
b/wikipedia/res/drawable-xxhdpi/ic_flag.png
new file mode 100644
index 0000000..65a3c9c
--- /dev/null
+++ b/wikipedia/res/drawable-xxhdpi/ic_flag.png
Binary files differ
diff --git a/wikipedia/res/layout/dialog_issues.xml 
b/wikipedia/res/layout/dialog_issues.xml
new file mode 100644
index 0000000..1067352
--- /dev/null
+++ b/wikipedia/res/layout/dialog_issues.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<ListView xmlns:android="http://schemas.android.com/apk/res/android";
+    android:id="@+id/list"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"/>
diff --git a/wikipedia/res/layout/item_issue.xml 
b/wikipedia/res/layout/item_issue.xml
new file mode 100644
index 0000000..046e60e
--- /dev/null
+++ b/wikipedia/res/layout/item_issue.xml
@@ -0,0 +1,25 @@
+<?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">
+
+    <ImageView
+        android:id="@+id/issues_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="8dp"
+        android:layout_marginLeft="8dp"
+        android:src="@drawable/ic_flag" />
+
+    <TextView
+        android:id="@+id/issue_text"
+        style="?android:textAppearanceMedium"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:padding="8dp" />
+
+</LinearLayout>
diff --git a/wikipedia/res/values-qq/strings.xml 
b/wikipedia/res/values-qq/strings.xml
index c5646c9..a2a44c9 100644
--- a/wikipedia/res/values-qq/strings.xml
+++ b/wikipedia/res/values-qq/strings.xml
@@ -273,6 +273,7 @@
   <string name="abusefilter_title_disallow">Message that informs the user that 
their edit is not allowed, and that the user must go back and modify the 
edit.</string>
   <string name="abusefilter_text_warn">Explanation of why the edit may be 
flagged as unconstructive: Typing in all caps, Blanking articles or Spamming, 
Irrelevant external links or images, Repeating characters</string>
   <string name="abusefilter_text_disallow">Explanation of why the edit was not 
allowed: potentially unconstructive, or potential vandalism.</string>
+  <string name="dialog_page_issues">Dialog title for page/article issues 
list</string>
   <string name="menu_themechooser">Menu item for choosing text size and color 
scheme</string>
   <string name="text_size_select">Label that describes text size 
selection</string>
   <string name="color_theme_select">Label that describes color theme 
selection</string>
diff --git a/wikipedia/res/values/color.xml b/wikipedia/res/values/color.xml
index e8d28e1..54612b9 100644
--- a/wikipedia/res/values/color.xml
+++ b/wikipedia/res/values/color.xml
@@ -26,6 +26,7 @@
     <color name="gray_highlight">#ff808080</color>
 
     <color name="link_light">#ff347BFF</color>
+    <color name="button_light">#ff777777</color>
     <color name="window_background_light">#fff2f2f2</color>
     <color name="actionbar_background_light">#ffffffff</color>
     <color name="search_background_light">#ffffffff</color>
@@ -35,6 +36,7 @@
     <color name="edit_text_light">#ff000000</color>
 
     <color name="link_dark">#ff2B6FB2</color>
+    <color name="button_dark">#ff2B6FB2</color>
     <color name="window_background_dark">#ff000000</color>
     <color name="actionbar_background_dark">#ff303030</color>
     <color name="search_background_dark">#ff404040</color>
@@ -50,4 +52,4 @@
     <color name="holo_green_light">#ff99cc00</color>
     <color name="holo_red_dark">#ffcc0000</color>
     <color name="primary_text_holo_light">#ff000000</color>
-</resources>
\ No newline at end of file
+</resources>
diff --git a/wikipedia/res/values/strings.xml b/wikipedia/res/values/strings.xml
index 0268e93..f10d270 100644
--- a/wikipedia/res/values/strings.xml
+++ b/wikipedia/res/values/strings.xml
@@ -204,6 +204,7 @@
     <string name="abusefilter_title_disallow">You cannot save this edit. 
Please go back and change it.</string>
     <string name="abusefilter_text_warn"><![CDATA[An automated filter has 
identified this edit as potentially unconstructive. It may contain one or more 
of the following:<br /><br />· Typing in all caps<br />· Blanking articles or 
spamming<br />· Irrelevant external links or images<br />· Repeating 
characters]]></string>
     <string name="abusefilter_text_disallow"><![CDATA[An automated filter has 
identified this edit as potentially unconstructive, or potential vandalism.<br 
/><br />Wikipedia is an encyclopedia and only neutral, notable content belongs 
here.]]></string>
+    <string name="dialog_page_issues">Page Issues</string>
     <string name="menu_themechooser">Font and theme</string>
     <string name="text_size_select">Font size</string>
     <string name="color_theme_select">Theme</string>
diff --git a/wikipedia/src/main/java/org/wikipedia/Utils.java 
b/wikipedia/src/main/java/org/wikipedia/Utils.java
index 65b5425..a3c43fc 100644
--- a/wikipedia/src/main/java/org/wikipedia/Utils.java
+++ b/wikipedia/src/main/java/org/wikipedia/Utils.java
@@ -29,6 +29,7 @@
 import android.widget.EditText;
 import android.widget.Toast;
 import com.squareup.otto.Bus;
+import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.mediawiki.api.json.ApiResult;
@@ -553,6 +554,23 @@
     }
 
     /**
+     * Convert a JSONArray object to a String Array.
+     *
+     * @param array a JSONArray containing only Strings
+     * @return a String[] with all the items in the JSONArray
+     */
+    public static String[] jsonArrayToStringArray(JSONArray array) {
+        if (array == null) {
+            return null;
+        }
+        String[] stringArray = new String[array.length()];
+        for (int i = 0; i < array.length(); i++) {
+            stringArray[i] = array.optString(i);
+        }
+        return stringArray;
+    }
+
+    /**
      * Resolves a potentially protocol relative URL to a 'full' URL
      *
      * @param url Url to check for (and fix) protocol relativeness
diff --git a/wikipedia/src/main/java/org/wikipedia/WikipediaApp.java 
b/wikipedia/src/main/java/org/wikipedia/WikipediaApp.java
index 1c050d1..afc1c09 100644
--- a/wikipedia/src/main/java/org/wikipedia/WikipediaApp.java
+++ b/wikipedia/src/main/java/org/wikipedia/WikipediaApp.java
@@ -449,6 +449,19 @@
         }
     }
 
+    /**
+     * Make adjustments to a link or button Drawable object to look better in 
the current theme.
+     * (e.g. apply a blue color filter for night mode, )
+     * @param d Drawable to be adjusted.
+     */
+    public void adjustLinkDrawableToTheme(Drawable d) {
+        if (getCurrentTheme() == THEME_DARK) {
+            d.setColorFilter(getResources().getColor(R.color.button_dark), 
PorterDuff.Mode.SRC_ATOP);
+        } else {
+            d.setColorFilter(getResources().getColor(R.color.button_light), 
PorterDuff.Mode.SRC_ATOP);
+        }
+    }
+
     public int getFontSizeMultiplier() {
         SharedPreferences prefs = 
PreferenceManager.getDefaultSharedPreferences(this);
         return prefs.getInt(WikipediaApp.PREFERENCE_TEXT_SIZE_MULTIPLIER, 0);
diff --git a/wikipedia/src/main/java/org/wikipedia/page/IssuesHandler.java 
b/wikipedia/src/main/java/org/wikipedia/page/IssuesHandler.java
new file mode 100644
index 0000000..d9a9461
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikipedia/page/IssuesHandler.java
@@ -0,0 +1,85 @@
+package org.wikipedia.page;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.text.Html;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.ListAdapter;
+import android.widget.TextView;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.wikipedia.R;
+import org.wikipedia.Utils;
+import org.wikipedia.WikipediaApp;
+import org.wikipedia.bridge.CommunicationBridge;
+
+/**
+ * Handles the #issues links coming from a {@link 
org.wikipedia.page.PageViewFragment}.
+ * Shows a dialog with a list of issues when the issues link is clicked.
+ */
+public class IssuesHandler implements CommunicationBridge.JSEventListener {
+
+    private final Activity activity;
+
+    public IssuesHandler(final Activity activity, CommunicationBridge bridge) {
+        this.activity = activity;
+        bridge.addListener("issuesClicked", this);
+    }
+
+    // message from JS bridge:
+    @Override
+    public void onMessage(String messageType, JSONObject messagePayload) {
+        try {
+            
show(Utils.jsonArrayToStringArray(messagePayload.getJSONArray("issues")));
+        } catch (JSONException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void show(final String[] items) {
+        final WikipediaApp app = (WikipediaApp) 
activity.getApplicationContext();
+
+        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+        ListAdapter adapter = new ArrayAdapter<String>(activity, 0, items) {
+
+            private ViewHolder holder;
+
+            class ViewHolder {
+                private ImageView icon;
+                private TextView title;
+            }
+
+            public View getView(int position, View convertView, ViewGroup 
parent) {
+                LayoutInflater inflater = activity.getLayoutInflater();
+
+                if (convertView == null) {
+                    convertView = inflater.inflate(R.layout.item_issue, null);
+
+                    holder = new ViewHolder();
+                    holder.icon = (ImageView) 
convertView.findViewById(R.id.issues_icon);
+                    holder.title = (TextView) 
convertView.findViewById(R.id.issue_text);
+                    convertView.setTag(holder);
+                } else {
+                    // view already defined, retrieve view holder
+                    holder = (ViewHolder) convertView.getTag();
+                }
+
+                final String issueText = items[position].replaceAll(" 
href\\s*=", " x=");
+                holder.title.setText(Html.fromHtml(issueText));
+
+//                holder.icon.setImageResource(icons[position]);
+                app.adjustLinkDrawableToTheme(holder.icon.getDrawable());
+                return convertView;
+            }
+        };
+
+        builder.setAdapter(adapter, null);
+        builder.setTitle(R.string.dialog_page_issues);
+
+        builder.create().show();
+    }
+}
diff --git a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java 
b/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java
index 8193eca..cca11dc 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/PageViewFragment.java
@@ -120,13 +120,14 @@
     private View pageDoesNotExistError;
     private DisableableDrawerLayout tocDrawer;
     private View pageFragmentContainer;
-    private ReferenceDialog referenceDialog;
     private Page page;
     private HistoryEntry curEntry;
 
     private CommunicationBridge bridge;
     private LinkHandler linkHandler;
     private ReferenceHandler referenceHandler;
+    private ReferenceDialog referenceDialog;
+    private IssuesHandler issuesHandler;
     private EditHandler editHandler;
     private NightModeHandler nightModeHandler;
 
@@ -342,6 +343,8 @@
             }
         };
 
+        issuesHandler = new IssuesHandler(getActivity(), bridge);
+
         api = 
((WikipediaApp)getActivity().getApplicationContext()).getAPIForSite(title.getSite());
 
         
bridge.injectStyleBundle(app.getStyleLoader().getAvailableBundle(StyleLoader.BUNDLE_PAGEVIEW,
 title.getSite()));
@@ -521,6 +524,7 @@
                 Log.d("PageViewFragment", "Detached from activity, so stopping 
update.");
                 return;
             }
+
             page = new Page(title, (ArrayList<Section>) result, 
pageProperties);
             editHandler.setPage(page);
             displayLeadSection();
diff --git a/www/Gruntfile.js b/www/Gruntfile.js
index f27e762..842da08 100644
--- a/www/Gruntfile.js
+++ b/www/Gruntfile.js
@@ -6,6 +6,7 @@
         "js/bridge.js",
         "js/actions.js",
         "js/editaction.js",
+        "js/issues.js",
         "js/sections.js",
         "js/rtlsupport.js",
         "lib/js/classList.js",
@@ -27,14 +28,15 @@
                 files: {
                     "bundle.js": [
                         "js/loader.js",
-                                               "lib/js/css-color-parser.js",
+                        "lib/js/css-color-parser.js",
                         "js/main.js",
-                                               "js/night.js",
+                        "js/night.js",
                         "js/transformer.js",
                         "js/transforms.js",
                         "js/bridge.js",
                         "js/actions.js",
                         "js/editaction.js",
+                        "js/issues.js",
                         "js/sections.js",
                         "js/rtlsupport.js"
                     ].concat( oldDroidPolyfills ),
diff --git a/www/js/actions.js b/www/js/actions.js
index 71c098e..c207c95 100644
--- a/www/js/actions.js
+++ b/www/js/actions.js
@@ -25,6 +25,40 @@
         }
         curNode = curNode.parentNode;
     }
+
+    function collectIssues( sourceNode ) {
+        var res = [];
+        var issues = sourceNode.parentNode.querySelectorAll( 'table.ambox' );
+        var i = 0,
+            len = issues.length;
+        for (; i < len; i++) {
+            // .ambox- is used e.g. on eswiki
+            res.push( issues[i].querySelector( '.mbox-text, .ambox-text' 
).innerHTML );
+        }
+
+        bridge.sendMessage( 'issuesClicked', { "issues": res } );
+    }
+
+    function handleReference( targetId ) {
+        var target = document.getElementById(targetId);
+        if ( target === null ) {
+            console.log( "reference target not found: " + targetId );
+        } else if ( href.slice(0, 10) === "#cite_note" ) {
+            try {
+                var refTexts = target.getElementsByClassName( "reference-text" 
);
+                if (refTexts.length > 0) {
+                    target = refTexts[0];
+                }
+                bridge.sendMessage( 'referenceClicked', { "ref": 
target.innerHTML } );
+            } catch (e) {
+                target.scrollIntoView();
+            }
+        } else {
+            // If it is a link to an anchor in the current page, just scroll 
to it
+            target.scrollIntoView();
+        }
+    }
+
     if (sourceNode) {
         if ( sourceNode.hasAttribute( "data-action" ) ) {
             var action = sourceNode.getAttribute( "data-action" );
@@ -36,22 +70,10 @@
             var href = sourceNode.getAttribute( "href" );
             if ( href[0] === "#" ) {
                 var targetId = href.slice(1);
-                var target = document.getElementById( targetId );
-                if ( target === null ) {
-                    console.log( "reference target not found: " + targetId );
-                } else if ( href.slice(0, 10) === "#cite_note" ) {
-                    try {
-                        var refTexts = target.getElementsByClassName( 
"reference-text" );
-                        if ( refTexts.length > 0 ) {
-                            target = refTexts[0];
-                        }
-                        bridge.sendMessage( 'referenceClicked', { "ref": 
target.innerHTML } );
-                    } catch (e) {
-                        target.scrollIntoView();
-                    }
+                if ( "issues" === targetId ) {
+                    collectIssues( sourceNode );
                 } else {
-                    // If it is a link to an anchor in the current page, just 
scroll to it
-                    target.scrollIntoView();
+                    handleReference( targetId );
                 }
             } else {
                 bridge.sendMessage( 'linkClicked', { "href": href } );
diff --git a/www/js/issues.js b/www/js/issues.js
new file mode 100644
index 0000000..4637776
--- /dev/null
+++ b/www/js/issues.js
@@ -0,0 +1,21 @@
+var transformer = require('./transformer');
+
+transformer.register( 'displayIssuesLink', function( content ) {
+    var issues = content.querySelectorAll( "table.ambox" );
+    if ( issues.length > 0 ) {
+        var el = issues[0];
+        var wrapper = document.createElement( 'div' );
+        var link = document.createElement( 'a' );
+        link.setAttribute( 'href', '#issues') ;
+        link.innerHTML = 'Issues';
+        wrapper.appendChild( link );
+        el.parentNode.replaceChild( wrapper, el );
+
+        var i = 0,
+            len = issues.length;
+        for (; i < len; i++) {
+            wrapper.appendChild( issues[i] );
+        }
+    }
+    return content;
+} );
diff --git a/www/js/sections.js b/www/js/sections.js
index 66bbc2c..27c6dee 100644
--- a/www/js/sections.js
+++ b/www/js/sections.js
@@ -27,6 +27,7 @@
     content.id = "#content_block_0";
     content = transformer.transform( "leadSection", content );
     content = transformer.transform( "section", content );
+    content = transformer.transform( "displayIssuesLink", content );
     document.getElementById( "content" ).appendChild( content );
 
     document.getElementById( "loading_sections").className = "loading";

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibd3054cc3e7142447de8d35021a006fbccd12bb9
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: BearND <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to