diff --git a/.idea/misc.xml b/.idea/misc.xml
index 4eb72272..8c22abe1 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -119,11 +119,12 @@
+
-
+
diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/HomeFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/HomeFragment.java
index a288c1f9..67befdc2 100644
--- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/HomeFragment.java
+++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/HomeFragment.java
@@ -3,6 +3,7 @@ package com.cappielloantonio.play.ui.fragment;
import android.annotation.SuppressLint;
import android.content.ComponentName;
import android.os.Bundle;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@@ -31,6 +32,7 @@ import com.cappielloantonio.play.adapter.AlbumHorizontalAdapter;
import com.cappielloantonio.play.adapter.ArtistAdapter;
import com.cappielloantonio.play.adapter.ArtistHorizontalAdapter;
import com.cappielloantonio.play.adapter.DiscoverSongAdapter;
+import com.cappielloantonio.play.adapter.PodcastEpisodeAdapter;
import com.cappielloantonio.play.adapter.SimilarTrackAdapter;
import com.cappielloantonio.play.adapter.SongHorizontalAdapter;
import com.cappielloantonio.play.adapter.YearAdapter;
@@ -69,6 +71,7 @@ public class HomeFragment extends Fragment {
private AlbumAdapter mostPlayedAlbumAdapter;
private AlbumHorizontalAdapter newReleasesAlbumAdapter;
private YearAdapter yearAdapter;
+ private PodcastEpisodeAdapter podcastEpisodeAdapter;
private ListenableFuture mediaBrowserListenableFuture;
@@ -116,6 +119,7 @@ public class HomeFragment extends Fragment {
initYearSongView();
initRecentAddedAlbumView();
initPinnedPlaylistsView();
+ initNewestPodcastsView();
}
@Override
@@ -265,7 +269,7 @@ public class HomeFragment extends Fragment {
}
});
- setDiscoverSongSlideViewOffset(20, 16);
+ setSlideViewOffset(bind.discoverSongViewPager, 20, 16);
}
private void initSimilarSongView() {
@@ -535,33 +539,6 @@ public class HomeFragment extends Fragment {
recentAddedAlbumSnapHelper.attachToRecyclerView(bind.recentlyAddedAlbumsRecyclerView);
}
- private void setDiscoverSongSlideViewOffset(float pageOffset, float pageMargin) {
- bind.discoverSongViewPager.setPageTransformer((page, position) -> {
- float myOffset = position * -(2 * pageOffset + pageMargin);
- if (bind.discoverSongViewPager.getOrientation() == ViewPager2.ORIENTATION_HORIZONTAL) {
- if (ViewCompat.getLayoutDirection(bind.discoverSongViewPager) == ViewCompat.LAYOUT_DIRECTION_RTL) {
- page.setTranslationX(-myOffset);
- } else {
- page.setTranslationX(myOffset);
- }
- } else {
- page.setTranslationY(myOffset);
- }
- });
- }
-
- public void reorder() {
- if (bind != null) {
- bind.homeLinearLayoutContainer.removeAllViews();
- bind.homeLinearLayoutContainer.addView(bind.homeDiscoverSector);
- bind.homeLinearLayoutContainer.addView(bind.homeSimilarTracksSector);
- bind.homeLinearLayoutContainer.addView(bind.homeRecentlyAddedAlbumsSector);
- bind.homeLinearLayoutContainer.addView(bind.homeFlashbackSector);
- bind.homeLinearLayoutContainer.addView(bind.homeMostPlayedAlbumsSector);
- bind.homeLinearLayoutContainer.addView(bind.homeRecentlyPlayedAlbumsSector);
- }
- }
-
public void initPinnedPlaylistsView() {
homeViewModel.getPinnedPlaylistList(requireActivity(), 5, true).observe(requireActivity(), playlists -> {
if (bind != null && playlists != null) {
@@ -620,6 +597,55 @@ public class HomeFragment extends Fragment {
});
}
+ private void initNewestPodcastsView() {
+ bind.newestPodcastsViewPager.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
+
+ podcastEpisodeAdapter = new PodcastEpisodeAdapter(activity, requireContext());
+ bind.newestPodcastsViewPager.setAdapter(podcastEpisodeAdapter);
+ bind.newestPodcastsViewPager.setOffscreenPageLimit(1);
+ homeViewModel.getNewestPodcastEpisodes(requireActivity()).observe(requireActivity(), podcastEpisodes -> {
+ if (podcastEpisodes == null) {
+ if (bind != null) bind.homeNewestPodcastsPlaceholder.placeholder.setVisibility(View.VISIBLE);
+ if (bind != null) bind.homeNewestPodcastsSector.setVisibility(View.GONE);
+ } else {
+ if (bind != null) bind.homeNewestPodcastsPlaceholder.placeholder.setVisibility(View.GONE);
+ if (bind != null) bind.homeNewestPodcastsSector.setVisibility(!podcastEpisodes.isEmpty() ? View.VISIBLE : View.GONE);
+
+ podcastEpisodeAdapter.setItems(podcastEpisodes);
+ }
+ });
+
+ setSlideViewOffset(bind.newestPodcastsViewPager, 20, 16);
+ }
+
+ private void setSlideViewOffset(ViewPager2 viewPager, float pageOffset, float pageMargin) {
+ viewPager.setPageTransformer((page, position) -> {
+ float myOffset = position * -(2 * pageOffset + pageMargin);
+ if (viewPager.getOrientation() == ViewPager2.ORIENTATION_HORIZONTAL) {
+ if (ViewCompat.getLayoutDirection(viewPager) == ViewCompat.LAYOUT_DIRECTION_RTL) {
+ page.setTranslationX(-myOffset);
+ } else {
+ page.setTranslationX(myOffset);
+ }
+ } else {
+ page.setTranslationY(myOffset);
+ }
+ });
+ }
+
+ public void reorder() {
+ if (bind != null) {
+ bind.homeLinearLayoutContainer.removeAllViews();
+ bind.homeLinearLayoutContainer.addView(bind.homeDiscoverSector);
+ bind.homeLinearLayoutContainer.addView(bind.homeSimilarTracksSector);
+ bind.homeLinearLayoutContainer.addView(bind.homeRecentlyAddedAlbumsSector);
+ bind.homeLinearLayoutContainer.addView(bind.homeFlashbackSector);
+ bind.homeLinearLayoutContainer.addView(bind.homeMostPlayedAlbumsSector);
+ bind.homeLinearLayoutContainer.addView(bind.homeRecentlyPlayedAlbumsSector);
+ bind.homeLinearLayoutContainer.addView(bind.homeNewestPodcastsSector);
+ }
+ }
+
@SuppressLint("UnsafeOptInUsageError")
private void initializeMediaBrowser() {
mediaBrowserListenableFuture = new MediaBrowser.Builder(requireContext(), new SessionToken(requireContext(), new ComponentName(requireContext(), MediaService.class))).buildAsync();
diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java
index 5bc628ba..d3949342 100644
--- a/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java
+++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java
@@ -12,11 +12,14 @@ import com.cappielloantonio.play.App;
import com.cappielloantonio.play.model.Album;
import com.cappielloantonio.play.model.Artist;
import com.cappielloantonio.play.model.Playlist;
+import com.cappielloantonio.play.model.PodcastEpisode;
import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.AlbumRepository;
import com.cappielloantonio.play.repository.ArtistRepository;
import com.cappielloantonio.play.repository.PlaylistRepository;
+import com.cappielloantonio.play.repository.PodcastRepository;
import com.cappielloantonio.play.repository.SongRepository;
+import com.cappielloantonio.play.subsonic.models.NewestPodcasts;
import com.cappielloantonio.play.util.PreferenceUtil;
import java.util.Calendar;
@@ -31,6 +34,7 @@ public class HomeViewModel extends AndroidViewModel {
private final AlbumRepository albumRepository;
private final ArtistRepository artistRepository;
private final PlaylistRepository playlistRepository;
+ private final PodcastRepository podcastRepository;
private final MutableLiveData> dicoverSongSample = new MutableLiveData<>(null);
private final MutableLiveData> newReleasedAlbum = new MutableLiveData<>(null);
@@ -44,6 +48,7 @@ public class HomeViewModel extends AndroidViewModel {
private final MutableLiveData> years = new MutableLiveData<>(null);
private final MutableLiveData> recentlyAddedAlbumSample = new MutableLiveData<>(null);
private final MutableLiveData> pinnedPlaylists = new MutableLiveData<>(null);
+ private final MutableLiveData> newestPodcastEpisodes = new MutableLiveData<>(null);
public HomeViewModel(@NonNull Application application) {
super(application);
@@ -52,6 +57,7 @@ public class HomeViewModel extends AndroidViewModel {
albumRepository = new AlbumRepository(application);
artistRepository = new ArtistRepository(application);
playlistRepository = new PlaylistRepository(application);
+ podcastRepository = new PodcastRepository(application);
songRepository.getRandomSample(10, null, null).observeForever(dicoverSongSample::postValue);
songRepository.getStarredSongs(true, 10).observeForever(starredTracksSample::postValue);
@@ -129,6 +135,11 @@ public class HomeViewModel extends AndroidViewModel {
return playlistRepository.getPlaylistSongs(playlistId);
}
+ public LiveData> getNewestPodcastEpisodes(LifecycleOwner owner) {
+ podcastRepository.getNewestPodcastEpisodes(20).observe(owner, newestPodcastEpisodes::postValue);
+ return newestPodcastEpisodes;
+ }
+
public void refreshDiscoverySongSample(LifecycleOwner owner) {
songRepository.getRandomSample(10, null, null).observe(owner, dicoverSongSample::postValue);
}
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
index 48a56b36..7d5b2114 100644
--- a/app/src/main/res/layout/fragment_home.xml
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -591,6 +591,44 @@
android:id="@+id/home_recently_added_albums_placeholder"
layout="@layout/item_placeholder_album"
android:visibility="gone" />
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f1bd2e56..8cbcab77 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -127,6 +127,7 @@
Play
Shuffle
Playlist • %1$d songs
+ %1$s • %2$s
Cancel
Save
Rate
@@ -208,4 +209,5 @@
See all
Radio stations
New releases
+ Newest podcasts
\ No newline at end of file