diff --git a/res/values-v11/style.xml b/res/values-v11/style.xml
index 70a8c8fd..c4d8934f 100644
--- a/res/values-v11/style.xml
+++ b/res/values-v11/style.xml
@@ -21,6 +21,7 @@
- #ffffff
- #909090
- @android:color/secondary_text_light
+ - #008000
- #30B0E0
- @android:color/white
@@ -61,6 +62,7 @@
- @android:color/white
- @android:color/secondary_text_dark
- @android:color/black
+ - #00FF00
- @color/ics_cyan
- @android:color/black
diff --git a/res/values-v15/style.xml b/res/values-v15/style.xml
index c51b1844..9d331377 100644
--- a/res/values-v15/style.xml
+++ b/res/values-v15/style.xml
@@ -20,6 +20,7 @@
- #ffffff
- #909090
- @android:color/secondary_text_light
+ - #008000
- #30B0E0
- @android:color/white
@@ -65,6 +66,7 @@
- @android:color/white
- @android:color/secondary_text_dark
- @android:color/black
+ - #00FF00
- @color/ics_cyan
- @android:color/black
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index b9d12e12..0338016e 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -20,6 +20,7 @@
+
\ No newline at end of file
diff --git a/res/values/style.xml b/res/values/style.xml
index 3d9afd07..21a3edaa 100644
--- a/res/values/style.xml
+++ b/res/values/style.xml
@@ -21,6 +21,7 @@
- @android:color/primary_text_light
- @android:color/secondary_text_light
- @android:color/secondary_text_light
+ - #008000
- #5858F8
- @android:color/white
@@ -61,6 +62,7 @@
- @android:color/black
- @android:color/secondary_text_dark
- @android:color/black
+ - #00FF00
- #5858F8
- @android:color/black
diff --git a/src/org/fox/ttrss/HeadlinesFragment.java b/src/org/fox/ttrss/HeadlinesFragment.java
index 3001f071..693b39a0 100644
--- a/src/org/fox/ttrss/HeadlinesFragment.java
+++ b/src/org/fox/ttrss/HeadlinesFragment.java
@@ -16,6 +16,8 @@ import org.jsoup.Jsoup;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
+import android.content.res.Resources.Theme;
+import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
@@ -24,6 +26,7 @@ import android.support.v4.app.Fragment;
import android.text.Html;
import android.text.Html.ImageGetter;
import android.util.Log;
+import android.util.TypedValue;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
@@ -534,9 +537,17 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener,
public static final int VIEW_COUNT = VIEW_LOADMORE+1;
+ private final Integer[] origTitleColors = new Integer[VIEW_COUNT];
+ private final int titleHighScoreUnreadColor;
+
public ArticleListAdapter(Context context, int textViewResourceId, ArrayList items) {
super(context, textViewResourceId, items);
this.items = items;
+
+ Theme theme = context.getTheme();
+ TypedValue tv = new TypedValue();
+ theme.resolveAttribute(R.attr.headlineTitleHighScoreUnreadTextColor, tv, true);
+ titleHighScoreUnreadColor = tv.data;
}
public int getViewTypeCount() {
@@ -596,6 +607,7 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener,
if (tt != null) {
tt.setText(Html.fromHtml(article.title));
+ adjustTitleTextView(article.score, article.unread, tt, position);
}
TextView ft = (TextView)v.findViewById(R.id.feed_title);
@@ -727,6 +739,24 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener,
return v;
}
+
+ private void adjustTitleTextView(int score, boolean unread, TextView tv, int position) {
+ int viewType = getItemViewType(position);
+ if (origTitleColors[viewType] == null)
+ // store original color
+ origTitleColors[viewType] = Integer.valueOf(tv.getCurrentTextColor());
+
+ if(score < -100) {
+ tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
+ } else if(score > 500) {
+ if(unread)
+ tv.setTextColor(titleHighScoreUnreadColor);
+ tv.setPaintFlags(tv.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
+ } else {
+ tv.setTextColor(origTitleColors[viewType].intValue());
+ tv.setPaintFlags(tv.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
+ }
+ }
}
diff --git a/src/org/fox/ttrss/offline/OfflineDownloadService.java b/src/org/fox/ttrss/offline/OfflineDownloadService.java
index 2fe87570..78ae6693 100644
--- a/src/org/fox/ttrss/offline/OfflineDownloadService.java
+++ b/src/org/fox/ttrss/offline/OfflineDownloadService.java
@@ -367,8 +367,10 @@ public class OfflineDownloadService extends Service {
m_articles = new Gson().fromJson(content, listType);
SQLiteStatement stmtInsert = getWritableDb().compileStatement("INSERT INTO articles " +
- "("+BaseColumns._ID+", unread, marked, published, updated, is_updated, title, link, feed_id, tags, content) " +
- "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
+ "(" +
+ BaseColumns._ID +
+ ", unread, marked, published, score, updated, is_updated, title, link, feed_id, tags, content) " +
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
for (Article article : m_articles) {
@@ -380,17 +382,19 @@ public class OfflineDownloadService extends Service {
tagsString = tagsString.replaceAll(", $", "");
- stmtInsert.bindLong(1, article.id);
- stmtInsert.bindLong(2, article.unread ? 1 : 0);
- stmtInsert.bindLong(3, article.marked ? 1 : 0);
- stmtInsert.bindLong(4, article.published ? 1 : 0);
- stmtInsert.bindLong(5, article.updated);
- stmtInsert.bindLong(6, article.is_updated ? 1 : 0);
- stmtInsert.bindString(7, article.title);
- stmtInsert.bindString(8, article.link);
- stmtInsert.bindLong(9, article.feed_id);
- stmtInsert.bindString(10, tagsString); // comma-separated tags
- stmtInsert.bindString(11, article.content);
+ int index = 1;
+ stmtInsert.bindLong(index++, article.id);
+ stmtInsert.bindLong(index++, article.unread ? 1 : 0);
+ stmtInsert.bindLong(index++, article.marked ? 1 : 0);
+ stmtInsert.bindLong(index++, article.published ? 1 : 0);
+ stmtInsert.bindLong(index++, article.score);
+ stmtInsert.bindLong(index++, article.updated);
+ stmtInsert.bindLong(index++, article.is_updated ? 1 : 0);
+ stmtInsert.bindString(index++, article.title);
+ stmtInsert.bindString(index++, article.link);
+ stmtInsert.bindLong(index++, article.feed_id);
+ stmtInsert.bindString(index++, tagsString); // comma-separated tags
+ stmtInsert.bindString(index++, article.content);
if (m_downloadImages) {
Document doc = Jsoup.parse(article.content);
diff --git a/src/org/fox/ttrss/offline/OfflineHeadlinesFragment.java b/src/org/fox/ttrss/offline/OfflineHeadlinesFragment.java
index be724eb1..41297a8a 100644
--- a/src/org/fox/ttrss/offline/OfflineHeadlinesFragment.java
+++ b/src/org/fox/ttrss/offline/OfflineHeadlinesFragment.java
@@ -12,8 +12,10 @@ import org.jsoup.Jsoup;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
+import android.content.res.Resources.Theme;
import android.database.Cursor;
import android.database.sqlite.SQLiteStatement;
+import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
@@ -24,6 +26,7 @@ import android.support.v4.widget.SimpleCursorAdapter;
import android.text.Html;
import android.text.Html.ImageGetter;
import android.util.Log;
+import android.util.TypedValue;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
@@ -371,12 +374,6 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
} */
private class ArticleListAdapter extends SimpleCursorAdapter {
- public ArticleListAdapter(Context context, int layout, Cursor c,
- String[] from, int[] to, int flags) {
- super(context, layout, c, from, to, flags);
- // TODO Auto-generated constructor stub
- }
-
public static final int VIEW_NORMAL = 0;
public static final int VIEW_UNREAD = 1;
public static final int VIEW_SELECTED = 2;
@@ -385,7 +382,19 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
public static final int VIEW_COUNT = VIEW_LOADMORE+1;
+ private final Integer[] origTitleColors = new Integer[VIEW_COUNT];
+ private final int titleHighScoreUnreadColor;
+ public ArticleListAdapter(Context context, int layout, Cursor c,
+ String[] from, int[] to, int flags) {
+ super(context, layout, c, from, to, flags);
+
+ Theme theme = context.getTheme();
+ TypedValue tv = new TypedValue();
+ theme.resolveAttribute(R.attr.headlineTitleHighScoreUnreadTextColor, tv, true);
+ titleHighScoreUnreadColor = tv.data;
+ }
+
public int getViewTypeCount() {
return VIEW_COUNT;
}
@@ -444,6 +453,11 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
if (tt != null) {
tt.setText(Html.fromHtml(article.getString(article.getColumnIndex("title"))));
+
+ int scoreIndex = article.getColumnIndex("score");
+ boolean unread = article.getInt(article.getColumnIndex("unread")) == 1;
+ if(scoreIndex >= 0)
+ adjustTitleTextView(article.getInt(scoreIndex), unread, tt, position);
}
TextView ft = (TextView)v.findViewById(R.id.feed_title);
@@ -573,6 +587,24 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
return v;
}
+
+ private void adjustTitleTextView(int score, boolean unread, TextView tv, int position) {
+ int viewType = getItemViewType(position);
+ if (origTitleColors[viewType] == null)
+ // store original color
+ origTitleColors[viewType] = Integer.valueOf(tv.getCurrentTextColor());
+
+ if(score < -100) {
+ tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
+ } else if(score > 500) {
+ if(unread)
+ tv.setTextColor(titleHighScoreUnreadColor);
+ tv.setPaintFlags(tv.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
+ } else {
+ tv.setTextColor(origTitleColors[viewType].intValue());
+ tv.setPaintFlags(tv.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
+ }
+ }
}
public void notifyUpdated() {
diff --git a/src/org/fox/ttrss/types/Article.java b/src/org/fox/ttrss/types/Article.java
index 914a4708..f5053891 100644
--- a/src/org/fox/ttrss/types/Article.java
+++ b/src/org/fox/ttrss/types/Article.java
@@ -12,6 +12,7 @@ public class Article implements Parcelable {
public boolean unread;
public boolean marked;
public boolean published;
+ public int score;
public int updated;
public boolean is_updated;
public String title;
@@ -53,6 +54,7 @@ public class Article implements Parcelable {
out.writeInt(unread ? 1 : 0);
out.writeInt(marked ? 1 : 0);
out.writeInt(published ? 1 : 0);
+ out.writeInt(score);
out.writeInt(updated);
out.writeInt(is_updated ? 1 : 0);
out.writeString(title);
@@ -73,6 +75,7 @@ public class Article implements Parcelable {
unread = in.readInt() == 1;
marked = in.readInt() == 1;
published = in.readInt() == 1;
+ score = in.readInt();
updated = in.readInt();
is_updated = in.readInt() == 1;
title = in.readString();
diff --git a/src/org/fox/ttrss/util/DatabaseHelper.java b/src/org/fox/ttrss/util/DatabaseHelper.java
index cf5380e0..3d64a820 100644
--- a/src/org/fox/ttrss/util/DatabaseHelper.java
+++ b/src/org/fox/ttrss/util/DatabaseHelper.java
@@ -10,7 +10,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
@SuppressWarnings("unused")
private final String TAG = this.getClass().getSimpleName();
public static final String DATABASE_NAME = "OfflineStorage.db";
- public static final int DATABASE_VERSION = 3;
+ public static final int DATABASE_VERSION = 4;
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
@@ -18,11 +18,12 @@ public class DatabaseHelper extends SQLiteOpenHelper {
@Override
public void onCreate(SQLiteDatabase db) {
+ db.execSQL("DROP VIEW IF EXISTS cats_unread;");
+ db.execSQL("DROP VIEW IF EXISTS feeds_unread;");
+ db.execSQL("DROP TRIGGER IF EXISTS articles_set_modified;");
db.execSQL("DROP TABLE IF EXISTS categories;");
db.execSQL("DROP TABLE IF EXISTS feeds;");
db.execSQL("DROP TABLE IF EXISTS articles;");
- db.execSQL("DROP VIEW IF EXISTS feeds_unread;");
- db.execSQL("DROP TRIGGER IF EXISTS articles_set_modified;");
db.execSQL("CREATE TABLE IF NOT EXISTS feeds (" +
BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
@@ -42,6 +43,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
"unread BOOLEAN, " +
"marked BOOLEAN, " +
"published BOOLEAN, " +
+ "score INTEGER, " +
"updated INTEGER, " +
"is_updated BOOLEAN, " +
"title TEXT, " +