summaryrefslogtreecommitdiff
path: root/app/src/main/java/de/danoeh/antennapod/adapter
diff options
context:
space:
mode:
authorByteHamster <ByteHamster@users.noreply.github.com>2022-08-27 11:19:34 +0200
committerGitHub <noreply@github.com>2022-08-27 11:19:34 +0200
commit77104c9038abf579bc5652fc0ec5f941c0f9799f (patch)
tree3e45eaf8f65b222b475e2ec340d0af175c11c23c /app/src/main/java/de/danoeh/antennapod/adapter
parentec92722c043cd30bfe9c21171b2a3f62c44884d7 (diff)
downloadAntennaPod-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.java15
-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.java138
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java3
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: