diff --git a/clients/android/NewsBlur/src/com/newsblur/fragment/ReadingItemFragment.java b/clients/android/NewsBlur/src/com/newsblur/fragment/ReadingItemFragment.java
index 74e2f2586..9fc0b0025 100644
--- a/clients/android/NewsBlur/src/com/newsblur/fragment/ReadingItemFragment.java
+++ b/clients/android/NewsBlur/src/com/newsblur/fragment/ReadingItemFragment.java
@@ -340,7 +340,9 @@ public class ReadingItemFragment extends NbFragment implements ClassifierDialogF
itemFeed.setText(feedTitle);
}
- itemTitle.setText(UIUtils.fromHtml(story.title));
+ String title = story.title;
+ title = UIUtils.colourTitleFromClassifier(title, classifier);
+ itemTitle.setText(UIUtils.fromHtml(title));
itemDate.setText(StoryUtils.formatLongDate(getActivity(), new Date(story.timestamp)));
if (!TextUtils.isEmpty(story.authors)) {
diff --git a/clients/android/NewsBlur/src/com/newsblur/util/UIUtils.java b/clients/android/NewsBlur/src/com/newsblur/util/UIUtils.java
index 95f3e5a8f..fbae80eff 100644
--- a/clients/android/NewsBlur/src/com/newsblur/util/UIUtils.java
+++ b/clients/android/NewsBlur/src/com/newsblur/util/UIUtils.java
@@ -1,5 +1,7 @@
package com.newsblur.util;
+import java.util.Map;
+
import static android.graphics.Bitmap.Config.ARGB_8888;
import android.app.Activity;
@@ -16,6 +18,7 @@ import android.os.Build;
import android.os.Handler;
import android.util.Log;
import android.text.Html;
+import android.text.Spanned;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
@@ -26,6 +29,7 @@ import android.widget.Toast;
import com.newsblur.R;
import com.newsblur.activity.*;
+import com.newsblur.domain.Classifier;
public class UIUtils {
@@ -267,13 +271,32 @@ public class UIUtils {
// API 24 introduced a more customizable impl of fromHtml but also *immediately* deprecated the
// default version in the same release, so it is necessary to wrap this is plat-specific helper
@SuppressWarnings("deprecation")
- public static CharSequence fromHtml(String html) {
+ public static Spanned fromHtml(String html) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- return Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY).toString();
+ return Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY);
} else {
- return Html.fromHtml(html).toString();
+ return Html.fromHtml(html);
}
}
-
+
+ private static final String POSIT_HILITE_FORMAT = "%s";
+ private static final String NEGAT_HILITE_FORMAT = "%s";
+
+ /**
+ * Alter a story title string to highlight intel training hits as positive or negative based
+ * upon the associated classifier, using markup that can quickly be parsed by fromHtml.
+ */
+ public static String colourTitleFromClassifier(String title, Classifier c) {
+ String result = title;
+ for (Map.Entry rule : c.title.entrySet()) {
+ if (rule.getValue() > 0) {
+ result = result.replaceAll(rule.getKey(), String.format(POSIT_HILITE_FORMAT, rule.getKey()));
+ }
+ if (rule.getValue() < 0) {
+ result = result.replaceAll(rule.getKey(), String.format(NEGAT_HILITE_FORMAT, rule.getKey()));
+ }
+ }
+ return result;
+ }
}