From 2e5d9bea0a688e73dbe78a94a898fa88047f9e3f Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 5 Jun 2017 22:33:52 +0300 Subject: [PATCH] use special article entries instead of footers because footers in this implementation tend to glitch out :( --- .../java/org/fox/ttrss/HeadlinesFragment.java | 86 ++++++++++++++++--- .../java/org/fox/ttrss/types/Article.java | 6 +- .../java/org/fox/ttrss/types/ArticleList.java | 12 +++ .../org/fox/ttrss/util/HeadlinesRequest.java | 3 + 4 files changed, 94 insertions(+), 13 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 bd95daa1..f2e9f9f0 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 @@ -17,6 +17,7 @@ import android.media.MediaPlayer; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.os.Handler; import android.preference.PreferenceManager; import android.support.design.widget.Snackbar; import android.support.v4.app.ActivityCompat; @@ -477,8 +478,14 @@ public class HeadlinesFragment extends Fragment { if (newState == RecyclerView.SCROLL_STATE_IDLE && m_prefs.getBoolean("headlines_mark_read_scroll", false)) { if (!m_readArticles.isEmpty()) { m_activity.toggleArticlesUnread(m_readArticles); - m_activity.refresh(false); m_readArticles.clear(); + + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + m_activity.refresh(false); + } + }, 100); } } @@ -568,7 +575,8 @@ public class HeadlinesFragment extends Fragment { @SuppressWarnings({ "serial" }) public void refresh(final boolean append, boolean userInitiated) { - m_adapter.removeAllFooterViews(); + m_articles.stripFooters(); + m_adapter.notifyDataSetChanged(); if (!append) m_lazyLoadDisabled = false; @@ -578,10 +586,14 @@ public class HeadlinesFragment extends Fragment { if (m_swipeLayout != null) m_swipeLayout.setRefreshing(true); if (!append) { + m_activity.getSupportActionBar().show(); m_articles.clear(); m_adapter.notifyDataSetChanged(); } else { - m_adapter.addFooterView(createListFooter(R.layout.headlines_row_loadmore)); + m_articles.add(new Article(Article.TYPE_LOADMORE)); + m_adapter.notifyDataSetChanged(); + + //m_adapter.addFooterView(createListFooter(R.layout.headlines_row_loadmore)); } final String sessionId = m_activity.getSessionId(); @@ -602,7 +614,7 @@ public class HeadlinesFragment extends Fragment { if (m_swipeLayout != null) m_swipeLayout.setRefreshing(false); - m_adapter.removeAllFooterViews(); + //m_adapter.removeAllFooterViews(); if (result != null) { m_refreshInProgress = false; @@ -615,7 +627,8 @@ public class HeadlinesFragment extends Fragment { m_lazyLoadDisabled = true; //Log.d(TAG, "first id changed, disabling lazy load"); - m_adapter.addFooterView(createListFooter(R.layout.headlines_row_top_changed)); + //!m_adapter.addFooterView(createListFooter(R.layout.headlines_row_top_changed)); + m_articles.add(new Article(Article.TYPE_TOP_CHANGED)); } if (m_amountLoaded < HEADLINES_REQUEST_SIZE) { @@ -642,7 +655,9 @@ public class HeadlinesFragment extends Fragment { } //if (m_prefs.getBoolean("headlines_mark_read_scroll", false)) - m_adapter.addFooterView(createListFooter(R.layout.headlines_footer)); + //!m_adapter.addFooterView(createListFooter(R.layout.headlines_footer)); + m_articles.add(new Article(Article.TYPE_AMR_FOOTER)); + m_adapter.notifyDataSetChanged(); } }; @@ -672,9 +687,9 @@ public class HeadlinesFragment extends Fragment { skip = numAll; } - if (skip > 0) { + /*if (skip > 0) { m_adapter.addFooterView(createListFooter(R.layout.headlines_row_loadmore)); - } + }*/ } final int fskip = skip; @@ -767,6 +782,7 @@ public class HeadlinesFragment extends Fragment { public ImageView textChecked; public View headlineHeader; public View flavorImageOverflow; + public View rowTopChanged; public TextureView flavorVideoView; //public int position; public boolean flavorImageEmbedded; @@ -808,6 +824,7 @@ public class HeadlinesFragment extends Fragment { textImage = (ImageView) v.findViewById(R.id.text_image); textChecked = (ImageView) v.findViewById(R.id.text_checked); headlineHeader = v.findViewById(R.id.headline_header); + rowTopChanged = v.findViewById(R.id.headlines_row_top_changed); flavorImageOverflow = v.findViewById(R.id.gallery_overflow); flavorVideoView = (TextureView) v.findViewById(R.id.flavor_video); @@ -855,8 +872,11 @@ public class HeadlinesFragment extends Fragment { public static final int VIEW_UNREAD = 1; public static final int VIEW_SELECTED = 2; public static final int VIEW_SELECTED_UNREAD = 3; + public static final int VIEW_LOADMORE = 4; + public static final int VIEW_TOP_CHANGED = 5; + public static final int VIEW_AMR_FOOTER = 6; - public static final int VIEW_COUNT = VIEW_SELECTED_UNREAD + 1; + public static final int VIEW_COUNT = VIEW_AMR_FOOTER + 1; private final Integer[] origTitleColors = new Integer[VIEW_COUNT]; private final int titleHighScoreUnreadColor; @@ -903,6 +923,15 @@ public class HeadlinesFragment extends Fragment { int layoutId = m_compactLayoutMode ? R.layout.headlines_row_compact : R.layout.headlines_row; switch (viewType) { + case VIEW_AMR_FOOTER: + layoutId = R.layout.headlines_footer; + break; + case VIEW_TOP_CHANGED: + layoutId = R.layout.headlines_row_top_changed; + break; + case VIEW_LOADMORE: + layoutId = R.layout.headlines_row_loadmore; + break; case VIEW_UNREAD: layoutId = m_compactLayoutMode ? R.layout.headlines_row_unread_compact : R.layout.headlines_row_unread; break; @@ -930,6 +959,26 @@ public class HeadlinesFragment extends Fragment { final Article article = holder.article; + if (article.id == Article.TYPE_AMR_FOOTER) { + WindowManager wm = (WindowManager) m_activity.getSystemService(Context.WINDOW_SERVICE); + Display display = wm.getDefaultDisplay(); + int screenHeight = display.getHeight(); + + holder.view.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.MATCH_PARENT, screenHeight)); + } + + if (holder.rowTopChanged != null) { + holder.rowTopChanged.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + refresh(false); + } + }); + } + + // nothing else of interest for those below anyway + if (article.id < 0) return; + holder.view.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { @@ -1448,7 +1497,10 @@ public class HeadlinesFragment extends Fragment { }); } - startAnimation(holder.view, position); + // not on an emulator pls + if (!BuildConfig.DEBUG) { + startAnimation(holder.view, position); + } } protected void startAnimation(View view, int position) { @@ -1469,7 +1521,13 @@ public class HeadlinesFragment extends Fragment { public int getItemViewType(int position) { Article a = items.get(position); - if (m_activeArticle != null && a.id == m_activeArticle.id && a.unread) { + if (a.id == Article.TYPE_AMR_FOOTER) { + return VIEW_AMR_FOOTER; + } else if (a.id == Article.TYPE_LOADMORE) { + return VIEW_LOADMORE; + } else if (a.id == Article.TYPE_TOP_CHANGED) { + return VIEW_TOP_CHANGED; + } else if (m_activeArticle != null && a.id == m_activeArticle.id && a.unread) { return VIEW_SELECTED_UNREAD; } else if (m_activeArticle != null && a.id == m_activeArticle.id) { return VIEW_SELECTED; @@ -1666,8 +1724,12 @@ public class HeadlinesFragment extends Fragment { m_adapter.notifyDataSetChanged(); } + // returns cloned array without footers public ArticleList getAllArticles() { - return (ArticleList) m_articles.clone(); + ArticleList tmp = (ArticleList) m_articles.clone(); + tmp.stripFooters(); + + return tmp; } // if setting active doesn't make sense, scroll to whatever is passed to us 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 8cd8a366..da6b8f89 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 @@ -14,6 +14,10 @@ import java.util.regex.Pattern; // TODO: serialize Labels public class Article implements Parcelable { + public static final int TYPE_LOADMORE = -1; + public static final int TYPE_AMR_FOOTER = -2; + public static final int TYPE_TOP_CHANGED = -3; + public int id; public boolean unread; public boolean marked; @@ -134,7 +138,7 @@ public class Article implements Parcelable { public Article(int id) { this.id = id; - this.title = ""; + this.title = "ID:" + String.valueOf(id); this.link = ""; this.tags = new ArrayList(); } 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 a6f59643..bee0a46d 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 @@ -43,6 +43,18 @@ public class ArticleList extends ArrayList
implements Parcelable { readFromParcel(in); } + public void stripFooters() { + for (int i = this.size()-1; i >= 0; i--) { + Article a = this.get(i); + + if (a.id < 0) { + this.remove(a); + } else if (a.id > 0) { + break; + } + } + } + @SuppressWarnings("rawtypes") public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 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 f87a4d2b..1df20837 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 @@ -81,6 +81,9 @@ public class HeadlinesRequest extends ApiRequest { if (m_offset == 0) { m_articles.clear(); } else { + + m_articles.stripFooters(); + while (m_articles.size() > HeadlinesFragment.HEADLINES_BUFFER_MAX) { m_articles.remove(0); }