diff options
author | ByteHamster <info@bytehamster.com> | 2020-03-17 13:45:34 +0100 |
---|---|---|
committer | ByteHamster <info@bytehamster.com> | 2020-03-17 14:35:10 +0100 |
commit | 8d2a188eda47b88351c1208190356a7f6a49b599 (patch) | |
tree | 5d4d5de5a94f208542b7d5a78b30c77315202a95 | |
parent | 4f0de071ec4654c8d0a829d2edb60d9891ce74da (diff) | |
download | AntennaPod-8d2a188eda47b88351c1208190356a7f6a49b599.zip |
Showing feed results in search
12 files changed, 169 insertions, 22 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 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<EpisodeItemView public EpisodeItemListAdapter(MainActivity mainActivity) { super(); this.mainActivityRef = new WeakReference<>(mainActivity); + setHasStableIds(true); } public void updateItems(List<FeedItem> 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<FeedSearchResultAdapter.Holder> { + + private final WeakReference<MainActivity> mainActivityRef; + private final List<Feed> data = new ArrayList<>(); + + public FeedSearchResultAdapter(MainActivity mainActivity) { + this.mainActivityRef = new WeakReference<>(mainActivity); + } + + public void updateData(List<Feed> 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<FeedItem> 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<FeedItem> 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<FeedItem>, List<Feed>> performSearch() { + String query = getArguments().getString(ARG_QUERY); + long feed = getArguments().getLong(ARG_FEED); + List<FeedItem> items = FeedSearcher.searchFeedItems(getContext(), query, feed); + List<Feed> 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 diff --git a/app/src/main/res/layout/cover_fragment.xml b/app/src/main/res/layout/cover_fragment.xml index 4292344fd..31e7dbda7 100644 --- a/app/src/main/res/layout/cover_fragment.xml +++ b/app/src/main/res/layout/cover_fragment.xml @@ -20,7 +20,7 @@ android:transitionName="coverTransition" tools:src="@android:drawable/sym_def_app_icon" android:foreground="?attr/selectableItemBackgroundBorderless" - squareImageView:useMinimum="true" /> + squareImageView:direction="minimum" /> <TextView android:id="@+id/txtvPodcastTitle" diff --git a/app/src/main/res/layout/quick_feed_discovery_item.xml b/app/src/main/res/layout/quick_feed_discovery_item.xml index 3a0fe0b4b..e1c91f9d8 100644 --- a/app/src/main/res/layout/quick_feed_discovery_item.xml +++ b/app/src/main/res/layout/quick_feed_discovery_item.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:squareImageView="http://schemas.android.com/apk/de.danoeh.antennapod" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="4dp" @@ -12,7 +13,8 @@ android:layout_height="match_parent" android:elevation="4dp" android:outlineProvider="bounds" - android:foreground="?android:attr/selectableItemBackground"/> + android:foreground="?android:attr/selectableItemBackground" + squareImageView:direction="width" /> </LinearLayout> diff --git a/app/src/main/res/layout/search_fragment.xml b/app/src/main/res/layout/search_fragment.xml index 371f94e34..ff40af775 100644 --- a/app/src/main/res/layout/search_fragment.xml +++ b/app/src/main/res/layout/search_fragment.xml @@ -24,7 +24,19 @@ <androidx.recyclerview.widget.RecyclerView android:layout_below="@id/toolbar" + android:id="@+id/recyclerViewFeeds" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingLeft="12dp" + android:paddingRight="12dp" + android:clipToPadding="false"/> + + <androidx.recyclerview.widget.RecyclerView + android:layout_below="@id/recyclerViewFeeds" android:id="@+id/recyclerView" + android:layout_marginTop="-4dp" + android:paddingTop="12dp" + android:clipToPadding="false" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout> diff --git a/app/src/main/res/layout/searchlist_item_feed.xml b/app/src/main/res/layout/searchlist_item_feed.xml new file mode 100644 index 000000000..f5e76801e --- /dev/null +++ b/app/src/main/res/layout/searchlist_item_feed.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:squareImageView="http://schemas.android.com/apk/de.danoeh.antennapod" + android:layout_width="match_parent" + android:layout_height="96dp" + android:padding="4dp" + android:clipToPadding="false"> + + <de.danoeh.antennapod.view.SquareImageView + android:id="@+id/discovery_cover" + android:layout_width="match_parent" + android:layout_height="96dp" + android:elevation="4dp" + android:outlineProvider="bounds" + android:foreground="?android:attr/selectableItemBackground" + squareImageView:direction="height" /> + +</LinearLayout> + diff --git a/app/src/main/res/layout/subscription_item.xml b/app/src/main/res/layout/subscription_item.xml index d065c5cf1..177608a54 100644 --- a/app/src/main/res/layout/subscription_item.xml +++ b/app/src/main/res/layout/subscription_item.xml @@ -1,7 +1,9 @@ <?xml version='1.0' encoding='utf-8'?> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" +<RelativeLayout + xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" + xmlns:squareImageView="http://schemas.android.com/apk/de.danoeh.antennapod" android:layout_width="match_parent" android:layout_height="match_parent"> @@ -10,7 +12,8 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="centerCrop" - tools:src="@mipmap/ic_launcher_round" /> + tools:src="@mipmap/ic_launcher_round" + squareImageView:direction="width"/> <com.joanzapata.iconify.widget.IconTextView android:id="@+id/txtvTitle" diff --git a/core/src/main/res/values/attrs.xml b/core/src/main/res/values/attrs.xml index 44f112614..471e31439 100644 --- a/core/src/main/res/values/attrs.xml +++ b/core/src/main/res/values/attrs.xml @@ -57,6 +57,10 @@ <attr name="action_icon_color" format="color"/> <declare-styleable name="SquareImageView"> - <attr name="useMinimum" format="boolean" /> + <attr name="direction" format="enum"> + <enum name="width" value="0"/> + <enum name="height" value="1"/> + <enum name="minimum" value="2"/> + </attr> </declare-styleable> </resources> |