package com.cappielloantonio.tempo.viewmodel; import android.app.Application; import android.content.Context; import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.OptIn; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.media3.common.util.UnstableApi; import com.cappielloantonio.tempo.model.Download; 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.ArtistInfo2; 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.Date; import java.util.List; import java.util.stream.Collectors; public class ArtistPageViewModel extends AndroidViewModel { private final AlbumRepository albumRepository; private final ArtistRepository artistRepository; private final FavoriteRepository favoriteRepository; private ArtistID3 artist; public ArtistPageViewModel(@NonNull Application application) { super(application); albumRepository = new AlbumRepository(); artistRepository = new ArtistRepository(); favoriteRepository = new FavoriteRepository(); } public LiveData> getAlbumList() { return albumRepository.getArtistAlbums(artist.getId()); } public LiveData getArtistInfo(String id) { return artistRepository.getArtistFullInfo(id); } public LiveData> getArtistTopSongList() { return artistRepository.getTopSongs(artist.getName(), 20); } public LiveData> getArtistShuffleList() { return artistRepository.getRandomSong(artist, 50); } public LiveData> getArtistInstantMix() { return artistRepository.getInstantMix(artist, 20); } public ArtistID3 getArtist() { return artist; } public void setArtist(ArtistID3 artist) { this.artist = artist; } public void setFavorite(Context context) { if (artist.getStarred() != null) { if (NetworkUtil.isOffline()) { removeFavoriteOffline(); } else { removeFavoriteOnline(); } } else { if (NetworkUtil.isOffline()) { setFavoriteOffline(); } else { setFavoriteOnline(context); } } } 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() { 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(Context context) { favoriteRepository.star(null, null, artist.getId(), new StarCallback() { @Override public void onError() { favoriteRepository.starLater(null, null, artist.getId(), true); } }); artist.setStarred(new Date()); if (Preferences.isStarredArtistsSyncEnabled()) { artistRepository.getArtistAllSongs(artist.getId(), new ArtistRepository.ArtistSongsCallback() { @OptIn(markerClass = UnstableApi.class) @Override public void onSongsCollected(List songs) { if (songs != null && !songs.isEmpty()) { DownloadUtil.getDownloadTracker(context).download( MappingUtil.mapDownloads(songs), songs.stream().map(Download::new).collect(Collectors.toList()) ); } } }); } else { Log.d("ArtistSync", "Artist sync preference is disabled"); } } }