diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java index 9ebe4e76..ac89ebcb 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java @@ -93,15 +93,15 @@ public class DiscoverSongAdapter extends RecyclerView.Adapter media) { QueueRepository queueRepository = new QueueRepository(App.getInstance()); - queueRepository.insertAllAndStartNew((ArrayList) media); + List mix = queueRepository.insertMix((ArrayList) media); activity.isBottomSheetInPeek(true); - activity.setBottomSheetMusicInfo(((ArrayList) media).get(0)); + activity.setBottomSheetMusicInfo(mix.get(0)); PlayerBottomSheetViewModel playerBottomSheetViewModel = new ViewModelProvider(activity).get(PlayerBottomSheetViewModel.class); - playerBottomSheetViewModel.setNowPlayingSong(((ArrayList) media).get(0)); + playerBottomSheetViewModel.setNowPlayingSong(mix.get(0)); - MusicPlayerRemote.openQueue((ArrayList) media, 0, true); + MusicPlayerRemote.openQueue(mix, 0, true); } }, SyncUtil.SONG, songs.get(getBindingAdapterPosition()).getId(), 50); } diff --git a/app/src/main/java/com/cappielloantonio/play/database/dao/SongDao.java b/app/src/main/java/com/cappielloantonio/play/database/dao/SongDao.java index ab54b45f..601bc60b 100644 --- a/app/src/main/java/com/cappielloantonio/play/database/dao/SongDao.java +++ b/app/src/main/java/com/cappielloantonio/play/database/dao/SongDao.java @@ -89,7 +89,16 @@ public interface SongDao { void deleteAll(); @Update - public void update(Song song); + void update(Song song); + + @Query("UPDATE song SET play_count = :playCount AND last_play = :lastPlay WHERE id = :id") + void updatePlayCount(String id, int playCount, long lastPlay); + + @Query("UPDATE song SET favorite = :isFavorite WHERE id = :id") + void updateFavorite(String id, boolean isFavorite); + + @Query("SELECT * FROM song WHERE id IN (:ids)") + List getSongsByID(List ids); @Query("SELECT * FROM song ORDER BY RANDOM() LIMIT :number") List random(int number); diff --git a/app/src/main/java/com/cappielloantonio/play/model/Song.java b/app/src/main/java/com/cappielloantonio/play/model/Song.java index be07e1ec..76dd1345 100644 --- a/app/src/main/java/com/cappielloantonio/play/model/Song.java +++ b/app/src/main/java/com/cappielloantonio/play/model/Song.java @@ -230,13 +230,6 @@ public class Song implements Parcelable { this.lastPlay = 0; } - @Ignore - public Song(String title, String albumName) { - this.id = UUID.randomUUID().toString(); - this.title = title; - this.albumName = albumName; - } - @NonNull public String getId() { return id; diff --git a/app/src/main/java/com/cappielloantonio/play/repository/QueueRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/QueueRepository.java index f7cdcf69..9e6be29f 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/QueueRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/QueueRepository.java @@ -6,6 +6,7 @@ import androidx.lifecycle.LiveData; import com.cappielloantonio.play.database.AppDatabase; import com.cappielloantonio.play.database.dao.QueueDao; +import com.cappielloantonio.play.database.dao.SongDao; import com.cappielloantonio.play.model.Queue; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.util.QueueUtil; @@ -17,11 +18,13 @@ import java.util.List; public class QueueRepository { private static final String TAG = "QueueRepository"; + private SongDao songDao; private QueueDao queueDao; private LiveData> listLiveQueue; public QueueRepository(Application application) { AppDatabase database = AppDatabase.getInstance(application); + songDao = database.songDao(); queueDao = database.queueDao(); } @@ -59,6 +62,26 @@ public class QueueRepository { thread.start(); } + public List insertMix(ArrayList media) { + List IDs = QueueUtil.getIDsFromSongs(media); + List mix = new ArrayList<>(); + + GetSongsByIDThreadSafe getSongsByIDThreadSafe = new GetSongsByIDThreadSafe(songDao, IDs); + Thread thread = new Thread(getSongsByIDThreadSafe); + thread.start(); + + try { + thread.join(); + mix = QueueUtil.orderSongByIdList(IDs, getSongsByIDThreadSafe.getSongs()); + + insertAllAndStartNew(mix); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + return mix; + } + public void insertAllAndStartNew(List songs) { try { final Thread delete = new Thread(new DeleteAllThreadSafe(queueDao)); @@ -218,4 +241,24 @@ public class QueueRepository { return songs; } } + + private static class GetSongsByIDThreadSafe implements Runnable { + private SongDao songDao; + private List IDs; + private List songs; + + public GetSongsByIDThreadSafe(SongDao songDao, List IDs) { + this.songDao = songDao; + this.IDs = IDs; + } + + @Override + public void run() { + songs = songDao.getSongsByID(IDs); + } + + public List getSongs() { + return songs; + } + } } 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 c3c49d2c..6b4168fa 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java @@ -46,11 +46,6 @@ public class SongRepository { return searchListLiveSongs; } - public LiveData getLiveDataSong(String id) { - liveDataSong = songDao.getOne(id); - return liveDataSong; - } - public LiveData> getListLiveRecentlyAddedSampleSong(int number) { listLiveSampleRecentlyAddedSongs = songDao.getRecentlyAddedSample(number); return listLiveSampleRecentlyAddedSongs; @@ -240,9 +235,11 @@ public class SongRepository { } public void increasePlayCount(Song song) { + Log.i(TAG, "increasePlayCount: " + song.getId()); boolean isIncreased = song.nowPlaying(); if(isIncreased) { + // UpdatePlayCountThreadSafe update = new UpdatePlayCountThreadSafe(songDao, song); UpdateThreadSafe update = new UpdateThreadSafe(songDao, song); Thread thread = new Thread(update); thread.start(); @@ -250,6 +247,7 @@ public class SongRepository { } public void setFavoriteStatus(Song song) { + // UpdateFavoriteThreadSafe update = new UpdateFavoriteThreadSafe(songDao, song); UpdateThreadSafe update = new UpdateThreadSafe(songDao, song); Thread thread = new Thread(update); thread.start(); @@ -296,23 +294,6 @@ public class SongRepository { return sample; } - public Song getSongByID(String id) { - Song song = null; - - GetSongByIDThreadSafe songByID = new GetSongByIDThreadSafe(songDao, id); - Thread thread = new Thread(songByID); - thread.start(); - - try { - thread.join(); - song = songByID.getSong(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - return song; - } - private static class GetSongsByAlbumIDThreadSafe implements Runnable { private SongDao songDao; private String albumID; @@ -439,6 +420,36 @@ public class SongRepository { } } + private static class UpdatePlayCountThreadSafe implements Runnable { + private SongDao songDao; + private Song song; + + public UpdatePlayCountThreadSafe(SongDao songDao, Song song) { + this.songDao = songDao; + this.song = song; + } + + @Override + public void run() { + songDao.updatePlayCount(song.getId(), song.getPlayCount(), song.getLastPlay()); + } + } + + private static class UpdateFavoriteThreadSafe implements Runnable { + private SongDao songDao; + private Song song; + + public UpdateFavoriteThreadSafe(SongDao songDao, Song song) { + this.songDao = songDao; + this.song = song; + } + + @Override + public void run() { + songDao.updateFavorite(song.getId(), song.isFavorite()); + } + } + private static class PickRandomThreadSafe implements Runnable { private SongDao songDao; private int elementNumber; @@ -568,24 +579,4 @@ public class SongRepository { return decades; } } - - private static class GetSongByIDThreadSafe implements Runnable { - private SongDao songDao; - private String id; - private Song song; - - public GetSongByIDThreadSafe(SongDao songDao, String id) { - this.songDao = songDao; - this.id = id; - } - - @Override - public void run() { - song = songDao.getSongByID(id); - } - - public Song getSong() { - return song; - } - } } diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java index d9dd2f22..67af3e6a 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java @@ -95,15 +95,15 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements @Override public void onLoadMedia(List media) { QueueRepository queueRepository = new QueueRepository(App.getInstance()); - queueRepository.insertAllAndStartNew((ArrayList) media); + List mix = queueRepository.insertMix((ArrayList) media); activity.isBottomSheetInPeek(true); - activity.setBottomSheetMusicInfo(((ArrayList) media).get(0)); + activity.setBottomSheetMusicInfo(mix.get(0)); PlayerBottomSheetViewModel playerBottomSheetViewModel = new ViewModelProvider(activity).get(PlayerBottomSheetViewModel.class); - playerBottomSheetViewModel.setNowPlayingSong(((ArrayList) media).get(0)); + playerBottomSheetViewModel.setNowPlayingSong(mix.get(0)); - MusicPlayerRemote.openQueue((ArrayList) media, 0, true); + MusicPlayerRemote.openQueue(mix, 0, true); } }, SyncUtil.SONG, album.getId(), 50); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java index b3c9e129..9beba41e 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java @@ -84,15 +84,15 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement @Override public void onLoadMedia(List media) { QueueRepository queueRepository = new QueueRepository(App.getInstance()); - queueRepository.insertAllAndStartNew((ArrayList) media); + List mix = queueRepository.insertMix((ArrayList) media); activity.isBottomSheetInPeek(true); - activity.setBottomSheetMusicInfo(((ArrayList) media).get(0)); + activity.setBottomSheetMusicInfo(mix.get(0)); PlayerBottomSheetViewModel playerBottomSheetViewModel = new ViewModelProvider(activity).get(PlayerBottomSheetViewModel.class); - playerBottomSheetViewModel.setNowPlayingSong(((ArrayList) media).get(0)); + playerBottomSheetViewModel.setNowPlayingSong(mix.get(0)); - MusicPlayerRemote.openQueue((ArrayList) media, 0, true); + MusicPlayerRemote.openQueue(mix, 0, true); } }, SyncUtil.SONG, artist.getId(), 50); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java index 423c7ad6..30c6c4ff 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java @@ -102,15 +102,15 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements @Override public void onLoadMedia(List media) { QueueRepository queueRepository = new QueueRepository(App.getInstance()); - queueRepository.insertAllAndStartNew((ArrayList) media); + List mix = queueRepository.insertMix((ArrayList) media); activity.isBottomSheetInPeek(true); - activity.setBottomSheetMusicInfo(((ArrayList) media).get(0)); + activity.setBottomSheetMusicInfo(mix.get(0)); PlayerBottomSheetViewModel playerBottomSheetViewModel = new ViewModelProvider(activity).get(PlayerBottomSheetViewModel.class); - playerBottomSheetViewModel.setNowPlayingSong(((ArrayList) media).get(0)); + playerBottomSheetViewModel.setNowPlayingSong(mix.get(0)); - MusicPlayerRemote.openQueue((ArrayList) media, 0, true); + MusicPlayerRemote.openQueue(mix, 0, true); } }, SyncUtil.SONG, song.getId(), 50); diff --git a/app/src/main/java/com/cappielloantonio/play/util/QueueUtil.java b/app/src/main/java/com/cappielloantonio/play/util/QueueUtil.java index ef8c310f..1b94a074 100644 --- a/app/src/main/java/com/cappielloantonio/play/util/QueueUtil.java +++ b/app/src/main/java/com/cappielloantonio/play/util/QueueUtil.java @@ -1,5 +1,7 @@ package com.cappielloantonio.play.util; +import android.util.Log; + import com.cappielloantonio.play.model.Queue; import com.cappielloantonio.play.model.Song; @@ -7,9 +9,7 @@ import java.util.ArrayList; import java.util.List; public class QueueUtil { - public static Queue getQueueElementFromSong(Song song) { - return new Queue(0, song.getId()); - } + private static final String TAG = "QueueUtil"; public static Queue getQueueElementFromSong(Song song, int startingPosition) { return new Queue(startingPosition, song.getId()); @@ -27,15 +27,28 @@ public class QueueUtil { return queue; } - public static List getQueueElementsFromSongs(List songs, int startingPosition) { - int counter = startingPosition; - List queue = new ArrayList<>(); + public static List getIDsFromSongs(List songs) { + List IDs = new ArrayList<>(); for(Song song: songs) { - queue.add(new Queue(counter, song.getId())); - counter++; + IDs.add(song.getId()); } - return queue; + return IDs; + } + + public static List orderSongByIdList(List IDs, List songs) { + List orderedSong = new ArrayList<>(); + + for(String ID: IDs) { + for(Song song: songs) { + if(ID.equals(song.getId())) { + orderedSong.add(song); + break; + } + } + } + + return orderedSong; } }