diff --git a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/AlbumBottomSheetViewModel.java b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/AlbumBottomSheetViewModel.java index 5eab7d3b..4ee072fc 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/AlbumBottomSheetViewModel.java +++ b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/AlbumBottomSheetViewModel.java @@ -7,11 +7,14 @@ import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; +import com.cappielloantonio.tempo.interfaces.StarCallback; import com.cappielloantonio.tempo.repository.AlbumRepository; import com.cappielloantonio.tempo.repository.ArtistRepository; +import com.cappielloantonio.tempo.repository.FavoriteRepository; import com.cappielloantonio.tempo.subsonic.models.AlbumID3; import com.cappielloantonio.tempo.subsonic.models.ArtistID3; import com.cappielloantonio.tempo.subsonic.models.Child; +import com.cappielloantonio.tempo.util.NetworkUtil; import java.util.Date; import java.util.List; @@ -19,6 +22,7 @@ import java.util.List; public class AlbumBottomSheetViewModel extends AndroidViewModel { private final AlbumRepository albumRepository; private final ArtistRepository artistRepository; + private final FavoriteRepository favoriteRepository; private AlbumID3 album; @@ -27,6 +31,7 @@ public class AlbumBottomSheetViewModel extends AndroidViewModel { albumRepository = new AlbumRepository(); artistRepository = new ArtistRepository(); + favoriteRepository = new FavoriteRepository(); } public AlbumID3 getAlbum() { @@ -47,11 +52,51 @@ public class AlbumBottomSheetViewModel extends AndroidViewModel { public void setFavorite() { if (album.getStarred() != null) { - artistRepository.unstar(album.getId()); - album.setStarred(null); + if (NetworkUtil.isOffline()) { + removeFavoriteOffline(); + } else { + removeFavoriteOnline(); + } } else { - artistRepository.star(album.getId()); - album.setStarred(new Date()); + if (NetworkUtil.isOffline()) { + setFavoriteOffline(); + } else { + setFavoriteOnline(); + } } } + + private void removeFavoriteOffline() { + favoriteRepository.starLater(null, album.getId(), null, false); + album.setStarred(null); + } + + private void removeFavoriteOnline() { + favoriteRepository.unstar(null, album.getId(), null, new StarCallback() { + @Override + public void onError() { + // album.setStarred(new Date()); + favoriteRepository.starLater(null, album.getId(), null, false); + } + }); + + album.setStarred(null); + } + + private void setFavoriteOffline() { + favoriteRepository.starLater(null, album.getId(), null, true); + album.setStarred(new Date()); + } + + private void setFavoriteOnline() { + favoriteRepository.star(null, album.getId(), null, new StarCallback() { + @Override + public void onError() { + // album.setStarred(null); + favoriteRepository.starLater(null, album.getId(), null, true); + } + }); + + album.setStarred(new Date()); + } } diff --git a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/ArtistBottomSheetViewModel.java b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/ArtistBottomSheetViewModel.java index 9a042d29..08ae3681 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/ArtistBottomSheetViewModel.java +++ b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/ArtistBottomSheetViewModel.java @@ -5,20 +5,25 @@ import android.app.Application; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; -import com.cappielloantonio.tempo.repository.AlbumRepository; +import com.cappielloantonio.tempo.interfaces.StarCallback; +import com.cappielloantonio.tempo.repository.ArtistRepository; +import com.cappielloantonio.tempo.repository.FavoriteRepository; import com.cappielloantonio.tempo.subsonic.models.ArtistID3; +import com.cappielloantonio.tempo.util.NetworkUtil; import java.util.Date; public class ArtistBottomSheetViewModel extends AndroidViewModel { - private final AlbumRepository albumRepository; + private final ArtistRepository artistRepository; + private final FavoriteRepository favoriteRepository; private ArtistID3 artist; public ArtistBottomSheetViewModel(@NonNull Application application) { super(application); - albumRepository = new AlbumRepository(); + artistRepository = new ArtistRepository(); + favoriteRepository = new FavoriteRepository(); } public ArtistID3 getArtist() { @@ -31,11 +36,51 @@ public class ArtistBottomSheetViewModel extends AndroidViewModel { public void setFavorite() { if (artist.getStarred() != null) { - albumRepository.unstar(artist.getId()); - artist.setStarred(null); + if (NetworkUtil.isOffline()) { + removeFavoriteOffline(); + } else { + removeFavoriteOnline(); + } } else { - albumRepository.star(artist.getId()); - artist.setStarred(new Date()); + if (NetworkUtil.isOffline()) { + setFavoriteOffline(); + } else { + setFavoriteOnline(); + } } } + + private void removeFavoriteOffline() { + favoriteRepository.starLater(null, null, artist.getId(), false); + artist.setStarred(null); + } + + private void removeFavoriteOnline() { + favoriteRepository.unstar(null, null, artist.getId(), new StarCallback() { + @Override + public void onError() { + // artist.setStarred(new Date()); + favoriteRepository.starLater(null, null, artist.getId(), false); + } + }); + + artist.setStarred(null); + } + + private void setFavoriteOffline() { + favoriteRepository.starLater(null, null, artist.getId(), true); + artist.setStarred(new Date()); + } + + private void setFavoriteOnline() { + favoriteRepository.star(null, null, artist.getId(), new StarCallback() { + @Override + public void onError() { + // artist.setStarred(null); + favoriteRepository.starLater(null, null, artist.getId(), true); + } + }); + + artist.setStarred(new Date()); + } } diff --git a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlayerBottomSheetViewModel.java b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlayerBottomSheetViewModel.java index 1441859c..9d08b235 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlayerBottomSheetViewModel.java +++ b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlayerBottomSheetViewModel.java @@ -11,9 +11,11 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.media3.common.util.UnstableApi; +import com.cappielloantonio.tempo.interfaces.StarCallback; import com.cappielloantonio.tempo.model.Download; import com.cappielloantonio.tempo.model.Queue; import com.cappielloantonio.tempo.repository.ArtistRepository; +import com.cappielloantonio.tempo.repository.FavoriteRepository; import com.cappielloantonio.tempo.repository.QueueRepository; import com.cappielloantonio.tempo.repository.SongRepository; import com.cappielloantonio.tempo.subsonic.models.ArtistID3; @@ -22,6 +24,7 @@ import com.cappielloantonio.tempo.subsonic.models.PlayQueue; import com.cappielloantonio.tempo.util.Constants; import com.cappielloantonio.tempo.util.DownloadUtil; import com.cappielloantonio.tempo.util.MappingUtil; +import com.cappielloantonio.tempo.util.NetworkUtil; import com.cappielloantonio.tempo.util.Preferences; import java.util.Collections; @@ -36,6 +39,7 @@ public class PlayerBottomSheetViewModel extends AndroidViewModel { private final SongRepository songRepository; private final ArtistRepository artistRepository; private final QueueRepository queueRepository; + private final FavoriteRepository favoriteRepository; private final MutableLiveData lyricsLiveData = new MutableLiveData<>(null); @@ -50,6 +54,7 @@ public class PlayerBottomSheetViewModel extends AndroidViewModel { songRepository = new SongRepository(); artistRepository = new ArtistRepository(); queueRepository = new QueueRepository(); + favoriteRepository = new FavoriteRepository(); } public LiveData> getQueueSong() { @@ -59,22 +64,62 @@ public class PlayerBottomSheetViewModel extends AndroidViewModel { public void setFavorite(Context context, Child media) { if (media != null) { if (media.getStarred() != null) { - songRepository.unstar(media.getId()); - media.setStarred(null); + if (NetworkUtil.isOffline()) { + removeFavoriteOffline(media); + } else { + removeFavoriteOnline(media); + } } else { - songRepository.star(media.getId()); - media.setStarred(new Date()); - - if (Preferences.isStarredSyncEnabled()) { - DownloadUtil.getDownloadTracker(context).download( - MappingUtil.mapDownload(media), - new Download(media) - ); + if (NetworkUtil.isOffline()) { + setFavoriteOffline(media); + } else { + setFavoriteOnline(context, media); } } } } + private void removeFavoriteOffline(Child media) { + favoriteRepository.starLater(media.getId(), null, null, false); + media.setStarred(null); + } + + private void removeFavoriteOnline(Child media) { + favoriteRepository.unstar(media.getId(), null, null, new StarCallback() { + @Override + public void onError() { + // media.setStarred(new Date()); + favoriteRepository.starLater(media.getId(), null, null, false); + } + }); + + media.setStarred(null); + } + + private void setFavoriteOffline(Child media) { + favoriteRepository.starLater(media.getId(), null, null, true); + media.setStarred(new Date()); + } + + private void setFavoriteOnline(Context context, Child media) { + favoriteRepository.star(media.getId(), null, null, new StarCallback() { + @Override + public void onError() { + // media.setStarred(null); + favoriteRepository.starLater(media.getId(), null, null, true); + } + }); + + media.setStarred(new Date()); + + if (Preferences.isStarredSyncEnabled()) { + DownloadUtil.getDownloadTracker(context).download( + MappingUtil.mapDownload(media), + new Download(media) + ); + } + } + public LiveData getLiveLyrics() { return lyricsLiveData; } diff --git a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/SongBottomSheetViewModel.java b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/SongBottomSheetViewModel.java index 4b2847a6..1930ec97 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/SongBottomSheetViewModel.java +++ b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/SongBottomSheetViewModel.java @@ -10,15 +10,18 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.media3.common.util.UnstableApi; +import com.cappielloantonio.tempo.interfaces.StarCallback; import com.cappielloantonio.tempo.model.Download; import com.cappielloantonio.tempo.repository.AlbumRepository; import com.cappielloantonio.tempo.repository.ArtistRepository; +import com.cappielloantonio.tempo.repository.FavoriteRepository; import com.cappielloantonio.tempo.repository.SongRepository; import com.cappielloantonio.tempo.subsonic.models.AlbumID3; import com.cappielloantonio.tempo.subsonic.models.ArtistID3; import com.cappielloantonio.tempo.subsonic.models.Child; import com.cappielloantonio.tempo.util.DownloadUtil; import com.cappielloantonio.tempo.util.MappingUtil; +import com.cappielloantonio.tempo.util.NetworkUtil; import com.cappielloantonio.tempo.util.Preferences; import java.util.Collections; @@ -30,6 +33,7 @@ public class SongBottomSheetViewModel extends AndroidViewModel { private final SongRepository songRepository; private final AlbumRepository albumRepository; private final ArtistRepository artistRepository; + private final FavoriteRepository favoriteRepository; private Child song; @@ -41,6 +45,7 @@ public class SongBottomSheetViewModel extends AndroidViewModel { songRepository = new SongRepository(); albumRepository = new AlbumRepository(); artistRepository = new ArtistRepository(); + favoriteRepository = new FavoriteRepository(); } public Child getSong() { @@ -53,18 +58,58 @@ public class SongBottomSheetViewModel extends AndroidViewModel { public void setFavorite(Context context) { if (song.getStarred() != null) { - songRepository.unstar(song.getId()); - song.setStarred(null); - } else { - songRepository.star(song.getId()); - song.setStarred(new Date()); - - if (Preferences.isStarredSyncEnabled()) { - DownloadUtil.getDownloadTracker(context).download( - MappingUtil.mapDownload(song), - new Download(song) - ); + if (NetworkUtil.isOffline()) { + removeFavoriteOffline(song); + } else { + removeFavoriteOnline(song); } + } else { + if (NetworkUtil.isOffline()) { + setFavoriteOffline(song); + } else { + setFavoriteOnline(context, song); + } + } + } + + private void removeFavoriteOffline(Child media) { + favoriteRepository.starLater(media.getId(), null, null, false); + media.setStarred(null); + } + + private void removeFavoriteOnline(Child media) { + favoriteRepository.unstar(media.getId(), null, null, new StarCallback() { + @Override + public void onError() { + // media.setStarred(new Date()); + favoriteRepository.starLater(media.getId(), null, null, false); + } + }); + + media.setStarred(null); + } + + private void setFavoriteOffline(Child media) { + favoriteRepository.starLater(media.getId(), null, null, true); + media.setStarred(new Date()); + } + + private void setFavoriteOnline(Context context, Child media) { + favoriteRepository.star(media.getId(), null, null, new StarCallback() { + @Override + public void onError() { + // media.setStarred(null); + favoriteRepository.starLater(media.getId(), null, null, true); + } + }); + + media.setStarred(new Date()); + + if (Preferences.isStarredSyncEnabled()) { + DownloadUtil.getDownloadTracker(context).download( + MappingUtil.mapDownload(media), + new Download(media) + ); } }