From 2e6fc7a0a5b185e3d0c077daa80404aa99e8a432 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Wed, 5 Feb 2020 18:18:10 +0100 Subject: [PATCH] Using unified item view in search fragment --- .../adapter/FeedItemlistAdapter.java | 44 +++++-- .../antennapod/adapter/SearchlistAdapter.java | 123 ------------------ .../fragment/FeedItemlistFragment.java | 6 +- .../antennapod/fragment/SearchFragment.java | 12 +- .../view/viewholder/FeedViewHolder.java | 37 +----- app/src/main/res/layout/search_fragment.xml | 5 +- .../antennapod/core/storage/FeedSearcher.java | 9 +- 7 files changed, 53 insertions(+), 183 deletions(-) delete mode 100644 app/src/main/java/de/danoeh/antennapod/adapter/SearchlistAdapter.java diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java index 9e7778c12..a5cfcb3e7 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java @@ -6,8 +6,12 @@ import android.widget.BaseAdapter; import android.widget.ListView; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.core.event.PlaybackPositionEvent; +import de.danoeh.antennapod.core.feed.Feed; +import de.danoeh.antennapod.core.feed.FeedComponent; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.view.viewholder.EpisodeItemViewHolder; +import de.danoeh.antennapod.view.viewholder.FeedComponentViewHolder; +import de.danoeh.antennapod.view.viewholder.FeedViewHolder; /** * List adapter for items of feeds that the user has already subscribed to. @@ -21,10 +25,8 @@ public class FeedItemlistAdapter extends BaseAdapter { private int currentlyPlayingItem = -1; - public FeedItemlistAdapter(MainActivity activity, - ItemAccess itemAccess, - boolean showIcons, - boolean makePlayedItemsTransparent) { + public FeedItemlistAdapter(MainActivity activity, ItemAccess itemAccess, + boolean showIcons, boolean makePlayedItemsTransparent) { super(); this.activity = activity; this.itemAccess = itemAccess; @@ -44,14 +46,38 @@ public class FeedItemlistAdapter extends BaseAdapter { } @Override - public FeedItem getItem(int position) { + public FeedComponent getItem(int position) { return itemAccess.getItem(position); } @Override public View getView(final int position, View convertView, ViewGroup parent) { + final FeedComponent item = getItem(position); + if (item instanceof Feed) { + return getView((Feed) item, convertView, parent); + } else { + final FeedItem feeditem = (FeedItem) item; + if (feeditem.getMedia() != null && feeditem.getMedia().isCurrentlyPlaying()) { + currentlyPlayingItem = position; + } + return getView(feeditem, convertView, parent); + } + } + + private View getView(Feed item, View convertView, ViewGroup parent) { + FeedViewHolder holder; + if (convertView == null || !(convertView.getTag() instanceof FeedViewHolder)) { + holder = new FeedViewHolder(activity, parent); + } else { + holder = (FeedViewHolder) convertView.getTag(); + } + holder.bind(item); + return holder.itemView; + } + + private View getView(final FeedItem item, View convertView, ViewGroup parent) { EpisodeItemViewHolder holder; - if (convertView == null) { + if (convertView == null || !(convertView.getTag() instanceof EpisodeItemViewHolder)) { holder = new EpisodeItemViewHolder(activity, parent); } else { holder = (EpisodeItemViewHolder) convertView.getTag(); @@ -61,7 +87,6 @@ public class FeedItemlistAdapter extends BaseAdapter { holder.coverHolder.setVisibility(View.GONE); } - final FeedItem item = getItem(position); holder.bind(item); holder.dragHandle.setVisibility(View.GONE); @@ -69,9 +94,6 @@ public class FeedItemlistAdapter extends BaseAdapter { holder.itemView.setAlpha(1.0f); } - if (item.getMedia() != null && item.getMedia().isCurrentlyPlaying()) { - currentlyPlayingItem = position; - } holder.hideSeparatorIfNecessary(); return holder.itemView; } @@ -91,7 +113,7 @@ public class FeedItemlistAdapter extends BaseAdapter { public interface ItemAccess { int getCount(); - FeedItem getItem(int position); + FeedComponent getItem(int position); } } diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/SearchlistAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/SearchlistAdapter.java deleted file mode 100644 index d1615b410..000000000 --- a/app/src/main/java/de/danoeh/antennapod/adapter/SearchlistAdapter.java +++ /dev/null @@ -1,123 +0,0 @@ -package de.danoeh.antennapod.adapter; - -import android.content.Context; -import android.os.Build; -import android.text.Layout; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.TextView; -import com.bumptech.glide.Glide; -import com.bumptech.glide.request.RequestOptions; -import de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.feed.Feed; -import de.danoeh.antennapod.core.feed.FeedComponent; -import de.danoeh.antennapod.core.feed.FeedItem; -import de.danoeh.antennapod.core.glide.ApGlideSettings; - -/** - * List adapter for search activity. - */ -public class SearchlistAdapter extends BaseAdapter { - - private final Context context; - private final ItemAccess itemAccess; - - - public SearchlistAdapter(Context context, ItemAccess itemAccess) { - this.context = context; - this.itemAccess = itemAccess; - } - - @Override - public int getCount() { - return itemAccess.getCount(); - } - - @Override - public FeedComponent getItem(int position) { - return itemAccess.getItem(position); - } - - @Override - public long getItemId(int position) { - return 0; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - final Holder holder; - FeedComponent component = getItem(position); - - // Inflate Layout - if (convertView == null) { - holder = new Holder(); - LayoutInflater inflater = (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - - convertView = inflater.inflate(R.layout.searchlist_item, parent, false); - holder.title = convertView.findViewById(R.id.txtvTitle); - if(Build.VERSION.SDK_INT >= 23) { - holder.title.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL); - } - holder.cover = convertView - .findViewById(R.id.imgvFeedimage); - holder.subtitle = convertView - .findViewById(R.id.txtvSubtitle); - - convertView.setTag(holder); - } else { - holder = (Holder) convertView.getTag(); - } - if (component.getClass() == Feed.class) { - final Feed feed = (Feed) component; - holder.title.setText(feed.getTitle()); - holder.subtitle.setVisibility(View.GONE); - - Glide.with(context) - .load(feed.getImageLocation()) - .apply(new RequestOptions() - .placeholder(R.color.light_gray) - .error(R.color.light_gray) - .diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY) - .fitCenter() - .dontAnimate()) - .into(holder.cover); - - } else if (component.getClass() == FeedItem.class) { - final FeedItem item = (FeedItem) component; - holder.title.setText(item.getTitle()); - holder.subtitle.setVisibility(View.VISIBLE); - - convertView.setAlpha(item.isPlayed() ? 0.5f : 1.0f); - - Glide.with(context) - .load(item.getFeed().getImageLocation()) - .apply(new RequestOptions() - .placeholder(R.color.light_gray) - .error(R.color.light_gray) - .diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY) - .fitCenter() - .dontAnimate()) - .into(holder.cover); - - } - - return convertView; - } - - static class Holder { - ImageView cover; - TextView title; - TextView subtitle; - } - - public interface ItemAccess { - int getCount(); - - FeedComponent getItem(int position); - } - -} diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java index 16787a1c5..b9afa6d57 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java @@ -289,7 +289,7 @@ public class FeedItemlistFragment extends ListFragment { AdapterView.AdapterContextMenuInfo adapterInfo = (AdapterView.AdapterContextMenuInfo) menuInfo; // because of addHeaderView(), positions are increased by 1! - FeedItem item = itemAccess.getItem(adapterInfo.position-1); + FeedItem item = (FeedItem) itemAccess.getItem(adapterInfo.position - 1); MenuInflater inflater = getActivity().getMenuInflater(); inflater.inflate(R.menu.feeditemlist_context, menu); @@ -305,11 +305,11 @@ public class FeedItemlistFragment extends ListFragment { @Override public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); - if(menuInfo == null) { + if (menuInfo == null) { menuInfo = lastMenuInfo; } // because of addHeaderView(), positions are increased by 1! - FeedItem selectedItem = itemAccess.getItem(menuInfo.position-1); + FeedItem selectedItem = feed.getItemAtIndex(menuInfo.position - 1); if (selectedItem == null) { Log.i(TAG, "Selected item at position " + menuInfo.position + " was null, ignoring selection"); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java index c640554ff..6a698ecce 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java @@ -20,11 +20,12 @@ import androidx.core.view.MenuItemCompat; import androidx.fragment.app.Fragment; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; -import de.danoeh.antennapod.adapter.SearchlistAdapter; +import de.danoeh.antennapod.adapter.FeedItemlistAdapter; import de.danoeh.antennapod.core.event.UnreadItemsUpdateEvent; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedComponent; import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.FeedSearcher; import de.danoeh.antennapod.view.EmptyViewHandler; import io.reactivex.Observable; @@ -33,6 +34,9 @@ import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.FutureTask; + import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -45,7 +49,7 @@ public class SearchFragment extends Fragment implements AdapterView.OnItemClickL private static final String ARG_QUERY = "query"; private static final String ARG_FEED = "feed"; - private SearchlistAdapter searchAdapter; + private FeedItemlistAdapter searchAdapter; private List searchResults = new ArrayList<>(); private Disposable disposable; private ProgressBar progressBar; @@ -105,7 +109,7 @@ public class SearchFragment extends Fragment implements AdapterView.OnItemClickL View layout = inflater.inflate(R.layout.search_fragment, container, false); ListView listView = layout.findViewById(R.id.listview); progressBar = layout.findViewById(R.id.progressBar); - searchAdapter = new SearchlistAdapter(getActivity(), itemAccess); + searchAdapter = new FeedItemlistAdapter((MainActivity) getActivity(), itemAccess, true, true); listView.setAdapter(searchAdapter); listView.setOnItemClickListener(this); @@ -172,7 +176,7 @@ public class SearchFragment extends Fragment implements AdapterView.OnItemClickL emptyViewHandler.setMessage(getString(R.string.no_results_for_query, query)); } - private final SearchlistAdapter.ItemAccess itemAccess = new SearchlistAdapter.ItemAccess() { + private final FeedItemlistAdapter.ItemAccess itemAccess = new FeedItemlistAdapter.ItemAccess() { @Override public int getCount() { return searchResults.size(); diff --git a/app/src/main/java/de/danoeh/antennapod/view/viewholder/FeedViewHolder.java b/app/src/main/java/de/danoeh/antennapod/view/viewholder/FeedViewHolder.java index 39d428a6e..83250bbfa 100644 --- a/app/src/main/java/de/danoeh/antennapod/view/viewholder/FeedViewHolder.java +++ b/app/src/main/java/de/danoeh/antennapod/view/viewholder/FeedViewHolder.java @@ -2,34 +2,16 @@ package de.danoeh.antennapod.view.viewholder; import android.os.Build; import android.text.Layout; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; -import android.widget.ProgressBar; import android.widget.TextView; import androidx.cardview.widget.CardView; -import androidx.recyclerview.widget.RecyclerView; -import com.joanzapata.iconify.Iconify; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.CoverLoader; -import de.danoeh.antennapod.adapter.QueueRecyclerAdapter; -import de.danoeh.antennapod.adapter.actionbutton.ItemActionButton; -import de.danoeh.antennapod.core.event.PlaybackPositionEvent; import de.danoeh.antennapod.core.feed.Feed; -import de.danoeh.antennapod.core.feed.FeedItem; -import de.danoeh.antennapod.core.feed.FeedMedia; -import de.danoeh.antennapod.core.feed.MediaType; -import de.danoeh.antennapod.core.feed.util.ImageResourceUtils; -import de.danoeh.antennapod.core.service.download.DownloadRequest; -import de.danoeh.antennapod.core.storage.DownloadRequester; -import de.danoeh.antennapod.core.util.Converter; -import de.danoeh.antennapod.core.util.DateUtils; -import de.danoeh.antennapod.core.util.NetworkUtils; -import de.danoeh.antennapod.core.util.ThemeUtils; -import de.danoeh.antennapod.view.CircularProgressBar; /** * Holds the view which shows feeds. @@ -37,14 +19,9 @@ import de.danoeh.antennapod.view.CircularProgressBar; public class FeedViewHolder extends FeedComponentViewHolder { private static final String TAG = "FeedViewHolder"; - private final View container; - public final ImageView dragHandle; private final TextView placeholder; private final ImageView cover; private final TextView title; - public final View secondaryActionButton; - public final ImageView secondaryActionIcon; - private final CircularProgressBar secondaryActionProgress; public final CardView coverHolder; private final MainActivity activity; @@ -53,21 +30,18 @@ public class FeedViewHolder extends FeedComponentViewHolder { public FeedViewHolder(MainActivity activity, ViewGroup parent) { super(LayoutInflater.from(activity).inflate(R.layout.feeditemlist_item, parent, false)); this.activity = activity; - container = itemView.findViewById(R.id.container); - dragHandle = itemView.findViewById(R.id.drag_handle); placeholder = itemView.findViewById(R.id.txtvPlaceholder); cover = itemView.findViewById(R.id.imgvCover); + coverHolder = itemView.findViewById(R.id.coverHolder); title = itemView.findViewById(R.id.txtvTitle); if (Build.VERSION.SDK_INT >= 23) { title.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL); } + itemView.findViewById(R.id.secondaryActionButton).setVisibility(View.GONE); itemView.findViewById(R.id.status).setVisibility(View.GONE); itemView.findViewById(R.id.progress).setVisibility(View.GONE); - secondaryActionProgress = itemView.findViewById(R.id.secondaryActionProgress); - secondaryActionButton = itemView.findViewById(R.id.secondaryActionButton); - secondaryActionIcon = itemView.findViewById(R.id.secondaryActionIcon); - coverHolder = itemView.findViewById(R.id.coverHolder); + itemView.findViewById(R.id.drag_handle).setVisibility(View.GONE); itemView.setTag(this); } @@ -76,11 +50,6 @@ public class FeedViewHolder extends FeedComponentViewHolder { placeholder.setText(feed.getTitle()); title.setText(feed.getTitle()); - /*ItemActionButton actionButton = ItemActionButton.forItem(item, true, true); - actionButton.configure(secondaryActionButton, secondaryActionIcon, activity); - secondaryActionButton.setFocusable(false); - secondaryActionProgress.setPercentage(0, null);*/ - if (coverHolder.getVisibility() == View.VISIBLE) { new CoverLoader(activity) .withUri(feed.getImageLocation()) diff --git a/app/src/main/res/layout/search_fragment.xml b/app/src/main/res/layout/search_fragment.xml index 6f455a056..489c2d392 100644 --- a/app/src/main/res/layout/search_fragment.xml +++ b/app/src/main/res/layout/search_fragment.xml @@ -13,8 +13,5 @@ + android:layout_height="match_parent" /> \ No newline at end of file diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java b/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java index bbe8b26f1..77c8d3b7f 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java @@ -35,11 +35,12 @@ public class FeedSearcher { final List result = new ArrayList<>(); try { FutureTask> itemSearchTask = DBTasks.searchFeedItems(context, selectedFeed, query); - FutureTask> feedSearchTask = DBTasks.searchFeeds(context, query); itemSearchTask.run(); - feedSearchTask.run(); - - result.addAll(feedSearchTask.get()); + if (selectedFeed == 0) { + FutureTask> feedSearchTask = DBTasks.searchFeeds(context, query); + feedSearchTask.run(); + result.addAll(feedSearchTask.get()); + } result.addAll(itemSearchTask.get()); } catch (InterruptedException | ExecutionException e) { e.printStackTrace();