summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Dolgov <fox@fakecake.org>2025-09-16 07:37:42 +0300
committerAndrew Dolgov <fox@fakecake.org>2025-09-16 07:37:42 +0300
commit1018485aa0569df9e39a6d2460330b92ad0b78bd (patch)
treed9a264016852f4d1c2a7218d4d2fa5057a965d65
parent72177b9a499bfce5cf98d51604412f32862a73ca (diff)
parent02ba1c3b93adf3aeacae95527ce7b390306d4846 (diff)
Merge branch 'dev' into 'master'
stop storing Article as parcelable (store id instead), remove Parcelable... See merge request tt-rss/tt-rss-android!56
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java6
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleModel.java7
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java20
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java84
4 files changed, 31 insertions, 86 deletions
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/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);
}
});
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<Element> 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
*/