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, " +