summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java6
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java101
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java8
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java37
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java13
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java10
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)