diff options
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/adapter')
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; |