diff options
Diffstat (limited to 'org.fox.ttrss/src')
12 files changed, 234 insertions, 227 deletions
diff --git a/org.fox.ttrss/src/main/AndroidManifest.xml b/org.fox.ttrss/src/main/AndroidManifest.xml index 61ea11bf..feb8a2e1 100755 --- a/org.fox.ttrss/src/main/AndroidManifest.xml +++ b/org.fox.ttrss/src/main/AndroidManifest.xml @@ -58,7 +58,6 @@ </activity> <activity android:name=".DetailActivity" - android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:label="@string/app_name" > <intent-filter> diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/Application.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/Application.java index b872d034..cb43b330 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/Application.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/Application.java @@ -2,7 +2,6 @@ package org.fox.ttrss; import android.os.Bundle; -import org.fox.ttrss.types.Article; import org.fox.ttrss.types.ArticleList; import java.util.HashMap; @@ -15,10 +14,6 @@ public class Application extends android.app.Application { // used by all fragments and activities concurrently private final ArticleList m_articles = new ArticleList(); - // we use this to pass a large temporary object between activities - public Article tmpActiveArticle; - - public int m_selectedArticleId; public String m_sessionId; public int m_apiLevel; public LinkedHashMap<String, String> m_customSortModes = new LinkedHashMap<>(); @@ -43,7 +38,6 @@ public class Application extends android.app.Application { out.setClassLoader(getClass().getClassLoader()); out.putString("gs:sessionId", m_sessionId); out.putInt("gs:apiLevel", m_apiLevel); - out.putInt("gs:selectedArticleId", m_selectedArticleId); out.putSerializable("gs:customSortTypes", m_customSortModes); } @@ -52,7 +46,6 @@ public class Application extends android.app.Application { if (in != null) { m_sessionId = in.getString("gs:sessionId"); m_apiLevel = in.getInt("gs:apiLevel"); - m_selectedArticleId = in.getInt("gs:selectedArticleId"); HashMap<String, String> tmp = (HashMap<String, String>) in.getSerializable("gs:customSortTypes"); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java index dcd378d5..da9dc8f3 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java @@ -32,12 +32,12 @@ public class ArticlePager extends androidx.fragment.app.Fragment { private final String TAG = "ArticlePager"; private PagerAdapter m_adapter; private HeadlinesEventListener m_listener; - protected Article m_article; + private int m_articleId; private OnlineActivity m_activity; private String m_searchQuery = ""; - protected Feed m_feed; + private Feed m_feed; private SharedPreferences m_prefs; - protected int m_firstId = 0; + private int m_firstId = 0; private boolean m_refreshInProgress; private boolean m_lazyLoadDisabled; private ViewPager2 m_pager; @@ -74,8 +74,8 @@ public class ArticlePager extends androidx.fragment.app.Fragment { } - public void initialize(Article article, Feed feed) { - m_article = article; + public void initialize(int articleId, Feed feed) { + m_articleId = articleId; m_feed = feed; } @@ -87,7 +87,7 @@ public class ArticlePager extends androidx.fragment.app.Fragment { public void onSaveInstanceState(Bundle out) { super.onSaveInstanceState(out); - out.putParcelable("m_article", m_article); + out.putInt("m_articleId", m_articleId); out.putParcelable("m_feed", m_feed); out.putInt("m_firstId", m_firstId); } @@ -97,7 +97,7 @@ public class ArticlePager extends androidx.fragment.app.Fragment { super.onCreate(savedInstanceState); if (savedInstanceState != null) { - m_article = savedInstanceState.getParcelable("m_article"); + m_articleId = savedInstanceState.getInt("m_articleId"); m_feed = savedInstanceState.getParcelable("m_feed"); m_firstId = savedInstanceState.getInt("m_firstId"); } @@ -113,9 +113,9 @@ public class ArticlePager extends androidx.fragment.app.Fragment { m_pager = view.findViewById(R.id.article_pager); - int position = Application.getArticles().indexOf(m_article); - - m_listener.onArticleSelected(m_article, false); + int position = Application.getArticles().getPositionById(m_articleId); + + m_listener.onArticleSelected(Application.getArticles().getById(m_articleId), false); m_pager.setAdapter(m_adapter); m_pager.setOffscreenPageLimit(3); @@ -129,7 +129,7 @@ public class ArticlePager extends androidx.fragment.app.Fragment { final Article article = Application.getArticles().get(position); if (article != null) { - m_article = article; + m_articleId = article.id; new Handler().postDelayed(() -> m_listener.onArticleSelected(article, false), 250); @@ -196,13 +196,13 @@ public class ArticlePager extends androidx.fragment.app.Fragment { return; } } - - if (m_article != null) { - if (m_article.id == 0 || !Application.getArticles().containsId(m_article.id)) { - if (!Application.getArticles().isEmpty()) { - m_article = Application.getArticles().get(0); - m_listener.onArticleSelected(m_article, false); - } + + if (!Application.getArticles().isEmpty()) { + if (Application.getArticles().getById(m_articleId) == null) { + Article article = Application.getArticles().get(0); + + m_articleId = article.id; + m_listener.onArticleSelected(article, false); } } @@ -213,8 +213,7 @@ public class ArticlePager extends androidx.fragment.app.Fragment { m_activity.login(true); } else { m_activity.toast(getErrorMessage()); - //setLoadingStatus(getErrorMessage(), false); - } + } } } }; @@ -314,40 +313,36 @@ public class ArticlePager extends androidx.fragment.app.Fragment { m_activity.invalidateOptionsMenu(); } - public Article getSelectedArticle() { - return m_article; - } - - public void setActiveArticle(Article article) { - if (m_article != article) { - m_article = article; - - int position = Application.getArticles().indexOf(m_article); + public void setActiveArticleId(int articleId) { + if (m_pager != null && articleId != m_articleId) { + int position = Application.getArticles().getPositionById(articleId); m_pager.setCurrentItem(position, false); } } - public void selectArticle(boolean next) { - if (m_article != null) { - int position = Application.getArticles().indexOf(m_article); - - if (next) + public void switchToArticle(boolean next) { + int position = Application.getArticles().getPositionById(m_articleId); + + if (position != -1) { + + if (next) position++; else position--; - + try { - Article tmp = Application.getArticles().get(position); - - if (tmp != null) { - setActiveArticle(tmp); - } - + Article targetArticle = Application.getArticles().get(position); + + setActiveArticleId(targetArticle.id); } catch (IndexOutOfBoundsException e) { - // do nothing + e.printStackTrace(); } - } + } + } + + public int getSelectedArticleId() { + return m_articleId; } public void notifyUpdated() { 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 4718960d..faee2b56 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 @@ -4,7 +4,6 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; -import android.content.res.Configuration; import android.net.Uri; import android.os.Bundle; import android.os.Handler; @@ -29,7 +28,7 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList protected BottomAppBar m_bottomAppBar; protected SharedPreferences m_prefs; - private Article m_activeArticle; + //private int m_activeArticleId; @SuppressLint("NewApi") @Override @@ -49,9 +48,6 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - - m_forceDisableActionMode = isPortrait() || isSmallScreen(); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); @@ -59,12 +55,10 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList Application.getInstance().load(savedInstanceState); - if (isPortrait()) { - View headlines = findViewById(R.id.headlines_fragment); + View headlines = findViewById(R.id.headlines_fragment); - if (headlines != null) - headlines.setVisibility(View.GONE); - } + if (headlines != null) + headlines.setVisibility(isPortrait() ? View.GONE : View.VISIBLE); m_bottomAppBar = findViewById(R.id.detail_bottom_appbar); @@ -74,36 +68,36 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList final ArticlePager ap = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); final HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); - Article article = ap.getSelectedArticle(); - - if (article == null) return false; + Article article = Application.getArticles().getById(ap.getSelectedArticleId()); - int itemId = item.getItemId(); + if (article != null) { + int itemId = item.getItemId(); - if (itemId == R.id.article_set_labels) { - editArticleLabels(article); + if (itemId == R.id.article_set_labels) { + editArticleLabels(article); - return true; - } else if (itemId == R.id.toggle_attachments) { - displayAttachments(article); + return true; + } else if (itemId == R.id.toggle_attachments) { + displayAttachments(article); - return true; - } else if (itemId == R.id.article_edit_note) { - editArticleNote(article); + return true; + } else if (itemId == R.id.article_edit_note) { + editArticleNote(article); - return true; - } else if (itemId == R.id.article_set_score) { - setArticleScore(article); + return true; + } else if (itemId == R.id.article_set_score) { + setArticleScore(article); - return true; - } else if (itemId == R.id.toggle_unread) { - article.unread = !article.unread; - saveArticleUnread(article); + return true; + } else if (itemId == R.id.toggle_unread) { + article.unread = !article.unread; + saveArticleUnread(article); - if (hf != null) { - hf.notifyUpdated(); - } - } + if (hf != null) { + hf.notifyUpdated(); + } + } + } return false; }); @@ -116,9 +110,13 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList fab.show(); fab.setOnClickListener(view -> { - if (m_activeArticle != null) { - openUri(Uri.parse(m_activeArticle.link)); - } + ArticlePager ap = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); + if (ap != null) { + Article article = Application.getArticles().getById(ap.getSelectedArticleId()); + + if (article != null) + openUri(Uri.parse(article.link)); + } }); } else { fab.hide(); @@ -146,20 +144,19 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList } final Feed feed = tmpFeed; - - final Article article = Application.getInstance().tmpActiveArticle; + final int openedArticleId = i.getIntExtra("openedArticleId", 0); final String searchQuery = i.getStringExtra("searchQuery"); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); final HeadlinesFragment hf = new HeadlinesFragment(); - hf.initialize(feed, article, true); + hf.initialize(feed, openedArticleId, true); hf.setSearchQuery(searchQuery); ft.replace(R.id.headlines_fragment, hf, FRAG_HEADLINES); ArticlePager af = new ArticlePager(); - af.initialize(article != null ? article : new Article(), feed); + af.initialize(openedArticleId, feed); af.setSearchQuery(searchQuery); ft.replace(R.id.article_fragment, af, FRAG_ARTICLE); @@ -191,44 +188,27 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList final ArticlePager ap = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); if (ap != null) { - Article article = ap.getSelectedArticle(); + Article selectedArticle = Application.getArticles().getById(ap.getSelectedArticleId()); - if (article != null) { - if (article.score > 0) { + if (selectedArticle != null) { + if (selectedArticle.score > 0) { menu.findItem(R.id.article_set_score).setIcon(R.drawable.baseline_trending_up_24); - } else if (article.score < 0) { + } else if (selectedArticle.score < 0) { menu.findItem(R.id.article_set_score).setIcon(R.drawable.baseline_trending_down_24); } else { menu.findItem(R.id.article_set_score).setIcon(R.drawable.baseline_trending_flat_24); } - menu.findItem(R.id.toggle_unread).setIcon(article.unread ? R.drawable.baseline_mark_email_unread_24 : + menu.findItem(R.id.toggle_unread).setIcon(selectedArticle.unread ? R.drawable.baseline_mark_email_unread_24 : R.drawable.baseline_email_24); - menu.findItem(R.id.toggle_attachments).setVisible(article.attachments != null && !article.attachments.isEmpty()); + menu.findItem(R.id.toggle_attachments).setVisible(selectedArticle.attachments != null && !selectedArticle.attachments.isEmpty()); } } } } @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - - if (!isSmallScreen()) { - findViewById(R.id.headlines_fragment).setVisibility(isPortrait() ? View.GONE : View.VISIBLE); - } - - m_forceDisableActionMode = isPortrait() || isSmallScreen(); - invalidateOptionsMenu(); - } - - @Override - protected void refresh() { - super.refresh(); - } - - @Override protected void loginSuccess(boolean refresh) { Log.d(TAG, "loginSuccess"); @@ -257,6 +237,8 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList @Override public void onResume() { super.onResume(); + + m_forceDisableActionMode = isPortrait() || isSmallScreen(); } @Override @@ -267,7 +249,8 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList m_menu.setGroupVisible(R.id.menu_group_feeds, false); m_menu.setGroupVisible(R.id.menu_group_headlines, !isPortrait() && !isSmallScreen()); - m_menu.findItem(R.id.headlines_toggle_sort_order).setVisible(false); + + m_menu.findItem(R.id.catchup_above).setVisible(!isSmallScreen()); ArticlePager af = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); @@ -308,24 +291,20 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList if (open) { new Handler().postDelayed(() -> { - ArticlePager af = (ArticlePager) DetailActivity.this.getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); + ArticlePager ap = (ArticlePager) DetailActivity.this.getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); - if (af != null) { - af.setActiveArticle(article); + if (ap != null) { + ap.setActiveArticleId(article.id); } }, 250); } else { HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); if (hf != null) { - hf.setActiveArticle(article); + hf.setActiveArticleId(article.id); } } - m_activeArticle = article; - - //Application.getInstance().m_activeArticle = article; - invalidateOptionsMenu(); } @@ -339,19 +318,19 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList } if (hf != null) { - Article article = hf.getActiveArticle(); + Article article = Application.getArticles().getById(hf.getActiveArticleId()); if (article == null && !Application.getArticles().isEmpty()) { article = Application.getArticles().get(0); - hf.setActiveArticle(article); + hf.setActiveArticleId(article.id); FragmentTransaction ft = getSupportFragmentManager() .beginTransaction(); ArticlePager af = new ArticlePager(); - af.initialize(article, hf.getFeed()); + af.initialize(article.id, hf.getFeed()); ft.replace(R.id.article_fragment, af, FRAG_ARTICLE); ft.commitAllowingStateLoss(); @@ -363,7 +342,10 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList public void onBackPressed() { Intent resultIntent = new Intent(); - Application.getInstance().tmpActiveArticle = m_activeArticle; + ArticlePager ap = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); + + if (ap != null) + resultIntent.putExtra("activeArticleId", ap.getSelectedArticleId()); setResult(Activity.RESULT_OK, resultIntent); 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 13c4e320..ad023a7e 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 @@ -93,12 +93,12 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { private final String TAG = this.getClass().getSimpleName(); - Feed m_feed; - Article m_activeArticle; - String m_searchQuery = ""; + private Feed m_feed; + private int m_activeArticleId; + private String m_searchQuery = ""; private boolean m_refreshInProgress = false; - int m_firstId = 0; - boolean m_lazyLoadDisabled = false; + private int m_firstId = 0; + private boolean m_lazyLoadDisabled = false; private SharedPreferences m_prefs; @@ -107,7 +107,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { private HeadlinesEventListener m_listener; private OnlineActivity m_activity; private SwipeRefreshLayout m_swipeLayout; - boolean m_compactLayoutMode = false; + private boolean m_compactLayoutMode = false; private RecyclerView m_list; private LinearLayoutManager m_layoutManager; @@ -128,10 +128,10 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { m_feed = feed; } - public void initialize(Feed feed, Article activeArticle, boolean compactMode) { + public void initialize(Feed feed, int activeArticleId, boolean compactMode) { m_feed = feed; m_compactLayoutMode = compactMode; - m_activeArticle = activeArticle; + m_activeArticleId = activeArticleId; } public boolean onArticleMenuItemSelected(MenuItem item, Article article, int position) { @@ -197,7 +197,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { } if (!tmp.isEmpty()) { - m_activity.setArticlesUnread(tmp, Article.UPDATE_SET_FALSE); + m_activity.setArticlesUnread(tmp, Article.UPDATE_SET_FALSE); m_adapter.notifyDataSetChanged(); } } @@ -248,7 +248,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { if (savedInstanceState != null) { m_feed = savedInstanceState.getParcelable("m_feed"); - m_activeArticle = savedInstanceState.getParcelable("m_activeArticle"); + m_activeArticleId = savedInstanceState.getInt("m_activeArticleId"); m_searchQuery = savedInstanceState.getString("m_searchQuery"); m_firstId = savedInstanceState.getInt("m_firstId"); m_lazyLoadDisabled = savedInstanceState.getBoolean("m_lazyLoadDisabled"); @@ -265,7 +265,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { super.onSaveInstanceState(out); out.putParcelable("m_feed", m_feed); - out.putParcelable("m_activeArticle", m_activeArticle); + out.putInt("m_activeArticleId", m_activeArticleId); out.putString("m_searchQuery", m_searchQuery); out.putInt("m_firstId", m_firstId); out.putBoolean("m_lazyLoadDisabled", m_lazyLoadDisabled); @@ -446,8 +446,11 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { if (Application.getArticles().isEmpty()) { refresh(false); - } else if (m_activeArticle != null) { - scrollToArticle(m_activeArticle); + } else { + Article activeArticle = Application.getArticles().getById(m_activeArticleId); + + if (activeArticle != null) + scrollToArticle(activeArticle); } m_activity.invalidateOptionsMenu(); @@ -503,9 +506,9 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { if (result != null) { - if (m_activeArticle != null && !Application.getArticles().containsId(m_activeArticle.id)) { - m_activeArticle = null; - } + // is this needed? + if (!Application.getArticles().containsId(m_activeArticleId)) + m_activeArticleId = 0; if (m_firstIdChanged) { m_lazyLoadDisabled = true; @@ -741,8 +744,8 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { public static final int VIEW_NORMAL = 0; 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_ACTIVE = 2; + public static final int VIEW_ACTIVE_UNREAD = 3; public static final int VIEW_LOADMORE = 4; public static final int VIEW_AMR_FOOTER = 5; @@ -806,11 +809,11 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { case VIEW_UNREAD: layoutId = m_compactLayoutMode ? R.layout.headlines_row_compact_unread : R.layout.headlines_row_unread; break; - case VIEW_SELECTED: - layoutId = m_compactLayoutMode ? R.layout.headlines_row_compact_selected : R.layout.headlines_row; + case VIEW_ACTIVE: + layoutId = m_compactLayoutMode ? R.layout.headlines_row_compact_active : R.layout.headlines_row; break; - case VIEW_SELECTED_UNREAD: - layoutId = m_compactLayoutMode ? R.layout.headlines_row_compact_selected_unread : R.layout.headlines_row_unread; + case VIEW_ACTIVE_UNREAD: + layoutId = m_compactLayoutMode ? R.layout.headlines_row_compact_active_unread : R.layout.headlines_row_unread; break; } @@ -851,7 +854,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { // only set active article when it makes sense (in DetailActivity) if (getActivity() instanceof DetailActivity) { - m_activeArticle = article; + m_activeArticleId = article.id; m_adapter.notifyDataSetChanged(); } }); @@ -1067,7 +1070,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { // only set active article when it makes sense (in DetailActivity) if (getActivity() instanceof DetailActivity) { - m_activeArticle = article; + m_activeArticleId = article.id; m_adapter.notifyDataSetChanged(); } }); @@ -1354,10 +1357,10 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { return VIEW_AMR_FOOTER; } else if (a.id == Article.TYPE_LOADMORE) { return VIEW_LOADMORE; - } 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; + } else if (a.id == m_activeArticleId && a.unread) { + return VIEW_ACTIVE_UNREAD; + } else if (a.id == m_activeArticleId) { + return VIEW_ACTIVE; } else if (a.unread) { return VIEW_UNREAD; } else { @@ -1510,16 +1513,20 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { } public void scrollToArticle(Article article) { - m_list.scrollToPosition(Application.getArticles().getById(article.id)); + scrollToArticleId(article.id); + } + + public void scrollToArticleId(int id) { + m_list.scrollToPosition(Application.getArticles().getPositionById(id)); } - public void setActiveArticle(Article article) { - if (m_list != null && article != null && !article.equalsById(m_activeArticle)) { + public void setActiveArticleId(int articleId) { + if (m_list != null && articleId != m_activeArticleId) { - m_activeArticle = article; + m_activeArticleId = articleId; m_adapter.notifyDataSetChanged(); - scrollToArticle(article); + scrollToArticleId(articleId); } } @@ -1540,8 +1547,8 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { } } - public Article getActiveArticle() { - return m_activeArticle; + public int getActiveArticleId() { + return m_activeArticleId; } public String getSearchQuery() { 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 26519d4a..9430ddc2 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 @@ -459,8 +459,9 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList } HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES); + if (hf != null) { - hf.setActiveArticle(article); + hf.setActiveArticleId(article.id); } openUri(Uri.parse(article.link)); @@ -471,13 +472,12 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList Intent intent = new Intent(MasterActivity.this, DetailActivity.class); intent.putExtra("feed", hf.getFeed()); intent.putExtra("searchQuery", hf.getSearchQuery()); + intent.putExtra("openedArticleId", article.id); // 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); overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left); } @@ -532,8 +532,7 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList // this makes position in headlines in master activity (not quite) randomly jump around when returning // even if active article hasn't been changed, i guess keeping it as-is is a lesser evil? - - hf.scrollToArticle(Application.getInstance().tmpActiveArticle); + hf.scrollToArticleId(data.getIntExtra("activeArticleId", 0)); } } } 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 f7fdd6e9..eb014180 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 @@ -293,17 +293,26 @@ public class OnlineActivity extends CommonActivity { return true; } else if (itemId == R.id.article_img_view_caption) { if (getLastContentImageHitTestUrl() != null) { - displayImageCaption(getLastContentImageHitTestUrl(), ap.getSelectedArticle().content); + Article selectedArticle = Application.getArticles().getById(ap.getSelectedArticleId()); + + if (selectedArticle != null) + displayImageCaption(getLastContentImageHitTestUrl(), selectedArticle.content); } return true; } else if (itemId == R.id.article_link_share) { - if (ap != null && ap.getSelectedArticle() != null) { - shareArticle(ap.getSelectedArticle()); + if (ap != null) { + Article selectedArticle = Application.getArticles().getById(ap.getSelectedArticleId()); + + if (selectedArticle != null) + shareArticle(selectedArticle); } return true; } else if (itemId == R.id.article_link_copy) { - if (ap != null && ap.getSelectedArticle() != null) { - copyToClipboard(ap.getSelectedArticle().link); + if (ap != null) { + Article selectedArticle = Application.getArticles().getById(ap.getSelectedArticleId()); + + if (selectedArticle != null) + copyToClipboard(selectedArticle.link); } return true; } @@ -356,18 +365,22 @@ public class OnlineActivity extends CommonActivity { startActivityForResult(subscribe, 0); return true; } else if (itemId == R.id.toggle_attachments) { - Article article = ap.getSelectedArticle(); + if (ap != null) { + Article selectedArticle = Application.getArticles().getById(ap.getSelectedArticleId()); - if (article != null) { - displayAttachments(article); - } + if (selectedArticle != null) + displayAttachments(selectedArticle); + } return true; } else if (itemId == R.id.login) { login(); return true; } else if (itemId == R.id.article_edit_note) { - if (ap != null && ap.getSelectedArticle() != null) { - editArticleNote(ap.getSelectedArticle()); + if (ap != null) { + Article selectedArticle = Application.getArticles().getById(ap.getSelectedArticleId()); + + if (selectedArticle != null) + editArticleNote(selectedArticle); } return true; } else if (itemId == R.id.preferences) { @@ -538,40 +551,40 @@ public class OnlineActivity extends CommonActivity { return true; } else if (itemId == R.id.share_article) { if (ap != null) { - shareArticle(ap.getSelectedArticle()); + Article selectedArticle = Application.getArticles().getById(ap.getSelectedArticleId()); + + if (selectedArticle != null) + shareArticle(selectedArticle); } return true; } else if (itemId == R.id.article_set_score) { if (ap != null) { - setArticleScore(ap.getSelectedArticle()); + Article selectedArticle = Application.getArticles().getById(ap.getSelectedArticleId()); + + if (selectedArticle != null) + setArticleScore(selectedArticle); } return true; } else if (itemId == R.id.toggle_marked) { - if (ap != null && ap.getSelectedArticle() != null) { - Article a = ap.getSelectedArticle(); - a.marked = !a.marked; - saveArticleMarked(a); + if (ap != null) { + Article selectedArticle = Application.getArticles().getById(ap.getSelectedArticleId()); + + selectedArticle.marked = !selectedArticle.marked; + saveArticleMarked(selectedArticle); + if (hf != null) hf.notifyUpdated(); } return true; } else if (itemId == R.id.toggle_unread) { - if (ap != null && ap.getSelectedArticle() != null) { - Article a = ap.getSelectedArticle(); - a.unread = !a.unread; - saveArticleUnread(a); + if (ap != null) { + Article selectedArticle = Application.getArticles().getById(ap.getSelectedArticleId()); + + selectedArticle.unread = !selectedArticle.unread; + saveArticleUnread(selectedArticle); + if (hf != null) hf.notifyUpdated(); } return true; - /* case R.id.selection_select_none: - if (hf != null) { - ArticleList selected = hf.getSelectedArticles(); - if (selected.size() > 0) { - selected.clear(); - invalidateOptionsMenu(); - hf.notifyUpdated(); - } - } - return true; */ } else if (itemId == R.id.selection_toggle_unread) { if (hf != null) { ArticleList selected = hf.getSelectedArticles(); @@ -615,11 +628,15 @@ public class OnlineActivity extends CommonActivity { } return true; } else if (itemId == R.id.toggle_published) { - if (ap != null && ap.getSelectedArticle() != null) { - Article a = ap.getSelectedArticle(); - a.published = !a.published; - saveArticlePublished(a); - if (hf != null) hf.notifyUpdated(); + if (ap != null) { + Article selectedArticle = Application.getArticles().getById(ap.getSelectedArticleId()); + + if (selectedArticle != null) { + selectedArticle.published = !selectedArticle.published; + saveArticlePublished(selectedArticle); + + if (hf != null) hf.notifyUpdated(); + } } return true; } else if (itemId == R.id.catchup_above) { @@ -640,9 +657,12 @@ public class OnlineActivity extends CommonActivity { } return true; } else if (itemId == R.id.article_set_labels) { - if (ap != null && ap.getSelectedArticle() != null) { + if (ap != null) { if (getApiLevel() != 7) { - editArticleLabels(ap.getSelectedArticle()); + Article selectedArticle = Application.getArticles().getById(ap.getSelectedArticleId()); + + if (selectedArticle != null) + editArticleLabels(selectedArticle); } else { toast(R.string.server_function_not_available); } @@ -656,13 +676,13 @@ public class OnlineActivity extends CommonActivity { private void catchupAbove(HeadlinesFragment hf, ArticlePager ap) { if (ap != null) { - Article selectedArticle = ap.getSelectedArticle(); + int selectedArticleId = ap.getSelectedArticleId(); - if (selectedArticle != null) { + if (Application.getArticles().containsId(selectedArticleId)) { ArticleList tmp = new ArticleList(); for (Article a : Application.getArticles()) { - if (selectedArticle.equalsById(a)) + if (a.id == selectedArticleId) break; if (a.unread) { @@ -954,13 +974,13 @@ article.score = Integer.parseInt(edit.getText().toString()); switch (keyCode) { case KeyEvent.KEYCODE_DPAD_LEFT: if (ap != null && ap.isAdded()) { - ap.selectArticle(false); + ap.switchToArticle(false); return true; } break; case KeyEvent.KEYCODE_DPAD_RIGHT: if (ap != null && ap.isAdded()) { - ap.selectArticle(true); + ap.switchToArticle(true); return true; } break; @@ -968,20 +988,25 @@ article.score = Integer.parseInt(edit.getText().toString()); moveTaskToBack(true); return true; case KeyEvent.KEYCODE_O: - if (ap != null && ap.getSelectedArticle() != null) { - openUri(Uri.parse(ap.getSelectedArticle().link)); - return true; + if (ap != null) { + Article selectedArticle = Application.getArticles().getById(ap.getSelectedArticleId()); + + if (selectedArticle != null) + openUri(Uri.parse(selectedArticle.link)); } - break; + return true; case KeyEvent.KEYCODE_R: refresh(); return true; case KeyEvent.KEYCODE_U: - if (ap != null && ap.getSelectedArticle() != null) { - Article a = ap.getSelectedArticle(); - a.unread = !a.unread; - saveArticleUnread(a); - if (hf != null) hf.notifyUpdated(); + if (ap != null) { + Article selectedArticle = Application.getArticles().getById(ap.getSelectedArticleId()); + + if (selectedArticle != null) { + selectedArticle.unread = !selectedArticle.unread; + saveArticleUnread(selectedArticle); + if (hf != null) hf.notifyUpdated(); + } } return true; } @@ -991,10 +1016,10 @@ article.score = Integer.parseInt(edit.getText().toString()); if (ap != null && ap.isAdded()) { switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: - ap.selectArticle(false); + ap.switchToArticle(false); return true; case KeyEvent.KEYCODE_VOLUME_DOWN: - ap.selectArticle(true); + ap.switchToArticle(true); return true; } } @@ -1116,7 +1141,7 @@ article.score = Integer.parseInt(edit.getText().toString()); ArticlePager ap = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE); if (ap != null) { - Article article = ap.getSelectedArticle(); + Article article = Application.getArticles().getById(ap.getSelectedArticleId()); if (article != null) { m_menu.findItem(R.id.toggle_marked).setIcon(article.marked ? R.drawable.baseline_star_24 : 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 d045eab2..a218987c 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 @@ -3,8 +3,6 @@ package org.fox.ttrss.types; import android.os.Parcel; import android.os.Parcelable; -import org.fox.ttrss.Application; - import java.util.ListIterator; import java.util.concurrent.CopyOnWriteArrayList; import java.util.stream.Collectors; @@ -70,7 +68,7 @@ public class ArticleList extends CopyOnWriteArrayList<Article> implements Parcel } } - public int getById(int id) { + public int getPositionById(int id) { for (int i = 0; i < size(); i++) { if (get(i).id == id) { return i; @@ -80,6 +78,13 @@ public class ArticleList extends CopyOnWriteArrayList<Article> implements Parcel return -1; } + public Article getById(int id) { + for (Article a : this) { + if (a.id == id) + return a; + } + return null; + } public String getAsCommaSeparatedIds() { return this.stream().map(a -> String.valueOf(a.id)) .collect(Collectors.joining(",")); 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 85d87c7f..626dc80b 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 @@ -11,7 +11,6 @@ import com.google.gson.reflect.TypeToken; import org.fox.ttrss.ApiCommon; import org.fox.ttrss.ApiRequest; -import org.fox.ttrss.HeadlinesFragment; import org.fox.ttrss.OnlineActivity; import org.fox.ttrss.types.Article; import org.fox.ttrss.types.ArticleList; diff --git a/org.fox.ttrss/src/main/res/layout/headlines_row_compact_selected.xml b/org.fox.ttrss/src/main/res/layout/headlines_row_compact_active.xml index 5721dcb8..5721dcb8 100755 --- a/org.fox.ttrss/src/main/res/layout/headlines_row_compact_selected.xml +++ b/org.fox.ttrss/src/main/res/layout/headlines_row_compact_active.xml diff --git a/org.fox.ttrss/src/main/res/layout/headlines_row_compact_selected_unread.xml b/org.fox.ttrss/src/main/res/layout/headlines_row_compact_active_unread.xml index 06813e04..06813e04 100755 --- a/org.fox.ttrss/src/main/res/layout/headlines_row_compact_selected_unread.xml +++ b/org.fox.ttrss/src/main/res/layout/headlines_row_compact_active_unread.xml diff --git a/org.fox.ttrss/src/main/res/menu/activity_main.xml b/org.fox.ttrss/src/main/res/menu/activity_main.xml index 1650f366..6f3198a2 100755 --- a/org.fox.ttrss/src/main/res/menu/activity_main.xml +++ b/org.fox.ttrss/src/main/res/menu/activity_main.xml @@ -66,7 +66,10 @@ app:iconTint="?attr/colorControlNormal" app:showAsAction="ifRoom" android:title="@string/share_article"/> - + <item + android:id="@+id/catchup_above" + app:showAsAction="" + android:title="@string/article_mark_read_above"/> </group> </group> |