Using unified item view in search fragment

This commit is contained in:
ByteHamster 2020-02-05 18:18:10 +01:00
parent a80bf2265a
commit 2e6fc7a0a5
7 changed files with 53 additions and 183 deletions

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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");

View File

@ -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<FeedComponent> 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();

View File

@ -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())

View File

@ -13,8 +13,5 @@
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingLeft="@dimen/list_vertical_padding"
android:paddingRight="@dimen/list_vertical_padding" />
android:layout_height="match_parent" />
</FrameLayout>

View File

@ -35,11 +35,12 @@ public class FeedSearcher {
final List<FeedComponent> result = new ArrayList<>();
try {
FutureTask<List<FeedItem>> itemSearchTask = DBTasks.searchFeedItems(context, selectedFeed, query);
FutureTask<List<Feed>> feedSearchTask = DBTasks.searchFeeds(context, query);
itemSearchTask.run();
feedSearchTask.run();
result.addAll(feedSearchTask.get());
if (selectedFeed == 0) {
FutureTask<List<Feed>> feedSearchTask = DBTasks.searchFeeds(context, query);
feedSearchTask.run();
result.addAll(feedSearchTask.get());
}
result.addAll(itemSearchTask.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();