summaryrefslogtreecommitdiff
path: root/app/src/main/java/de/danoeh/antennapod/adapter
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/adapter')
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java8
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/CoverLoader.java33
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java134
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/DownloadlistAdapter.java123
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java11
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/FeedSearchResultAdapter.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java332
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsAdapter.java68
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/AddToQueueActionButton.java8
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/CancelDownloadActionButton.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DeleteActionButton.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DownloadActionButton.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java17
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MarkAsPlayedActionButton.java8
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MobileDownloadHelper.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PauseActionButton.java13
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayActionButton.java12
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayLocalActionButton.java12
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/StreamActionButton.java12
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/VisitWebsiteActionButton.java8
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/TagListAdapter.java2
23 files changed, 415 insertions, 424 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java
index 8380d8626..faa18434e 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java
@@ -15,13 +15,13 @@ import com.bumptech.glide.load.resource.bitmap.FitCenter;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.core.feed.Chapter;
+import de.danoeh.antennapod.model.feed.Chapter;
import de.danoeh.antennapod.core.glide.ApGlideSettings;
import de.danoeh.antennapod.core.util.Converter;
import de.danoeh.antennapod.core.util.EmbeddedChapterImage;
import de.danoeh.antennapod.core.util.IntentUtils;
import de.danoeh.antennapod.ui.common.ThemeUtils;
-import de.danoeh.antennapod.core.util.playback.Playable;
+import de.danoeh.antennapod.model.playback.Playable;
import de.danoeh.antennapod.ui.common.CircularProgressBar;
public class ChaptersListAdapter extends RecyclerView.Adapter<ChaptersListAdapter.ChapterHolder> {
@@ -77,7 +77,7 @@ public class ChaptersListAdapter extends RecyclerView.Adapter<ChaptersListAdapte
holder.link.setText(sc.getLink());
holder.link.setOnClickListener(v -> IntentUtils.openInBrowser(context, sc.getLink()));
}
- holder.secondaryActionIcon.setImageResource(ThemeUtils.getDrawableFromAttr(context, R.attr.av_play));
+ holder.secondaryActionIcon.setImageResource(R.drawable.ic_play_48dp);
holder.secondaryActionButton.setContentDescription(context.getString(R.string.play_chapter));
holder.secondaryActionButton.setOnClickListener(v -> {
if (callback != null) {
@@ -92,7 +92,7 @@ public class ChaptersListAdapter extends RecyclerView.Adapter<ChaptersListAdapte
progress = Math.max(progress, CircularProgressBar.MINIMUM_PERCENTAGE);
progress = Math.min(progress, CircularProgressBar.MAXIMUM_PERCENTAGE);
holder.progressBar.setPercentage(progress, position);
- holder.secondaryActionIcon.setImageResource(ThemeUtils.getDrawableFromAttr(context, R.attr.av_replay));
+ holder.secondaryActionIcon.setImageResource(R.drawable.ic_replay);
} else {
holder.itemView.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent));
holder.progressBar.setPercentage(0, null);
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/CoverLoader.java b/app/src/main/java/de/danoeh/antennapod/adapter/CoverLoader.java
index d782d4ed5..aeaf526be 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/CoverLoader.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/CoverLoader.java
@@ -21,6 +21,7 @@ import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.core.glide.ApGlideSettings;
public class CoverLoader {
+ private int resource = 0;
private String uri;
private String fallbackUri;
private TextView txtvPlaceholder;
@@ -37,6 +38,11 @@ public class CoverLoader {
return this;
}
+ public CoverLoader withResource(int resource) {
+ this.resource = resource;
+ return this;
+ }
+
public CoverLoader withFallbackUri(String uri) {
fallbackUri = uri;
return this;
@@ -66,6 +72,12 @@ public class CoverLoader {
}
public void load() {
+ if (resource != 0) {
+ imgvCover.setImageResource(resource);
+ CoverTarget.setPlaceholderVisibility(txtvPlaceholder, textAndImageCombined);
+ return;
+ }
+
RequestOptions options = new RequestOptions()
.diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY)
.fitCenter()
@@ -106,15 +118,7 @@ public class CoverLoader {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
- TextView txtvPlaceholder = placeholder.get();
- if (txtvPlaceholder != null) {
- if (textAndImageCombined) {
- int bgColor = txtvPlaceholder.getContext().getResources().getColor(R.color.feed_text_bg);
- txtvPlaceholder.setBackgroundColor(bgColor);
- } else {
- txtvPlaceholder.setVisibility(View.INVISIBLE);
- }
- }
+ setPlaceholderVisibility(placeholder.get(), textAndImageCombined);
ImageView ivCover = cover.get();
ivCover.setImageDrawable(resource);
}
@@ -124,5 +128,16 @@ public class CoverLoader {
ImageView ivCover = cover.get();
ivCover.setImageDrawable(placeholder);
}
+
+ static void setPlaceholderVisibility(TextView placeholder, boolean textAndImageCombined) {
+ if (placeholder != null) {
+ if (textAndImageCombined) {
+ int bgColor = placeholder.getContext().getResources().getColor(R.color.feed_text_bg);
+ placeholder.setBackgroundColor(bgColor);
+ } else {
+ placeholder.setVisibility(View.INVISIBLE);
+ }
+ }
+ }
}
} \ No newline at end of file
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
index 811e1e31b..740636c77 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
@@ -2,26 +2,32 @@ package de.danoeh.antennapod.adapter;
import android.app.Activity;
import android.text.format.DateUtils;
-import android.util.Log;
+import android.text.format.Formatter;
import android.view.View;
import android.view.ViewGroup;
+import android.util.Log;
import android.widget.BaseAdapter;
-import android.widget.Toast;
+import android.widget.Toast;
import androidx.core.content.ContextCompat;
-
+import androidx.fragment.app.ListFragment;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.core.dialog.DownloadRequestErrorDialogCreator;
-import de.danoeh.antennapod.core.feed.Feed;
-import de.danoeh.antennapod.core.feed.FeedMedia;
+import de.danoeh.antennapod.core.service.download.DownloadRequest;
+import de.danoeh.antennapod.core.service.download.Downloader;
import de.danoeh.antennapod.core.service.download.DownloadStatus;
import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.storage.DBTasks;
import de.danoeh.antennapod.core.storage.DownloadRequestException;
import de.danoeh.antennapod.core.storage.DownloadRequester;
+import de.danoeh.antennapod.model.feed.Feed;
+import de.danoeh.antennapod.model.feed.FeedMedia;
import de.danoeh.antennapod.ui.common.ThemeUtils;
-import de.danoeh.antennapod.view.viewholder.DownloadItemViewHolder;
+import de.danoeh.antennapod.view.viewholder.DownloadLogItemViewHolder;
+
+import java.util.ArrayList;
+import java.util.List;
/**
* Displays a list of DownloadStatus entries.
@@ -30,37 +36,62 @@ public class DownloadLogAdapter extends BaseAdapter {
private static final String TAG = "DownloadLogAdapter";
private final Activity context;
- private final ItemAccess itemAccess;
+ private final ListFragment listFragment;
+ private List<DownloadStatus> downloadLog = new ArrayList<>();
+ private List<Downloader> runningDownloads = new ArrayList<>();
- public DownloadLogAdapter(Activity context, ItemAccess itemAccess) {
+ public DownloadLogAdapter(Activity context, ListFragment listFragment) {
super();
- this.itemAccess = itemAccess;
this.context = context;
+ this.listFragment = listFragment;
+ }
+
+ public void setDownloadLog(List<DownloadStatus> downloadLog) {
+ this.downloadLog = downloadLog;
+ notifyDataSetChanged();
+ }
+
+ public void setRunningDownloads(List<Downloader> runningDownloads) {
+ this.runningDownloads = runningDownloads;
+ notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
- DownloadItemViewHolder holder;
+ DownloadLogItemViewHolder holder;
if (convertView == null) {
- holder = new DownloadItemViewHolder(context, parent);
+ holder = new DownloadLogItemViewHolder(context, parent);
+ holder.itemView.setTag(holder);
} else {
- holder = (DownloadItemViewHolder) convertView.getTag();
+ holder = (DownloadLogItemViewHolder) convertView.getTag();
}
- DownloadStatus status = getItem(position);
+ Object item = getItem(position);
+ if (item instanceof DownloadStatus) {
+ bind(holder, (DownloadStatus) item, position);
+ } else if (item instanceof Downloader) {
+ bind(holder, (Downloader) item, position);
+ }
+ return holder.itemView;
+ }
+
+ private void bind(DownloadLogItemViewHolder holder, DownloadStatus status, int position) {
+ String statusText = "";
if (status.getFeedfileType() == Feed.FEEDFILETYPE_FEED) {
- holder.type.setText(R.string.download_type_feed);
+ statusText += context.getString(R.string.download_type_feed);
} else if (status.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) {
- holder.type.setText(R.string.download_type_media);
+ statusText += context.getString(R.string.download_type_media);
}
+ statusText += " · ";
+ statusText += DateUtils.getRelativeTimeSpanString(status.getCompletionDate().getTime(),
+ System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS, 0);
+ holder.status.setText(statusText);
if (status.getTitle() != null) {
holder.title.setText(status.getTitle());
} else {
holder.title.setText(R.string.download_log_title_unknown);
}
- holder.date.setText(DateUtils.getRelativeTimeSpanString(status.getCompletionDate().getTime(),
- System.currentTimeMillis(), 0, 0));
if (status.isSuccessful()) {
holder.icon.setTextColor(ContextCompat.getColor(context, R.color.download_success_green));
@@ -77,13 +108,13 @@ public class DownloadLogAdapter extends BaseAdapter {
holder.reason.setVisibility(View.VISIBLE);
holder.tapForDetails.setVisibility(View.VISIBLE);
- if (newerWasSuccessful(position, status.getFeedfileType(), status.getFeedfileId())) {
+ if (newerWasSuccessful(position - runningDownloads.size(),
+ status.getFeedfileType(), status.getFeedfileId())) {
holder.secondaryActionButton.setVisibility(View.INVISIBLE);
holder.secondaryActionButton.setOnClickListener(null);
holder.secondaryActionButton.setTag(null);
} else {
- holder.secondaryActionIcon.setImageResource(
- ThemeUtils.getDrawableFromAttr(context, R.attr.navigation_refresh));
+ holder.secondaryActionIcon.setImageResource(R.drawable.ic_refresh);
holder.secondaryActionButton.setVisibility(View.VISIBLE);
if (status.getFeedfileType() == Feed.FEEDFILETYPE_FEED) {
@@ -120,13 +151,51 @@ public class DownloadLogAdapter extends BaseAdapter {
}
}
}
+ }
- return holder.itemView;
+ private void bind(DownloadLogItemViewHolder holder, Downloader downloader, int position) {
+ DownloadRequest request = downloader.getDownloadRequest();
+ holder.title.setText(request.getTitle());
+ holder.secondaryActionIcon.setImageResource(R.drawable.ic_cancel);
+ holder.secondaryActionButton.setContentDescription(context.getString(R.string.cancel_download_label));
+ holder.secondaryActionButton.setVisibility(View.VISIBLE);
+ holder.secondaryActionButton.setTag(downloader);
+ holder.secondaryActionButton.setOnClickListener(v ->
+ listFragment.onListItemClick(null, holder.itemView, position, 0));
+ holder.reason.setVisibility(View.GONE);
+ holder.tapForDetails.setVisibility(View.GONE);
+ holder.icon.setTextColor(ThemeUtils.getColorFromAttr(context, R.attr.colorPrimary));
+ holder.icon.setText("{fa-arrow-circle-down}");
+ holder.icon.setContentDescription(context.getString(R.string.status_downloading_label));
+
+ boolean percentageWasSet = false;
+ String status = "";
+ if (request.getFeedfileType() == Feed.FEEDFILETYPE_FEED) {
+ status += context.getString(R.string.download_type_feed);
+ } else if (request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) {
+ status += context.getString(R.string.download_type_media);
+ }
+ status += " · ";
+ if (request.getSoFar() <= 0) {
+ status += context.getString(R.string.download_pending);
+ } else {
+ status += Formatter.formatShortFileSize(context, request.getSoFar());
+ if (request.getSize() != DownloadStatus.SIZE_UNKNOWN) {
+ status += " / " + Formatter.formatShortFileSize(context, request.getSize());
+ holder.secondaryActionProgress.setPercentage(
+ 0.01f * Math.max(1, request.getProgressPercent()), request);
+ percentageWasSet = true;
+ }
+ }
+ if (!percentageWasSet) {
+ holder.secondaryActionProgress.setPercentage(0, request);
+ }
+ holder.status.setText(status);
}
- private boolean newerWasSuccessful(int position, int feedTypeId, long id) {
- for (int i = 0; i < position; i++) {
- DownloadStatus status = getItem(i);
+ private boolean newerWasSuccessful(int downloadStatusIndex, int feedTypeId, long id) {
+ for (int i = 0; i < downloadStatusIndex; i++) {
+ DownloadStatus status = downloadLog.get(i);
if (status.getFeedfileType() == feedTypeId && status.getFeedfileId() == id && status.isSuccessful()) {
return true;
}
@@ -136,12 +205,17 @@ public class DownloadLogAdapter extends BaseAdapter {
@Override
public int getCount() {
- return itemAccess.getCount();
+ return downloadLog.size() + runningDownloads.size();
}
@Override
- public DownloadStatus getItem(int position) {
- return itemAccess.getItem(position);
+ public Object getItem(int position) {
+ if (position < runningDownloads.size()) {
+ return runningDownloads.get(position);
+ } else if (position - runningDownloads.size() < downloadLog.size()) {
+ return downloadLog.get(position - runningDownloads.size());
+ }
+ return null;
}
@Override
@@ -149,10 +223,4 @@ public class DownloadLogAdapter extends BaseAdapter {
return position;
}
- public interface ItemAccess {
- int getCount();
-
- DownloadStatus getItem(int position);
- }
-
}
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadlistAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadlistAdapter.java
deleted file mode 100644
index 9363edc9f..000000000
--- a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadlistAdapter.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package de.danoeh.antennapod.adapter;
-
-import android.content.Context;
-import android.text.format.Formatter;
-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 de.danoeh.antennapod.R;
-import de.danoeh.antennapod.core.feed.Feed;
-import de.danoeh.antennapod.core.feed.FeedMedia;
-import de.danoeh.antennapod.core.service.download.DownloadRequest;
-import de.danoeh.antennapod.core.service.download.DownloadStatus;
-import de.danoeh.antennapod.core.service.download.Downloader;
-import de.danoeh.antennapod.ui.common.ThemeUtils;
-import de.danoeh.antennapod.ui.common.CircularProgressBar;
-
-public class DownloadlistAdapter extends BaseAdapter {
-
- private final ItemAccess itemAccess;
- private final Context context;
-
- public DownloadlistAdapter(Context context, ItemAccess itemAccess) {
- super();
- this.context = context;
- this.itemAccess = itemAccess;
- }
-
- @Override
- public int getCount() {
- return itemAccess.getCount();
- }
-
- @Override
- public Downloader getItem(int position) {
- return itemAccess.getItem(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- Holder holder;
- Downloader downloader = getItem(position);
- DownloadRequest request = downloader.getDownloadRequest();
- if (convertView == null) {
- holder = new Holder();
- LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- convertView = inflater.inflate(R.layout.downloadlist_item, parent, false);
- holder.title = convertView.findViewById(R.id.txtvTitle);
- holder.status = convertView.findViewById(R.id.txtvStatus);
- holder.secondaryActionButton = convertView.findViewById(R.id.secondaryActionButton);
- holder.secondaryActionIcon = convertView.findViewById(R.id.secondaryActionIcon);
- holder.secondaryActionProgress = convertView.findViewById(R.id.secondaryActionProgress);
- convertView.setTag(holder);
- } else {
- holder = (Holder) convertView.getTag();
- }
-
- holder.title.setText(request.getTitle());
- holder.secondaryActionIcon.setImageResource(ThemeUtils.getDrawableFromAttr(context, R.attr.navigation_cancel));
- holder.secondaryActionButton.setContentDescription(context.getString(R.string.cancel_download_label));
- holder.secondaryActionButton.setTag(downloader);
- holder.secondaryActionButton.setOnClickListener(butSecondaryListener);
-
- boolean percentageWasSet = false;
- String status = "";
- if (request.getFeedfileType() == Feed.FEEDFILETYPE_FEED) {
- status += context.getString(R.string.download_type_feed);
- } else if (request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) {
- status += context.getString(R.string.download_type_media);
- }
- status += " · ";
- if (request.getSoFar() <= 0) {
- status += context.getString(R.string.download_pending);
- } else {
- status += Formatter.formatShortFileSize(context, request.getSoFar());
- if (request.getSize() != DownloadStatus.SIZE_UNKNOWN) {
- status += " / " + Formatter.formatShortFileSize(context, request.getSize());
- holder.secondaryActionProgress.setPercentage(
- 0.01f * Math.max(1, request.getProgressPercent()), request);
- percentageWasSet = true;
- }
- }
- if (!percentageWasSet) {
- holder.secondaryActionProgress.setPercentage(0, request);
- }
- holder.status.setText(status);
-
- return convertView;
- }
-
- private final View.OnClickListener butSecondaryListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Downloader downloader = (Downloader) v.getTag();
- itemAccess.onSecondaryActionClick(downloader);
- }
- };
-
- static class Holder {
- TextView title;
- TextView status;
- View secondaryActionButton;
- ImageView secondaryActionIcon;
- CircularProgressBar secondaryActionProgress;
- }
-
- public interface ItemAccess {
- int getCount();
-
- Downloader getItem(int position);
-
- void onSecondaryActionClick(Downloader downloader);
- }
-
-}
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 4762622d1..774b97454 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java
@@ -10,7 +10,7 @@ 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.feed.FeedItem;
+import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.core.util.FeedItemUtil;
import de.danoeh.antennapod.fragment.ItemPagerFragment;
import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler;
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java
index 8cb0fd30a..62a97e849 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java
@@ -12,14 +12,15 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.core.feed.MediaType;
+import de.danoeh.antennapod.model.playback.MediaType;
import de.danoeh.antennapod.core.util.NetworkUtils;
-import de.danoeh.antennapod.core.util.playback.RemoteMedia;
-import de.danoeh.antennapod.core.feed.FeedItem;
+import de.danoeh.antennapod.model.playback.RemoteMedia;
+import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.core.service.playback.PlaybackService;
import de.danoeh.antennapod.core.util.DateUtils;
-import de.danoeh.antennapod.core.util.playback.Playable;
+import de.danoeh.antennapod.model.playback.Playable;
import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter;
+import de.danoeh.antennapod.core.util.syndication.HtmlToPlainText;
import de.danoeh.antennapod.dialog.StreamingConfirmationDialog;
import java.util.List;
@@ -59,7 +60,7 @@ public class FeedItemlistDescriptionAdapter extends ArrayAdapter<FeedItem> {
holder.title.setText(item.getTitle());
holder.pubDate.setText(DateUtils.formatAbbrev(getContext(), item.getPubDate()));
if (item.getDescription() != null) {
- String description = item.getDescription()
+ String description = HtmlToPlainText.getPlainText(item.getDescription())
.replaceAll("\n", " ")
.replaceAll("\\s+", " ")
.trim();
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/FeedSearchResultAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/FeedSearchResultAdapter.java
index dbb9ce0d0..92865e211 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/FeedSearchResultAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/FeedSearchResultAdapter.java
@@ -8,7 +8,7 @@ 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.model.feed.Feed;
import de.danoeh.antennapod.fragment.FeedItemlistFragment;
import de.danoeh.antennapod.ui.common.SquareImageView;
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 7c8943f36..ff0311ab6 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java
@@ -1,28 +1,31 @@
package de.danoeh.antennapod.adapter;
import android.app.Activity;
-import android.content.Context;
+import android.content.Intent;
import android.content.SharedPreferences;
-import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
+import android.view.ContextMenu;
+import android.view.LayoutInflater;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.NonNull;
import androidx.preference.PreferenceManager;
import android.util.TypedValue;
-import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
+import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.joanzapata.iconify.Iconify;
import com.joanzapata.iconify.widget.IconTextView;
import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.core.feed.Feed;
+import de.danoeh.antennapod.activity.PreferenceActivity;
+import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.core.glide.ApGlideSettings;
import de.danoeh.antennapod.core.preferences.UserPreferences;
+import de.danoeh.antennapod.core.storage.NavDrawerData;
import de.danoeh.antennapod.fragment.AddFeedFragment;
import de.danoeh.antennapod.fragment.DownloadsFragment;
import de.danoeh.antennapod.fragment.EpisodesFragment;
@@ -42,10 +45,9 @@ import java.util.List;
/**
* BaseAdapter for the navigation drawer
*/
-public class NavListAdapter extends BaseAdapter
+public class NavListAdapter extends RecyclerView.Adapter<NavListAdapter.Holder>
implements SharedPreferences.OnSharedPreferenceChangeListener {
- private static final int VIEW_TYPE_COUNT = 3;
public static final int VIEW_TYPE_NAV = 0;
public static final int VIEW_TYPE_SECTION_DIVIDER = 1;
private static final int VIEW_TYPE_SUBSCRIPTION = 2;
@@ -56,9 +58,8 @@ public class NavListAdapter extends BaseAdapter
*/
public static final String SUBSCRIPTION_LIST_TAG = "SubscriptionList";
- private static List<String> tags;
- private static String[] titles;
-
+ private final List<String> fragmentTags = new ArrayList<>();
+ private final String[] titles;
private final ItemAccess itemAccess;
private final WeakReference<Activity> activity;
public boolean showSubscriptionList = true;
@@ -96,7 +97,8 @@ public class NavListAdapter extends BaseAdapter
showSubscriptionList = false;
}
- tags = newTags;
+ fragmentTags.clear();
+ fragmentTags.addAll(newTags);
notifyDataSetChanged();
}
@@ -105,47 +107,31 @@ public class NavListAdapter extends BaseAdapter
return titles[index];
}
- private Drawable getDrawable(String tag) {
- Activity context = activity.get();
- if (context == null) {
- return null;
- }
- int icon;
+ private @DrawableRes int getDrawable(String tag) {
switch (tag) {
case QueueFragment.TAG:
- icon = R.attr.stat_playlist;
- break;
+ return R.drawable.ic_playlist;
case EpisodesFragment.TAG:
- icon = R.attr.feed;
- break;
+ return R.drawable.ic_feed;
case DownloadsFragment.TAG:
- icon = R.attr.av_download;
- break;
+ return R.drawable.ic_download;
case PlaybackHistoryFragment.TAG:
- icon = R.attr.ic_history;
- break;
+ return R.drawable.ic_history;
case SubscriptionFragment.TAG:
- icon = R.attr.ic_folder;
- break;
+ return R.drawable.ic_folder;
case AddFeedFragment.TAG:
- icon = R.attr.content_new;
- break;
+ return R.drawable.ic_add;
default:
- return null;
+ return 0;
}
- TypedArray ta = context.obtainStyledAttributes(new int[] { icon } );
- Drawable result = ta.getDrawable(0);
- ta.recycle();
- return result;
}
- public List<String> getTags() {
- return Collections.unmodifiableList(tags);
+ public List<String> getFragmentTags() {
+ return Collections.unmodifiableList(fragmentTags);
}
-
@Override
- public int getCount() {
+ public int getItemCount() {
int baseCount = getSubscriptionOffset();
if (showSubscriptionList) {
baseCount += itemAccess.getCount();
@@ -154,25 +140,20 @@ public class NavListAdapter extends BaseAdapter
}
@Override
- public Object getItem(int position) {
+ public long getItemId(int position) {
int viewType = getItemViewType(position);
- if (viewType == VIEW_TYPE_NAV) {
- return getLabel(tags.get(position));
- } else if (viewType == VIEW_TYPE_SECTION_DIVIDER) {
- return "";
+ if (viewType == VIEW_TYPE_SUBSCRIPTION) {
+ return itemAccess.getItem(position - getSubscriptionOffset()).id;
+ } else if (viewType == VIEW_TYPE_NAV) {
+ return -Math.abs((long) fragmentTags.get(position).hashCode()) - 1; // Folder IDs are >0
} else {
- return itemAccess.getItem(position);
+ return 0;
}
}
@Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
public int getItemViewType(int position) {
- if (0 <= position && position < tags.size()) {
+ if (0 <= position && position < fragmentTags.size()) {
return VIEW_TYPE_NAV;
} else if (position < getSubscriptionOffset()) {
return VIEW_TYPE_SECTION_DIVIDER;
@@ -181,69 +162,67 @@ public class NavListAdapter extends BaseAdapter
}
}
- @Override
- public int getViewTypeCount() {
- return VIEW_TYPE_COUNT;
- }
-
public int getSubscriptionOffset() {
- return tags.size() > 0 ? tags.size() + 1 : 0;
+ return fragmentTags.size() > 0 ? fragmentTags.size() + 1 : 0;
}
+ @NonNull
+ @Override
+ public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ LayoutInflater inflater = LayoutInflater.from(activity.get());
+ if (viewType == VIEW_TYPE_NAV) {
+ return new NavHolder(inflater.inflate(R.layout.nav_listitem, parent, false));
+ } else if (viewType == VIEW_TYPE_SECTION_DIVIDER) {
+ return new DividerHolder(inflater.inflate(R.layout.nav_section_item, parent, false));
+ } else {
+ return new FeedHolder(inflater.inflate(R.layout.nav_listitem, parent, false));
+ }
+ }
@Override
- public View getView(int position, View convertView, ViewGroup parent) {
+ public void onBindViewHolder(@NonNull Holder holder, int position) {
int viewType = getItemViewType(position);
- View v;
+
+ holder.itemView.setOnCreateContextMenuListener(null);
if (viewType == VIEW_TYPE_NAV) {
- v = getNavView((String) getItem(position), position, convertView, parent);
+ bindNavView(getLabel(fragmentTags.get(position)), position, (NavHolder) holder);
} else if (viewType == VIEW_TYPE_SECTION_DIVIDER) {
- v = getSectionDividerView(convertView, parent);
+ bindSectionDivider((DividerHolder) holder);
} else {
- v = getFeedView(position, convertView, parent);
+ int itemPos = position - getSubscriptionOffset();
+ NavDrawerData.DrawerItem item = itemAccess.getItem(itemPos);
+ bindListItem(item, (FeedHolder) holder);
+ if (item.type == NavDrawerData.DrawerItem.Type.FEED) {
+ bindFeedView((NavDrawerData.FeedDrawerItem) item, (FeedHolder) holder);
+ holder.itemView.setOnCreateContextMenuListener(itemAccess);
+ } else {
+ bindFolderView((NavDrawerData.FolderDrawerItem) item, (FeedHolder) holder);
+ }
}
- if (v != null && viewType != VIEW_TYPE_SECTION_DIVIDER) {
+ if (viewType != VIEW_TYPE_SECTION_DIVIDER) {
TypedValue typedValue = new TypedValue();
- if (position == itemAccess.getSelectedItemIndex()) {
- v.getContext().getTheme().resolveAttribute(R.attr.drawer_activated_color, typedValue, true);
- v.setBackgroundResource(typedValue.resourceId);
- } else {
- v.getContext().getTheme().resolveAttribute(android.R.attr.windowBackground, typedValue, true);
- v.setBackgroundResource(typedValue.resourceId);
- }
+ activity.get().getTheme().resolveAttribute(itemAccess.isSelected(position)
+ ? R.attr.drawer_activated_color : android.R.attr.windowBackground, typedValue, true);
+ holder.itemView.setBackgroundResource(typedValue.resourceId);
+
+ holder.itemView.setOnClickListener(v -> itemAccess.onItemClick(position));
+ holder.itemView.setOnLongClickListener(v -> itemAccess.onItemLongClick(position));
}
- return v;
}
- private View getNavView(String title, int position, View convertView, ViewGroup parent) {
+ private void bindNavView(String title, int position, NavHolder holder) {
Activity context = activity.get();
- if(context == null) {
- return null;
- }
- NavHolder holder;
- if (convertView == null) {
- holder = new NavHolder();
- LayoutInflater inflater = (LayoutInflater) context
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-
- convertView = inflater.inflate(R.layout.nav_listitem, parent, false);
-
- holder.image = convertView.findViewById(R.id.imgvCover);
- holder.title = convertView.findViewById(R.id.txtvTitle);
- holder.count = convertView.findViewById(R.id.txtvCount);
- convertView.setTag(holder);
- } else {
- holder = (NavHolder) convertView.getTag();
+ if (context == null) {
+ return;
}
-
holder.title.setText(title);
// reset for re-use
holder.count.setVisibility(View.GONE);
holder.count.setOnClickListener(null);
- String tag = tags.get(position);
+ String tag = fragmentTags.get(position);
if (tag.equals(QueueFragment.TAG)) {
int queueSize = itemAccess.getQueueSize();
if (queueSize > 0) {
@@ -262,78 +241,69 @@ public class NavListAdapter extends BaseAdapter
holder.count.setText(NumberFormat.getInstance().format(sum));
holder.count.setVisibility(View.VISIBLE);
}
- } else if(tag.equals(DownloadsFragment.TAG) && UserPreferences.isEnableAutodownload()) {
+ } else if (tag.equals(DownloadsFragment.TAG) && UserPreferences.isEnableAutodownload()) {
int epCacheSize = UserPreferences.getEpisodeCacheSize();
// don't count episodes that can be reclaimed
- int spaceUsed = itemAccess.getNumberOfDownloadedItems() -
- itemAccess.getReclaimableItems();
+ int spaceUsed = itemAccess.getNumberOfDownloadedItems()
+ - itemAccess.getReclaimableItems();
if (epCacheSize > 0 && spaceUsed >= epCacheSize) {
holder.count.setText("{md-disc-full 150%}");
Iconify.addIcons(holder.count);
holder.count.setVisibility(View.VISIBLE);
holder.count.setOnClickListener(v ->
- new AlertDialog.Builder(context)
+ new AlertDialog.Builder(context)
.setTitle(R.string.episode_cache_full_title)
.setMessage(R.string.episode_cache_full_message)
- .setPositiveButton(android.R.string.ok, (dialog, which) -> {})
+ .setPositiveButton(android.R.string.ok, null)
+ .setNeutralButton(R.string.open_autodownload_settings, (dialog, which) -> {
+ Intent intent = new Intent(context, PreferenceActivity.class);
+ intent.putExtra(PreferenceActivity.OPEN_AUTO_DOWNLOAD_SETTINGS, true);
+ context.startActivity(intent);
+ })
.show()
);
}
}
- holder.image.setImageDrawable(getDrawable(tags.get(position)));
-
- return convertView;
+ holder.image.setImageResource(getDrawable(fragmentTags.get(position)));
}
- private View getSectionDividerView(View convertView, ViewGroup parent) {
+ private void bindSectionDivider(DividerHolder holder) {
Activity context = activity.get();
- if(context == null) {
- return null;
+ if (context == null) {
+ return;
}
- LayoutInflater inflater = (LayoutInflater) context
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-
- convertView = inflater.inflate(R.layout.nav_section_item, parent, false);
- TextView feedsFilteredMsg = convertView.findViewById(R.id.nav_feeds_filtered_message);
if (UserPreferences.getSubscriptionsFilter().isEnabled() && showSubscriptionList) {
- convertView.setEnabled(true);
- feedsFilteredMsg.setText("{md-info-outline} " + context.getString(R.string.subscriptions_are_filtered));
- Iconify.addIcons(feedsFilteredMsg);
- feedsFilteredMsg.setVisibility(View.VISIBLE);
+ holder.itemView.setEnabled(true);
+ holder.feedsFilteredMsg.setText("{md-info-outline} "
+ + context.getString(R.string.subscriptions_are_filtered));
+ Iconify.addIcons(holder.feedsFilteredMsg);
+ holder.feedsFilteredMsg.setVisibility(View.VISIBLE);
} else {
- convertView.setEnabled(false);
- feedsFilteredMsg.setVisibility(View.GONE);
+ holder.itemView.setEnabled(false);
+ holder.feedsFilteredMsg.setVisibility(View.GONE);
}
+ }
- return convertView;
+ private void bindListItem(NavDrawerData.DrawerItem item, FeedHolder holder) {
+ if (item.getCounter() > 0) {
+ holder.count.setVisibility(View.VISIBLE);
+ holder.count.setText(NumberFormat.getInstance().format(item.getCounter()));
+ } else {
+ holder.count.setVisibility(View.GONE);
+ }
+ holder.title.setText(item.getTitle());
+ int padding = (int) (activity.get().getResources().getDimension(R.dimen.thumbnail_length_navlist) / 2);
+ holder.itemView.setPadding(item.getLayer() * padding, 0, 0, 0);
}
- private View getFeedView(int position, View convertView, ViewGroup parent) {
+ private void bindFeedView(NavDrawerData.FeedDrawerItem drawerItem, FeedHolder holder) {
+ Feed feed = drawerItem.feed;
Activity context = activity.get();
- if(context == null) {
- return null;
- }
- int feedPos = position - getSubscriptionOffset();
- Feed feed = itemAccess.getItem(feedPos);
-
- FeedHolder holder;
- if (convertView == null) {
- holder = new FeedHolder();
- LayoutInflater inflater = (LayoutInflater) context
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-
- convertView = inflater.inflate(R.layout.nav_listitem, parent, false);
-
- holder.image = convertView.findViewById(R.id.imgvCover);
- holder.title = convertView.findViewById(R.id.txtvTitle);
- holder.failure = convertView.findViewById(R.id.itxtvFailure);
- holder.count = convertView.findViewById(R.id.txtvCount);
- convertView.setTag(holder);
- } else {
- holder = (FeedHolder) convertView.getTag();
+ if (context == null) {
+ return;
}
Glide.with(context)
@@ -346,9 +316,7 @@ public class NavListAdapter extends BaseAdapter
.dontAnimate())
.into(holder.image);
- holder.title.setText(feed.getTitle());
-
- if(feed.hasLastUpdateFailed()) {
+ if (feed.hasLastUpdateFailed()) {
RelativeLayout.LayoutParams p = (RelativeLayout.LayoutParams) holder.title.getLayoutParams();
p.addRule(RelativeLayout.LEFT_OF, R.id.itxtvFailure);
holder.failure.setVisibility(View.VISIBLE);
@@ -357,39 +325,87 @@ public class NavListAdapter extends BaseAdapter
p.addRule(RelativeLayout.LEFT_OF, R.id.txtvCount);
holder.failure.setVisibility(View.GONE);
}
- int counter = itemAccess.getFeedCounter(feed.getId());
- if(counter > 0) {
- holder.count.setVisibility(View.VISIBLE);
- holder.count.setText(NumberFormat.getInstance().format(counter));
- } else {
+ }
+
+ private void bindFolderView(NavDrawerData.FolderDrawerItem folder, FeedHolder holder) {
+ Activity context = activity.get();
+ if (context == null) {
+ return;
+ }
+ if (folder.isOpen) {
holder.count.setVisibility(View.GONE);
}
- return convertView;
+ Glide.with(context).clear(holder.image);
+ holder.image.setImageResource(R.drawable.ic_folder);
+ holder.failure.setVisibility(View.GONE);
+ }
+
+ static class Holder extends RecyclerView.ViewHolder {
+ public Holder(@NonNull View itemView) {
+ super(itemView);
+ }
}
- static class NavHolder {
- ImageView image;
- TextView title;
- TextView count;
+ static class DividerHolder extends Holder {
+ final TextView feedsFilteredMsg;
+
+ public DividerHolder(@NonNull View itemView) {
+ super(itemView);
+ feedsFilteredMsg = itemView.findViewById(R.id.nav_feeds_filtered_message);
+ }
}
- static class FeedHolder {
- ImageView image;
- TextView title;
- IconTextView failure;
- TextView count;
+ static class NavHolder extends Holder {
+ final ImageView image;
+ final TextView title;
+ final TextView count;
+
+ public NavHolder(@NonNull View itemView) {
+ super(itemView);
+ image = itemView.findViewById(R.id.imgvCover);
+ title = itemView.findViewById(R.id.txtvTitle);
+ count = itemView.findViewById(R.id.txtvCount);
+ }
}
- public interface ItemAccess {
+ static class FeedHolder extends Holder {
+ final ImageView image;
+ final TextView title;
+ final IconTextView failure;
+ final TextView count;
+
+ public FeedHolder(@NonNull View itemView) {
+ super(itemView);
+ image = itemView.findViewById(R.id.imgvCover);
+ title = itemView.findViewById(R.id.txtvTitle);
+ failure = itemView.findViewById(R.id.itxtvFailure);
+ count = itemView.findViewById(R.id.txtvCount);
+ }
+ }
+
+ public interface ItemAccess extends View.OnCreateContextMenuListener {
int getCount();
- Feed getItem(int position);
- int getSelectedItemIndex();
+
+ NavDrawerData.DrawerItem getItem(int position);
+
+ boolean isSelected(int position);
+
int getQueueSize();
+
int getNumberOfNewItems();
+
int getNumberOfDownloadedItems();
+
int getReclaimableItems();
- int getFeedCounter(long feedId);
+
int getFeedCounterSum();
+
+ void onItemClick(int position);
+
+ boolean onItemLongClick(int position);
+
+ @Override
+ void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo);
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsAdapter.java
index f7d6358de..0af6960d7 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsAdapter.java
@@ -19,19 +19,17 @@ import java.util.Locale;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
-import de.danoeh.antennapod.core.feed.Feed;
+import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.core.feed.LocalFeedUpdater;
+import de.danoeh.antennapod.core.storage.NavDrawerData;
import de.danoeh.antennapod.fragment.FeedItemlistFragment;
+import de.danoeh.antennapod.fragment.SubscriptionFragment;
import jp.shts.android.library.TriangleLabelView;
/**
* Adapter for subscriptions
*/
public class SubscriptionsAdapter extends BaseAdapter implements AdapterView.OnItemClickListener {
-
- /** placeholder object that indicates item should be added */
- public static final Object ADD_ITEM_OBJ = new Object();
-
/** the position in the view that holds the add item; 0 is the first, -1 is the last position */
private static final String TAG = "SubscriptionsAdapter";
@@ -60,7 +58,7 @@ public class SubscriptionsAdapter extends BaseAdapter implements AdapterView.OnI
@Override
public long getItemId(int position) {
- return itemAccess.getItem(position).getId();
+ return ((NavDrawerData.DrawerItem) getItem(position)).id;
}
@Override
@@ -83,11 +81,13 @@ public class SubscriptionsAdapter extends BaseAdapter implements AdapterView.OnI
holder = (Holder) convertView.getTag();
}
- final Feed feed = (Feed) getItem(position);
- if (feed == null) return null;
+ final NavDrawerData.DrawerItem drawerItem = (NavDrawerData.DrawerItem) getItem(position);
+ if (drawerItem == null) {
+ return null;
+ }
- holder.feedTitle.setText(feed.getTitle());
- holder.imageView.setContentDescription(feed.getTitle());
+ holder.feedTitle.setText(drawerItem.getTitle());
+ holder.imageView.setContentDescription(drawerItem.getTitle());
holder.feedTitle.setVisibility(View.VISIBLE);
// Fix TriangleLabelView corner for RTL
@@ -96,30 +96,46 @@ public class SubscriptionsAdapter extends BaseAdapter implements AdapterView.OnI
holder.count.setCorner(TriangleLabelView.Corner.TOP_LEFT);
}
- int count = itemAccess.getFeedCounter(feed.getId());
- if(count > 0) {
- holder.count.setPrimaryText(
- NumberFormat.getInstance().format(itemAccess.getFeedCounter(feed.getId())));
+ if (drawerItem.getCounter() > 0) {
+ holder.count.setPrimaryText(NumberFormat.getInstance().format(drawerItem.getCounter()));
holder.count.setVisibility(View.VISIBLE);
} else {
holder.count.setVisibility(View.GONE);
}
- boolean textAndImageCombined = feed.isLocalFeed()
- && LocalFeedUpdater.getDefaultIconUrl(convertView.getContext()).equals(feed.getImageUrl());
- new CoverLoader(mainActivityRef.get())
- .withUri(feed.getImageUrl())
- .withPlaceholderView(holder.feedTitle, textAndImageCombined)
- .withCoverView(holder.imageView)
- .load();
-
+ if (drawerItem.type == NavDrawerData.DrawerItem.Type.FEED) {
+ Feed feed = ((NavDrawerData.FeedDrawerItem) drawerItem).feed;
+ boolean textAndImageCombined = feed.isLocalFeed()
+ && LocalFeedUpdater.getDefaultIconUrl(convertView.getContext()).equals(feed.getImageUrl());
+ new CoverLoader(mainActivityRef.get())
+ .withUri(feed.getImageUrl())
+ .withPlaceholderView(holder.feedTitle, textAndImageCombined)
+ .withCoverView(holder.imageView)
+ .load();
+ } else {
+ new CoverLoader(mainActivityRef.get())
+ .withResource(R.drawable.ic_folder)
+ .withPlaceholderView(holder.feedTitle, true)
+ .withCoverView(holder.imageView)
+ .load();
+ }
return convertView;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- Fragment fragment = FeedItemlistFragment.newInstance(getItemId(position));
- mainActivityRef.get().loadChildFragment(fragment);
+ final NavDrawerData.DrawerItem drawerItem = (NavDrawerData.DrawerItem) getItem(position);
+ if (drawerItem == null) {
+ return;
+ }
+ if (drawerItem.type == NavDrawerData.DrawerItem.Type.FEED) {
+ Feed feed = ((NavDrawerData.FeedDrawerItem) drawerItem).feed;
+ Fragment fragment = FeedItemlistFragment.newInstance(feed.getId());
+ mainActivityRef.get().loadChildFragment(fragment);
+ } else if (drawerItem.type == NavDrawerData.DrawerItem.Type.FOLDER) {
+ Fragment fragment = SubscriptionFragment.newInstance(drawerItem.getTitle());
+ mainActivityRef.get().loadChildFragment(fragment);
+ }
}
static class Holder {
@@ -130,7 +146,7 @@ public class SubscriptionsAdapter extends BaseAdapter implements AdapterView.OnI
public interface ItemAccess {
int getCount();
- Feed getItem(int position);
- int getFeedCounter(long feedId);
+
+ NavDrawerData.DrawerItem getItem(int position);
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/AddToQueueActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/AddToQueueActionButton.java
index a8001eeb1..b362a5a1d 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/AddToQueueActionButton.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/AddToQueueActionButton.java
@@ -1,11 +1,11 @@
package de.danoeh.antennapod.adapter.actionbutton;
import android.content.Context;
-import androidx.annotation.AttrRes;
+import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.core.feed.FeedItem;
+import de.danoeh.antennapod.model.feed.FeedItem;
class AddToQueueActionButton extends ItemActionButton {
@@ -20,9 +20,9 @@ class AddToQueueActionButton extends ItemActionButton {
}
@Override
- @AttrRes
+ @DrawableRes
public int getDrawable() {
- return R.attr.content_new;
+ return R.drawable.ic_add;
}
@Override
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/CancelDownloadActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/CancelDownloadActionButton.java
index a31d2fdc0..afa86c9d7 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/CancelDownloadActionButton.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/CancelDownloadActionButton.java
@@ -1,13 +1,13 @@
package de.danoeh.antennapod.adapter.actionbutton;
import android.content.Context;
-import androidx.annotation.AttrRes;
+import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
import android.widget.Toast;
import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.core.feed.FeedItem;
-import de.danoeh.antennapod.core.feed.FeedMedia;
+import de.danoeh.antennapod.model.feed.FeedItem;
+import de.danoeh.antennapod.model.feed.FeedMedia;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.storage.DBWriter;
import de.danoeh.antennapod.core.storage.DownloadRequester;
@@ -25,9 +25,9 @@ public class CancelDownloadActionButton extends ItemActionButton {
}
@Override
- @AttrRes
+ @DrawableRes
public int getDrawable() {
- return R.attr.navigation_cancel;
+ return R.drawable.ic_cancel;
}
@Override
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DeleteActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DeleteActionButton.java
index 45cce23b8..096d060c1 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DeleteActionButton.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DeleteActionButton.java
@@ -2,11 +2,11 @@ package de.danoeh.antennapod.adapter.actionbutton;
import android.content.Context;
import android.view.View;
-import androidx.annotation.AttrRes;
+import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.core.feed.FeedItem;
-import de.danoeh.antennapod.core.feed.FeedMedia;
+import de.danoeh.antennapod.model.feed.FeedItem;
+import de.danoeh.antennapod.model.feed.FeedMedia;
import de.danoeh.antennapod.core.storage.DBWriter;
public class DeleteActionButton extends ItemActionButton {
@@ -22,9 +22,9 @@ public class DeleteActionButton extends ItemActionButton {
}
@Override
- @AttrRes
+ @DrawableRes
public int getDrawable() {
- return R.attr.ic_delete;
+ return R.drawable.ic_delete;
}
@Override
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DownloadActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DownloadActionButton.java
index 0f7c2bdd0..c3e979dd8 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DownloadActionButton.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DownloadActionButton.java
@@ -4,14 +4,14 @@ import android.content.Context;
import android.view.View;
import android.widget.Toast;
-import androidx.annotation.AttrRes;
+import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.dialog.DownloadRequestErrorDialogCreator;
-import de.danoeh.antennapod.core.feed.FeedItem;
-import de.danoeh.antennapod.core.feed.FeedMedia;
+import de.danoeh.antennapod.model.feed.FeedItem;
+import de.danoeh.antennapod.model.feed.FeedMedia;
import de.danoeh.antennapod.core.preferences.UsageStatistics;
import de.danoeh.antennapod.core.storage.DBWriter;
import de.danoeh.antennapod.core.storage.DownloadRequestException;
@@ -33,9 +33,9 @@ public class DownloadActionButton extends ItemActionButton {
}
@Override
- @AttrRes
+ @DrawableRes
public int getDrawable() {
- return R.attr.av_download;
+ return R.drawable.ic_download;
}
@Override
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java
index 5d95d3775..12150293f 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java
@@ -1,17 +1,17 @@
package de.danoeh.antennapod.adapter.actionbutton;
import android.content.Context;
-import android.content.res.TypedArray;
import android.widget.ImageView;
-import androidx.annotation.AttrRes;
+import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import android.view.View;
-import de.danoeh.antennapod.core.feed.FeedItem;
-import de.danoeh.antennapod.core.feed.FeedMedia;
+import de.danoeh.antennapod.model.feed.FeedItem;
+import de.danoeh.antennapod.model.feed.FeedMedia;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.storage.DownloadRequester;
+import de.danoeh.antennapod.core.util.FeedItemUtil;
public abstract class ItemActionButton {
FeedItem item;
@@ -23,7 +23,7 @@ public abstract class ItemActionButton {
@StringRes
public abstract int getLabel();
- @AttrRes
+ @DrawableRes
public abstract int getDrawable();
public abstract void onClick(Context context);
@@ -40,7 +40,7 @@ public abstract class ItemActionButton {
}
final boolean isDownloadingMedia = DownloadRequester.getInstance().isDownloadingFile(media);
- if (media.isCurrentlyPlaying()) {
+ if (FeedItemUtil.isCurrentlyPlaying(media)) {
return new PauseActionButton(item);
} else if (item.getFeed().isLocalFeed()) {
return new PlayLocalActionButton(item);
@@ -62,9 +62,6 @@ public abstract class ItemActionButton {
button.setVisibility(getVisibility());
button.setContentDescription(context.getString(getLabel()));
button.setOnClickListener((view) -> onClick(context));
-
- TypedArray drawables = context.obtainStyledAttributes(new int[]{getDrawable()});
- icon.setImageDrawable(drawables.getDrawable(0));
- drawables.recycle();
+ icon.setImageResource(getDrawable());
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MarkAsPlayedActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MarkAsPlayedActionButton.java
index 14fa94f7a..8dc4ffe33 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MarkAsPlayedActionButton.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MarkAsPlayedActionButton.java
@@ -1,12 +1,12 @@
package de.danoeh.antennapod.adapter.actionbutton;
import android.content.Context;
-import androidx.annotation.AttrRes;
+import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
import android.view.View;
import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.core.feed.FeedItem;
+import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.core.storage.DBWriter;
public class MarkAsPlayedActionButton extends ItemActionButton {
@@ -22,9 +22,9 @@ public class MarkAsPlayedActionButton extends ItemActionButton {
}
@Override
- @AttrRes
+ @DrawableRes
public int getDrawable() {
- return R.attr.navigation_accept;
+ return R.drawable.ic_check;
}
@Override
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MobileDownloadHelper.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MobileDownloadHelper.java
index 49b785056..66ce973e2 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MobileDownloadHelper.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MobileDownloadHelper.java
@@ -5,7 +5,7 @@ import android.content.Context;
import androidx.appcompat.app.AlertDialog;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.dialog.DownloadRequestErrorDialogCreator;
-import de.danoeh.antennapod.core.feed.FeedItem;
+import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.storage.DBWriter;
import de.danoeh.antennapod.core.storage.DownloadRequestException;
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PauseActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PauseActionButton.java
index 4ac03c50e..de4dae6a0 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PauseActionButton.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PauseActionButton.java
@@ -1,11 +1,12 @@
package de.danoeh.antennapod.adapter.actionbutton;
import android.content.Context;
-import androidx.annotation.AttrRes;
+import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.core.feed.FeedItem;
-import de.danoeh.antennapod.core.feed.FeedMedia;
+import de.danoeh.antennapod.model.feed.FeedItem;
+import de.danoeh.antennapod.model.feed.FeedMedia;
+import de.danoeh.antennapod.core.util.FeedItemUtil;
import de.danoeh.antennapod.core.util.IntentUtils;
import static de.danoeh.antennapod.core.service.playback.PlaybackService.ACTION_PAUSE_PLAY_CURRENT_EPISODE;
@@ -23,9 +24,9 @@ public class PauseActionButton extends ItemActionButton {
}
@Override
- @AttrRes
+ @DrawableRes
public int getDrawable() {
- return R.attr.av_pause;
+ return R.drawable.ic_pause;
}
@Override
@@ -35,7 +36,7 @@ public class PauseActionButton extends ItemActionButton {
return;
}
- if (media.isCurrentlyPlaying()) {
+ if (FeedItemUtil.isCurrentlyPlaying(media)) {
IntentUtils.sendLocalBroadcast(context, ACTION_PAUSE_PLAY_CURRENT_EPISODE);
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayActionButton.java
index 512f1a512..974b12bab 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayActionButton.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayActionButton.java
@@ -1,12 +1,12 @@
package de.danoeh.antennapod.adapter.actionbutton;
import android.content.Context;
-import androidx.annotation.AttrRes;
+import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
import de.danoeh.antennapod.R;
-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.model.feed.FeedItem;
+import de.danoeh.antennapod.model.feed.FeedMedia;
+import de.danoeh.antennapod.model.playback.MediaType;
import de.danoeh.antennapod.core.service.playback.PlaybackService;
import de.danoeh.antennapod.core.storage.DBTasks;
import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter;
@@ -24,9 +24,9 @@ public class PlayActionButton extends ItemActionButton {
}
@Override
- @AttrRes
+ @DrawableRes
public int getDrawable() {
- return R.attr.av_play;
+ return R.drawable.ic_play_24dp;
}
@Override
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayLocalActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayLocalActionButton.java
index 78ea3b93f..ab2122b12 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayLocalActionButton.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayLocalActionButton.java
@@ -1,12 +1,12 @@
package de.danoeh.antennapod.adapter.actionbutton;
import android.content.Context;
-import androidx.annotation.AttrRes;
+import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
import de.danoeh.antennapod.R;
-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.model.feed.FeedItem;
+import de.danoeh.antennapod.model.feed.FeedMedia;
+import de.danoeh.antennapod.model.playback.MediaType;
import de.danoeh.antennapod.core.service.playback.PlaybackService;
import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter;
@@ -23,9 +23,9 @@ public class PlayLocalActionButton extends ItemActionButton {
}
@Override
- @AttrRes
+ @DrawableRes
public int getDrawable() {
- return R.attr.av_play;
+ return R.drawable.ic_play_24dp;
}
@Override
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/StreamActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/StreamActionButton.java
index 8a892a621..94c446f50 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/StreamActionButton.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/StreamActionButton.java
@@ -2,13 +2,13 @@ package de.danoeh.antennapod.adapter.actionbutton;
import android.content.Context;
-import androidx.annotation.AttrRes;
+import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
import de.danoeh.antennapod.R;
-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.model.feed.FeedItem;
+import de.danoeh.antennapod.model.feed.FeedMedia;
+import de.danoeh.antennapod.model.playback.MediaType;
import de.danoeh.antennapod.core.preferences.UsageStatistics;
import de.danoeh.antennapod.core.service.playback.PlaybackService;
import de.danoeh.antennapod.core.util.NetworkUtils;
@@ -28,9 +28,9 @@ public class StreamActionButton extends ItemActionButton {
}
@Override
- @AttrRes
+ @DrawableRes
public int getDrawable() {
- return R.attr.action_stream;
+ return R.drawable.ic_stream;
}
@Override
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/VisitWebsiteActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/VisitWebsiteActionButton.java
index e45280eed..03ccce2fe 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/VisitWebsiteActionButton.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/VisitWebsiteActionButton.java
@@ -2,10 +2,10 @@ package de.danoeh.antennapod.adapter.actionbutton;
import android.content.Context;
import android.view.View;
-import androidx.annotation.AttrRes;
+import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.core.feed.FeedItem;
+import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.core.util.IntentUtils;
public class VisitWebsiteActionButton extends ItemActionButton {
@@ -21,9 +21,9 @@ public class VisitWebsiteActionButton extends ItemActionButton {
}
@Override
- @AttrRes
+ @DrawableRes
public int getDrawable() {
- return R.attr.location_web_site;
+ return R.drawable.ic_web;
}
@Override
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java
index 25fc0a05c..a125515cc 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java
@@ -13,7 +13,7 @@ import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.FitCenter;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
-import de.danoeh.antennapod.core.sync.gpoddernet.model.GpodnetPodcast;
+import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetPodcast;
import org.apache.commons.lang3.StringUtils;
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/TagListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/TagListAdapter.java
index 698e43145..b0441688d 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/TagListAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/TagListAdapter.java
@@ -8,7 +8,7 @@ import android.widget.ArrayAdapter;
import android.widget.TextView;
import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.core.sync.gpoddernet.model.GpodnetTag;
+import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetTag;
import java.util.List;