From 8d2a188eda47b88351c1208190356a7f6a49b599 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Tue, 17 Mar 2020 13:45:34 +0100 Subject: Showing feed results in search --- .../antennapod/adapter/EpisodeItemListAdapter.java | 1 + .../adapter/FeedSearchResultAdapter.java | 76 ++++++++++++++++++++++ .../antennapod/fragment/EpisodesListFragment.java | 1 - .../danoeh/antennapod/fragment/QueueFragment.java | 1 - .../danoeh/antennapod/fragment/SearchFragment.java | 31 ++++++--- .../de/danoeh/antennapod/view/SquareImageView.java | 30 +++++++-- 6 files changed, 123 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/de/danoeh/antennapod/adapter/FeedSearchResultAdapter.java (limited to 'app/src/main/java/de/danoeh') 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 e5b9288ef..f8fd99867 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java @@ -34,6 +34,7 @@ public class EpisodeItemListAdapter extends RecyclerView.Adapter(mainActivity); + setHasStableIds(true); } public void updateItems(List items) { diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/FeedSearchResultAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/FeedSearchResultAdapter.java new file mode 100644 index 000000000..2e5ba31c9 --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/adapter/FeedSearchResultAdapter.java @@ -0,0 +1,76 @@ +package de.danoeh.antennapod.adapter; + +import android.view.View; +import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.activity.MainActivity; +import de.danoeh.antennapod.core.feed.Feed; +import de.danoeh.antennapod.fragment.FeedItemlistFragment; +import de.danoeh.antennapod.view.SquareImageView; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; + +public class FeedSearchResultAdapter extends RecyclerView.Adapter { + + private final WeakReference mainActivityRef; + private final List data = new ArrayList<>(); + + public FeedSearchResultAdapter(MainActivity mainActivity) { + this.mainActivityRef = new WeakReference<>(mainActivity); + } + + public void updateData(List newData) { + data.clear(); + data.addAll(newData); + notifyDataSetChanged(); + } + + @NonNull + @Override + public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View convertView = View.inflate(mainActivityRef.get(), R.layout.searchlist_item_feed, null); + return new Holder(convertView); + } + + @Override + public void onBindViewHolder(@NonNull Holder holder, int position) { + final Feed podcast = data.get(position); + holder.imageView.setContentDescription(podcast.getTitle()); + holder.imageView.setOnClickListener(v -> + mainActivityRef.get().loadChildFragment(FeedItemlistFragment.newInstance(podcast.getId()))); + + Glide.with(mainActivityRef.get()) + .load(podcast.getImageUrl()) + .apply(new RequestOptions() + .placeholder(R.color.light_gray) + .fitCenter() + .dontAnimate()) + .into(holder.imageView); + } + + @Override + public long getItemId(int position) { + return data.get(position).getId(); + } + + @Override + public int getItemCount() { + return data.size(); + } + + static class Holder extends RecyclerView.ViewHolder { + SquareImageView imageView; + + public Holder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.discovery_cover); + imageView.setDirection(SquareImageView.DIRECTION_HEIGHT); + } + } +} diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java index c92cba694..cb72153c2 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java @@ -344,7 +344,6 @@ public abstract class EpisodesListFragment extends Fragment { private void createRecycleAdapter(RecyclerView recyclerView, EmptyViewHandler emptyViewHandler) { MainActivity mainActivity = (MainActivity) getActivity(); listAdapter = new EpisodeItemListAdapter(mainActivity); - listAdapter.setHasStableIds(true); listAdapter.updateItems(episodes); recyclerView.setAdapter(listAdapter); emptyViewHandler.updateAdapter(listAdapter); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index a7c1c5c25..404ea1d8d 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -586,7 +586,6 @@ public class QueueFragment extends Fragment { if (recyclerAdapter == null) { MainActivity activity = (MainActivity) getActivity(); recyclerAdapter = new QueueRecyclerAdapter(activity, itemTouchHelper); - recyclerAdapter.setHasStableIds(true); recyclerView.setAdapter(recyclerAdapter); emptyView.updateAdapter(recyclerAdapter); } 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 7eeb26412..4bb7ec28a 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java @@ -3,6 +3,7 @@ package de.danoeh.antennapod.fragment; import android.content.Context; import android.os.Bundle; import android.util.Log; +import android.util.Pair; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -21,12 +22,14 @@ import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.EpisodeItemListAdapter; +import de.danoeh.antennapod.adapter.FeedSearchResultAdapter; import de.danoeh.antennapod.core.event.DownloadEvent; import de.danoeh.antennapod.core.event.DownloaderUpdate; import de.danoeh.antennapod.core.event.FeedItemEvent; import de.danoeh.antennapod.core.event.PlaybackPositionEvent; import de.danoeh.antennapod.core.event.PlayerStatusEvent; import de.danoeh.antennapod.core.event.UnreadItemsUpdateEvent; +import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.storage.FeedSearcher; import de.danoeh.antennapod.core.util.FeedItemUtil; @@ -52,10 +55,12 @@ public class SearchFragment extends Fragment { private static final String ARG_FEED = "feed"; private EpisodeItemListAdapter adapter; + private FeedSearchResultAdapter adapterFeeds; private Disposable disposable; private ProgressBar progressBar; private EmptyViewHandler emptyViewHandler; private RecyclerView recyclerView; + private RecyclerView recyclerViewFeeds; private List results; /** @@ -110,6 +115,7 @@ public class SearchFragment extends Fragment { View layout = inflater.inflate(R.layout.search_fragment, container, false); ((AppCompatActivity) getActivity()).setSupportActionBar(layout.findViewById(R.id.toolbar)); progressBar = layout.findViewById(R.id.progressBar); + recyclerView = layout.findViewById(R.id.recyclerView); LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); recyclerView.setLayoutManager(layoutManager); @@ -119,6 +125,14 @@ public class SearchFragment extends Fragment { adapter = new EpisodeItemListAdapter((MainActivity) getActivity()); recyclerView.setAdapter(adapter); + recyclerViewFeeds = layout.findViewById(R.id.recyclerViewFeeds); + LinearLayoutManager layoutManagerFeeds = new LinearLayoutManager(getActivity()); + layoutManagerFeeds.setOrientation(RecyclerView.HORIZONTAL); + recyclerViewFeeds.setLayoutManager(layoutManagerFeeds); + recyclerViewFeeds.setHasFixedSize(true); + adapterFeeds = new FeedSearchResultAdapter((MainActivity) getActivity()); + recyclerViewFeeds.setAdapter(adapterFeeds); + emptyViewHandler = new EmptyViewHandler(getContext()); emptyViewHandler.attachToRecyclerView(recyclerView); emptyViewHandler.setIcon(R.attr.action_search); @@ -249,19 +263,20 @@ public class SearchFragment extends Fragment { .observeOn(AndroidSchedulers.mainThread()) .subscribe(results -> { progressBar.setVisibility(View.GONE); - this.results = results; - adapter.updateItems(results); + this.results = results.first; + adapter.updateItems(results.first); + adapterFeeds.updateData(results.second); String query = getArguments().getString(ARG_QUERY); emptyViewHandler.setMessage(getString(R.string.no_results_for_query, query)); }, error -> Log.e(TAG, Log.getStackTraceString(error))); } @NonNull - private List performSearch() { - Bundle args = getArguments(); - String query = args.getString(ARG_QUERY); - long feed = args.getLong(ARG_FEED); - Context context = getActivity(); - return FeedSearcher.searchFeedItems(context, query, feed); + private Pair, List> performSearch() { + String query = getArguments().getString(ARG_QUERY); + long feed = getArguments().getLong(ARG_FEED); + List items = FeedSearcher.searchFeedItems(getContext(), query, feed); + List feeds = FeedSearcher.searchFeeds(getContext(), query); + return new Pair<>(items, feeds); } } diff --git a/app/src/main/java/de/danoeh/antennapod/view/SquareImageView.java b/app/src/main/java/de/danoeh/antennapod/view/SquareImageView.java index dcf1edbe7..c256ede9e 100644 --- a/app/src/main/java/de/danoeh/antennapod/view/SquareImageView.java +++ b/app/src/main/java/de/danoeh/antennapod/view/SquareImageView.java @@ -10,7 +10,11 @@ import de.danoeh.antennapod.core.R; * From http://stackoverflow.com/a/19449488/6839 */ public class SquareImageView extends AppCompatImageView { - private boolean useMinimum = false; + public static final int DIRECTION_WIDTH = 0; + public static final int DIRECTION_HEIGHT = 1; + public static final int DIRECTION_MINIMUM = 2; + + private int direction = DIRECTION_WIDTH; public SquareImageView(Context context) { super(context); @@ -27,20 +31,32 @@ public class SquareImageView extends AppCompatImageView { } private void loadAttrs(Context context, AttributeSet attrs) { - TypedArray a = context.obtainStyledAttributes(attrs, new int[]{R.styleable.SquareImageView_useMinimum}); - useMinimum = a.getBoolean(0, false); + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SquareImageView); + direction = a.getInt(R.styleable.SquareImageView_direction, DIRECTION_WIDTH); a.recycle(); } + public void setDirection(int direction) { + this.direction = direction; + requestLayout(); + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); - int size = getMeasuredWidth(); - if (useMinimum) { - size = Math.min(getMeasuredWidth(), getMeasuredHeight()); + switch (direction) { + case DIRECTION_MINIMUM: + int size = Math.min(getMeasuredWidth(), getMeasuredHeight()); + setMeasuredDimension(size, size); + break; + case DIRECTION_HEIGHT: + setMeasuredDimension(getMeasuredHeight(), getMeasuredHeight()); + break; + default: + setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth()); + break; } - setMeasuredDimension(size, size); } } \ No newline at end of file -- cgit v1.2.3