From 3dae17beff1f8338bbc88716e70e7234d0dd3be4 Mon Sep 17 00:00:00 2001 From: "H. Lehmann" Date: Sun, 1 Mar 2020 00:10:39 +0100 Subject: Refactor action button in ItemFragment (#3898) Much more readable to have decision for action and action itself in one place. --- .../actionbutton/CancelDownloadActionButton.java | 4 +- .../adapter/actionbutton/DeleteActionButton.java | 43 +++++++ .../adapter/actionbutton/DownloadActionButton.java | 11 +- .../actionbutton/MarkAsPlayedActionButton.java | 4 +- .../adapter/actionbutton/PauseActionButton.java | 4 +- .../adapter/actionbutton/PlayActionButton.java | 4 +- .../adapter/actionbutton/StreamActionButton.java | 2 +- .../actionbutton/VisitWebsiteActionButton.java | 40 ++++++ .../danoeh/antennapod/fragment/ItemFragment.java | 140 +++++++-------------- 9 files changed, 149 insertions(+), 103 deletions(-) create mode 100644 app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DeleteActionButton.java create mode 100644 app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/VisitWebsiteActionButton.java (limited to 'app/src/main') 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 10458ed46..3b5baadef 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 @@ -12,9 +12,9 @@ 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 { +public class CancelDownloadActionButton extends ItemActionButton { - CancelDownloadActionButton(FeedItem item) { + public CancelDownloadActionButton(FeedItem item) { super(item); } 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 new file mode 100644 index 000000000..7831c6450 --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DeleteActionButton.java @@ -0,0 +1,43 @@ +package de.danoeh.antennapod.adapter.actionbutton; + +import android.content.Context; +import android.view.View; +import androidx.annotation.AttrRes; +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.storage.DBWriter; + +public class DeleteActionButton extends ItemActionButton { + + public DeleteActionButton(FeedItem item) { + super(item); + } + + @Override + @StringRes + public int getLabel() { + return R.string.delete_label; + } + + @Override + @AttrRes + public int getDrawable() { + return R.attr.content_discard; + } + + @Override + public void onClick(Context context) { + final FeedMedia media = item.getMedia(); + if (media == null) { + return; + } + DBWriter.deleteFeedMediaOfItem(context, media.getId()); + } + + @Override + public int getVisibility() { + return (item.isPlayed()) ? View.INVISIBLE : View.VISIBLE; + } +} 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 026386cf9..0a1199e9b 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 @@ -1,6 +1,7 @@ package de.danoeh.antennapod.adapter.actionbutton; import android.content.Context; +import android.view.View; import android.widget.Toast; import androidx.annotation.AttrRes; @@ -16,10 +17,10 @@ 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 { +public class DownloadActionButton extends ItemActionButton { private boolean isInQueue; - DownloadActionButton(FeedItem item, boolean isInQueue) { + public DownloadActionButton(FeedItem item, boolean isInQueue) { super(item); this.isInQueue = isInQueue; } @@ -36,6 +37,12 @@ class DownloadActionButton extends ItemActionButton { return R.attr.av_download; } + @Override + public int getVisibility() { + return (item.getMedia() != null && DownloadRequester.getInstance().isDownloadingFile(item.getMedia())) + ? View.INVISIBLE : View.VISIBLE; + } + @Override public void onClick(Context context) { final FeedMedia media = item.getMedia(); 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 71ac07c47..14fa94f7a 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 @@ -9,9 +9,9 @@ import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.storage.DBWriter; -class MarkAsPlayedActionButton extends ItemActionButton { +public class MarkAsPlayedActionButton extends ItemActionButton { - MarkAsPlayedActionButton(FeedItem item) { + public MarkAsPlayedActionButton(FeedItem item) { super(item); } 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 b839f7788..4ac03c50e 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 @@ -10,9 +10,9 @@ import de.danoeh.antennapod.core.util.IntentUtils; import static de.danoeh.antennapod.core.service.playback.PlaybackService.ACTION_PAUSE_PLAY_CURRENT_EPISODE; -class PauseActionButton extends ItemActionButton { +public class PauseActionButton extends ItemActionButton { - PauseActionButton(FeedItem item) { + public PauseActionButton(FeedItem item) { super(item); } 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 3432f1deb..0c6924469 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 @@ -8,9 +8,9 @@ import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter; -class PlayActionButton extends ItemActionButton { +public class PlayActionButton extends ItemActionButton { - PlayActionButton(FeedItem item) { + public PlayActionButton(FeedItem item) { super(item); } 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 c1e619fdf..3a43d3217 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 @@ -16,7 +16,7 @@ import static de.danoeh.antennapod.core.service.playback.PlaybackService.ACTION_ public class StreamActionButton extends ItemActionButton { - StreamActionButton(FeedItem item) { + public StreamActionButton(FeedItem item) { super(item); } 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 new file mode 100644 index 000000000..5eb8c1fb6 --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/VisitWebsiteActionButton.java @@ -0,0 +1,40 @@ +package de.danoeh.antennapod.adapter.actionbutton; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.view.View; +import androidx.annotation.AttrRes; +import androidx.annotation.StringRes; +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.feed.FeedItem; + +public class VisitWebsiteActionButton extends ItemActionButton { + + public VisitWebsiteActionButton(FeedItem item) { + super(item); + } + + @Override + @StringRes + public int getLabel() { + return R.string.visit_website_label; + } + + @Override + @AttrRes + public int getDrawable() { + return R.attr.location_web_site; + } + + @Override + public void onClick(Context context) { + Uri uri = Uri.parse(item.getLink()); + context.startActivity(new Intent(Intent.ACTION_VIEW, uri)); + } + + @Override + public int getVisibility() { + return (item.getLink() != null) ? View.INVISIBLE : View.VISIBLE; + } +} 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 e263d2b3e..de6eb6dd6 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java @@ -1,8 +1,6 @@ package de.danoeh.antennapod.fragment; import android.content.Context; -import android.content.Intent; -import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.text.Layout; @@ -13,14 +11,11 @@ import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; -import androidx.annotation.AttrRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.StringRes; import androidx.fragment.app.Fragment; import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.bitmap.FitCenter; @@ -29,10 +24,19 @@ import com.bumptech.glide.request.RequestOptions; import com.google.android.material.snackbar.Snackbar; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; +import de.danoeh.antennapod.adapter.actionbutton.CancelDownloadActionButton; +import de.danoeh.antennapod.adapter.actionbutton.DeleteActionButton; +import de.danoeh.antennapod.adapter.actionbutton.DownloadActionButton; import de.danoeh.antennapod.adapter.actionbutton.ItemActionButton; +import de.danoeh.antennapod.adapter.actionbutton.MarkAsPlayedActionButton; +import de.danoeh.antennapod.adapter.actionbutton.PauseActionButton; +import de.danoeh.antennapod.adapter.actionbutton.PlayActionButton; +import de.danoeh.antennapod.adapter.actionbutton.StreamActionButton; +import de.danoeh.antennapod.adapter.actionbutton.VisitWebsiteActionButton; import de.danoeh.antennapod.core.event.DownloadEvent; import de.danoeh.antennapod.core.event.DownloaderUpdate; import de.danoeh.antennapod.core.event.FeedItemEvent; +import de.danoeh.antennapod.core.event.PlayerStatusEvent; import de.danoeh.antennapod.core.event.UnreadItemsUpdateEvent; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; @@ -40,8 +44,6 @@ import de.danoeh.antennapod.core.feed.util.ImageResourceUtils; import de.danoeh.antennapod.core.glide.ApGlideSettings; import de.danoeh.antennapod.core.service.download.Downloader; 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.DownloadRequester; import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.core.util.DateUtils; @@ -102,6 +104,8 @@ public class ItemFragment extends Fragment { private ImageView butAction2Icon; private View butAction1; private View butAction2; + private ItemActionButton actionButton1; + private ItemActionButton actionButton2; private Disposable disposable; private PlaybackController controller; @@ -151,40 +155,8 @@ public class ItemFragment extends Fragment { butAction2Icon = layout.findViewById(R.id.butAction2Icon); butAction1Text = layout.findViewById(R.id.butAction1Text); butAction2Text = layout.findViewById(R.id.butAction2Text); - - butAction1.setOnClickListener(v -> { - if (item == null) { - return; - } - ItemActionButton actionButton = ItemActionButton.forItem(item, item.isTagged(FeedItem.TAG_QUEUE), false); - actionButton.onClick(getActivity()); - - FeedMedia media = item.getMedia(); - if (media != null && media.isDownloaded()) { - // playback was started, dialog should close itself - ((MainActivity) getActivity()).dismissChildFragment(); - } - }); - - butAction2.setOnClickListener(v -> { - if (item == null) { - return; - } - - if (item.hasMedia()) { - FeedMedia media = item.getMedia(); - if (!media.isDownloaded()) { - DBTasks.playMedia(getActivity(), media, true, true, true); - ((MainActivity) getActivity()).dismissChildFragment(); - } else { - DBWriter.deleteFeedMediaOfItem(getActivity(), media.getId()); - } - } else if (item.getLink() != null) { - Uri uri = Uri.parse(item.getLink()); - getActivity().startActivity(new Intent(Intent.ACTION_VIEW, uri)); - } - }); - + butAction1.setOnClickListener(v -> actionButton1.onClick(getContext())); + butAction2.setOnClickListener(v -> actionButton2.onClick(getContext())); return layout; } @@ -264,7 +236,10 @@ public class ItemFragment extends Fragment { new RoundedCorners((int) (4 * getResources().getDisplayMetrics().density))) .dontAnimate()) .into(imgvCover); + updateButtons(); + } + private void updateButtons() { progbarDownload.setVisibility(View.GONE); if (item.hasMedia() && downloaderList != null) { for (Downloader downloader : downloaderList) { @@ -277,67 +252,41 @@ public class ItemFragment extends Fragment { } FeedMedia media = item.getMedia(); - @AttrRes int butAction1IconRes = 0; - @StringRes int butAction1TextRes = 0; - @AttrRes int butAction2IconRes = 0; - @StringRes int butAction2TextRes = 0; if (media == null) { - if (!item.isPlayed()) { - butAction1IconRes = R.attr.navigation_accept; - if (item.hasMedia()) { - butAction1TextRes = R.string.mark_read_label; - } else { - butAction1TextRes = R.string.mark_read_no_media_label; - } - } - if (item.getLink() != null) { - butAction2IconRes = R.attr.location_web_site; - butAction2TextRes = R.string.visit_website_label; - } + actionButton1 = new MarkAsPlayedActionButton(item); + actionButton2 = new VisitWebsiteActionButton(item); } else { if (media.getDuration() > 0) { txtvDuration.setText(Converter.getDurationStringLong(media.getDuration())); } - boolean isDownloading = DownloadRequester.getInstance().isDownloadingFile(media); - if (!media.isDownloaded()) { - butAction2IconRes = R.attr.action_stream; - butAction2TextRes = R.string.stream_label; + if (media.isCurrentlyPlaying()) { + actionButton1 = new PauseActionButton(item); + } else if (media.isDownloaded()) { + actionButton1 = new PlayActionButton(item); } else { - butAction2IconRes = R.attr.content_discard; - butAction2TextRes = R.string.delete_label; + actionButton1 = new StreamActionButton(item); } - if (isDownloading) { - butAction1IconRes = R.attr.navigation_cancel; - butAction1TextRes = R.string.cancel_label; - } else if (media.isDownloaded()) { - butAction1IconRes = R.attr.av_play; - butAction1TextRes = R.string.play_label; + if (DownloadRequester.getInstance().isDownloadingFile(media)) { + actionButton2 = new CancelDownloadActionButton(item); + } else if (!media.isDownloaded()) { + actionButton2 = new DownloadActionButton(item, false); } else { - butAction1IconRes = R.attr.av_download; - butAction1TextRes = R.string.download_label; + actionButton2 = new DeleteActionButton(item); } } - if (butAction1IconRes != 0 && butAction1TextRes != 0) { - butAction1Text.setText(butAction1TextRes); - butAction1Text.setTransformationMethod(null); - TypedValue typedValue = new TypedValue(); - getContext().getTheme().resolveAttribute(butAction1IconRes, typedValue, true); - butAction1Icon.setImageResource(typedValue.resourceId); - butAction1.setVisibility(View.VISIBLE); - } else { - butAction1.setVisibility(View.INVISIBLE); - } - if (butAction2IconRes != 0 && butAction2TextRes != 0) { - butAction2Text.setText(butAction2TextRes); - butAction2Text.setTransformationMethod(null); - TypedValue typedValue = new TypedValue(); - getContext().getTheme().resolveAttribute(butAction2IconRes, typedValue, true); - butAction2Icon.setImageResource(typedValue.resourceId); - butAction2.setVisibility(View.VISIBLE); - } else { - butAction2.setVisibility(View.INVISIBLE); - } + butAction1Text.setText(actionButton1.getLabel()); + butAction1Text.setTransformationMethod(null); + TypedValue typedValue = new TypedValue(); + getContext().getTheme().resolveAttribute(actionButton1.getDrawable(), typedValue, true); + butAction1Icon.setImageResource(typedValue.resourceId); + butAction1.setVisibility(actionButton1.getVisibility()); + + butAction2Text.setText(actionButton2.getLabel()); + butAction2Text.setTransformationMethod(null); + getContext().getTheme().resolveAttribute(actionButton2.getDrawable(), typedValue, true); + butAction2Icon.setImageResource(typedValue.resourceId); + butAction2.setVisibility(actionButton1.getVisibility()); } @Override @@ -377,6 +326,11 @@ public class ItemFragment extends Fragment { } } + @Subscribe(threadMode = ThreadMode.MAIN) + public void onPlayerStatusChanged(PlayerStatusEvent event) { + updateButtons(); + } + @Subscribe(threadMode = ThreadMode.MAIN) public void onUnreadItemsChanged(UnreadItemsUpdateEvent event) { load(); @@ -386,7 +340,9 @@ public class ItemFragment extends Fragment { if (disposable != null) { disposable.dispose(); } - progbarLoading.setVisibility(View.VISIBLE); + if (!itemsLoaded) { + progbarLoading.setVisibility(View.VISIBLE); + } disposable = Observable.fromCallable(this::loadInBackground) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) -- cgit v1.2.3