summaryrefslogtreecommitdiff
path: root/org.fox.ttrss/src
diff options
context:
space:
mode:
authorAndrew Dolgov <fox@fakecake.org>2025-05-16 09:02:29 +0300
committerAndrew Dolgov <fox@fakecake.org>2025-05-16 09:02:29 +0300
commit1be5611e66d8d4a152f1d431d7a7d76b2888e3f3 (patch)
treefc7d2cf95a822062072a4529527653c82a47e8ff /org.fox.ttrss/src
parent0cb76d17e78c6c7c42790c229bc08dbc95dcfe0e (diff)
deal with issues related to feed selection
Diffstat (limited to 'org.fox.ttrss/src')
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java2
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/FeedsFragment.java99
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java25
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/RootCategoriesFragment.java3
4 files changed, 82 insertions, 47 deletions
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java
index d5d593ae..096eb75a 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java
@@ -310,7 +310,7 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc
setAppTheme(sharedPreferences);
}
- String[] filter = new String[] { "headline_mode", "widget_update_interval",
+ String[] filter = new String[] { "browse_cats_like_feeds", "headline_mode", "widget_update_interval",
"headlines_swipe_to_dismiss", "headlines_mark_read_scroll", "headlines_request_size",
"force_phone_layout", "open_on_startup"};
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsFragment.java
index 353d965c..65581da6 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsFragment.java
@@ -48,14 +48,14 @@ import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
-import java.util.stream.Collectors;
+import java.util.Optional;
public class FeedsFragment extends Fragment implements OnSharedPreferenceChangeListener,
LoaderManager.LoaderCallbacks<JsonElement> {
private final String TAG = this.getClass().getSimpleName();
protected SharedPreferences m_prefs;
protected MasterActivity m_activity;
- protected Feed m_feed;
+ protected Feed m_rootFeed;
private Feed m_selectedFeed;
protected SwipeRefreshLayout m_swipeLayout;
private boolean m_enableParentBtn = false;
@@ -63,10 +63,10 @@ public class FeedsFragment extends Fragment implements OnSharedPreferenceChangeL
private RecyclerView m_list;
private RecyclerView.LayoutManager m_layoutManager;
- public void initialize(@NonNull Feed feed, boolean enableParentBtn) {
- Log.d(TAG, "initialize, feed=" + feed);
+ public void initialize(@NonNull Feed rootFeed, boolean enableParentBtn) {
+ Log.d(TAG, "initialize, feed=" + rootFeed);
- m_feed = feed;
+ m_rootFeed = rootFeed;
m_enableParentBtn = enableParentBtn;
}
@@ -78,10 +78,10 @@ public class FeedsFragment extends Fragment implements OnSharedPreferenceChangeL
params.put("op", "getFeeds");
params.put("sid", m_activity.getSessionId());
params.put("include_nested", "true");
- params.put("cat_id", String.valueOf(m_feed.id));
+ params.put("cat_id", String.valueOf(m_rootFeed.id));
/* except marked */
- if (m_activity.getUnreadOnly() && m_feed.id != -1)
+ if (m_activity.getUnreadOnly() && m_rootFeed.id != -1)
params.put("unread_only", "true");
return new ApiLoader(getContext(), params);
@@ -101,13 +101,13 @@ public class FeedsFragment extends Fragment implements OnSharedPreferenceChangeL
List<Feed> feeds = new ArrayList<>();
- sortFeeds(feedsJson, m_feed);
+ sortFeeds(feedsJson, m_rootFeed);
if (m_enableParentBtn) {
feeds.add(0, new Feed(Feed.TYPE_GOBACK));
- if (m_feed.id >= 0 && !feedsJson.isEmpty()) {
- Feed feed = new Feed(m_feed.id, getString(R.string.feed_all_articles), true);
+ if (m_rootFeed.id >= 0 && !feedsJson.isEmpty()) {
+ Feed feed = new Feed(m_rootFeed.id, m_rootFeed.title, true);
feed.unread = feedsJson.stream().map(a -> a.unread).reduce(0, Integer::sum);
feed.always_open_headlines = true;
@@ -232,10 +232,12 @@ public class FeedsFragment extends Fragment implements OnSharedPreferenceChangeL
int itemId = item.getItemId();
if (itemId == R.id.browse_headlines) {
- Feed forceFeed = new Feed(feed);
- forceFeed.always_open_headlines = true;
+ Feed tmpFeed = new Feed(feed);
- m_activity.onFeedSelected(forceFeed);
+ if (neverOpenHeadlines(feed))
+ tmpFeed.always_open_headlines = true;
+
+ m_activity.onFeedSelected(tmpFeed);
return true;
} else if (itemId == R.id.browse_feeds) {
m_activity.onFeedSelected(feed);
@@ -275,13 +277,14 @@ public class FeedsFragment extends Fragment implements OnSharedPreferenceChangeL
menu.setHeaderTitle(feed.title);
- if (!feed.is_cat) {
+ if (!feed.is_cat)
menu.findItem(R.id.browse_feeds).setVisible(false);
- }
- if (feed.id <= 0) {
+ if (neverOpenHeadlines(feed))
+ menu.findItem(R.id.browse_headlines).setVisible(false);
+
+ if (feed.id <= 0 || feed.is_cat)
menu.findItem(R.id.unsubscribe_feed).setVisible(false);
- }
super.onCreateContextMenu(menu, v, menuInfo);
@@ -292,7 +295,7 @@ public class FeedsFragment extends Fragment implements OnSharedPreferenceChangeL
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
- m_feed = savedInstanceState.getParcelable("m_feed");
+ m_rootFeed = savedInstanceState.getParcelable("m_feed");
m_selectedFeed = savedInstanceState.getParcelable("m_selectedFeed");
m_enableParentBtn = savedInstanceState.getBoolean("m_enableParentBtn");
}
@@ -302,7 +305,7 @@ public class FeedsFragment extends Fragment implements OnSharedPreferenceChangeL
public void onSaveInstanceState(Bundle out) {
super.onSaveInstanceState(out);
- out.putParcelable("m_feed", m_feed);
+ out.putParcelable("m_feed", m_rootFeed);
out.putParcelable("m_selectedFeed", m_selectedFeed);
out.putBoolean("m_enableParentBtn", m_enableParentBtn);
}
@@ -377,6 +380,8 @@ public class FeedsFragment extends Fragment implements OnSharedPreferenceChangeL
Log.d(TAG, "onResume");
+ setSelectedFeed(m_activity.getActiveFeed());
+
refresh();
m_activity.invalidateOptionsMenu();
@@ -503,26 +508,19 @@ public class FeedsFragment extends Fragment implements OnSharedPreferenceChangeL
return true;
});
+ // default open handler (i.e. tap)
holder.view.setOnClickListener(view -> {
if (feed.id == Feed.TYPE_GOBACK) {
m_activity.getSupportFragmentManager().popBackStack();
} else if (feed.id == Feed.TYPE_TOGGLE_UNREAD || feed.id == Feed.TYPE_DIVIDER) {
//
} else {
+ Feed tmpFeed = new Feed(feed);
- /* if (feed.is_cat) {
- if (feed.always_display_as_feed) {
- //m_activity.onCatSelected(new FeedCategory(feed.id, feed.title, feed.unread), true);
- } else if (feed.id < 0) {
- //m_activity.onCatSelected(new FeedCategory(feed.id, feed.title, feed.unread), false);
- } else {
- //m_activity.onCatSelected(new FeedCategory(feed.id, feed.title, feed.unread));
- }
- } else {
- m_activity.onFeedSelected(feed);
- } */
+ if (neverOpenHeadlines(feed))
+ tmpFeed.always_open_headlines = m_prefs.getBoolean("browse_cats_like_feeds", false);
- m_activity.onFeedSelected(feed);
+ m_activity.onFeedSelected(tmpFeed);
}
});
}
@@ -537,12 +535,32 @@ public class FeedsFragment extends Fragment implements OnSharedPreferenceChangeL
return VIEW_DIVIDER;
} else if (feed.id == Feed.TYPE_TOGGLE_UNREAD) {
return VIEW_TOGGLE_UNREAD;
- } else if (m_selectedFeed != null && feed.id == m_selectedFeed.id && feed.is_cat && m_selectedFeed.is_cat) {
+ } else if (m_selectedFeed != null && feed.id == m_selectedFeed.id && feed.is_cat == m_selectedFeed.is_cat) {
return VIEW_SELECTED;
} else {
return VIEW_NORMAL;
}
}
+
+ /** TODO there has to be a better way -- Feed.equals()? */
+ public int getPositionOf(Feed feed) {
+ List<Feed> feeds = getCurrentList();
+
+ Optional<Feed> maybeFeed = feeds.stream().filter(a -> a.id == feed.id && a.is_cat == feed.is_cat).findFirst();
+
+ if (maybeFeed.isPresent()) {
+ Feed foundFeed = maybeFeed.get();
+
+ return feeds.indexOf(foundFeed);
+ }
+
+ return -1;
+ }
+ }
+
+ /** we always show Labels and Special contents, regardless of the setting */
+ private boolean neverOpenHeadlines(Feed feed) {
+ return feed.id != Feed.CAT_SPECIAL && feed.id != Feed.CAT_LABELS;
}
protected void sortFeeds(List<Feed> feeds, Feed feed) {
@@ -604,13 +622,24 @@ public class FeedsFragment extends Fragment implements OnSharedPreferenceChangeL
refresh();
}
-
public void setSelectedFeed(Feed feed) {
if (m_adapter != null) {
+
+ int oldPosition = -1;
+
+ if (m_selectedFeed != null)
+ oldPosition = m_adapter.getPositionOf(m_selectedFeed);
+
+ int newPosition = m_adapter.getPositionOf(feed);
+
m_selectedFeed = feed;
- // TODO handle properly
- m_adapter.notifyDataSetChanged();
+ if (oldPosition != -1)
+ m_adapter.notifyItemChanged(oldPosition);
+
+ if (newPosition != -1)
+ m_adapter.notifyItemChanged(newPosition);
+
}
}
}
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 a12c5c44..bb750c01 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
@@ -256,11 +256,7 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList
public void onFeedSelected(Feed feed) {
- m_activeFeed = feed;
-
- if (isSmallScreen())
- setTitle(feed.title);
-
+ // show subfolder of feeds below current level
if (feed.is_cat && !feed.always_open_headlines) {
FragmentTransaction ft = getSupportFragmentManager()
.beginTransaction();
@@ -273,11 +269,9 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList
ft.commit();
} else {
- FeedsFragment ff = (FeedsFragment) getSupportFragmentManager().findFragmentByTag(FRAG_FEEDS);
+ // actualy open the feed (i.e. show headlines)
- if (ff != null) {
- ff.setSelectedFeed(feed);
- }
+ setActiveFeed(feed);
if (m_drawerLayout != null) {
m_drawerLayout.closeDrawers();
@@ -510,4 +504,17 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList
return m_activeFeed;
}
+ public void setActiveFeed(Feed feed) {
+ m_activeFeed = feed;
+
+ setTitle(feed.title);
+
+ FeedsFragment ff = (FeedsFragment) getSupportFragmentManager().findFragmentByTag(FRAG_FEEDS);
+
+ if (ff != null) {
+ ff.setSelectedFeed(feed);
+ }
+
+ }
+
}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/RootCategoriesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/RootCategoriesFragment.java
index cb91cc14..21381964 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/RootCategoriesFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/RootCategoriesFragment.java
@@ -18,7 +18,6 @@ import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
-import java.util.stream.Collectors;
public class RootCategoriesFragment extends FeedsFragment {
private final String TAG = this.getClass().getSimpleName();
@@ -86,7 +85,7 @@ public class RootCategoriesFragment extends FeedsFragment {
List<Feed> feeds = new ArrayList<>();
- sortFeeds(feedsJson, m_feed);
+ sortFeeds(feedsJson, m_rootFeed);
// virtual cats implemented in getCategories since api level 1
if (m_activity.getApiLevel() == 0) {