diff options
| author | Andrew Dolgov <fox@fakecake.org> | 2025-05-12 13:30:22 +0300 |
|---|---|---|
| committer | Andrew Dolgov <fox@fakecake.org> | 2025-05-12 13:30:22 +0300 |
| commit | 91295ad483d46fe6603881d10421e401e51299f7 (patch) | |
| tree | 7e593a3b9c25bb75a4e2c1dc743202504860bd78 | |
| parent | 2c262e4fcef9a3546c78a051c65bec26716cb1e5 (diff) | |
better deal with footer/no-footer discrepancy between master & detail activity, add some helper methods to article list
6 files changed, 91 insertions, 84 deletions
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java index e56c387a..4718960d 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java @@ -308,7 +308,7 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList if (open) { new Handler().postDelayed(() -> { -ArticlePager af = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); + ArticlePager af = (ArticlePager) DetailActivity.this.getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); if (af != null) { af.setActiveArticle(article); @@ -341,9 +341,9 @@ ArticlePager af = (ArticlePager) getSupportFragmentManager().findFragmentByTag(F if (hf != null) { Article article = hf.getActiveArticle(); - if (article == null && !hf.getAllArticles().isEmpty()) { + if (article == null && !Application.getArticles().isEmpty()) { - article = hf.getAllArticles().get(0); + article = Application.getArticles().get(0); hf.setActiveArticle(article); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java index 06112db0..13c4e320 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java @@ -91,8 +91,6 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { public static final int FLAVOR_IMG_MIN_SIZE = 128; public static final int THUMB_IMG_MIN_SIZE = 32; - public static final int HEADLINES_BUFFER_MAX = 1000; - private final String TAG = this.getClass().getSimpleName(); Feed m_feed; @@ -187,10 +185,9 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { } private void catchupAbove(Article article) { - ArticleList articles = getAllArticles(); ArticleList tmp = new ArticleList(); - for (Article a : articles) { - if (article.id == a.id) + for (Article a : Application.getArticles()) { + if (article.equalsById(a)) break; if (a.unread) { @@ -198,11 +195,11 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { tmp.add(a); } } + if (!tmp.isEmpty()) { - m_activity.toggleArticlesUnread(tmp); - //updateHeadlines(); + m_activity.setArticlesUnread(tmp, Article.UPDATE_SET_FALSE); + m_adapter.notifyDataSetChanged(); } - m_adapter.notifyDataSetChanged(); } public boolean onContextItemSelected(MenuItem item) { @@ -483,11 +480,11 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { m_activity.getSupportActionBar().show(); Application.getArticles().clear(); m_adapter.notifyDataSetChanged(); - } else { - if (!(m_activity instanceof DetailActivity)) { - Application.getArticles().add(new Article(Article.TYPE_LOADMORE)); - m_adapter.notifyDataSetChanged(); - } + } else if (!(m_activity instanceof DetailActivity)) { + // detail activity does not use footers because it would break 1-to-1 mapping with pager view + // pager will need to work on a footerless subset of shared article view before this is possible + Application.getArticles().add(new Article(Article.TYPE_LOADMORE)); + m_adapter.notifyDataSetChanged(); } final String sessionId = m_activity.getSessionId(); @@ -499,11 +496,9 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { if (isDetached() || !isAdded()) return; super.onPostExecute(result); - m_adapter.notifyDataSetChanged(); if (m_swipeLayout != null) m_swipeLayout.setRefreshing(false); - //m_adapter.removeAllFooterViews(); m_refreshInProgress = false; if (result != null) { @@ -515,17 +510,17 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { if (m_firstIdChanged) { m_lazyLoadDisabled = true; - //Log.d(TAG, "first id changed, disabling lazy load"); + Log.d(TAG, "first id changed, disabling lazy load"); + // article pager deals with this in tablet landscape view if (m_activity.isSmallScreen() || !m_activity.isPortrait()) { - Snackbar.make(getView(), R.string.headlines_row_top_changed, Snackbar.LENGTH_LONG) .setAction(R.string.reload, v -> refresh(false)).show(); } } if (m_amountLoaded < Integer.parseInt(m_prefs.getString("headlines_request_size", "15"))) { - //Log.d(TAG, "amount loaded < request size, disabling lazy load"); + // Log.d(TAG, "amount loaded "+m_amountLoaded+" < request size, disabling lazy load"); m_lazyLoadDisabled = true; } @@ -548,6 +543,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { } } + // detail activity does not use footers (see above) if (!(m_activity instanceof DetailActivity)) { Application.getArticles().add(new Article(Article.TYPE_AMR_FOOTER)); m_adapter.notifyDataSetChanged(); @@ -555,40 +551,13 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { } }; - int skip = 0; - - if (append) { - // adaptive, all_articles, marked, published, unread - String viewMode = m_activity.getViewMode(); - int numUnread = 0; - int numAll = Application.getArticles().size(); - - for (Article a : Application.getArticles()) { - if (a.unread) ++numUnread; - } - - if ("marked".equals(viewMode)) { - skip = numAll; - } else if ("published".equals(viewMode)) { - skip = numAll; - } else if ("unread".equals(viewMode)) { - skip = numUnread; - } else if (m_searchQuery != null && !m_searchQuery.isEmpty()) { - skip = numAll; - } else if ("adaptive".equals(viewMode)) { - skip = numUnread > 0 ? numUnread : numAll; - } else { - skip = numAll; - } - } - - final int fskip = skip; + final int skip = getSkip(append); final boolean allowForceUpdate = m_activity.getApiLevel() >= 9 && !m_feed.is_cat && m_feed.id > 0 && !append && userInitiated && skip == 0; - Log.d(TAG, "allowForceUpdate=" + allowForceUpdate + " userInitiated=" + userInitiated); + Log.d(TAG, "allowForceUpdate=" + allowForceUpdate + " userInitiated=" + userInitiated + " skip=" + skip); req.setOffset(skip); @@ -603,7 +572,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { map.put("view_mode", m_activity.getViewMode()); map.put("limit", m_prefs.getString("headlines_request_size", "15")); map.put("offset", String.valueOf(0)); - map.put("skip", String.valueOf(fskip)); + map.put("skip", String.valueOf(skip)); map.put("include_nested", "true"); map.put("has_sandbox", "true"); map.put("order_by", m_activity.getSortMode()); @@ -638,6 +607,34 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { } } + private int getSkip(boolean append) { + int skip = 0; + + if (append) { + // adaptive, all_articles, marked, published, unread + String viewMode = m_activity.getViewMode(); + + int numUnread = Math.toIntExact(Application.getArticles().getUnreadCount()); + int numAll = Math.toIntExact(Application.getArticles().getSizeWithoutFooters()); + + if ("marked".equals(viewMode)) { + skip = numAll; + } else if ("published".equals(viewMode)) { + skip = numAll; + } else if ("unread".equals(viewMode)) { + skip = numUnread; + } else if (m_searchQuery != null && !m_searchQuery.isEmpty()) { + skip = numAll; + } else if ("adaptive".equals(viewMode)) { + skip = numUnread > 0 ? numUnread : numAll; + } else { + skip = numAll; + } + } + + return skip; + } + static class ArticleViewHolder extends RecyclerView.ViewHolder { public View view; public Article article; @@ -1512,14 +1509,6 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { m_adapter.notifyDataSetChanged(); } - // returns cloned array without footers - public ArticleList getAllArticles() { - ArticleList tmp = (ArticleList) Application.getArticles().clone(); - tmp.stripFooters(); - - return tmp; - } - public void scrollToArticle(Article article) { m_list.scrollToPosition(Application.getArticles().getById(article.id)); } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java index 8a700a86..26519d4a 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java @@ -472,6 +472,10 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList intent.putExtra("feed", hf.getFeed()); intent.putExtra("searchQuery", hf.getSearchQuery()); + // we use shared article list, but detail activity does not use special footers + // we will append those back (if needed) in onActivityResult() + Application.getArticles().stripFooters(); + Application.getInstance().tmpActiveArticle = article; startActivityForResult(intent, HEADLINES_REQUEST); @@ -517,6 +521,10 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList super.onActivityResult(requestCode, resultCode, data); if (requestCode == HEADLINES_REQUEST) { + + // we add back footers stripped when this was passed to DetailActivity + Application.getArticles().add(new Article(Article.TYPE_AMR_FOOTER)); + HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); if (hf != null) { diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java index b2b955c0..f7fdd6e9 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java @@ -655,24 +655,27 @@ public class OnlineActivity extends CommonActivity { } private void catchupAbove(HeadlinesFragment hf, ArticlePager ap) { - if (ap != null && ap.getSelectedArticle() != null) { - Article article = ap.getSelectedArticle(); - - ArticleList articles = hf.getAllArticles(); - ArticleList tmp = new ArticleList(); - for (Article a : articles) { - if (article.id == a.id) - break; - - if (a.unread) { - a.unread = false; - tmp.add(a); + if (ap != null) { + Article selectedArticle = ap.getSelectedArticle(); + + if (selectedArticle != null) { + ArticleList tmp = new ArticleList(); + + for (Article a : Application.getArticles()) { + if (selectedArticle.equalsById(a)) + break; + + if (a.unread) { + a.unread = false; + tmp.add(a); + } + } + + if (!tmp.isEmpty()) { + setArticlesUnread(tmp, Article.UPDATE_SET_FALSE); + hf.notifyUpdated(); + invalidateOptionsMenu(); } - } - if (!tmp.isEmpty()) { - toggleArticlesUnread(tmp); - hf.notifyUpdated(); - invalidateOptionsMenu(); } } } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java index 1a367bd3..d045eab2 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java @@ -46,6 +46,18 @@ public class ArticleList extends CopyOnWriteArrayList<Article> implements Parcel readFromParcel(in); } + public ArticleList getWithoutFooters() { + return this.stream().filter(a -> { return a.id > 0; }).collect(Collectors.toCollection(ArticleList::new)); + } + + public long getUnreadCount() { + return this.stream().filter(a -> { return a.unread; }).count(); + } + + public long getSizeWithoutFooters() { + return this.stream().filter(a -> { return a.id > 0; }).count(); + } + /** strips all trailing items with negative IDs (Article.TYPE_LOADMORE, Article.TYPE_AMR_FOOTER) */ public void stripFooters() { for (ListIterator<Article> iterator = this.listIterator(size()); iterator.hasPrevious();) { @@ -84,4 +96,5 @@ public class ArticleList extends CopyOnWriteArrayList<Article> implements Parcel return new ArticleList[size]; } }; + }
\ No newline at end of file diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java index dd4d45ac..85d87c7f 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java @@ -65,17 +65,11 @@ public class HeadlinesRequest extends ApiRequest { articles = new Gson().fromJson(content, listType); } - if (m_offset == 0) { + if (m_offset == 0) m_articles.clear(); - } else { - + else m_articles.stripFooters(); - while (m_articles.size() > HeadlinesFragment.HEADLINES_BUFFER_MAX) { - m_articles.remove(0); - } - } - m_amountLoaded = articles.size(); for (Article f : articles) |