From 7d425df6f28d1f27d13797c30e3122d66c66a94a Mon Sep 17 00:00:00 2001 From: dosiecki Date: Fri, 23 Feb 2018 07:06:38 -0800 Subject: [PATCH] flesh out grid view items --- .../res/drawable-nodpi/item_border.xml | 17 +++ .../NewsBlur/res/layout/view_story_tile.xml | 118 ++++++++++++--- clients/android/NewsBlur/res/values/attrs.xml | 9 +- .../android/NewsBlur/res/values/colors.xml | 2 +- .../src/com/newsblur/activity/ItemsList.java | 21 +-- .../newsblur/database/BlurDatabaseHelper.java | 1 + .../newsblur/database/StoryViewAdapter.java | 141 ++++++++++++------ .../newsblur/fragment/ItemGridFragment.java | 13 +- .../newsblur/fragment/ItemListFragment.java | 5 - .../newsblur/fragment/ItemSetFragment.java | 7 +- .../com/newsblur/service/NBSyncService.java | 31 ++-- .../src/com/newsblur/util/UIUtils.java | 13 ++ .../newsblur/view/SquaredRelativeLayout.java | 20 ++- 13 files changed, 295 insertions(+), 103 deletions(-) create mode 100644 clients/android/NewsBlur/res/drawable-nodpi/item_border.xml diff --git a/clients/android/NewsBlur/res/drawable-nodpi/item_border.xml b/clients/android/NewsBlur/res/drawable-nodpi/item_border.xml new file mode 100644 index 000000000..2b2a40e52 --- /dev/null +++ b/clients/android/NewsBlur/res/drawable-nodpi/item_border.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/clients/android/NewsBlur/res/layout/view_story_tile.xml b/clients/android/NewsBlur/res/layout/view_story_tile.xml index 32bc1a39c..41c4bd885 100644 --- a/clients/android/NewsBlur/res/layout/view_story_tile.xml +++ b/clients/android/NewsBlur/res/layout/view_story_tile.xml @@ -1,38 +1,122 @@ - - + + + + + + + + + + + + + + diff --git a/clients/android/NewsBlur/res/values/attrs.xml b/clients/android/NewsBlur/res/values/attrs.xml index e042efa42..bc504ed65 100644 --- a/clients/android/NewsBlur/res/values/attrs.xml +++ b/clients/android/NewsBlur/res/values/attrs.xml @@ -1,7 +1,5 @@ - - @@ -41,8 +39,15 @@ + + + + + + + diff --git a/clients/android/NewsBlur/res/values/colors.xml b/clients/android/NewsBlur/res/values/colors.xml index b1a9d75c1..d621fa9a9 100644 --- a/clients/android/NewsBlur/res/values/colors.xml +++ b/clients/android/NewsBlur/res/values/colors.xml @@ -59,7 +59,7 @@ #4C4C4C #606060 - #F7F8F5 + @color/gray55 #424242 #BDBDBD #404040 diff --git a/clients/android/NewsBlur/src/com/newsblur/activity/ItemsList.java b/clients/android/NewsBlur/src/com/newsblur/activity/ItemsList.java index bc2471fc4..1bbc6718a 100644 --- a/clients/android/NewsBlur/src/com/newsblur/activity/ItemsList.java +++ b/clients/android/NewsBlur/src/com/newsblur/activity/ItemsList.java @@ -265,32 +265,35 @@ public abstract class ItemsList extends NbActivity implements StoryOrderChangedL } fs.setSearchQuery(q); if (!TextUtils.equals(q, oldQuery)) { + NBSyncService.resetReadingSession(); + FeedUtils.prepareReadingSession(fs); + triggerSync(); itemSetFragment.resetEmptyState(); itemSetFragment.hasUpdated(); itemSetFragment.scrollToTop(); - NBSyncService.resetReadingSession(); - NBSyncService.resetFetchState(fs); } } @Override public void storyOrderChanged(StoryOrder newValue) { updateStoryOrderPreference(newValue); - itemSetFragment.resetEmptyState(); - itemSetFragment.hasUpdated(); - itemSetFragment.scrollToTop(); - NBSyncService.resetFetchState(fs); - triggerSync(); + restartReadingSession(); } @Override public void readFilterChanged(ReadFilter newValue) { updateReadFilterPreference(newValue); + restartReadingSession(); + } + + private void restartReadingSession() { + NBSyncService.resetFetchState(fs); + NBSyncService.resetReadingSession(); + FeedUtils.prepareReadingSession(fs); + triggerSync(); itemSetFragment.resetEmptyState(); itemSetFragment.hasUpdated(); itemSetFragment.scrollToTop(); - NBSyncService.resetFetchState(fs); - triggerSync(); } // NB: this callback is for the text size slider diff --git a/clients/android/NewsBlur/src/com/newsblur/database/BlurDatabaseHelper.java b/clients/android/NewsBlur/src/com/newsblur/database/BlurDatabaseHelper.java index 7f0e55c14..4ff39ed19 100644 --- a/clients/android/NewsBlur/src/com/newsblur/database/BlurDatabaseHelper.java +++ b/clients/android/NewsBlur/src/com/newsblur/database/BlurDatabaseHelper.java @@ -1125,6 +1125,7 @@ public class BlurDatabaseHelper { } public void clearStorySession() { + com.newsblur.util.Log.i(this, "reading session reset"); synchronized (RW_MUTEX) {dbRW.delete(DatabaseConstants.READING_SESSION_TABLE, null, null);} } diff --git a/clients/android/NewsBlur/src/com/newsblur/database/StoryViewAdapter.java b/clients/android/NewsBlur/src/com/newsblur/database/StoryViewAdapter.java index fd207f01c..bd795c230 100644 --- a/clients/android/NewsBlur/src/com/newsblur/database/StoryViewAdapter.java +++ b/clients/android/NewsBlur/src/com/newsblur/database/StoryViewAdapter.java @@ -44,7 +44,9 @@ public class StoryViewAdapter extends RecyclerView.Adapter 0) { + vh.intelDot.setImageResource(R.drawable.g_icn_focus); + } else if (score == 0) { + vh.intelDot.setImageResource(R.drawable.g_icn_unread); + } else { + vh.intelDot.setImageResource(R.drawable.g_icn_hidden); + } + } else { + vh.intelDot.setImageResource(android.R.color.transparent); + } + vh.storyTitleView.setText(UIUtils.fromHtml(story.title)); + vh.storyDate.setText(StoryUtils.formatShortDate(context, new Date(story.timestamp))); // lists with mixed feeds get added info, but single feeds do not if (!singleFeed) { String faviconUrl = cursor.getString(cursor.getColumnIndex(DatabaseConstants.FEED_FAVICON_URL)); FeedUtils.iconLoader.displayImage(faviconUrl, vh.feedIconView, 0, false); + vh.feedTitleView.setText(cursor.getString(cursor.getColumnIndex(DatabaseConstants.FEED_TITLE))); + vh.feedIconView.setVisibility(View.VISIBLE); + vh.feedTitleView.setVisibility(View.VISIBLE); } else { vh.feedIconView.setVisibility(View.GONE); + vh.feedTitleView.setVisibility(View.GONE); } - // dynamic text sizing - vh.storyTitleView.setTextSize(textSize * defaultTextSize_story_item_title); - - // read/unread fading - if (this.ignoreReadStatus || (! story.read)) { - vh.thumbView.setImageAlpha(255); - vh.feedIconView.setImageAlpha(255); - vh.storyTitleView.setAlpha(1.0f); - vh.storyTitleView.setTypeface(null, Typeface.BOLD); + if (vh.story.starred) { + vh.savedView.setVisibility(View.VISIBLE); } else { - vh.thumbView.setImageAlpha(READ_STORY_ALPHA_B255); - vh.feedIconView.setImageAlpha(READ_STORY_ALPHA_B255); - vh.storyTitleView.setAlpha(READ_STORY_ALPHA); - vh.storyTitleView.setTypeface(null, Typeface.NORMAL); + vh.savedView.setVisibility(View.GONE); } - /* boolean shared = false; findshareloop: for (String userId : story.sharedUserIds) { if (TextUtils.equals(userId, user.id)) { @@ -263,7 +279,38 @@ public class StoryViewAdapter extends RecyclerView.Adapter 0)) { fleuronFooter.setVisibility(View.VISIBLE); } } @@ -210,11 +210,11 @@ public class ItemGridFragment extends ItemSetFragment { int totalCount = layoutManager.getItemCount(); int visibleCount = layoutManager.getChildCount(); int lastVisible = layoutManager.findLastVisibleItemPosition(); - //com.newsblur.util.Log.d(this, String.format("SCROLL total:%d bound:%d last%d", totalCount, visibleCount, lastVisible)); - // load an extra page or two worth of stories past the viewport - int desiredStoryCount = lastVisible + (visibleCount*2) + 1; + // load an extra page worth of stories past the viewport plus at least two rows to prime the height calc + int desiredStoryCount = lastVisible + (visibleCount*2) + (GRID_COLUMN_COUNT*2); triggerRefresh(desiredStoryCount, totalCount); + //com.newsblur.util.Log.d(this, String.format(" total:%d bound:%d last%d desire:%d", totalCount, visibleCount, lastVisible, desiredStoryCount)); // TODO: mark on scroll? } @@ -233,6 +233,7 @@ public class ItemGridFragment extends ItemSetFragment { @Override protected void updateAdapter(Cursor cursor) { adapter.swapCursor(cursor); + adapter.updateFeedSet(getFeedSet()); adapter.notifyDataSetChanged(); if (cursor.getCount() > 0) { emptyView.setVisibility(View.INVISIBLE); @@ -245,10 +246,6 @@ public class ItemGridFragment extends ItemSetFragment { ensureSufficientStories(); } - @Override - protected void resetAdapter() { - } - @Override protected void setShowNone(boolean showNone) { adapter.setShowNone(showNone); diff --git a/clients/android/NewsBlur/src/com/newsblur/fragment/ItemListFragment.java b/clients/android/NewsBlur/src/com/newsblur/fragment/ItemListFragment.java index d11d11365..6e48e819c 100644 --- a/clients/android/NewsBlur/src/com/newsblur/fragment/ItemListFragment.java +++ b/clients/android/NewsBlur/src/com/newsblur/fragment/ItemListFragment.java @@ -247,11 +247,6 @@ public class ItemListFragment extends ItemSetFragment implements OnScrollListene adapter.swapCursor(cursor); } - @Override - protected void resetAdapter() { - //if (adapter != null) adapter.notifyDataSetInvalidated(); - } - @Override protected void setShowNone(boolean showNone) { adapter.setShowNone(showNone); diff --git a/clients/android/NewsBlur/src/com/newsblur/fragment/ItemSetFragment.java b/clients/android/NewsBlur/src/com/newsblur/fragment/ItemSetFragment.java index 4bafbeb5e..b3f80b6be 100644 --- a/clients/android/NewsBlur/src/com/newsblur/fragment/ItemSetFragment.java +++ b/clients/android/NewsBlur/src/com/newsblur/fragment/ItemSetFragment.java @@ -84,9 +84,8 @@ public abstract class ItemSetFragment extends NbFragment implements LoaderManage * Indicate that the DB was cleared. */ public void resetEmptyState() { - resetAdapter(); + setShowNone(true); cursorSeenYet = false; - FeedUtils.dbHelper.clearStorySession(); } public abstract void setLoading(boolean isLoading); @@ -162,13 +161,11 @@ public abstract class ItemSetFragment extends NbFragment implements LoaderManage protected abstract void updateAdapter(Cursor cursor); - protected abstract void resetAdapter(); - protected abstract void setShowNone(boolean showNone); @Override public void onLoaderReset(Loader loader) { - resetAdapter(); + ; } public abstract void setTextSize(Float size); diff --git a/clients/android/NewsBlur/src/com/newsblur/service/NBSyncService.java b/clients/android/NewsBlur/src/com/newsblur/service/NBSyncService.java index 15113e13a..bc07a0033 100644 --- a/clients/android/NewsBlur/src/com/newsblur/service/NBSyncService.java +++ b/clients/android/NewsBlur/src/com/newsblur/service/NBSyncService.java @@ -118,6 +118,8 @@ public class NBSyncService extends Service { /** Feed to reset to zero-state, so it is fetched fresh, presumably with new filters. */ private static FeedSet ResetFeed; + private static final Object MUTEX_ResetFeed = new Object(); + /** Actions that may need to be double-checked locally due to overlapping API calls. */ private static List FollowupActions; static { FollowupActions = new ArrayList(); } @@ -657,21 +659,24 @@ public class NBSyncService extends Service { FeedSet fs = PendingFeed; try { + // see if we need to quickly reset fetch state for a feed. we + // do this before the loop to prevent-mid loop state corruption + synchronized (MUTEX_ResetFeed) { + if (ResetFeed != null) { + com.newsblur.util.Log.i(this.getClass().getName(), "Resetting state for feed set: " + ResetFeed); + ExhaustedFeeds.remove(ResetFeed); + FeedStoriesSeen.remove(ResetFeed); + FeedPagesSeen.remove(ResetFeed); + ResetFeed = null; + } + } + if (fs == null) { return; } prepareReadingSession(dbHelper, fs); - // see if we need to quickly reset fetch state for a feed. we - // do this before the loop to prevent-mid loop state corruption - if (ResetFeed != null) { - ExhaustedFeeds.remove(ResetFeed); - FeedStoriesSeen.remove(ResetFeed); - FeedPagesSeen.remove(ResetFeed); - ResetFeed = null; - } - LastFeedSet = fs; if (ExhaustedFeeds.contains(fs)) { @@ -1040,7 +1045,7 @@ public class NBSyncService extends Service { PendingFeed = fs; PendingFeedTarget = desiredStoryCount; - if (AppConstants.VERBOSE_LOG) Log.d(NBSyncService.class.getName(), "callerhas: " + callerSeen + " have:" + alreadySeen + " want:" + desiredStoryCount + " pending:" + alreadyPending); + //if (AppConstants.VERBOSE_LOG) Log.d(NBSyncService.class.getName(), "callerhas: " + callerSeen + " have:" + alreadySeen + " want:" + desiredStoryCount + " pending:" + alreadyPending); if (!fs.equals(LastFeedSet)) { return true; @@ -1095,8 +1100,10 @@ public class NBSyncService extends Service { * Reset the API pagniation state for the given feedset, presumably because the order or filter changed. */ public static void resetFetchState(FeedSet fs) { - com.newsblur.util.Log.d(NBSyncService.class.getName(), "requesting feed fetch state reset"); - ResetFeed = fs; + synchronized (MUTEX_ResetFeed) { + com.newsblur.util.Log.d(NBSyncService.class.getName(), "requesting feed fetch state reset"); + ResetFeed = fs; + } } public static void addRecountCandidates(FeedSet fs) { diff --git a/clients/android/NewsBlur/src/com/newsblur/util/UIUtils.java b/clients/android/NewsBlur/src/com/newsblur/util/UIUtils.java index ed6671363..271dfd688 100644 --- a/clients/android/NewsBlur/src/com/newsblur/util/UIUtils.java +++ b/clients/android/NewsBlur/src/com/newsblur/util/UIUtils.java @@ -24,6 +24,7 @@ import android.util.Log; import android.util.TypedValue; import android.text.Html; import android.text.Spanned; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.ContextMenu; import android.view.MenuInflater; @@ -528,4 +529,16 @@ public class UIUtils { } } + public static int decodeColourValue(String val, int defaultVal) { + int result = defaultVal; + if (val == null) return result; + if (TextUtils.equals(val, "null")) return result; + try { + result = Color.parseColor("#" + val); + } catch (NumberFormatException nfe) { + com.newsblur.util.Log.e(UIUtils.class.getName(), "feed supplied bad color info: " + nfe.getMessage()); + } + return result; + } + } diff --git a/clients/android/NewsBlur/src/com/newsblur/view/SquaredRelativeLayout.java b/clients/android/NewsBlur/src/com/newsblur/view/SquaredRelativeLayout.java index d9d1a1cc7..6a99a7fa4 100644 --- a/clients/android/NewsBlur/src/com/newsblur/view/SquaredRelativeLayout.java +++ b/clients/android/NewsBlur/src/com/newsblur/view/SquaredRelativeLayout.java @@ -1,29 +1,45 @@ package com.newsblur.view; import android.content.Context; +import android.content.res.TypedArray; import android.util.AttributeSet; import android.widget.RelativeLayout; +import com.newsblur.R; +import com.newsblur.util.UIUtils; + public class SquaredRelativeLayout extends RelativeLayout { + private int addedHeightPx; + public SquaredRelativeLayout(Context context) { super(context); + addedHeightPx = 0; } public SquaredRelativeLayout(Context context, AttributeSet attrs) { super(context, attrs); + bindAttrs(context, attrs); } public SquaredRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + bindAttrs(context, attrs); + } + + private void bindAttrs(Context context, AttributeSet attrs) { + TypedArray styledAttributes = context.obtainStyledAttributes(attrs, R.styleable.SquaredRelativeLayout); + int addedHeightAttributeDp = styledAttributes.getInt(R.styleable.SquaredRelativeLayout_addedHeight, 0); + addedHeightPx = UIUtils.dp2px(context, addedHeightAttributeDp); + styledAttributes.recycle(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (heightMeasureSpec > widthMeasureSpec) { - super.onMeasure(widthMeasureSpec, widthMeasureSpec); + super.onMeasure(widthMeasureSpec, widthMeasureSpec + addedHeightPx); } else { - super.onMeasure(heightMeasureSpec, heightMeasureSpec); + super.onMeasure(heightMeasureSpec, heightMeasureSpec + addedHeightPx); } } }