From 1d64057fd41442d276fd690229dc0c0f9afd2b96 Mon Sep 17 00:00:00 2001 From: Anderson Mesquita Date: Thu, 2 May 2019 20:06:36 -0400 Subject: Extract action button utils/callback into classes This splits the logic in `ActionButtonUtils` and `DefaultActionButtonCallback` into multiple specialized classes to reduce duplication figuring out which button/action to use while at the same time making each individual button to have a single responsability. --- .../actionbutton/AddToQueueActionButton.java | 32 ++++++++++ .../actionbutton/CancelDownloadActionButton.java | 44 +++++++++++++ .../adapter/actionbutton/DownloadActionButton.java | 74 ++++++++++++++++++++++ .../adapter/actionbutton/ItemActionButton.java | 63 ++++++++++++++++++ .../actionbutton/MarkAsPlayedActionButton.java | 41 ++++++++++++ .../adapter/actionbutton/MobileDownloadHelper.java | 60 ++++++++++++++++++ .../adapter/actionbutton/PlayActionButton.java | 63 ++++++++++++++++++ 7 files changed, 377 insertions(+) create mode 100644 app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/AddToQueueActionButton.java create mode 100644 app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/CancelDownloadActionButton.java create mode 100644 app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DownloadActionButton.java create mode 100644 app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java create mode 100644 app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MarkAsPlayedActionButton.java create mode 100644 app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MobileDownloadHelper.java create mode 100644 app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayActionButton.java (limited to 'app/src/main/java') 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 new file mode 100644 index 000000000..3299db3ab --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/AddToQueueActionButton.java @@ -0,0 +1,32 @@ +package de.danoeh.antennapod.adapter.actionbutton; + +import android.content.Context; +import android.support.annotation.AttrRes; +import android.support.annotation.StringRes; + +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.feed.FeedItem; + +class AddToQueueActionButton extends ItemActionButton { + + AddToQueueActionButton(FeedItem item) { + super(item); + } + + @Override + @StringRes + public int getLabel() { + return R.string.add_to_queue_label; + } + + @Override + @AttrRes + public int getDrawable() { + return R.attr.content_new; + } + + @Override + public void onClick(Context context) { + MobileDownloadHelper.confirmMobileDownload(context, item); + } +} 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 new file mode 100644 index 000000000..1275a799b --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/CancelDownloadActionButton.java @@ -0,0 +1,44 @@ +package de.danoeh.antennapod.adapter.actionbutton; + +import android.content.Context; +import android.support.annotation.AttrRes; +import android.support.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.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.storage.DBWriter; +import de.danoeh.antennapod.core.storage.DownloadRequester; + +class CancelDownloadActionButton extends ItemActionButton { + + CancelDownloadActionButton(FeedItem item) { + super(item); + } + + @Override + @StringRes + public int getLabel() { + return R.string.cancel_download_label; + } + + @Override + @AttrRes + public int getDrawable() { + return R.attr.navigation_cancel; + } + + @Override + public void onClick(Context context) { + FeedMedia media = item.getMedia(); + DownloadRequester.getInstance().cancelDownload(context, media); + if (UserPreferences.isEnableAutodownload()) { + DBWriter.setFeedItemAutoDownload(media.getItem(), false); + Toast.makeText(context, R.string.download_canceled_autodownload_enabled_msg, Toast.LENGTH_LONG).show(); + } else { + Toast.makeText(context, R.string.download_canceled_msg, Toast.LENGTH_LONG).show(); + } + } +} 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 new file mode 100644 index 000000000..202a41161 --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DownloadActionButton.java @@ -0,0 +1,74 @@ +package de.danoeh.antennapod.adapter.actionbutton; + +import android.content.Context; +import android.support.annotation.AttrRes; +import android.support.annotation.NonNull; +import android.support.annotation.StringRes; +import android.widget.Toast; + +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.core.storage.DBTasks; +import de.danoeh.antennapod.core.storage.DBWriter; +import de.danoeh.antennapod.core.storage.DownloadRequestException; +import de.danoeh.antennapod.core.storage.DownloadRequester; +import de.danoeh.antennapod.core.util.NetworkUtils; + +class DownloadActionButton extends ItemActionButton { + private boolean isInQueue; + + DownloadActionButton(FeedItem item, boolean isInQueue) { + super(item); + this.isInQueue = isInQueue; + } + + @Override + @StringRes + public int getLabel() { + return R.string.download_label; + } + + @Override + @AttrRes + public int getDrawable() { + return R.attr.av_download; + } + + @Override + public void onClick(Context context) { + final FeedMedia media = item.getMedia(); + if (media == null || shouldNotDownload(media)) { + return; + } + + if (NetworkUtils.isDownloadAllowed() || MobileDownloadHelper.userAllowedMobileDownloads()) { + downloadEpisode(context); + } else if (MobileDownloadHelper.userChoseAddToQueue() && !isInQueue) { + addEpisodeToQueue(context); + } else { + MobileDownloadHelper.confirmMobileDownload(context, item); + } + } + + private boolean shouldNotDownload(@NonNull FeedMedia media) { + boolean isDownloading = DownloadRequester.getInstance().isDownloadingFile(media); + return isDownloading || media.isDownloaded(); + } + + private void addEpisodeToQueue(Context context) { + DBWriter.addQueueItem(context, item); + Toast.makeText(context, R.string.added_to_queue_label, Toast.LENGTH_SHORT).show(); + } + + private void downloadEpisode(Context context) { + try { + DBTasks.downloadFeedItems(context, item); + Toast.makeText(context, R.string.status_downloading_label, Toast.LENGTH_SHORT).show(); + } catch (DownloadRequestException e) { + e.printStackTrace(); + DownloadRequestErrorDialogCreator.newRequestErrorDialog(context, e.getMessage()); + } + } +} 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 new file mode 100644 index 000000000..da5ebf6e1 --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java @@ -0,0 +1,63 @@ +package de.danoeh.antennapod.adapter.actionbutton; + +import android.content.Context; +import android.content.res.TypedArray; +import android.support.annotation.AttrRes; +import android.support.annotation.NonNull; +import android.support.annotation.StringRes; +import android.view.View; +import android.widget.ImageButton; + +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.storage.DownloadRequester; + +public abstract class ItemActionButton { + FeedItem item; + + ItemActionButton(FeedItem item) { + this.item = item; + } + + @StringRes + abstract public int getLabel(); + + @AttrRes + abstract public int getDrawable(); + + abstract public void onClick(Context context); + + public int getVisibility() { + return View.VISIBLE; + } + + @NonNull + public static ItemActionButton forItem(@NonNull FeedItem item, boolean isInQueue) { + final FeedMedia media = item.getMedia(); + if (media == null) { + return new MarkAsPlayedActionButton(item); + } + + final boolean isDownloadingMedia = DownloadRequester.getInstance().isDownloadingFile(media); + if (media.isDownloaded()) { + return new PlayActionButton(item); + } else if (isDownloadingMedia) { + return new CancelDownloadActionButton(item); + } else if (MobileDownloadHelper.userAllowedMobileDownloads() || !MobileDownloadHelper.userChoseAddToQueue() || isInQueue) { + return new DownloadActionButton(item, isInQueue); + } else { + return new AddToQueueActionButton(item); + } + } + + public void configure(@NonNull ImageButton button, Context context) { + TypedArray drawables = context.obtainStyledAttributes(new int[]{getDrawable()}); + + button.setVisibility(getVisibility()); + button.setContentDescription(context.getString(getLabel())); + button.setImageDrawable(drawables.getDrawable(0)); + button.setOnClickListener((view) -> onClick(context)); + + drawables.recycle(); + } +} 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 new file mode 100644 index 000000000..4d906cee5 --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MarkAsPlayedActionButton.java @@ -0,0 +1,41 @@ +package de.danoeh.antennapod.adapter.actionbutton; + +import android.content.Context; +import android.support.annotation.AttrRes; +import android.support.annotation.StringRes; +import android.view.View; + +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.storage.DBWriter; + +class MarkAsPlayedActionButton extends ItemActionButton { + + MarkAsPlayedActionButton(FeedItem item) { + super(item); + } + + @Override + @StringRes + public int getLabel() { + return R.string.mark_read_label; + } + + @Override + @AttrRes + public int getDrawable() { + return R.attr.navigation_accept; + } + + @Override + public void onClick(Context context) { + if (!item.isPlayed()) { + DBWriter.markItemPlayed(item, FeedItem.PLAYED, true); + } + } + + @Override + public int getVisibility() { + return (item.isPlayed()) ? View.INVISIBLE : View.VISIBLE; + } +} 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 new file mode 100644 index 000000000..f8d2a139e --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/MobileDownloadHelper.java @@ -0,0 +1,60 @@ +package de.danoeh.antennapod.adapter.actionbutton; + +import android.content.Context; +import android.widget.Toast; + +import com.afollestad.materialdialogs.MaterialDialog; + +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.dialog.DownloadRequestErrorDialogCreator; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.storage.DBReader; +import de.danoeh.antennapod.core.storage.DBTasks; +import de.danoeh.antennapod.core.storage.DBWriter; +import de.danoeh.antennapod.core.storage.DownloadRequestException; + +class MobileDownloadHelper { + private static long addToQueueTimestamp; + private static long allowMobileDownloadTimestamp; + private static final int TEN_MINUTES_IN_MILLIS = 10 * 60 * 1000; + + static boolean userChoseAddToQueue() { + return System.currentTimeMillis() - addToQueueTimestamp < TEN_MINUTES_IN_MILLIS; + } + + static boolean userAllowedMobileDownloads() { + return System.currentTimeMillis() - allowMobileDownloadTimestamp < TEN_MINUTES_IN_MILLIS; + } + + static void confirmMobileDownload(final Context context, final FeedItem item) { + MaterialDialog.Builder builder = new MaterialDialog.Builder(context) + .title(R.string.confirm_mobile_download_dialog_title) + .content(R.string.confirm_mobile_download_dialog_message) + .positiveText(context.getText(R.string.confirm_mobile_download_dialog_enable_temporarily)) + .onPositive((dialog, which) -> downloadFeedItems(context, item)); + if (!DBReader.getQueueIDList().contains(item.getId())) { + builder + .content(R.string.confirm_mobile_download_dialog_message_not_in_queue) + .neutralText(R.string.confirm_mobile_download_dialog_only_add_to_queue) + .onNeutral((dialog, which) -> addToQueue(context, item)); + } + builder.show(); + } + + private static void addToQueue(Context context, FeedItem item) { + addToQueueTimestamp = System.currentTimeMillis(); + DBWriter.addQueueItem(context, item); + Toast.makeText(context, R.string.added_to_queue_label, Toast.LENGTH_SHORT).show(); + } + + private static void downloadFeedItems(Context context, FeedItem item) { + allowMobileDownloadTimestamp = System.currentTimeMillis(); + try { + DBTasks.downloadFeedItems(context, item); + Toast.makeText(context, R.string.status_downloading_label, Toast.LENGTH_SHORT).show(); + } catch (DownloadRequestException e) { + e.printStackTrace(); + DownloadRequestErrorDialogCreator.newRequestErrorDialog(context, e.getMessage()); + } + } +} \ No newline at end of file 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 new file mode 100644 index 000000000..3992c7240 --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayActionButton.java @@ -0,0 +1,63 @@ +package de.danoeh.antennapod.adapter.actionbutton; + +import android.content.Context; +import android.support.annotation.AttrRes; +import android.support.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.storage.DBTasks; +import de.danoeh.antennapod.core.util.IntentUtils; +import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter; + +import static de.danoeh.antennapod.core.service.playback.PlaybackService.ACTION_PAUSE_PLAY_CURRENT_EPISODE; +import static de.danoeh.antennapod.core.service.playback.PlaybackService.ACTION_RESUME_PLAY_CURRENT_EPISODE; + +class PlayActionButton extends ItemActionButton { + + PlayActionButton(FeedItem item) { + super(item); + } + + @Override + @StringRes + public int getLabel() { + return R.string.play_label; + } + + @Override + @AttrRes + public int getDrawable() { + FeedMedia media = item.getMedia(); + if (media != null && media.isCurrentlyPlaying()) { + return R.attr.av_pause; + } else { + return R.attr.av_play; + } + } + + @Override + public void onClick(Context context) { + FeedMedia media = item.getMedia(); + if (media == null) { + return; + } + + if (media.isPlaying()) { + togglePlayPause(context, media); + } else { + DBTasks.playMedia(context, media, false, true, false); + } + } + + private void togglePlayPause(Context context, FeedMedia media) { + new PlaybackServiceStarter(context, media) + .startWhenPrepared(true) + .shouldStream(false) + .start(); + + String pauseOrResume = media.isCurrentlyPlaying() ? ACTION_PAUSE_PLAY_CURRENT_EPISODE : ACTION_RESUME_PLAY_CURRENT_EPISODE; + IntentUtils.sendLocalBroadcast(context, pauseOrResume); + } +} -- cgit v1.2.3 From 2450b0817bbe9f22b811110dae77607048780974 Mon Sep 17 00:00:00 2001 From: Anderson Mesquita Date: Thu, 2 May 2019 20:34:10 -0400 Subject: Replace action/callback utils with ItemActionButton This just replaces all previous usages of `ActionButtonUtils` and `DefaultActionButtonCallback` with the newly created `ItemActionButton` class. --- .../antennapod/adapter/ActionButtonCallback.java | 9 -- .../antennapod/adapter/ActionButtonUtils.java | 97 -------------- .../adapter/AllEpisodesRecycleAdapter.java | 20 +-- .../adapter/DefaultActionButtonCallback.java | 139 --------------------- .../antennapod/adapter/FeedItemlistAdapter.java | 20 +-- .../antennapod/adapter/QueueRecyclerAdapter.java | 24 +--- .../antennapod/fragment/AllEpisodesFragment.java | 4 +- .../danoeh/antennapod/fragment/ItemFragment.java | 9 +- .../antennapod/fragment/ItemlistFragment.java | 3 +- .../fragment/PlaybackHistoryFragment.java | 4 +- .../danoeh/antennapod/fragment/QueueFragment.java | 4 +- 11 files changed, 22 insertions(+), 311 deletions(-) delete mode 100644 app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonCallback.java delete mode 100644 app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonUtils.java delete mode 100644 app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java (limited to 'app/src/main/java') diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonCallback.java b/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonCallback.java deleted file mode 100644 index e6b42efcb..000000000 --- a/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonCallback.java +++ /dev/null @@ -1,9 +0,0 @@ -package de.danoeh.antennapod.adapter; - -import de.danoeh.antennapod.core.feed.FeedItem; -import de.danoeh.antennapod.core.util.LongList; - -interface ActionButtonCallback { - /** Is called when the action button of a list item has been pressed. */ - void onActionButtonPressed(FeedItem item, LongList queueIds); -} diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonUtils.java b/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonUtils.java deleted file mode 100644 index a915692d1..000000000 --- a/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonUtils.java +++ /dev/null @@ -1,97 +0,0 @@ -package de.danoeh.antennapod.adapter; - -import android.content.Context; -import android.content.res.TypedArray; -import android.view.View; -import android.widget.ImageButton; - -import org.apache.commons.lang3.Validate; - -import de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.feed.FeedItem; -import de.danoeh.antennapod.core.feed.FeedMedia; -import de.danoeh.antennapod.core.storage.DownloadRequester; - -/** - * Utility methods for the action button that is displayed on the right hand side - * of a listitem. - */ -class ActionButtonUtils { - - private final int[] labels; - private final TypedArray drawables; - private final Context context; - - public ActionButtonUtils(Context context) { - Validate.notNull(context); - - this.context = context.getApplicationContext(); - drawables = context.obtainStyledAttributes(new int[] { - R.attr.av_play, - R.attr.navigation_cancel, - R.attr.av_download, - R.attr.av_pause, - R.attr.navigation_accept, - R.attr.content_new - }); - labels = new int[] { - R.string.play_label, - R.string.cancel_download_label, - R.string.download_label, - R.string.mark_read_label, - R.string.add_to_queue_label - }; - } - - /** - * Sets the displayed bitmap and content description of the given - * action button so that it matches the state of the FeedItem. - */ - @SuppressWarnings("ResourceType") - public void configureActionButton(ImageButton butSecondary, FeedItem item, boolean isInQueue) { - Validate.isTrue(butSecondary != null && item != null, "butSecondary or item was null"); - - final FeedMedia media = item.getMedia(); - if (media != null) { - final boolean isDownloadingMedia = DownloadRequester.getInstance().isDownloadingFile(media); - if (!media.isDownloaded()) { - if (isDownloadingMedia) { - // item is being downloaded - butSecondary.setVisibility(View.VISIBLE); - butSecondary.setImageDrawable(drawables.getDrawable(1)); - butSecondary.setContentDescription(context.getString(labels[1])); - } else { - // item is not downloaded and not being downloaded - if(DefaultActionButtonCallback.userAllowedMobileDownloads() || - !DefaultActionButtonCallback.userChoseAddToQueue() || isInQueue) { - butSecondary.setVisibility(View.VISIBLE); - butSecondary.setImageDrawable(drawables.getDrawable(2)); - butSecondary.setContentDescription(context.getString(labels[2])); - } else { - // mobile download not allowed yet, item is not in queue and user chose add to queue - butSecondary.setVisibility(View.VISIBLE); - butSecondary.setImageDrawable(drawables.getDrawable(5)); - butSecondary.setContentDescription(context.getString(labels[4])); - } - } - } else { - // item is downloaded - butSecondary.setVisibility(View.VISIBLE); - if (media.isCurrentlyPlaying()) { - butSecondary.setImageDrawable(drawables.getDrawable(3)); - } else { - butSecondary.setImageDrawable(drawables.getDrawable(0)); - } - butSecondary.setContentDescription(context.getString(labels[0])); - } - } else { - if (item.isPlayed()) { - butSecondary.setVisibility(View.INVISIBLE); - } else { - butSecondary.setVisibility(View.VISIBLE); - butSecondary.setImageDrawable(drawables.getDrawable(4)); - butSecondary.setContentDescription(context.getString(labels[3])); - } - } - } -} diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java index 0b2b81edb..8866d987e 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java @@ -1,5 +1,6 @@ package de.danoeh.antennapod.adapter; +import android.content.Context; import android.os.Build; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; @@ -26,6 +27,7 @@ import java.lang.ref.WeakReference; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; +import de.danoeh.antennapod.adapter.actionbutton.ItemActionButton; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.storage.DownloadRequester; @@ -46,8 +48,6 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter mainActivityRef; private final ItemAccess itemAccess; - private final ActionButtonCallback actionButtonCallback; - private final ActionButtonUtils actionButtonUtils; private final boolean showOnlyNewEpisodes; private FeedItem selectedItem; @@ -57,13 +57,10 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter(mainActivity); this.itemAccess = itemAccess; - this.actionButtonUtils = new ActionButtonUtils(mainActivity); - this.actionButtonCallback = actionButtonCallback; this.showOnlyNewEpisodes = showOnlyNewEpisodes; playingBackGroundColor = ThemeUtils.getColorFromAttr(mainActivity, R.attr.currently_playing_background); @@ -186,10 +183,11 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter { - allowMobileDownloadsTimestamp = System.currentTimeMillis(); - try { - DBTasks.downloadFeedItems(context, item); - Toast.makeText(context, R.string.status_downloading_label, Toast.LENGTH_SHORT).show(); - } catch (DownloadRequestException e) { - e.printStackTrace(); - DownloadRequestErrorDialogCreator.newRequestErrorDialog(context, e.getMessage()); - } - }); - LongList queueIds = DBReader.getQueueIDList(); - if(!queueIds.contains(item.getId())) { - builder - .content(R.string.confirm_mobile_download_dialog_message_not_in_queue) - .neutralText(R.string.confirm_mobile_download_dialog_only_add_to_queue) - .onNeutral((dialog, which) -> { - onlyAddToQueueTimeStamp = System.currentTimeMillis(); - DBWriter.addQueueItem(context, item); - Toast.makeText(context, R.string.added_to_queue_label, Toast.LENGTH_SHORT).show(); - }); - } - builder.show(); - } - -} diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java index 738a0a636..a365b1b2e 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java @@ -7,7 +7,6 @@ import android.support.v4.content.ContextCompat; import android.text.Layout; import android.view.LayoutInflater; import android.view.View; -import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Adapter; import android.widget.BaseAdapter; @@ -18,6 +17,7 @@ import android.widget.ProgressBar; import android.widget.TextView; import de.danoeh.antennapod.R; +import de.danoeh.antennapod.adapter.actionbutton.ItemActionButton; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.feed.MediaType; @@ -31,14 +31,12 @@ import de.danoeh.antennapod.core.util.ThemeUtils; */ public class FeedItemlistAdapter extends BaseAdapter { - private final ActionButtonCallback callback; private final ItemAccess itemAccess; private final Context context; private final boolean showFeedtitle; private final int selectedItemIndex; /** true if played items should be made partially transparent */ private final boolean makePlayedItemsTransparent; - private final ActionButtonUtils actionButtonUtils; private static final int SELECTION_NONE = -1; @@ -47,16 +45,13 @@ public class FeedItemlistAdapter extends BaseAdapter { public FeedItemlistAdapter(Context context, ItemAccess itemAccess, - ActionButtonCallback callback, boolean showFeedtitle, boolean makePlayedItemsTransparent) { super(); - this.callback = callback; this.context = context; this.itemAccess = itemAccess; this.showFeedtitle = showFeedtitle; this.selectedItemIndex = SELECTION_NONE; - this.actionButtonUtils = new ActionButtonUtils(context); this.makePlayedItemsTransparent = makePlayedItemsTransparent; playingBackGroundColor = ThemeUtils.getColorFromAttr(context, R.attr.currently_playing_background); @@ -199,10 +194,11 @@ public class FeedItemlistAdapter extends BaseAdapter { } } - actionButtonUtils.configureActionButton(holder.butAction, item, isInQueue); + ItemActionButton actionButton = ItemActionButton.forItem(item, isInQueue); + actionButton.configure(holder.butAction, context); + holder.butAction.setFocusable(false); holder.butAction.setTag(item); - holder.butAction.setOnClickListener(butActionListener); } else { convertView.setVisibility(View.GONE); @@ -210,14 +206,6 @@ public class FeedItemlistAdapter extends BaseAdapter { return convertView; } - private final OnClickListener butActionListener = new OnClickListener() { - @Override - public void onClick(View v) { - FeedItem item = (FeedItem) v.getTag(); - callback.onActionButtonPressed(item, itemAccess.getQueueIds()); - } - }; - static class Holder { LinearLayout container; TextView title; diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java index df8cafb9d..d9d54ac15 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java @@ -1,5 +1,6 @@ package de.danoeh.antennapod.adapter; +import android.content.Context; import android.os.Build; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; @@ -22,8 +23,6 @@ import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; -import com.bumptech.glide.Glide; -import com.bumptech.glide.request.RequestOptions; import com.joanzapata.iconify.Iconify; import org.apache.commons.lang3.ArrayUtils; @@ -32,9 +31,9 @@ import java.lang.ref.WeakReference; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; +import de.danoeh.antennapod.adapter.actionbutton.ItemActionButton; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; -import de.danoeh.antennapod.core.glide.ApGlideSettings; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.DownloadRequester; import de.danoeh.antennapod.core.util.Converter; @@ -54,8 +53,6 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter mainActivity; private final ItemAccess itemAccess; - private final ActionButtonCallback actionButtonCallback; - private final ActionButtonUtils actionButtonUtils; private final ItemTouchHelper itemTouchHelper; private boolean locked; @@ -67,13 +64,10 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter(mainActivity); this.itemAccess = itemAccess; - this.actionButtonUtils = new ActionButtonUtils(mainActivity); - this.actionButtonCallback = actionButtonCallback; this.itemTouchHelper = itemTouchHelper; locked = UserPreferences.isQueueLocked(); @@ -287,10 +281,11 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter 0) { if (listAdapter == null) { MainActivity mainActivity = (MainActivity) getActivity(); - listAdapter = new AllEpisodesRecycleAdapter(mainActivity, itemAccess, - new DefaultActionButtonCallback(mainActivity), showOnlyNewEpisodes()); + listAdapter = new AllEpisodesRecycleAdapter(mainActivity, itemAccess, showOnlyNewEpisodes()); listAdapter.setHasStableIds(true); recyclerView.setAdapter(listAdapter); emptyView.updateAdapter(listAdapter); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java index 79b15a112..a2472b071 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java @@ -42,7 +42,7 @@ import java.util.List; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.CastEnabledActivity; import de.danoeh.antennapod.activity.MainActivity; -import de.danoeh.antennapod.adapter.DefaultActionButtonCallback; +import de.danoeh.antennapod.adapter.actionbutton.ItemActionButton; import de.danoeh.antennapod.core.event.DownloadEvent; import de.danoeh.antennapod.core.event.DownloaderUpdate; import de.danoeh.antennapod.core.event.FeedItemEvent; @@ -61,7 +61,6 @@ import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.core.util.DateUtils; import de.danoeh.antennapod.core.util.Flavors; import de.danoeh.antennapod.core.util.IntentUtils; -import de.danoeh.antennapod.core.util.LongList; import de.danoeh.antennapod.core.util.NetworkUtils; import de.danoeh.antennapod.core.util.ShareUtils; import de.danoeh.antennapod.core.util.playback.Timeline; @@ -232,9 +231,9 @@ public class ItemFragment extends Fragment implements OnSwipeGesture { if (item == null) { return; } - DefaultActionButtonCallback actionButtonCallback = new DefaultActionButtonCallback(getActivity()); - actionButtonCallback.onActionButtonPressed(item, item.isTagged(FeedItem.TAG_QUEUE) ? - LongList.of(item.getId()) : new LongList(0)); + ItemActionButton actionButton = ItemActionButton.forItem(item, item.isTagged(FeedItem.TAG_QUEUE)); + actionButton.onClick(getActivity()); + FeedMedia media = item.getMedia(); if (media != null && media.isDownloaded()) { // playback was started, dialog should close itself diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java index 3d6e0a458..6a04758b9 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java @@ -37,7 +37,6 @@ import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.FeedInfoActivity; import de.danoeh.antennapod.activity.FeedSettingsActivity; import de.danoeh.antennapod.activity.MainActivity; -import de.danoeh.antennapod.adapter.DefaultActionButtonCallback; import de.danoeh.antennapod.adapter.FeedItemlistAdapter; import de.danoeh.antennapod.core.asynctask.FeedRemover; import de.danoeh.antennapod.core.dialog.ConfirmationDialog; @@ -428,7 +427,7 @@ public class ItemlistFragment extends ListFragment { setListAdapter(null); setupHeaderView(); setupFooterView(); - adapter = new FeedItemlistAdapter(getActivity(), itemAccess, new DefaultActionButtonCallback(getActivity()), false, true); + adapter = new FeedItemlistAdapter(getActivity(), itemAccess, false, true); setListAdapter(adapter); } refreshHeaderView(); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java index efa727ca0..da11383a5 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java @@ -17,7 +17,6 @@ import java.util.List; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; -import de.danoeh.antennapod.adapter.DefaultActionButtonCallback; import de.danoeh.antennapod.adapter.FeedItemlistAdapter; import de.danoeh.antennapod.core.event.DownloadEvent; import de.danoeh.antennapod.core.event.DownloaderUpdate; @@ -216,8 +215,7 @@ public class PlaybackHistoryFragment extends ListFragment { // played items shoudln't be transparent for this fragment since, *all* items // in this fragment will, by definition, be played. So it serves no purpose and can make // it harder to read. - adapter = new FeedItemlistAdapter(getActivity(), itemAccess, - new DefaultActionButtonCallback(getActivity()), true, false); + adapter = new FeedItemlistAdapter(getActivity(), itemAccess, true, false); setListAdapter(adapter); } setListShown(true); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index 36d0811b3..71b3c27a2 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -28,7 +28,6 @@ import java.util.List; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; -import de.danoeh.antennapod.adapter.DefaultActionButtonCallback; import de.danoeh.antennapod.adapter.QueueRecyclerAdapter; import de.danoeh.antennapod.core.dialog.ConfirmationDialog; import de.danoeh.antennapod.core.event.DownloadEvent; @@ -525,8 +524,7 @@ public class QueueFragment extends Fragment { if (queue != null && queue.size() > 0) { if (recyclerAdapter == null) { MainActivity activity = (MainActivity) getActivity(); - recyclerAdapter = new QueueRecyclerAdapter(activity, itemAccess, - new DefaultActionButtonCallback(activity), itemTouchHelper); + recyclerAdapter = new QueueRecyclerAdapter(activity, itemAccess, itemTouchHelper); recyclerAdapter.setHasStableIds(true); recyclerView.setAdapter(recyclerAdapter); emptyView.updateAdapter(recyclerAdapter); -- cgit v1.2.3