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