diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 35739948..d501b365 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -7,11 +7,11 @@ - + - + \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/YearAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/YearAdapter.java index 8b1ae125..100695a4 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/YearAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/YearAdapter.java @@ -10,6 +10,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.cappielloantonio.play.R; +import java.util.ArrayList; import java.util.List; public class YearAdapter extends RecyclerView.Adapter { @@ -19,10 +20,10 @@ public class YearAdapter extends RecyclerView.Adapter { private Context context; private ItemClickListener itemClickListener; - public YearAdapter(Context context, List years) { + public YearAdapter(Context context) { this.context = context; this.mInflater = LayoutInflater.from(context); - this.years = years; + this.years = new ArrayList<>(); } @Override diff --git a/app/src/main/java/com/cappielloantonio/play/interfaces/DecadesCallback.java b/app/src/main/java/com/cappielloantonio/play/interfaces/DecadesCallback.java new file mode 100644 index 00000000..36aad16d --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/interfaces/DecadesCallback.java @@ -0,0 +1,6 @@ +package com.cappielloantonio.play.interfaces; + + +public interface DecadesCallback { + void onLoadYear(int year); +} diff --git a/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java index 7fd2b8a0..b4f0b303 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java @@ -6,6 +6,7 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import com.cappielloantonio.play.App; +import com.cappielloantonio.play.interfaces.DecadesCallback; import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Song; @@ -14,7 +15,10 @@ import com.cappielloantonio.play.subsonic.models.SubsonicResponse; import com.cappielloantonio.play.util.MappingUtil; import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; import java.util.List; +import java.util.Map; import retrofit2.Call; import retrofit2.Callback; @@ -37,7 +41,7 @@ public class AlbumRepository { public LiveData> getAlbums(String type, int size) { App.getSubsonicClientInstance(application, false) .getAlbumSongListClient() - .getAlbumList2(type, size, 0) + .getAlbumList2(type, size, 0, null, null) .enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { @@ -265,4 +269,68 @@ public class AlbumRepository { } }); } + + public MutableLiveData> getDecades() { + MutableLiveData> decades = new MutableLiveData<>(); + + getFirstAlbum(first -> { + getLastAlbum(last -> { + List decadeList = new ArrayList(); + + int startDecade = first - (first % 10); + int lastDecade = last - (last % 10); + + while (startDecade <= lastDecade) { + decadeList.add(startDecade); + startDecade = startDecade + 10; + } + + decades.setValue(decadeList); + }); + }); + + return decades; + } + + private void getFirstAlbum(DecadesCallback callback) { + App.getSubsonicClientInstance(application, false) + .getAlbumSongListClient() + .getAlbumList2("byYear", 1, 0, 0, Calendar.getInstance().get(Calendar.YEAR)) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { + if(response.body().getAlbumList2().getAlbums().get(0) != null){ + callback.onLoadYear(response.body().getAlbumList2().getAlbums().get(0).getYear()); + } + } + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + } + + private void getLastAlbum(DecadesCallback callback) { + App.getSubsonicClientInstance(application, false) + .getAlbumSongListClient() + .getAlbumList2("byYear", 1, 0, Calendar.getInstance().get(Calendar.YEAR), 0) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { + if(response.body().getAlbumList2().getAlbums().get(0) != null){ + callback.onLoadYear(response.body().getAlbumList2().getAlbums().get(0).getYear()); + } + } + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + } } diff --git a/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java index 9fa6154d..0bd913fd 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java @@ -25,13 +25,13 @@ public class SongRepository { private Application application; - private MutableLiveData> starredSongs = new MutableLiveData<>(); - public SongRepository(Application application) { this.application = application; } public MutableLiveData> getStarredSongs() { + MutableLiveData> starredSongs = new MutableLiveData<>(); + App.getSubsonicClientInstance(application, false) .getAlbumSongListClient() .getStarred2() @@ -80,27 +80,29 @@ public class SongRepository { }); } - public void getRandomSample(int number, MediaCallback callback) { + public MutableLiveData> getRandomSample(int number, Integer fromYear, Integer toYear) { + MutableLiveData> randomSongsSample = new MutableLiveData<>(new ArrayList<>()); + App.getSubsonicClientInstance(application, false) .getAlbumSongListClient() - .getRandomSongs(number) + .getRandomSongs(number, fromYear, toYear) .enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { - List songs = new ArrayList<>(); - if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { - songs = new ArrayList<>(MappingUtil.mapSong(response.body().getRandomSongs().getSongs())); + List songs = new ArrayList<>(MappingUtil.mapSong(response.body().getRandomSongs().getSongs())); + randomSongsSample.setValue(songs); } - callback.onLoadMedia(songs); } @Override public void onFailure(Call call, Throwable t) { - callback.onError(new Exception(t.getMessage())); + } }); + + return randomSongsSample; } public void scrobble(String id) { diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/api/albumsonglist/AlbumSongListClient.java b/app/src/main/java/com/cappielloantonio/play/subsonic/api/albumsonglist/AlbumSongListClient.java index 61db7b05..cf4b0ef1 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/api/albumsonglist/AlbumSongListClient.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/api/albumsonglist/AlbumSongListClient.java @@ -35,14 +35,14 @@ public class AlbumSongListClient { return albumSongListService.getAlbumList(subsonic.getParams(), type, size, offset); } - public Call getAlbumList2(String type, int size, int offset) { + public Call getAlbumList2(String type, int size, int offset, Integer fromYear, Integer toYear) { Log.d(TAG, "getAlbumList2()"); - return albumSongListService.getAlbumList2(subsonic.getParams(), type, size, offset); + return albumSongListService.getAlbumList2(subsonic.getParams(), type, size, offset, fromYear, toYear); } - public Call getRandomSongs(int size) { + public Call getRandomSongs(int size, Integer fromYear, Integer toYear) { Log.d(TAG, "getRandomSongs()"); - return albumSongListService.getRandomSongs(subsonic.getParams(), size); + return albumSongListService.getRandomSongs(subsonic.getParams(), size, fromYear, toYear); } public Call getSongsByGenre(String genre, int count, int offset) { diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/api/albumsonglist/AlbumSongListService.java b/app/src/main/java/com/cappielloantonio/play/subsonic/api/albumsonglist/AlbumSongListService.java index 74550987..7542431d 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/api/albumsonglist/AlbumSongListService.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/api/albumsonglist/AlbumSongListService.java @@ -14,10 +14,10 @@ public interface AlbumSongListService { Call getAlbumList(@QueryMap Map params, @Query("type") String type, @Query("size") int size, @Query("offset") int offset); @GET("getAlbumList2") - Call getAlbumList2(@QueryMap Map params, @Query("type") String type, @Query("size") int size, @Query("offset") int offset); + Call getAlbumList2(@QueryMap Map params, @Query("type") String type, @Query("size") int size, @Query("offset") int offset, @Query("fromYear") Integer fromYear, @Query("toYear") Integer toYear); @GET("getRandomSongs") - Call getRandomSongs(@QueryMap Map params, @Query("size") int size); + Call getRandomSongs(@QueryMap Map params, @Query("size") int size, @Query("fromYear") Integer fromYear, @Query("toYear") Integer toYear); @GET("getSongsByGenre") Call getSongsByGenre(@QueryMap Map params, @Query("genre") String genre, @Query("count") int count, @Query("offset") int offset); 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 4df76f17..ea92eb9e 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 @@ -179,13 +179,10 @@ public class HomeFragment extends Fragment { } private void initYearSongView() { - if (bind != null) - bind.homeFlashbackSector.setVisibility(!homeViewModel.getYearList().isEmpty() ? View.VISIBLE : View.GONE); - bind.yearsRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); bind.yearsRecyclerView.setHasFixedSize(true); - yearAdapter = new YearAdapter(requireContext(), homeViewModel.getYearList()); + yearAdapter = new YearAdapter(requireContext()); yearAdapter.setClickListener((view, position) -> { Bundle bundle = new Bundle(); bundle.putString(Song.BY_YEAR, Song.BY_YEAR); @@ -193,6 +190,10 @@ public class HomeFragment extends Fragment { activity.navController.navigate(R.id.action_homeFragment_to_songListPageFragment, bundle); }); bind.yearsRecyclerView.setAdapter(yearAdapter); + homeViewModel.getYearList().observe(requireActivity(), years -> { + if (bind != null) bind.homeFlashbackSector.setVisibility(!years.isEmpty() ? View.VISIBLE : View.GONE); + yearAdapter.setItems(years); + }); } private void initStarredTracksView() { diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumCatalogueViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumCatalogueViewModel.java index 860bf408..2e5ec543 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumCatalogueViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumCatalogueViewModel.java @@ -63,7 +63,7 @@ public class AlbumCatalogueViewModel extends AndroidViewModel { private void retrieveAlbums(Context context, MediaCallback callback, int size, int offset) { App.getSubsonicClientInstance(context, false) .getAlbumSongListClient() - .getAlbumList2("alphabeticalByName", size, offset) + .getAlbumList2("alphabeticalByName", size, offset, null, null) .enqueue(new Callback() { @Override public void onResponse(Call call, retrofit2.Response response) { 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 f0b04e6c..965b23f3 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java @@ -19,6 +19,7 @@ import com.cappielloantonio.play.repository.SongRepository; import java.util.ArrayList; import java.util.List; +import java.util.Map; public class HomeViewModel extends AndroidViewModel { private static final String TAG = "HomeViewModel"; @@ -27,13 +28,12 @@ public class HomeViewModel extends AndroidViewModel { private ArtistRepository artistRepository; private DownloadRepository downloadRepository; - private LiveData> downloadedSongSample; - private List years; - - private MutableLiveData> dicoverSongSample; + private LiveData> dicoverSongSample; private LiveData> mostPlayedAlbumSample; private LiveData> recentlyAddedAlbumSample; private LiveData> recentlyPlayedAlbumSample; + private LiveData> downloadedSongSample; + private LiveData> years; private LiveData> starredTracks; private LiveData> starredAlbums; @@ -47,18 +47,12 @@ public class HomeViewModel extends AndroidViewModel { artistRepository = new ArtistRepository(application); downloadRepository = new DownloadRepository(application); - // favoritesSongSample = songRepository.getListLiveFavoritesSampleSong(20); - // downloadedSongSample = songRepository.getListLiveDownloadedSampleSong(20); - // years = songRepository.getYearList(); - - setDicoverSongSample(); - dicoverSongSample = new MutableLiveData<>(); - downloadedSongSample = downloadRepository.getLiveDownloadSample(10); - years = new ArrayList<>(); - + dicoverSongSample = songRepository.getRandomSample(10, null, null); mostPlayedAlbumSample = albumRepository.getAlbums("frequent", 20); recentlyAddedAlbumSample = albumRepository.getAlbums("newest", 20); recentlyPlayedAlbumSample = albumRepository.getAlbums("recent", 20); + downloadedSongSample = downloadRepository.getLiveDownloadSample(10); + years = albumRepository.getDecades(); starredTracks = songRepository.getStarredSongs(); starredAlbums = albumRepository.getStarredAlbums(); @@ -73,7 +67,7 @@ public class HomeViewModel extends AndroidViewModel { return dicoverSongSample; } - public List getYearList() { + public LiveData> getYearList() { return years; } @@ -104,18 +98,4 @@ public class HomeViewModel extends AndroidViewModel { public LiveData> getRecentlyPlayedAlbumList() { return recentlyPlayedAlbumSample; } - - private void setDicoverSongSample() { - songRepository.getRandomSample(10, new MediaCallback() { - @Override - public void onError(Exception exception) { - - } - - @Override - public void onLoadMedia(List media) { - dicoverSongSample.setValue((List) media); - } - }); - } } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java index 26497212..e74eabbc 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java @@ -66,7 +66,7 @@ public class SongListPageViewModel extends AndroidViewModel { songList = songRepository.getSongsByGenres(filters); break; case Song.BY_YEAR: - // songList = songRepository.getSongByYearListLive(year); + songList = songRepository.getRandomSample(500, year, year + 10); break; case Song.STARRED: songList = songRepository.getStarredSongs();