summaryrefslogtreecommitdiff
path: root/org.fox.ttrss
diff options
context:
space:
mode:
Diffstat (limited to 'org.fox.ttrss')
-rwxr-xr-xorg.fox.ttrss/src/main/AndroidManifest.xml1
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/Application.java7
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java81
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java134
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java77
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java9
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java135
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java11
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java1
-rwxr-xr-xorg.fox.ttrss/src/main/res/layout/headlines_row_compact_active.xml (renamed from org.fox.ttrss/src/main/res/layout/headlines_row_compact_selected.xml)0
-rwxr-xr-xorg.fox.ttrss/src/main/res/layout/headlines_row_compact_active_unread.xml (renamed from org.fox.ttrss/src/main/res/layout/headlines_row_compact_selected_unread.xml)0
-rwxr-xr-xorg.fox.ttrss/src/main/res/menu/activity_main.xml5
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>