diff options
| author | Andrew Dolgov <fox@fakecake.org> | 2025-05-15 17:40:03 +0300 |
|---|---|---|
| committer | Andrew Dolgov <fox@fakecake.org> | 2025-05-15 17:40:03 +0300 |
| commit | 8e61244404cf5027b7a4f9c7dd0e2f7419dba8ce (patch) | |
| tree | be51b460a72acb4cfc4d190970e62ae76f502006 | |
| parent | 06b8a9d17b4451b16415cd22e583a2fd96099e23 (diff) | |
wip recycler feeds
| -rwxr-xr-x | org.fox.ttrss/src/main/java/org/fox/ttrss/BaseFeedlistFragment.java | 5 | ||||
| -rwxr-xr-x | org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsFragment.java | 385 | ||||
| -rw-r--r-- | org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsLoader.java | 19 | ||||
| -rwxr-xr-x | org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java | 13 | ||||
| -rw-r--r-- | org.fox.ttrss/src/main/java/org/fox/ttrss/types/Feed.java | 13 | ||||
| -rw-r--r-- | org.fox.ttrss/src/main/res/layout/feeds_row_divider.xml (renamed from org.fox.ttrss/src/main/res/layout/drawer_divider.xml) | 0 | ||||
| -rwxr-xr-x | org.fox.ttrss/src/main/res/layout/feeds_row_goback.xml (renamed from org.fox.ttrss/src/main/res/layout/feeds_goback.xml) | 0 | ||||
| -rwxr-xr-x | org.fox.ttrss/src/main/res/layout/feeds_row_header.xml (renamed from org.fox.ttrss/src/main/res/layout/drawer_header.xml) | 0 | ||||
| -rwxr-xr-x | org.fox.ttrss/src/main/res/layout/fragment_feeds_recycler.xml | 18 |
9 files changed, 267 insertions, 186 deletions
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/BaseFeedlistFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/BaseFeedlistFragment.java index b37f7386..4f48a19e 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/BaseFeedlistFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/BaseFeedlistFragment.java @@ -2,7 +2,6 @@ package org.fox.ttrss; import android.content.Intent; import android.content.SharedPreferences; -import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; @@ -19,7 +18,7 @@ public abstract class BaseFeedlistFragment extends androidx.fragment.app.Fragmen public void initDrawerHeader(LayoutInflater inflater, View view, ListView list, final CommonActivity activity, final SharedPreferences prefs) { - View layout = inflater.inflate(R.layout.drawer_header, list, false); + View layout = inflater.inflate(R.layout.feeds_row_header, list, false); list.addHeaderView(layout, null, false); TextView login = view.findViewById(R.id.drawer_header_login); @@ -49,7 +48,7 @@ public abstract class BaseFeedlistFragment extends androidx.fragment.app.Fragmen /* deal with ~material~ footers */ // divider - final View footer = inflater.inflate(R.layout.drawer_divider, list, false); + final View footer = inflater.inflate(R.layout.feeds_row_divider, list, false); footer.setOnClickListener(v -> { // }); 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 c198343d..edc75c9d 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 @@ -2,34 +2,33 @@ package org.fox.ttrss; import android.annotation.SuppressLint; import android.app.Activity; -import android.app.Dialog; -import android.content.Context; +import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.graphics.Typeface; import android.os.Bundle; import android.util.Log; -import android.util.TypedValue; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.AdapterView.AdapterContextMenuInfo; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.ArrayAdapter; import android.widget.ImageView; -import android.widget.ListView; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; import androidx.loader.app.LoaderManager; import androidx.loader.content.Loader; import androidx.preference.PreferenceManager; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.ListAdapter; +import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; @@ -37,7 +36,6 @@ import com.google.gson.reflect.TypeToken; import org.fox.ttrss.types.Feed; import org.fox.ttrss.types.FeedCategory; -import org.fox.ttrss.types.FeedList; import java.lang.reflect.Type; import java.util.ArrayList; @@ -45,43 +43,41 @@ import java.util.Comparator; import java.util.HashMap; import java.util.List; -public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickListener, OnSharedPreferenceChangeListener, +public class FeedsFragment extends Fragment implements OnSharedPreferenceChangeListener, LoaderManager.LoaderCallbacks<JsonElement> { private final String TAG = this.getClass().getSimpleName(); private SharedPreferences m_prefs; - private FeedListAdapter m_adapter; - private final FeedList m_feeds = new FeedList(); private MasterActivity m_activity; - Feed m_selectedFeed; - FeedCategory m_activeCategory; + private int m_catId; + private int m_selectedFeedId; private SwipeRefreshLayout m_swipeLayout; - boolean m_enableParentBtn = false; - private ListView m_list; + private boolean m_enableParentBtn = false; + private FeedsAdapter m_adapter; + private RecyclerView m_list; + private RecyclerView.LayoutManager m_layoutManager; - public void initialize(FeedCategory cat, boolean enableParentBtn) { - m_activeCategory = cat; - m_enableParentBtn = enableParentBtn; + public void initialize(int catId) { + m_catId = catId; } @Override public Loader<JsonElement> onCreateLoader(int id, Bundle args) { if (m_swipeLayout != null) m_swipeLayout.setRefreshing(true); - final int catId = (m_activeCategory != null) ? m_activeCategory.id : -4; - final String sessionId = m_activity.getSessionId(); - final boolean unreadOnly = m_activity.getUnreadOnly() && (m_activeCategory == null || m_activeCategory.id != -1); + final boolean unreadOnly = false; + // final boolean unreadOnly = m_activity.getUnreadOnly() && (m_activeCategory == null || m_activeCategory.id != -1); HashMap<String,String> params = new HashMap<>(); params.put("op", "getFeeds"); params.put("sid", sessionId); params.put("include_nested", "true"); - params.put("cat_id", String.valueOf(catId)); + params.put("cat_id", String.valueOf(m_catId)); if (unreadOnly) params.put("unread_only", "true"); - return new FeedsLoader(getActivity().getApplicationContext(), params, catId); + return new ApiLoader(getContext(), params); } @Override @@ -94,16 +90,14 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi if (content != null) { Type listType = new TypeToken<List<Feed>>() {}.getType(); - final List<Feed> feeds = new Gson().fromJson(content, listType); - - m_feeds.clear(); + final List<Feed> feedsJson = new Gson().fromJson(content, listType); - int catUnread = 0; + List<Feed> feeds = new ArrayList<>(); - int catId = ((FeedsLoader) loader).getCatId(); + // int catUnread = 0; - for (Feed f : feeds) - if (f.id > -10 || catId != -4) { // skip labels for flat feedlist for now + /* for (Feed f : feeds) + if (f.id > -10 || m_catId != -4) { // skip labels for flat feedlist for now if (m_activeCategory != null || f.id >= 0) { m_feeds.add(f); catUnread += f.unread; @@ -132,7 +126,19 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi m_feeds.add(0, feed); } - m_adapter.notifyDataSetChanged(); + m_adapter.notifyDataSetChanged(); */ + + // m_adapter.sortFeeds(feedsJson); + + feeds.add(new Feed(Feed.TYPE_HEADER)); + feeds.add(new Feed(Feed.TYPE_GOBACK)); + + feeds.addAll(feedsJson); + + feeds.add(new Feed(Feed.TYPE_DIVIDER)); + feeds.add(new Feed(Feed.TYPE_TOGGLE_UNREAD)); + + m_adapter.submitList(feeds); return; } @@ -142,16 +148,17 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi } } - ApiLoader al = (ApiLoader) loader; - - if (al.getLastError() == ApiCommon.ApiError.LOGIN_FAILED) { - m_activity.login(true); - } else { + ApiLoader apiLoader = (ApiLoader) loader; - if (al.getLastErrorMessage() != null) { - m_activity.toast(getString(al.getErrorMessage()) + "\n" + al.getLastErrorMessage()); + if (apiLoader.getLastError() != null && apiLoader.getLastError() != ApiCommon.ApiError.SUCCESS) { + if (apiLoader.getLastError() == ApiCommon.ApiError.LOGIN_FAILED) { + m_activity.login(true); } else { - m_activity.toast(al.getErrorMessage()); + if (apiLoader.getLastErrorMessage() != null) { + m_activity.toast(getString(apiLoader.getErrorMessage()) + "\n" + apiLoader.getLastErrorMessage()); + } else { + m_activity.toast(apiLoader.getErrorMessage()); + } } } } @@ -169,7 +176,7 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi else return a.title.toUpperCase().compareTo(b.title.toUpperCase()); } - + } @@ -222,7 +229,7 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi @Override public boolean onContextItemSelected(MenuItem item) { - AdapterContextMenuInfo info = (AdapterContextMenuInfo) item + /* AdapterContextMenuInfo info = (AdapterContextMenuInfo) item .getMenuInfo(); int itemId = item.getItemId(); if (itemId == R.id.browse_headlines) { @@ -261,7 +268,8 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi m_activity.catchupDialog(feed); } return true; - } + } */ + Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId()); return super.onContextItemSelected(item); } @@ -270,7 +278,7 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { - getActivity().getMenuInflater().inflate(R.menu.context_feed, menu); + /* getActivity().getMenuInflater().inflate(R.menu.context_feed, menu); AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; @@ -284,7 +292,7 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi if (feed.id <= 0) { menu.findItem(R.id.unsubscribe_feed).setVisible(false); - } + } */ super.onCreateContextMenu(menu, v, menuInfo); @@ -295,13 +303,8 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi super.onCreate(savedInstanceState); if (savedInstanceState != null) { - ArrayList<Feed> list = savedInstanceState.getParcelableArrayList("m_feeds"); - - m_feeds.clear(); - m_feeds.addAll(list); - - m_selectedFeed = savedInstanceState.getParcelable("m_selectedFeed"); - m_activeCategory = savedInstanceState.getParcelable("m_activeCategory"); + m_catId = savedInstanceState.getInt("m_catId"); + m_selectedFeedId = savedInstanceState.getInt("m_selectedId"); m_enableParentBtn = savedInstanceState.getBoolean("m_enableParentBtn"); } } @@ -310,26 +313,31 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi public void onSaveInstanceState(Bundle out) { super.onSaveInstanceState(out); - out.putParcelableArrayList("m_feeds", m_feeds); - out.putParcelable("m_selectedFeed", m_selectedFeed); - out.putParcelable("m_activeCategory", m_activeCategory); + out.putInt("m_catId", m_catId); + out.putInt("m_selectedId", m_selectedFeedId); out.putBoolean("m_enableParentBtn", m_enableParentBtn); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_feeds, container, false); + View view = inflater.inflate(R.layout.fragment_feeds_recycler, container, false); m_swipeLayout = view.findViewById(R.id.feeds_swipe_container); - + m_swipeLayout.setOnRefreshListener(this::refresh); m_list = view.findViewById(R.id.feeds); + registerForContextMenu(m_list); - initDrawerHeader(inflater, view, m_list, m_activity, m_prefs); + m_layoutManager = new LinearLayoutManager(m_activity.getApplicationContext()); + m_list.setLayoutManager(m_layoutManager); + m_list.setItemAnimator(new DefaultItemAnimator()); - if (m_enableParentBtn) { + m_adapter = new FeedsAdapter(); + m_list.setAdapter(m_adapter); + + /* if (m_enableParentBtn) { View layout = inflater.inflate(R.layout.feeds_goback, m_list, false); layout.setOnClickListener(view1 -> m_activity.getSupportFragmentManager().popBackStack()); @@ -341,7 +349,7 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi m_list.setAdapter(m_adapter); m_list.setOnItemClickListener(this); - registerForContextMenu(m_list); + registerForContextMenu(m_list); */ return view; } @@ -359,7 +367,6 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi m_prefs.registerOnSharedPreferenceChangeListener(this); m_activity = (MasterActivity)activity; - } @Override @@ -367,11 +374,11 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi super.onResume(); LoaderManager.getInstance(this).initLoader(Application.LOADER_FEEDS, null, this).forceLoad(); - + m_activity.invalidateOptionsMenu(); } - @Override + /* @Override public void onItemClick(AdapterView<?> av, View view, int position, long id) { ListView list = (ListView)av; @@ -395,11 +402,9 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi //m_selectedFeed = feed; //m_adapter.notifyDataSetChanged(); } - } + } */ public void refresh() { - if (!isAdded()) return; - if (m_swipeLayout != null) { m_swipeLayout.setRefreshing(true); } @@ -407,128 +412,189 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi LoaderManager.getInstance(this).restartLoader(Application.LOADER_FEEDS, null, this).forceLoad(); } - private class FeedListAdapter extends ArrayAdapter<Feed> { - private final ArrayList<Feed> items; - - public static final int VIEW_NORMAL = 0; - public static final int VIEW_SELECTED = 1; - - public static final int VIEW_COUNT = VIEW_SELECTED+1; - - public FeedListAdapter(Context context, int textViewResourceId, ArrayList<Feed> items) { - super(context, textViewResourceId, items); - this.items = items; + private class FeedViewHolder extends RecyclerView.ViewHolder { + + private View view; + private ImageView icon; + private TextView title; + private TextView unreadCounter; + private TextView rowSwitch; + private View settingsBtn; + private TextView login; + private TextView server; + + public FeedViewHolder(@NonNull View itemView) { + super(itemView); + + view = itemView; + icon = itemView.findViewById(R.id.icon); + title = itemView.findViewById(R.id.title); + unreadCounter = itemView.findViewById(R.id.unread_counter); + rowSwitch = itemView.findViewById(R.id.row_switch); + settingsBtn = itemView.findViewById(R.id.drawer_settings_btn); + login = itemView.findViewById(R.id.drawer_header_login); + server = itemView.findViewById(R.id.drawer_header_server); } + } - @Override - public boolean isEmpty() { - return !m_enableParentBtn && super.isEmpty(); - } - - @Override - public int getViewTypeCount() { - return VIEW_COUNT; - } + private class FeedDiffUtilItemCallback extends DiffUtil.ItemCallback<Feed> { @Override - public int getItemViewType(int position) { - Feed feed = items.get(position); - - if (/*!m_activity.isSmallScreen() &&*/ m_selectedFeed != null && feed.id == m_selectedFeed.id) { - return VIEW_SELECTED; - } else { - return VIEW_NORMAL; - } + public boolean areItemsTheSame(@NonNull Feed oldItem, @NonNull Feed newItem) { + return oldItem.id == newItem.id; } @Override - public View getView(int position, View convertView, ViewGroup parent) { - View v = convertView; - - Feed feed = items.get(position); - - if (v == null) { - int layoutId = R.layout.feeds_row; + public boolean areContentsTheSame(@NonNull Feed oldItem, @NonNull Feed newItem) { + return oldItem.id == newItem.id && + oldItem.is_cat == newItem.is_cat && + oldItem.title.equals(newItem.title) && + oldItem.unread == newItem.unread; + } + } - if (getItemViewType(position) == VIEW_SELECTED) { - layoutId = R.layout.feeds_row_selected; - } + private class FeedsAdapter extends ListAdapter<Feed, FeedViewHolder> { + public static final int VIEW_NORMAL = 0; + public static final int VIEW_SELECTED = 1; + public static final int VIEW_GOBACK = 2; + public static final int VIEW_HEADER = 3; + public static final int VIEW_TOGGLE_UNREAD = 4; + public static final int VIEW_DIVIDER = 5; - LayoutInflater vi = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - v = vi.inflate(layoutId, null); + protected FeedsAdapter() { + super(new FeedDiffUtilItemCallback()); + } + @NonNull + @Override + public FeedViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + int layoutId = R.layout.feeds_row; + + switch (viewType) { + case VIEW_SELECTED: + layoutId = R.layout.feeds_row_selected; + break; + case VIEW_GOBACK: + layoutId = R.layout.feeds_row_goback; + break; + case VIEW_TOGGLE_UNREAD: + layoutId = R.layout.feeds_row_toggle; + break; + case VIEW_HEADER: + layoutId = R.layout.feeds_row_header; + break; + case VIEW_DIVIDER: + layoutId = R.layout.feeds_row_divider; + break; } - ImageView icon = v.findViewById(R.id.icon); + return new FeedViewHolder(LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false)); + } - if (icon != null) { - if (feed.id == 0 && !feed.is_cat) { - icon.setImageResource(R.drawable.baseline_archive_24); + @Override + public void onBindViewHolder(@NonNull FeedViewHolder holder, int position) { + Feed feed = getItem(position); + + if (holder.icon != null) { + if (feed.id == Feed.TYPE_GOBACK) { + holder.icon.setImageResource(R.drawable.baseline_arrow_back_24); + } else if (feed.id == 0 && !feed.is_cat) { + holder.icon.setImageResource(R.drawable.baseline_archive_24); } else if (feed.id == -1 && !feed.is_cat) { - icon.setImageResource(R.drawable.baseline_star_24); + holder.icon.setImageResource(R.drawable.baseline_star_24); } else if (feed.id == -2 && !feed.is_cat) { - icon.setImageResource(R.drawable.rss); + holder.icon.setImageResource(R.drawable.rss); } else if (feed.id == -3 && !feed.is_cat) { - icon.setImageResource(R.drawable.baseline_local_fire_department_24); + holder.icon.setImageResource(R.drawable.baseline_local_fire_department_24); } else if (feed.id == -4 && !feed.is_cat) { - icon.setImageResource(R.drawable.baseline_inbox_24); + holder.icon.setImageResource(R.drawable.baseline_inbox_24); } else if (feed.id == -6 && !feed.is_cat) { - icon.setImageResource(R.drawable.baseline_restore_24); + holder.icon.setImageResource(R.drawable.baseline_restore_24); } else if (feed.is_cat) { - icon.setImageResource(R.drawable.baseline_folder_open_24); + holder.icon.setImageResource(R.drawable.baseline_folder_open_24); } else { - icon.setImageResource(R.drawable.rss); + holder.icon.setImageResource(R.drawable.rss); } } - TextView tt = v.findViewById(R.id.title); + if (holder.title != null) { + holder.title.setText(feed.display_title != null ? feed.display_title : feed.title); - if (tt != null) { - tt.setText(feed.display_title != null ? feed.display_title : feed.title); + if (feed.always_display_as_feed || (!feed.is_cat && feed.id == -4)) { + holder.title.setTypeface(null, Typeface.BOLD); + } else { + holder.title.setTypeface(null, Typeface.NORMAL); + } - if (feed.always_display_as_feed || (!feed.is_cat && feed.id == -4)) { - tt.setTypeface(null, Typeface.BOLD); - } else { - tt.setTypeface(null, Typeface.NORMAL); - } + } + if (holder.unreadCounter != null) { + holder.unreadCounter.setText(String.valueOf(feed.unread)); + holder.unreadCounter.setVisibility((feed.unread > 0) ? View.VISIBLE : View.INVISIBLE); } - TextView tu = v.findViewById(R.id.unread_counter); + if (holder.settingsBtn != null) { + holder.settingsBtn.setOnClickListener(view -> { + Intent intent = new Intent(getActivity(), + PreferencesActivity.class); - if (tu != null) { - tu.setText(String.valueOf(feed.unread)); - tu.setVisibility((feed.unread > 0) ? View.VISIBLE : View.INVISIBLE); + startActivityForResult(intent, 0); + }); } - return v; + holder.view.setOnClickListener(view -> { + 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); + } + }); } - } - public void sortFeeds() { - Comparator<Feed> cmp; - - if (m_prefs.getBoolean("sort_feeds_by_unread", false)) { - cmp = new FeedUnreadComparator(); - } else { - if (m_activity.getApiLevel() >= 3) { - cmp = new FeedOrderComparator(); + @Override + public int getItemViewType(int position) { + Feed feed = getItem(position); + + if (feed.id == Feed.TYPE_GOBACK) { + return VIEW_GOBACK; + } else if (feed.id == Feed.TYPE_DIVIDER) { + return VIEW_DIVIDER; + } else if (feed.id == Feed.TYPE_HEADER) { + return VIEW_HEADER; + } else if (feed.id == Feed.TYPE_TOGGLE_UNREAD) { + return VIEW_TOGGLE_UNREAD; + } else if (feed.id == m_selectedFeedId) { + return VIEW_SELECTED; } else { - cmp = new FeedTitleComparator(); + return VIEW_NORMAL; } } - - try { - m_feeds.sort(cmp); - } catch (IllegalArgumentException e) { - // sort order got changed in prefs or something - e.printStackTrace(); - } - try { - m_adapter.notifyDataSetChanged(); - } catch (NullPointerException e) { - // adapter missing + public void sortFeeds(List<Feed> feeds) { + Comparator<Feed> cmp; + + if (m_prefs.getBoolean("sort_feeds_by_unread", false)) { + cmp = new FeedUnreadComparator(); + } else { + if (m_activity.getApiLevel() >= 3) { + cmp = new FeedOrderComparator(); + } else { + cmp = new FeedTitleComparator(); + } + } + + try { + feeds.sort(cmp); + } catch (IllegalArgumentException e) { + // sort order got changed in prefs or something + e.printStackTrace(); + } } } @@ -536,10 +602,10 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - sortFeeds(); + refresh(); } - public Feed getFeedAtPosition(int position) { + /* public Feed getFeedAtPosition(int position) { try { return (Feed) m_list.getItemAtPosition(position); } catch (ArrayIndexOutOfBoundsException e) { @@ -547,13 +613,14 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi } return null; - } - - public void setSelectedfeed(Feed feed) { - m_selectedFeed = feed; + } */ + public void setSelectedFeedId(int feedId) { if (m_adapter != null) { - m_adapter.notifyDataSetChanged(); + m_selectedFeedId = feedId; + + // TODO handle properly + m_adapter.notifyDataSetChanged(); } } } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsLoader.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsLoader.java deleted file mode 100644 index 92ce64d2..00000000 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsLoader.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.fox.ttrss; - -import android.content.Context; - -import java.util.HashMap; - -class FeedsLoader extends ApiLoader { - private final int m_catId; - - public FeedsLoader(Context context, HashMap<String, String> params, int catId) { - super(context, params); - - m_catId = catId; - } - - public int getCatId() { - return m_catId; - } -} 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 458f1f76..31a0a23b 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 @@ -164,11 +164,16 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); - if (m_prefs.getBoolean("enable_cats", true)) { + /* if (m_prefs.getBoolean("enable_cats", true)) { ft.replace(R.id.feeds_fragment, new FeedCategoriesFragment(), FRAG_CATS); } else { ft.replace(R.id.feeds_fragment, new FeedsFragment(), FRAG_FEEDS); - } + } */ + + FeedsFragment ff = new FeedsFragment(); + ff.initialize(12); + + ft.replace(R.id.feeds_fragment, ff, FRAG_FEEDS); // allow overriding feed to open on startup in non-shortcut mode, default to // open_on_startup prefs setting and not-category @@ -273,7 +278,7 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList FeedsFragment ff = (FeedsFragment) getSupportFragmentManager().findFragmentByTag(FRAG_FEEDS); if (ff != null && ff.isAdded()) { - ff.setSelectedfeed(feed); + ff.setSelectedFeedId(feed.id); } if (m_drawerLayout != null) { @@ -321,7 +326,7 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList .beginTransaction(); FeedsFragment ff = new FeedsFragment(); - ff.initialize(cat, true); + ff.initialize(cat.id); ft.replace(R.id.feeds_fragment, ff, FRAG_FEEDS); ft.addToBackStack(null); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Feed.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Feed.java index 9cbe9f83..5432bad1 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Feed.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Feed.java @@ -7,6 +7,11 @@ import android.os.Parcelable; import org.fox.ttrss.R; public class Feed implements Comparable<Feed>, Parcelable { + public static final int TYPE_HEADER = -10000; + public static final int TYPE_GOBACK = -10001; + public static final int TYPE_DIVIDER = -10002; + public static final int TYPE_TOGGLE_UNREAD = -10003; + public String feed_url; public String title; public int id; @@ -18,7 +23,13 @@ public class Feed implements Comparable<Feed>, Parcelable { public boolean is_cat; public boolean always_display_as_feed; public String display_title; - + + public Feed(int id) { + this.id = id; + this.title = "ID:" + id; + this.is_cat = false; + } + public Feed(int id, String title, boolean is_cat) { this.id = id; this.title = title; diff --git a/org.fox.ttrss/src/main/res/layout/drawer_divider.xml b/org.fox.ttrss/src/main/res/layout/feeds_row_divider.xml index 55aa5fdc..55aa5fdc 100644 --- a/org.fox.ttrss/src/main/res/layout/drawer_divider.xml +++ b/org.fox.ttrss/src/main/res/layout/feeds_row_divider.xml diff --git a/org.fox.ttrss/src/main/res/layout/feeds_goback.xml b/org.fox.ttrss/src/main/res/layout/feeds_row_goback.xml index 75ba8fe1..75ba8fe1 100755 --- a/org.fox.ttrss/src/main/res/layout/feeds_goback.xml +++ b/org.fox.ttrss/src/main/res/layout/feeds_row_goback.xml diff --git a/org.fox.ttrss/src/main/res/layout/drawer_header.xml b/org.fox.ttrss/src/main/res/layout/feeds_row_header.xml index f4954259..f4954259 100755 --- a/org.fox.ttrss/src/main/res/layout/drawer_header.xml +++ b/org.fox.ttrss/src/main/res/layout/feeds_row_header.xml diff --git a/org.fox.ttrss/src/main/res/layout/fragment_feeds_recycler.xml b/org.fox.ttrss/src/main/res/layout/fragment_feeds_recycler.xml new file mode 100755 index 00000000..1ed85a5b --- /dev/null +++ b/org.fox.ttrss/src/main/res/layout/fragment_feeds_recycler.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/feeds_fragment" + android:layout_width="fill_parent" + android:layout_height="fill_parent" > + + <androidx.swiperefreshlayout.widget.SwipeRefreshLayout + android:id="@+id/feeds_swipe_container" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <org.fox.ttrss.util.ContextMenuRecyclerView + android:id="@+id/feeds" + android:scrollbars="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent" /> + </androidx.swiperefreshlayout.widget.SwipeRefreshLayout> +</RelativeLayout>
\ No newline at end of file |