diff options
6 files changed, 48 insertions, 80 deletions
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 9674cf2a..d0f4fa94 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 @@ -52,10 +52,9 @@ import androidx.loader.app.LoaderManager; import androidx.loader.content.Loader; import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.DefaultItemAnimator; -import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.ListUpdateCallback; +import androidx.recyclerview.widget.ListAdapter; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; @@ -76,7 +75,7 @@ import org.fox.ttrss.types.Article; import org.fox.ttrss.types.ArticleList; import org.fox.ttrss.types.Attachment; import org.fox.ttrss.types.Feed; -import org.fox.ttrss.util.HeadlinesDiffUtilCallback; +import org.fox.ttrss.util.HeadlinesDiffItemCallback; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; @@ -89,7 +88,6 @@ import jp.wasabeef.glide.transformations.CropCircleTransformation; public class HeadlinesFragment extends androidx.fragment.app.Fragment implements LoaderManager.LoaderCallbacks<ArticleList> { - private ArticleList m_articles = new ArticleList(); private boolean m_isLazyLoading; @NonNull @@ -106,52 +104,30 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements // successful update if (data != null) { + // shared article list contains raw returned data without footers ArticleList sharedArticles = Application.getArticles(); sharedArticles.clear(); sharedArticles.addAll(data); ArticleList tmp = new ArticleList(); - tmp.addAll(data); - - tmp.add(new Article(Article.TYPE_AMR_FOOTER)); - - DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new HeadlinesDiffUtilCallback(m_articles, tmp)); - - /* diffResult.dispatchUpdatesTo(new ListUpdateCallback() { - @Override - public void onInserted(int position, int count) { - Log.d(TAG, "[DIFF] onInserted! pos=" + position + " count=" + count); - } - @Override - public void onRemoved(int position, int count) { - Log.d(TAG, "[DIFF] onRemoved! pos=" + position + " count=" + count); - } - - @Override - public void onMoved(int fromPosition, int toPosition) { - Log.d(TAG, "[DIFF] onMoved! from=" + fromPosition + " to=" + toPosition); - } + tmp.addAll(data); - @Override - public void onChanged(int position, int count, @Nullable Object payload) { - Log.d(TAG, "[DIFF] onChanged! pos=" + position + " count=" + count + " payload=" + payload); - } - }); */ + if (m_prefs.getBoolean("headlines_mark_read_scroll", false)) + tmp.add(new Article(Article.TYPE_AMR_FOOTER)); - m_articles.clear(); - m_articles.addAll(tmp); + final boolean appended = headlinesLoader.getAppend(); - diffResult.dispatchUpdatesTo(m_adapter); + m_adapter.submitList(tmp, () -> { + if (!appended) + m_list.scrollToPosition(0); + }); if (headlinesLoader.getFirstIdChanged()) Snackbar.make(getView(), R.string.headlines_row_top_changed, Snackbar.LENGTH_LONG) .setAction(R.string.reload, v -> refresh(false)).show(); - if (!headlinesLoader.getAppend()) - m_list.scrollToPosition(0); - m_listener.onHeadlinesLoaded(headlinesLoader.getAppend()); } else { @@ -393,7 +369,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements m_list.setLayoutManager(m_layoutManager); m_list.setItemAnimator(new DefaultItemAnimator()); - m_adapter = new ArticleListAdapter(m_articles); + m_adapter = new ArticleListAdapter(); m_list.setAdapter(m_adapter); if (savedInstanceState == null && Application.getArticles().isEmpty()) { @@ -577,16 +553,9 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements if (!append) { m_activeArticleId = -1; - int size = m_articles.size(); - - m_articles.clear(); - if (m_adapter != null) { - m_adapter.notifyItemRangeRemoved(0, size); - - m_articles.add(new Article(Article.TYPE_AMR_FOOTER)); - - m_adapter.notifyItemRangeInserted(0, m_articles.size()); + ArticleList tmp = new ArticleList(); + m_adapter.submitList(tmp); } } @@ -705,14 +674,12 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements } } - private class ArticleListAdapter extends RecyclerView.Adapter<ArticleViewHolder> { - private final ArticleList items; - + private class ArticleListAdapter extends ListAdapter<Article, ArticleViewHolder> { public static final int VIEW_NORMAL = 0; public static final int VIEW_UNREAD = 1; public static final int VIEW_ACTIVE = 2; public static final int VIEW_ACTIVE_UNREAD = 3; - public static final int VIEW_AMR_FOOTER = 5; + public static final int VIEW_AMR_FOOTER = 4; public static final int VIEW_COUNT = VIEW_AMR_FOOTER + 1; @@ -744,9 +711,8 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements return false; } - public ArticleListAdapter(ArticleList items) { - super(); - this.items = items; + public ArticleListAdapter() { + super(new HeadlinesDiffItemCallback()); Display display = m_activity.getWindowManager().getDefaultDisplay(); Point size = new Point(); @@ -788,7 +754,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements @Override public void onBindViewHolder(final ArticleViewHolder holder, int position) { - holder.article = items.get(position); + holder.article = getItem(position); int headlineFontSize = m_prefs.getInt("headlines_font_size_sp_int", 13); int headlineSmallFontSize = Math.max(10, Math.min(18, headlineFontSize - 2)); @@ -1318,7 +1284,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements @Override public int getItemViewType(int position) { - Article a = items.get(position); + Article a = getItem(position); if (a.id == Article.TYPE_AMR_FOOTER) { return VIEW_AMR_FOOTER; @@ -1333,11 +1299,6 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements } } - @Override - public int getItemCount() { - return items.size(); - } - private void updateTextCheckedState(final ArticleViewHolder holder, final Article article) { String tmp = !article.title.isEmpty() ? article.title.substring(0, 1).toUpperCase() : "?"; @@ -1473,10 +1434,6 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements } } - public void notifyUpdated() { - m_adapter.notifyDataSetChanged(); - } - public void scrollToArticle(Article article) { scrollToArticleId(article.id); } @@ -1562,16 +1519,13 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements private void syncToSharedArticles() { ArticleList tmp = new ArticleList(); - tmp.addAll(Application.getArticles()); - - tmp.add(new Article(Article.TYPE_AMR_FOOTER)); - DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new HeadlinesDiffUtilCallback(m_articles, tmp)); + tmp.addAll(Application.getArticles()); - m_articles.clear(); - m_articles.addAll(tmp); + if (m_prefs.getBoolean("headlines_mark_read_scroll", false)) + tmp.add(new Article(Article.TYPE_AMR_FOOTER)); - diffResult.dispatchUpdatesTo(m_adapter); + m_adapter.submitList(tmp); } } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesLoader.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesLoader.java index a7755f5b..38ae19f4 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesLoader.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesLoader.java @@ -68,7 +68,7 @@ public class HeadlinesLoader extends AsyncTaskLoader<ArticleList> implements Api m_append = true; forceLoad(); } else { - deliverResult(m_articles); + reset(); } } 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 33d949f7..fcca41bb 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 @@ -521,15 +521,9 @@ 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) { - // articles might've been changed while in detail activity (resync with shared articles is handled in fragment onResume) - //hf.notifyUpdated(); - // data might be null if detailactivity crashed if (data != null) { int activeArticleId = data.getIntExtra("activeArticleId", 0); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffItemCallback.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffItemCallback.java new file mode 100644 index 00000000..b652946a --- /dev/null +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffItemCallback.java @@ -0,0 +1,23 @@ +package org.fox.ttrss.util; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; + +import org.fox.ttrss.types.Article; + +public class HeadlinesDiffItemCallback extends DiffUtil.ItemCallback<Article> { + @Override + public boolean areItemsTheSame(@NonNull Article a1, @NonNull Article a2) { + // Log.d(TAG, "[DIFF] areItemsTheSame a1=" + a1.title + " a2=" + a2.title); + + return a1.id == a2.id; + } + + @Override + public boolean areContentsTheSame(@NonNull Article a1, @NonNull Article a2) { + // Log.d(TAG, "[DIFF] areContentsTheSame a1=" + a1.title + " a2=" + a2.title); + + return a1.id == a2.id && a1.unread == a2.unread && a1.marked == a2.marked + && a1.published == a2.published && a1.note.equals(a2.note); + } +} diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffUtilCallback.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffUtilCallback.java index e1292f99..084fb9fc 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffUtilCallback.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffUtilCallback.java @@ -1,7 +1,5 @@ package org.fox.ttrss.util; -import android.util.Log; - import androidx.recyclerview.widget.DiffUtil; import org.fox.ttrss.types.Article; diff --git a/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml b/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml index 2783a1e4..647c3ae9 100755 --- a/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml +++ b/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml @@ -12,7 +12,6 @@ <org.fox.ttrss.util.ContextMenuRecyclerView android:id="@+id/headlines_list" android:background="?colorSurfaceContainer" - android:drawSelectorOnTop="true" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent" /> |