From bab4c9e13c57a07579bdb1f0d91a2eb880f2970f Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 15 Sep 2025 14:36:57 +0300 Subject: while in detail activity, trigger lazy load on active article change --- .../main/java/org/fox/ttrss/HeadlinesFragment.java | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'org.fox.ttrss/src') 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 72d0163a..0b291e4a 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 @@ -410,7 +410,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { if (dy > 0 && !m_isLazyLoading && !model.isLoading() && model.isLazyLoadEnabled() && lastVisibleItem >= Application.getArticles().size() - 5) { - Log.d(TAG, "attempting to lazy load more articles..."); + Log.d(TAG, "attempting to lazy load more articles (onScrolled)..."); m_isLazyLoading = true; @@ -441,6 +441,24 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { Log.d(TAG, "observed active article=" + activeArticle); if (activeArticle != null) { + + // we can't be sure scrollToArticle() below actually does anything in DetailView because our fragment might be invisible in some layouts + // so we also trigger lazy load on active article change + if (m_activity instanceof DetailActivity) { + int position = Application.getArticles().indexOf(activeArticle); + + if (!m_isLazyLoading && !model.isLoading() && model.isLazyLoadEnabled() && + position >= Application.getArticles().size() - 5) { + + Log.d(TAG, "attempting to lazy load more articles (observed active article change)..."); + + m_isLazyLoading = true; + + // this has to be dispatched delayed, consequent adapter updates are forbidden in scroll handler + new Handler().postDelayed(() -> refresh(true), 250); + } + } + scrollToArticle(activeArticle); } }); -- cgit v1.2.3-54-g00ecf From 02ba1c3b93adf3aeacae95527ce7b390306d4846 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 15 Sep 2025 14:51:15 +0300 Subject: stop storing Article as parcelable (store id instead), remove Parcelable implementation from Article class --- .../main/java/org/fox/ttrss/ArticleFragment.java | 6 +- .../src/main/java/org/fox/ttrss/ArticleModel.java | 7 ++ .../src/main/java/org/fox/ttrss/types/Article.java | 84 +--------------------- 3 files changed, 12 insertions(+), 85 deletions(-) (limited to 'org.fox.ttrss/src') diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java index 40d3b6a5..ff6fa9a6 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java @@ -83,7 +83,9 @@ public class ArticleFragment extends androidx.fragment.app.Fragment { super.onCreate(savedInstanceState); if (savedInstanceState != null) { - m_article = savedInstanceState.getParcelable("m_article"); + int articleId = savedInstanceState.getInt("m_articleId"); + + m_article = Application.getArticlesModel().getById(articleId); } } @@ -389,6 +391,6 @@ public class ArticleFragment extends androidx.fragment.app.Fragment { public void onSaveInstanceState(Bundle out) { super.onSaveInstanceState(out); - out.putParcelable("m_article", m_article); + out.putInt("m_articleId", m_article.id); } } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleModel.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleModel.java index 9f4d8e1f..309b01fa 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleModel.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleModel.java @@ -431,4 +431,11 @@ public class ArticleModel extends AndroidViewModel implements ApiCommon.ApiCalle }).collect(Collectors.toList()); } + // returns null if not found + public Article getById(final int id) { + return m_articles.getValue().stream().filter(a -> a.id == id) + .findFirst() + .orElse(null); + } + } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java index 2c1966ad..cdffffe2 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java @@ -1,8 +1,5 @@ package org.fox.ttrss.types; -import android.os.Parcel; -import android.os.Parcelable; - import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; @@ -16,7 +13,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; // TODO: serialize Labels -public class Article implements Parcelable { +public class Article { public static final int TYPE_AMR_FOOTER = -2; public static final int FLAVOR_KIND_ALBUM = 1; @@ -73,10 +70,6 @@ public class Article implements Parcelable { transient public String youtubeVid; transient public List mediaList = new ArrayList<>(); - public Article(Parcel in) { - readFromParcel(in); - } - public Article() { } @@ -237,81 +230,6 @@ public class Article implements Parcelable { mediaList = new ArrayList<>(clone.mediaList); } - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel out, int flags) { - out.writeInt(id); - 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); - out.writeString(link); - out.writeInt(feed_id); - out.writeStringList(tags); - out.writeString(content); - out.writeString(excerpt); - out.writeList(attachments); - out.writeString(feed_title); - out.writeInt(comments_count); - out.writeString(comments_link); - out.writeInt(always_display_attachments ? 1 : 0); - out.writeString(author); - out.writeString(note); - out.writeInt(selected ? 1 : 0); - out.writeString(site_url); - } - - public void readFromParcel(Parcel in) { - id = in.readInt(); - 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(); - link = in.readString(); - feed_id = in.readInt(); - - if (tags == null) tags = new ArrayList<>(); - in.readStringList(tags); - - content = in.readString(); - excerpt = in.readString(); - - attachments = new ArrayList<>(); - in.readList(attachments, Attachment.class.getClassLoader()); - - feed_title = in.readString(); - - comments_count = in.readInt(); - comments_link = in.readString(); - always_display_attachments = in.readInt() == 1; - author = in.readString(); - note = in.readString(); - selected = in.readInt() == 1; - site_url = in.readString(); - } - - @SuppressWarnings("rawtypes") - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { - public Article createFromParcel(Parcel in) { - return new Article(in); - } - - public Article[] newArray(int size) { - return new Article[size]; - } - }; - /** * set fields which might be missing during JSON deserialization to sane values */ -- cgit v1.2.3-54-g00ecf