From b267b904ccec32df12474fecd8987c63ccd1be99 Mon Sep 17 00:00:00 2001 From: antonio Date: Mon, 31 Jul 2023 11:39:35 +0200 Subject: [PATCH] feat: added the ability to request download for an unplayed podcast episode --- .../tempo/interfaces/ClickCallback.java | 1 + .../tempo/repository/PodcastRepository.java | 17 +++++++++++++++++ .../subsonic/api/podcast/PodcastClient.java | 5 +++++ .../subsonic/api/podcast/PodcastService.java | 3 +++ .../tempo/ui/adapter/PodcastEpisodeAdapter.java | 13 +++++++++++++ .../ui/fragment/PodcastChannelPageFragment.java | 11 +++++++++++ .../viewmodel/PodcastChannelPageViewModel.java | 5 +++++ .../main/res/drawable/ic_podcast_download.xml | 9 +++++++++ .../res/layout/item_home_podcast_episode.xml | 16 ++++++++++++++-- app/src/main/res/values/strings.xml | 1 + 10 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/drawable/ic_podcast_download.xml diff --git a/app/src/main/java/com/cappielloantonio/tempo/interfaces/ClickCallback.java b/app/src/main/java/com/cappielloantonio/tempo/interfaces/ClickCallback.java index 281bcac7..c87e7179 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/interfaces/ClickCallback.java +++ b/app/src/main/java/com/cappielloantonio/tempo/interfaces/ClickCallback.java @@ -20,6 +20,7 @@ public interface ClickCallback { default void onServerClick(Bundle bundle) {} default void onServerLongClick(Bundle bundle) {} default void onPodcastEpisodeClick(Bundle bundle) {} + default void onPodcastEpisodeAltClick(Bundle bundle) {} default void onPodcastEpisodeLongClick(Bundle bundle) {} default void onPodcastChannelClick(Bundle bundle) {} default void onPodcastChannelLongClick(Bundle bundle) {} diff --git a/app/src/main/java/com/cappielloantonio/tempo/repository/PodcastRepository.java b/app/src/main/java/com/cappielloantonio/tempo/repository/PodcastRepository.java index 084d9229..5552772f 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/repository/PodcastRepository.java +++ b/app/src/main/java/com/cappielloantonio/tempo/repository/PodcastRepository.java @@ -133,4 +133,21 @@ public class PodcastRepository { } }); } + + public void downloadPodcastEpisode(String episodeId) { + App.getSubsonicClientInstance(false) + .getPodcastClient() + .downloadPodcastEpisode(episodeId) + .enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + + } + }); + } } diff --git a/app/src/main/java/com/cappielloantonio/tempo/subsonic/api/podcast/PodcastClient.java b/app/src/main/java/com/cappielloantonio/tempo/subsonic/api/podcast/PodcastClient.java index 62cbb65b..766c7e62 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/subsonic/api/podcast/PodcastClient.java +++ b/app/src/main/java/com/cappielloantonio/tempo/subsonic/api/podcast/PodcastClient.java @@ -48,4 +48,9 @@ public class PodcastClient { Log.d(TAG, "deletePodcastEpisode()"); return podcastService.deletePodcastEpisode(subsonic.getParams(), episodeId); } + + public Call downloadPodcastEpisode(String episodeId) { + Log.d(TAG, "downloadPodcastEpisode()"); + return podcastService.downloadPodcastEpisode(subsonic.getParams(), episodeId); + } } diff --git a/app/src/main/java/com/cappielloantonio/tempo/subsonic/api/podcast/PodcastService.java b/app/src/main/java/com/cappielloantonio/tempo/subsonic/api/podcast/PodcastService.java index feb06e7d..be819f8c 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/subsonic/api/podcast/PodcastService.java +++ b/app/src/main/java/com/cappielloantonio/tempo/subsonic/api/podcast/PodcastService.java @@ -27,4 +27,7 @@ public interface PodcastService { @GET("deletePodcastEpisode") Call deletePodcastEpisode(@QueryMap Map params, @Query("id") String id); + + @GET("downloadPodcastEpisode") + Call downloadPodcastEpisode(@QueryMap Map params, @Query("id") String id); } diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/PodcastEpisodeAdapter.java b/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/PodcastEpisodeAdapter.java index 956da56a..9894dd1f 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/PodcastEpisodeAdapter.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/PodcastEpisodeAdapter.java @@ -57,6 +57,7 @@ public class PodcastEpisodeAdapter extends RecyclerView.Adapter onClick()); item.podcastMoreButton.setOnClickListener(v -> openMore()); + item.podcastDownloadRequestButton.setOnClickListener(v -> requestDownload()); } public void onClick() { @@ -120,6 +122,17 @@ public class PodcastEpisodeAdapter extends RecyclerView.Adapter + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_podcast_episode.xml b/app/src/main/res/layout/item_home_podcast_episode.xml index ef7b4ee7..d2596721 100644 --- a/app/src/main/res/layout/item_home_podcast_episode.xml +++ b/app/src/main/res/layout/item_home_podcast_episode.xml @@ -20,9 +20,9 @@ style="@style/LabelMedium" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginStart="12dp" android:ellipsize="end" android:maxLines="5" - android:layout_marginStart="12dp" android:text="@string/label_placeholder" app:layout_constraintBottom_toTopOf="@+id/podcast_subtitle_label" app:layout_constraintEnd_toEndOf="parent" @@ -36,9 +36,9 @@ style="@style/LabelSmall" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginStart="12dp" android:ellipsize="end" android:maxLines="2" - android:layout_marginStart="12dp" android:text="@string/label_placeholder" app:layout_constraintBottom_toTopOf="@id/podcast_upper_divider" app:layout_constraintEnd_toEndOf="parent" @@ -100,9 +100,21 @@ style="@style/Widget.Material3.Button.IconButton" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:visibility="gone" app:icon="@drawable/ic_more_vert" app:layout_constraintBottom_toBottomOf="@+id/podcast_play_button" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@+id/podcast_play_button" /> +