diff options
author | ByteHamster <ByteHamster@users.noreply.github.com> | 2022-08-27 11:19:34 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-27 11:19:34 +0200 |
commit | 77104c9038abf579bc5652fc0ec5f941c0f9799f (patch) | |
tree | 3e45eaf8f65b222b475e2ec340d0af175c11c23c /app/src/main/java/de/danoeh/antennapod/adapter | |
parent | ec92722c043cd30bfe9c21171b2a3f62c44884d7 (diff) | |
download | AntennaPod-77104c9038abf579bc5652fc0ec5f941c0f9799f.zip |
Home Screen (#5864)
Co-authored-by: ueen <ueli.sarnighausen@online.de>
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/adapter')
-rw-r--r-- | app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java | 15 | ||||
-rw-r--r-- | app/src/main/java/de/danoeh/antennapod/adapter/HorizontalFeedListAdapter.java (renamed from app/src/main/java/de/danoeh/antennapod/adapter/FeedSearchResultAdapter.java) | 27 | ||||
-rw-r--r-- | app/src/main/java/de/danoeh/antennapod/adapter/HorizontalItemListAdapter.java | 138 | ||||
-rw-r--r-- | app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java | 3 |
4 files changed, 177 insertions, 6 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 088caf70a..9c2ff2586 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java @@ -38,6 +38,7 @@ public class EpisodeItemListAdapter extends SelectableAdapter<EpisodeItemViewHol private List<FeedItem> episodes = new ArrayList<>(); private FeedItem longPressedItem; int longPressedPosition = 0; // used to init actionMode + private int dummyViews = 0; public EpisodeItemListAdapter(MainActivity mainActivity) { super(mainActivity); @@ -45,6 +46,10 @@ public class EpisodeItemListAdapter extends SelectableAdapter<EpisodeItemViewHol setHasStableIds(true); } + public void setDummyViews(int dummyViews) { + this.dummyViews = dummyViews; + } + public void updateItems(List<FeedItem> items) { episodes = items; notifyDataSetChanged(); @@ -64,6 +69,11 @@ public class EpisodeItemListAdapter extends SelectableAdapter<EpisodeItemViewHol @Override public final void onBindViewHolder(EpisodeItemViewHolder holder, int pos) { + if (pos >= episodes.size()) { + holder.bindDummy(); + return; + } + // Reset state of recycled views holder.coverHolder.setVisibility(View.VISIBLE); holder.dragHandle.setVisibility(View.GONE); @@ -155,13 +165,16 @@ public class EpisodeItemListAdapter extends SelectableAdapter<EpisodeItemViewHol @Override public long getItemId(int position) { + if (position >= episodes.size()) { + return RecyclerView.NO_ID; // Dummy views + } FeedItem item = episodes.get(position); return item != null ? item.getId() : RecyclerView.NO_POSITION; } @Override public int getItemCount() { - return episodes.size(); + return dummyViews + episodes.size(); } protected FeedItem getItem(int index) { diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/FeedSearchResultAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/HorizontalFeedListAdapter.java index 92865e211..3e0190ee5 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/FeedSearchResultAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/HorizontalFeedListAdapter.java @@ -11,20 +11,25 @@ import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.fragment.FeedItemlistFragment; import de.danoeh.antennapod.ui.common.SquareImageView; +import de.danoeh.antennapod.ui.common.ThemeUtils; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; -public class FeedSearchResultAdapter extends RecyclerView.Adapter<FeedSearchResultAdapter.Holder> { - +public class HorizontalFeedListAdapter extends RecyclerView.Adapter<HorizontalFeedListAdapter.Holder> { private final WeakReference<MainActivity> mainActivityRef; private final List<Feed> data = new ArrayList<>(); + private int dummyViews = 0; - public FeedSearchResultAdapter(MainActivity mainActivity) { + public HorizontalFeedListAdapter(MainActivity mainActivity) { this.mainActivityRef = new WeakReference<>(mainActivity); } + public void setDummyViews(int dummyViews) { + this.dummyViews = dummyViews; + } + public void updateData(List<Feed> newData) { data.clear(); data.addAll(newData); @@ -34,12 +39,21 @@ public class FeedSearchResultAdapter extends RecyclerView.Adapter<FeedSearchResu @NonNull @Override public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View convertView = View.inflate(mainActivityRef.get(), R.layout.searchlist_item_feed, null); + View convertView = View.inflate(mainActivityRef.get(), R.layout.horizontal_feed_item, null); return new Holder(convertView); } @Override public void onBindViewHolder(@NonNull Holder holder, int position) { + if (position >= data.size()) { + holder.itemView.setAlpha(0.1f); + Glide.with(mainActivityRef.get()).clear(holder.imageView); + holder.imageView.setImageResource( + ThemeUtils.getDrawableFromAttr(mainActivityRef.get(), android.R.attr.textColorSecondary)); + return; + } + + holder.itemView.setAlpha(1.0f); final Feed podcast = data.get(position); holder.imageView.setContentDescription(podcast.getTitle()); holder.imageView.setOnClickListener(v -> @@ -56,12 +70,15 @@ public class FeedSearchResultAdapter extends RecyclerView.Adapter<FeedSearchResu @Override public long getItemId(int position) { + if (position >= data.size()) { + return RecyclerView.NO_ID; // Dummy views + } return data.get(position).getId(); } @Override public int getItemCount() { - return data.size(); + return dummyViews + data.size(); } static class Holder extends RecyclerView.ViewHolder { diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/HorizontalItemListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/HorizontalItemListAdapter.java new file mode 100644 index 000000000..4e8a2b05e --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/adapter/HorizontalItemListAdapter.java @@ -0,0 +1,138 @@ +package de.danoeh.antennapod.adapter; + +import android.view.ContextMenu; +import android.view.MenuInflater; +import android.view.View; +import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.activity.MainActivity; +import de.danoeh.antennapod.core.util.FeedItemUtil; +import de.danoeh.antennapod.fragment.ItemPagerFragment; +import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler; +import de.danoeh.antennapod.model.feed.FeedItem; +import de.danoeh.antennapod.view.viewholder.HorizontalItemViewHolder; +import org.apache.commons.lang3.ArrayUtils; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; + +public class HorizontalItemListAdapter extends RecyclerView.Adapter<HorizontalItemViewHolder> + implements View.OnCreateContextMenuListener { + private final WeakReference<MainActivity> mainActivityRef; + private List<FeedItem> data = new ArrayList<>(); + private FeedItem longPressedItem; + private int dummyViews = 0; + + public HorizontalItemListAdapter(MainActivity mainActivity) { + this.mainActivityRef = new WeakReference<>(mainActivity); + setHasStableIds(true); + } + + public void setDummyViews(int dummyViews) { + this.dummyViews = dummyViews; + } + + public void updateData(List<FeedItem> newData) { + data = newData; + notifyDataSetChanged(); + } + + @NonNull + @Override + public HorizontalItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new HorizontalItemViewHolder(mainActivityRef.get(), parent); + } + + @Override + public void onBindViewHolder(@NonNull HorizontalItemViewHolder holder, int position) { + if (position >= data.size()) { + holder.bindDummy(); + return; + } + + final FeedItem item = data.get(position); + holder.bind(item); + + holder.card.setOnCreateContextMenuListener(this); + holder.card.setOnLongClickListener(v -> { + longPressedItem = item; + return false; + }); + holder.secondaryActionIcon.setOnCreateContextMenuListener(this); + holder.secondaryActionIcon.setOnLongClickListener(v -> { + longPressedItem = item; + return false; + }); + holder.card.setOnClickListener(v -> { + MainActivity activity = mainActivityRef.get(); + if (activity != null) { + long[] ids = FeedItemUtil.getIds(data); + int clickPosition = ArrayUtils.indexOf(ids, item.getId()); + activity.loadChildFragment(ItemPagerFragment.newInstance(ids, clickPosition)); + } + }); + } + + @Override + public long getItemId(int position) { + if (position >= data.size()) { + return RecyclerView.NO_ID; // Dummy views + } + return data.get(position).getId(); + } + + @Override + public int getItemCount() { + return dummyViews + data.size(); + } + + @Override + public void onViewRecycled(@NonNull HorizontalItemViewHolder holder) { + super.onViewRecycled(holder); + // Set all listeners to null. This is required to prevent leaking fragments that have set a listener. + // Activity -> recycledViewPool -> ViewHolder -> Listener -> Fragment (can not be garbage collected) + holder.card.setOnClickListener(null); + holder.card.setOnCreateContextMenuListener(null); + holder.card.setOnLongClickListener(null); + holder.secondaryActionIcon.setOnClickListener(null); + holder.secondaryActionIcon.setOnCreateContextMenuListener(null); + holder.secondaryActionIcon.setOnLongClickListener(null); + } + + /** + * {@link #notifyItemChanged(int)} is final, so we can not override. + * Calling {@link #notifyItemChanged(int)} may bind the item to a new ViewHolder and execute a transition. + * This causes flickering and breaks the download animation that stores the old progress in the View. + * Instead, we tell the adapter to use partial binding by calling {@link #notifyItemChanged(int, Object)}. + * We actually ignore the payload and always do a full bind but calling the partial bind method ensures + * that ViewHolders are always re-used. + * + * @param position Position of the item that has changed + */ + public void notifyItemChangedCompat(int position) { + notifyItemChanged(position, "foo"); + } + + @Nullable + public FeedItem getLongPressedItem() { + return longPressedItem; + } + + @Override + public void onCreateContextMenu(final ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + MenuInflater inflater = mainActivityRef.get().getMenuInflater(); + if (longPressedItem == null) { + return; + } + menu.clear(); + inflater.inflate(R.menu.feeditemlist_context, menu); + menu.setHeaderTitle(longPressedItem.getTitle()); + FeedItemMenuHandler.onPrepareMenu(menu, longPressedItem, R.id.skip_episode_item); + } + + +} diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java index a6252522a..c1df44da3 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java @@ -36,6 +36,7 @@ import de.danoeh.antennapod.fragment.NavDrawerFragment; import de.danoeh.antennapod.fragment.PlaybackHistoryFragment; import de.danoeh.antennapod.fragment.QueueFragment; import de.danoeh.antennapod.fragment.SubscriptionFragment; +import de.danoeh.antennapod.ui.home.HomeFragment; import org.apache.commons.lang3.ArrayUtils; import java.lang.ref.WeakReference; @@ -112,6 +113,8 @@ public class NavListAdapter extends RecyclerView.Adapter<NavListAdapter.Holder> private @DrawableRes int getDrawable(String tag) { switch (tag) { + case HomeFragment.TAG: + return R.drawable.ic_home; case QueueFragment.TAG: return R.drawable.ic_playlist_play; case InboxFragment.TAG: |