summaryrefslogtreecommitdiff
path: root/app/src/main/java/de/danoeh/antennapod/adapter
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/adapter')
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsAdapter.java152
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsRecyclerAdapter.java245
3 files changed, 249 insertions, 158 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java
index 674b5f86e..f6b47d8e5 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java
@@ -76,21 +76,19 @@ public class EpisodeItemListAdapter extends SelectableAdapter<EpisodeItemViewHol
int position = ArrayUtils.indexOf(ids, item.getId());
activity.loadChildFragment(ItemPagerFragment.newInstance(ids, position));
} else {
- toggleSelection(pos);
+ toggleSelection(holder.getBindingAdapterPosition());
}
});
holder.itemView.setOnCreateContextMenuListener(this);
holder.itemView.setOnLongClickListener(v -> {
- longPressedItem = item;
- longPressedPosition = pos;
+ longPressedItem = getItem(holder.getBindingAdapterPosition());
+ longPressedPosition = holder.getBindingAdapterPosition();
return false;
});
if (inActionMode()) {
holder.secondaryActionButton.setVisibility(View.GONE);
- holder.selectCheckBox.setOnClickListener(v -> {
- toggleSelection(pos);
- });
+ holder.selectCheckBox.setOnClickListener(v -> toggleSelection(holder.getBindingAdapterPosition()));
holder.selectCheckBox.setChecked(isSelected(pos));
holder.selectCheckBox.setVisibility(View.VISIBLE);
} else {
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsAdapter.java
deleted file mode 100644
index 0af6960d7..000000000
--- a/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsAdapter.java
+++ /dev/null
@@ -1,152 +0,0 @@
-package de.danoeh.antennapod.adapter;
-
-import android.content.Context;
-
-import androidx.core.text.TextUtilsCompat;
-import androidx.core.view.ViewCompat;
-import androidx.fragment.app.Fragment;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import java.lang.ref.WeakReference;
-import java.text.NumberFormat;
-import java.util.Locale;
-
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.activity.MainActivity;
-import de.danoeh.antennapod.model.feed.Feed;
-import de.danoeh.antennapod.core.feed.LocalFeedUpdater;
-import de.danoeh.antennapod.core.storage.NavDrawerData;
-import de.danoeh.antennapod.fragment.FeedItemlistFragment;
-import de.danoeh.antennapod.fragment.SubscriptionFragment;
-import jp.shts.android.library.TriangleLabelView;
-
-/**
- * Adapter for subscriptions
- */
-public class SubscriptionsAdapter extends BaseAdapter implements AdapterView.OnItemClickListener {
- /** the position in the view that holds the add item; 0 is the first, -1 is the last position */
- private static final String TAG = "SubscriptionsAdapter";
-
- private final WeakReference<MainActivity> mainActivityRef;
- private final ItemAccess itemAccess;
-
- public SubscriptionsAdapter(MainActivity mainActivity, ItemAccess itemAccess) {
- this.mainActivityRef = new WeakReference<>(mainActivity);
- this.itemAccess = itemAccess;
- }
-
- @Override
- public int getCount() {
- return itemAccess.getCount();
- }
-
- @Override
- public Object getItem(int position) {
- return itemAccess.getItem(position);
- }
-
- @Override
- public boolean hasStableIds() {
- return true;
- }
-
- @Override
- public long getItemId(int position) {
- return ((NavDrawerData.DrawerItem) getItem(position)).id;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- Holder holder;
-
- if (convertView == null) {
- holder = new Holder();
-
- LayoutInflater layoutInflater =
- (LayoutInflater) mainActivityRef.get().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- convertView = layoutInflater.inflate(R.layout.subscription_item, parent, false);
- holder.feedTitle = convertView.findViewById(R.id.txtvTitle);
- holder.imageView = convertView.findViewById(R.id.imgvCover);
- holder.count = convertView.findViewById(R.id.triangleCountView);
-
-
- convertView.setTag(holder);
- } else {
- holder = (Holder) convertView.getTag();
- }
-
- final NavDrawerData.DrawerItem drawerItem = (NavDrawerData.DrawerItem) getItem(position);
- if (drawerItem == null) {
- return null;
- }
-
- holder.feedTitle.setText(drawerItem.getTitle());
- holder.imageView.setContentDescription(drawerItem.getTitle());
- holder.feedTitle.setVisibility(View.VISIBLE);
-
- // Fix TriangleLabelView corner for RTL
- if (TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault())
- == ViewCompat.LAYOUT_DIRECTION_RTL) {
- holder.count.setCorner(TriangleLabelView.Corner.TOP_LEFT);
- }
-
- if (drawerItem.getCounter() > 0) {
- holder.count.setPrimaryText(NumberFormat.getInstance().format(drawerItem.getCounter()));
- holder.count.setVisibility(View.VISIBLE);
- } else {
- holder.count.setVisibility(View.GONE);
- }
-
- if (drawerItem.type == NavDrawerData.DrawerItem.Type.FEED) {
- Feed feed = ((NavDrawerData.FeedDrawerItem) drawerItem).feed;
- boolean textAndImageCombined = feed.isLocalFeed()
- && LocalFeedUpdater.getDefaultIconUrl(convertView.getContext()).equals(feed.getImageUrl());
- new CoverLoader(mainActivityRef.get())
- .withUri(feed.getImageUrl())
- .withPlaceholderView(holder.feedTitle, textAndImageCombined)
- .withCoverView(holder.imageView)
- .load();
- } else {
- new CoverLoader(mainActivityRef.get())
- .withResource(R.drawable.ic_folder)
- .withPlaceholderView(holder.feedTitle, true)
- .withCoverView(holder.imageView)
- .load();
- }
- return convertView;
- }
-
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- final NavDrawerData.DrawerItem drawerItem = (NavDrawerData.DrawerItem) getItem(position);
- if (drawerItem == null) {
- return;
- }
- if (drawerItem.type == NavDrawerData.DrawerItem.Type.FEED) {
- Feed feed = ((NavDrawerData.FeedDrawerItem) drawerItem).feed;
- Fragment fragment = FeedItemlistFragment.newInstance(feed.getId());
- mainActivityRef.get().loadChildFragment(fragment);
- } else if (drawerItem.type == NavDrawerData.DrawerItem.Type.FOLDER) {
- Fragment fragment = SubscriptionFragment.newInstance(drawerItem.getTitle());
- mainActivityRef.get().loadChildFragment(fragment);
- }
- }
-
- static class Holder {
- public TextView feedTitle;
- public ImageView imageView;
- public TriangleLabelView count;
- }
-
- public interface ItemAccess {
- int getCount();
-
- NavDrawerData.DrawerItem getItem(int position);
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsRecyclerAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsRecyclerAdapter.java
new file mode 100644
index 000000000..689f4fcbc
--- /dev/null
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsRecyclerAdapter.java
@@ -0,0 +1,245 @@
+package de.danoeh.antennapod.adapter;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.view.ContextMenu;
+import android.view.LayoutInflater;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.core.text.TextUtilsCompat;
+import androidx.core.view.ViewCompat;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.RecyclerView;
+
+import java.lang.ref.WeakReference;
+import java.text.NumberFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.activity.MainActivity;
+import de.danoeh.antennapod.core.feed.LocalFeedUpdater;
+import de.danoeh.antennapod.core.storage.NavDrawerData;
+import de.danoeh.antennapod.fragment.FeedItemlistFragment;
+import de.danoeh.antennapod.fragment.SubscriptionFragment;
+import de.danoeh.antennapod.model.feed.Feed;
+import jp.shts.android.library.TriangleLabelView;
+
+/**
+ * Adapter for subscriptions
+ */
+public class SubscriptionsRecyclerAdapter extends SelectableAdapter<SubscriptionsRecyclerAdapter.SubscriptionViewHolder>
+ implements View.OnCreateContextMenuListener {
+ private final WeakReference<MainActivity> mainActivityRef;
+ private List<NavDrawerData.DrawerItem> listItems;
+ private Feed selectedFeed = null;
+ int longPressedPosition = 0; // used to init actionMode
+
+ public SubscriptionsRecyclerAdapter(MainActivity mainActivity) {
+ super(mainActivity);
+ this.mainActivityRef = new WeakReference<>(mainActivity);
+ this.listItems = new ArrayList<>();
+ setHasStableIds(true);
+ }
+
+ public Object getItem(int position) {
+ return listItems.get(position);
+ }
+
+ public Feed getSelectedFeed() {
+ return selectedFeed;
+ }
+
+ @NonNull
+ @Override
+ public SubscriptionViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View itemView = LayoutInflater.from(mainActivityRef.get()).inflate(R.layout.subscription_item, parent, false);
+ return new SubscriptionViewHolder(itemView);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull SubscriptionViewHolder holder, int position) {
+ NavDrawerData.DrawerItem drawerItem = listItems.get(position);
+ boolean isFeed = drawerItem.type == NavDrawerData.DrawerItem.Type.FEED;
+ holder.bind(drawerItem);
+ holder.itemView.setOnCreateContextMenuListener(this);
+ if (inActionMode()) {
+ if (isFeed) {
+ holder.selectCheckbox.setVisibility(View.VISIBLE);
+ holder.selectView.setVisibility(View.VISIBLE);
+ }
+ holder.selectCheckbox.setChecked((isSelected(position)));
+ holder.selectCheckbox.setOnCheckedChangeListener((buttonView, isChecked)
+ -> setSelected(holder.getBindingAdapterPosition(), isChecked));
+ holder.imageView.setAlpha(0.6f);
+ holder.count.setVisibility(View.GONE);
+ } else {
+ holder.selectView.setVisibility(View.GONE);
+ holder.imageView.setAlpha(1.0f);
+ }
+
+ holder.itemView.setOnLongClickListener(v -> {
+ if (!inActionMode()) {
+ if (isFeed) {
+ selectedFeed = ((NavDrawerData.FeedDrawerItem) getItem(holder.getBindingAdapterPosition())).feed;
+ longPressedPosition = holder.getBindingAdapterPosition();
+ } else {
+ selectedFeed = null;
+ }
+ }
+ return false;
+ });
+
+ holder.itemView.setOnClickListener(v -> {
+ if (isFeed) {
+ if (inActionMode()) {
+ holder.selectCheckbox.setChecked(!isSelected(holder.getBindingAdapterPosition()));
+ } else {
+ Fragment fragment = FeedItemlistFragment
+ .newInstance(((NavDrawerData.FeedDrawerItem) drawerItem).feed.getId());
+ mainActivityRef.get().loadChildFragment(fragment);
+ }
+ } else if (!inActionMode()) {
+ Fragment fragment = SubscriptionFragment.newInstance(drawerItem.getTitle());
+ mainActivityRef.get().loadChildFragment(fragment);
+ }
+ });
+
+ }
+
+ @Override
+ public int getItemCount() {
+ return listItems.size();
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return listItems.get(position).id;
+ }
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
+ if (selectedFeed != null && !inActionMode()) {
+ MenuInflater inflater = mainActivityRef.get().getMenuInflater();
+ inflater.inflate(R.menu.nav_feed_context, menu);
+ menu.setHeaderTitle(selectedFeed.getTitle());
+ }
+ }
+
+ public boolean onContextItemSelected(MenuItem item) {
+ if (item.getItemId() == R.id.multi_select) {
+ startSelectMode(longPressedPosition);
+ return true;
+ }
+ return false;
+ }
+
+ public List<Feed> getSelectedItems() {
+ List<Feed> items = new ArrayList<>();
+ for (int i = 0; i < getItemCount(); i++) {
+ if (isSelected(i)) {
+ NavDrawerData.DrawerItem drawerItem = listItems.get(i);
+ if (drawerItem.type == NavDrawerData.DrawerItem.Type.FEED) {
+ Feed feed = ((NavDrawerData.FeedDrawerItem) drawerItem).feed;
+ items.add(feed);
+ }
+ }
+ }
+ return items;
+ }
+
+ public void setItems(List<NavDrawerData.DrawerItem> listItems) {
+ this.listItems = listItems;
+ }
+
+ @Override
+ public void setSelected(int pos, boolean selected) {
+ NavDrawerData.DrawerItem drawerItem = listItems.get(pos);
+ if (drawerItem.type == NavDrawerData.DrawerItem.Type.FEED) {
+ super.setSelected(pos, selected);
+ }
+ }
+
+ public class SubscriptionViewHolder extends RecyclerView.ViewHolder {
+ private final TextView feedTitle;
+ private final ImageView imageView;
+ private final TriangleLabelView count;
+ private final FrameLayout selectView;
+ private final CheckBox selectCheckbox;
+
+ public SubscriptionViewHolder(@NonNull View itemView) {
+ super(itemView);
+ feedTitle = itemView.findViewById(R.id.txtvTitle);
+ imageView = itemView.findViewById(R.id.imgvCover);
+ count = itemView.findViewById(R.id.triangleCountView);
+ selectView = itemView.findViewById(R.id.selectView);
+ selectCheckbox = itemView.findViewById(R.id.selectCheckBox);
+ }
+
+ public void bind(NavDrawerData.DrawerItem drawerItem) {
+ feedTitle.setText(drawerItem.getTitle());
+ imageView.setContentDescription(drawerItem.getTitle());
+ feedTitle.setVisibility(View.VISIBLE);
+ if (TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault())
+ == ViewCompat.LAYOUT_DIRECTION_RTL) {
+ count.setCorner(TriangleLabelView.Corner.TOP_LEFT);
+ }
+
+ if (drawerItem.getCounter() > 0) {
+ count.setPrimaryText(NumberFormat.getInstance().format(drawerItem.getCounter()));
+ count.setVisibility(View.VISIBLE);
+ } else {
+ count.setVisibility(View.GONE);
+ }
+
+ if (drawerItem.type == NavDrawerData.DrawerItem.Type.FEED) {
+ Feed feed = ((NavDrawerData.FeedDrawerItem) drawerItem).feed;
+ boolean textAndImageCombind = feed.isLocalFeed()
+ && LocalFeedUpdater.getDefaultIconUrl(itemView.getContext()).equals(feed.getImageUrl());
+ new CoverLoader(mainActivityRef.get())
+ .withUri(feed.getImageUrl())
+ .withPlaceholderView(feedTitle, textAndImageCombind)
+ .withCoverView(imageView)
+ .load();
+ } else {
+ new CoverLoader(mainActivityRef.get())
+ .withResource(R.drawable.ic_folder)
+ .withPlaceholderView(feedTitle, true)
+ .withCoverView(imageView)
+ .load();
+ }
+ }
+ }
+
+ public static float convertDpToPixel(Context context, float dp) {
+ return dp * context.getResources().getDisplayMetrics().density;
+ }
+
+ public static class GridDividerItemDecorator extends RecyclerView.ItemDecoration {
+ @Override
+ public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
+ super.onDraw(c, parent, state);
+ }
+
+ @Override
+ public void getItemOffsets(@NonNull Rect outRect,
+ @NonNull View view,
+ @NonNull RecyclerView parent,
+ @NonNull RecyclerView.State state) {
+ super.getItemOffsets(outRect, view, parent, state);
+ Context context = parent.getContext();
+ int insetOffset = (int) convertDpToPixel(context, 1f);
+ outRect.set(insetOffset, insetOffset, insetOffset, insetOffset);
+ }
+ }
+}