diff options
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/adapter')
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); + } + } +} |