Fixed bottom sheets functionality

This commit is contained in:
CappielloAntonio 2021-07-31 16:37:41 +02:00
parent 320e3b8678
commit 2e1c21e73c
15 changed files with 348 additions and 222 deletions

View file

@ -10,6 +10,10 @@ import androidx.room.Ignore;
import androidx.room.PrimaryKey; import androidx.room.PrimaryKey;
import com.cappielloantonio.play.subsonic.models.AlbumID3; import com.cappielloantonio.play.subsonic.models.AlbumID3;
import com.cappielloantonio.play.subsonic.models.AlbumWithSongsID3;
import com.cappielloantonio.play.util.MappingUtil;
import java.util.List;
public class Album implements Parcelable { public class Album implements Parcelable {
private static final String TAG = "Album"; private static final String TAG = "Album";
@ -27,6 +31,7 @@ public class Album implements Parcelable {
public String primary; public String primary;
public String blurHash; public String blurHash;
public boolean favorite; public boolean favorite;
public List<Song> songs;
public Album(AlbumID3 albumID3) { public Album(AlbumID3 albumID3) {
this.id = albumID3.getId(); this.id = albumID3.getId();
@ -37,6 +42,18 @@ public class Album implements Parcelable {
this.primary = albumID3.getCoverArtId(); this.primary = albumID3.getCoverArtId();
this.favorite = albumID3.getStarred() != null; this.favorite = albumID3.getStarred() != null;
} }
public Album(AlbumWithSongsID3 albumWithSongsID3) {
this.id = albumWithSongsID3.getId();
this.title = albumWithSongsID3.getName();
this.year = albumWithSongsID3.getYear();
this.artistId = albumWithSongsID3.getArtistId();
this.artistName = albumWithSongsID3.getArtist();
this.primary = albumWithSongsID3.getCoverArtId();
this.favorite = albumWithSongsID3.getStarred() != null;
this.songs = MappingUtil.mapSong(albumWithSongsID3.getSongs());
}
public String getId() { public String getId() {
return id; return id;
} }
@ -101,6 +118,14 @@ public class Album implements Parcelable {
this.favorite = favorite; this.favorite = favorite;
} }
public List<Song> getSongs() {
return songs;
}
public void setSongs(List<Song> songs) {
this.songs = songs;
}
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o) return true;

View file

@ -2,13 +2,8 @@ package com.cappielloantonio.play.model;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import android.text.Html;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.Ignore;
import androidx.room.PrimaryKey;
import com.cappielloantonio.play.subsonic.models.ArtistID3; import com.cappielloantonio.play.subsonic.models.ArtistID3;
import com.cappielloantonio.play.subsonic.models.ArtistInfo2; import com.cappielloantonio.play.subsonic.models.ArtistInfo2;
@ -55,6 +50,7 @@ public class Artist implements Parcelable {
this.albumCount = artistWithAlbumsID3.getAlbumCount(); this.albumCount = artistWithAlbumsID3.getAlbumCount();
this.albums = MappingUtil.mapAlbum(artistWithAlbumsID3.getAlbums()); this.albums = MappingUtil.mapAlbum(artistWithAlbumsID3.getAlbums());
this.favorite = artistWithAlbumsID3.getStarred() != null; this.favorite = artistWithAlbumsID3.getStarred() != null;
this.albums = MappingUtil.mapAlbum(artistWithAlbumsID3.getAlbums());
} }
public Artist(ArtistInfo2 artistInfo2) { public Artist(ArtistInfo2 artistInfo2) {

View file

@ -6,7 +6,9 @@ import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import com.cappielloantonio.play.App; import com.cappielloantonio.play.App;
import com.cappielloantonio.play.interfaces.MediaCallback;
import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Album;
import com.cappielloantonio.play.model.Artist;
import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.subsonic.models.ResponseStatus; import com.cappielloantonio.play.subsonic.models.ResponseStatus;
import com.cappielloantonio.play.subsonic.models.SubsonicResponse; import com.cappielloantonio.play.subsonic.models.SubsonicResponse;
@ -198,4 +200,47 @@ public class AlbumRepository {
return artistsAlbum; return artistsAlbum;
} }
public MutableLiveData<Album> getAlbum(String id) {
MutableLiveData<Album> album = new MutableLiveData<>();
App.getSubsonicClientInstance(application, false)
.getBrowsingClient()
.getAlbum(id)
.enqueue(new Callback<SubsonicResponse>() {
@Override
public void onResponse(Call<SubsonicResponse> call, Response<SubsonicResponse> response) {
if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) {
album.setValue(MappingUtil.mapAlbum(response.body().getAlbum()));
}
}
@Override
public void onFailure(Call<SubsonicResponse> call, Throwable t) {
}
});
return album;
}
public void getInstantMix(Album album, int count, MediaCallback callback) {
App.getSubsonicClientInstance(application, false)
.getBrowsingClient()
.getSimilarSongs2(album.getId(), count)
.enqueue(new Callback<SubsonicResponse>() {
@Override
public void onResponse(Call<SubsonicResponse> call, Response<SubsonicResponse> response) {
if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) {
List<Song> songs = new ArrayList<>(MappingUtil.mapSong(response.body().getSimilarSongs2().getSongs()));
callback.onLoadMedia(songs);
}
}
@Override
public void onFailure(Call<SubsonicResponse> call, Throwable t) {
callback.onLoadMedia(new ArrayList<>());
}
});
}
} }

View file

@ -2,12 +2,14 @@ package com.cappielloantonio.play.repository;
import android.app.Application; import android.app.Application;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import com.cappielloantonio.play.App; import com.cappielloantonio.play.App;
import com.cappielloantonio.play.interfaces.MediaCallback;
import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Album;
import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Artist;
import com.cappielloantonio.play.subsonic.models.ArtistWithAlbumsID3; import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.subsonic.models.IndexID3; import com.cappielloantonio.play.subsonic.models.IndexID3;
import com.cappielloantonio.play.subsonic.models.ResponseStatus; import com.cappielloantonio.play.subsonic.models.ResponseStatus;
import com.cappielloantonio.play.subsonic.models.SubsonicResponse; import com.cappielloantonio.play.subsonic.models.SubsonicResponse;
@ -203,6 +205,85 @@ public class ArtistRepository {
}); });
} }
public MutableLiveData<Artist> getArtist(String id) {
MutableLiveData<Artist> artist = new MutableLiveData<>();
App.getSubsonicClientInstance(application, false)
.getBrowsingClient()
.getArtist(id)
.enqueue(new Callback<SubsonicResponse>() {
@Override
public void onResponse(Call<SubsonicResponse> call, Response<SubsonicResponse> response) {
if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) {
artist.setValue(MappingUtil.mapArtist(response.body().getArtist()));
}
}
@Override
public void onFailure(Call<SubsonicResponse> call, Throwable t) {
}
});
return artist;
}
public void getInstantMix(Artist artist, int count, MediaCallback callback) {
App.getSubsonicClientInstance(application, false)
.getBrowsingClient()
.getSimilarSongs2(artist.getId(), count)
.enqueue(new Callback<SubsonicResponse>() {
@Override
public void onResponse(Call<SubsonicResponse> call, Response<SubsonicResponse> response) {
if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) {
List<Song> songs = new ArrayList<>(MappingUtil.mapSong(response.body().getSimilarSongs2().getSongs()));
callback.onLoadMedia(songs);
}
}
@Override
public void onFailure(Call<SubsonicResponse> call, Throwable t) {
callback.onLoadMedia(new ArrayList<>());
}
});
}
public MutableLiveData<ArrayList<Song>> getArtistRandomSong(FragmentActivity fragmentActivity, Artist artist, int count) {
MutableLiveData<ArrayList<Song>> randomSongs = new MutableLiveData<>(new ArrayList());
App.getSubsonicClientInstance(application, false)
.getBrowsingClient()
.getArtist(artist.getId())
.enqueue(new Callback<SubsonicResponse>() {
@Override
public void onResponse(Call<SubsonicResponse> call, Response<SubsonicResponse> response) {
if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) {
List<Album> albums = new ArrayList<>(MappingUtil.mapAlbum(response.body().getArtist().getAlbums()));
if(albums.size() > 0) {
AlbumRepository albumRepository = new AlbumRepository(App.getInstance());
for (int index = 0; index < albums.size(); index++) {
albumRepository.getAlbumTracks(albums.get(index).getId()).observe(fragmentActivity, songs -> {
ArrayList<Song> liveSongs = randomSongs.getValue();
Collections.shuffle(liveSongs);
liveSongs.addAll(songs);
randomSongs.setValue(liveSongs);
});
}
}
}
}
@Override
public void onFailure(Call<SubsonicResponse> call, Throwable t) {
}
});
return randomSongs;
}
private void addToMutableLiveData(MutableLiveData<List<Artist>> liveData, Artist artist) { private void addToMutableLiveData(MutableLiveData<List<Artist>> liveData, Artist artist) {
List<Artist> liveArtists = liveData.getValue(); List<Artist> liveArtists = liveData.getValue();
liveArtists.add(artist); liveArtists.add(artist);

View file

@ -47,32 +47,6 @@ public class QueueRepository {
return songs; return songs;
} }
public void insertAll(List<Song> songs) {
InsertAllThreadSafe insertAll = new InsertAllThreadSafe(queueDao, songs);
Thread thread = new Thread(insertAll);
thread.start();
}
public List<Song> insertMix(ArrayList<Song> media) {
List<String> IDs = QueueUtil.getIDsFromSongs(media);
List<Song> 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<Song> songs) { public void insertAllAndStartNew(List<Song> songs) {
try { try {
final Thread delete = new Thread(new DeleteAllThreadSafe(queueDao)); final Thread delete = new Thread(new DeleteAllThreadSafe(queueDao));

View file

@ -111,7 +111,7 @@ public class SearchingRepository {
} }
public MutableLiveData<List<String>> getSuggestions(String query) { public MutableLiveData<List<String>> getSuggestions(String query) {
MutableLiveData<List<String>> suggestions = new MutableLiveData<>(new ArrayList()); MutableLiveData<List<String>> suggestions = new MutableLiveData<>(new ArrayList());
App.getSubsonicClientInstance(application, false) App.getSubsonicClientInstance(application, false)
.getSearchingClient() .getSearchingClient()
@ -122,15 +122,15 @@ public class SearchingRepository {
List<String> newSuggestions = new ArrayList(); List<String> newSuggestions = new ArrayList();
if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) {
for(ArtistID3 artistID3 : response.body().getSearchResult3().getArtists()) { for (ArtistID3 artistID3 : response.body().getSearchResult3().getArtists()) {
newSuggestions.add(artistID3.getName()); newSuggestions.add(artistID3.getName());
} }
for(AlbumID3 albumID3 : response.body().getSearchResult3().getAlbums()) { for (AlbumID3 albumID3 : response.body().getSearchResult3().getAlbums()) {
newSuggestions.add(albumID3.getName()); newSuggestions.add(albumID3.getName());
} }
for(Child song : response.body().getSearchResult3().getSongs()) { for (Child song : response.body().getSearchResult3().getSongs()) {
newSuggestions.add(song.getTitle()); newSuggestions.add(song.getTitle());
} }

View file

@ -5,6 +5,7 @@ import android.graphics.BlendMode;
import android.graphics.BlendModeColorFilter; import android.graphics.BlendModeColorFilter;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -27,6 +28,7 @@ import com.cappielloantonio.play.databinding.FragmentArtistPageBinding;
import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.interfaces.MediaCallback;
import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Artist;
import com.cappielloantonio.play.repository.ArtistRepository;
import com.cappielloantonio.play.service.MusicPlayerRemote; import com.cappielloantonio.play.service.MusicPlayerRemote;
import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.repository.QueueRepository;
@ -39,6 +41,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class ArtistPageFragment extends Fragment { public class ArtistPageFragment extends Fragment {
private static final String TAG = "ArtistPageFragment";
private FragmentArtistPageBinding bind; private FragmentArtistPageBinding bind;
private MainActivity activity; private MainActivity activity;
@ -125,35 +128,44 @@ public class ArtistPageFragment extends Fragment {
private void initPlayButtons() { private void initPlayButtons() {
bind.artistPageShuffleButton.setOnClickListener(v -> { bind.artistPageShuffleButton.setOnClickListener(v -> {
List<Song> songs = artistPageViewModel.getArtistRandomSongList(); ArtistRepository artistRepository = new ArtistRepository(App.getInstance());
artistRepository.getArtistRandomSong(requireActivity(), artistPageViewModel.getArtist(), 20).observe(requireActivity(), songs -> {
if (songs.size() > 0) {
QueueRepository queueRepository = new QueueRepository(App.getInstance());
queueRepository.insertAllAndStartNew(songs);
if(songs.size() > 0) { MusicPlayerRemote.openQueue(songs, 0, true);
QueueRepository queueRepository = new QueueRepository(App.getInstance()); activity.isBottomSheetInPeek(true);
queueRepository.insertAllAndStartNew(songs); } else {
Toast.makeText(requireContext(), "Error retrieving artist's songs", Toast.LENGTH_SHORT).show();
MusicPlayerRemote.openQueue(songs, 0, true); }
((MainActivity) requireActivity()).isBottomSheetInPeek(true); });
}
else Toast.makeText(requireContext(), "Error retrieving artist's songs", Toast.LENGTH_SHORT).show();
}); });
bind.artistPageRadioButton.setOnClickListener(v -> SyncUtil.getInstantMix(requireContext(), new MediaCallback() { bind.artistPageRadioButton.setOnClickListener(v -> {
@Override ArtistRepository artistRepository = new ArtistRepository(App.getInstance());
public void onError(Exception exception) { artistRepository.getInstantMix(artistPageViewModel.getArtist(), 20, new MediaCallback() {
Toast.makeText(requireContext(), "Error retrieving artist's radio", Toast.LENGTH_SHORT).show(); @Override
} public void onError(Exception exception) {
Log.e(TAG, "onError: " + exception.getMessage());
}
@Override @Override
public void onLoadMedia(List<?> media) { public void onLoadMedia(List<?> media) {
QueueRepository queueRepository = new QueueRepository(App.getInstance()); if (media.size() > 0) {
List<Song> mix = queueRepository.insertMix((ArrayList<Song>) media); QueueRepository queueRepository = new QueueRepository(App.getInstance());
queueRepository.insertAllAndStartNew((ArrayList<Song>) media);
activity.isBottomSheetInPeek(true); activity.isBottomSheetInPeek(true);
activity.setBottomSheetMusicInfo(mix.get(0)); activity.setBottomSheetMusicInfo((Song) media.get(0));
MusicPlayerRemote.openQueue(mix, 0, true); MusicPlayerRemote.openQueue((List<Song>) media, 0, true);
} } else {
}, SyncUtil.SONG, artistPageViewModel.getArtist().getId(), PreferenceUtil.getInstance(requireContext()).getInstantMixSongNumber())); Toast.makeText(requireContext(), "Error retrieving artist's radio", Toast.LENGTH_SHORT).show();
}
}
});
});
} }
private void initTopSongsView() { private void initTopSongsView() {

View file

@ -17,28 +17,28 @@ import androidx.navigation.fragment.NavHostFragment;
import com.cappielloantonio.play.App; import com.cappielloantonio.play.App;
import com.cappielloantonio.play.R; import com.cappielloantonio.play.R;
import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.service.MusicPlayerRemote;
import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.interfaces.MediaCallback;
import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Album;
import com.cappielloantonio.play.model.Artist;
import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.AlbumRepository;
import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.repository.QueueRepository;
import com.cappielloantonio.play.repository.SongRepository; import com.cappielloantonio.play.repository.SongRepository;
import com.cappielloantonio.play.service.MusicPlayerRemote;
import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.ui.activity.MainActivity;
import com.cappielloantonio.play.util.DownloadUtil; import com.cappielloantonio.play.util.DownloadUtil;
import com.cappielloantonio.play.util.PreferenceUtil;
import com.cappielloantonio.play.util.SyncUtil;
import com.cappielloantonio.play.viewmodel.AlbumBottomSheetViewModel; import com.cappielloantonio.play.viewmodel.AlbumBottomSheetViewModel;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener { public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener {
private static final String TAG = "AlbumBottomSheetDialog"; private static final String TAG = "AlbumBottomSheetDialog";
private MainActivity activity;
private AlbumBottomSheetViewModel albumBottomSheetViewModel; private AlbumBottomSheetViewModel albumBottomSheetViewModel;
private SongRepository songRepository;
private Album album; private Album album;
private ImageView coverAlbum; private ImageView coverAlbum;
@ -51,7 +51,6 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements
private TextView playNext; private TextView playNext;
private TextView addToQueue; private TextView addToQueue;
private TextView Download; private TextView Download;
private TextView addToPlaylist;
private TextView goToArtist; private TextView goToArtist;
@Nullable @Nullable
@ -64,14 +63,14 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements
albumBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(AlbumBottomSheetViewModel.class); albumBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(AlbumBottomSheetViewModel.class);
albumBottomSheetViewModel.setAlbum(album); albumBottomSheetViewModel.setAlbum(album);
songRepository = new SongRepository(App.getInstance());
init(view); init(view);
return view; return view;
} }
private void init(View view) { private void init(View view) {
activity = (MainActivity) requireActivity();
coverAlbum = view.findViewById(R.id.album_cover_image_view); coverAlbum = view.findViewById(R.id.album_cover_image_view);
CustomGlideRequest.Builder CustomGlideRequest.Builder
.from(requireContext(), albumBottomSheetViewModel.getAlbum().getPrimary(), albumBottomSheetViewModel.getAlbum().getBlurHash(), CustomGlideRequest.ALBUM_PIC) .from(requireContext(), albumBottomSheetViewModel.getAlbum().getPrimary(), albumBottomSheetViewModel.getAlbum().getBlurHash(), CustomGlideRequest.ALBUM_PIC)
@ -94,79 +93,87 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements
playRadio = view.findViewById(R.id.play_radio_text_view); playRadio = view.findViewById(R.id.play_radio_text_view);
playRadio.setOnClickListener(v -> { playRadio.setOnClickListener(v -> {
SyncUtil.getInstantMix(requireContext(), new MediaCallback() { AlbumRepository albumRepository = new AlbumRepository(App.getInstance());
MainActivity activity = (MainActivity) requireActivity(); albumRepository.getInstantMix(album, 20, new MediaCallback() {
@Override @Override
public void onError(Exception exception) { public void onError(Exception exception) {
Log.e(TAG, "onError: " + exception.getMessage()); Log.e(TAG, "onError: " + exception.getMessage());
dismissBottomSheet();
} }
@Override @Override
public void onLoadMedia(List<?> media) { public void onLoadMedia(List<?> media) {
QueueRepository queueRepository = new QueueRepository(App.getInstance()); if(media.size() > 0) {
List<Song> mix = queueRepository.insertMix((ArrayList<Song>) media); QueueRepository queueRepository = new QueueRepository(App.getInstance());
queueRepository.insertAllAndStartNew((ArrayList<Song>) media);
activity.isBottomSheetInPeek(true); activity.isBottomSheetInPeek(true);
activity.setBottomSheetMusicInfo(mix.get(0)); activity.setBottomSheetMusicInfo((Song) media.get(0));
MusicPlayerRemote.openQueue(mix, 0, true); MusicPlayerRemote.openQueue((List<Song>) media, 0, true);
} else {
Toast.makeText(requireContext(), "Error retrieving album's radio", Toast.LENGTH_SHORT).show();
}
dismissBottomSheet();
} }
}, SyncUtil.SONG, album.getId(), PreferenceUtil.getInstance(requireContext()).getInstantMixSongNumber()); });
dismissBottomSheet();
}); });
playRandom = view.findViewById(R.id.play_random_text_view); playRandom = view.findViewById(R.id.play_random_text_view);
playRandom.setOnClickListener(v -> { playRandom.setOnClickListener(v -> {
// List<Song> songs = songRepository.getAlbumListSong(album.getId(), true); AlbumRepository albumRepository = new AlbumRepository(App.getInstance());
List<Song> songs = new ArrayList<>(); albumRepository.getAlbumTracks(album.getId()).observe(requireActivity(), songs -> {
Collections.shuffle(songs);
QueueRepository queueRepository = new QueueRepository(App.getInstance()); QueueRepository queueRepository = new QueueRepository(App.getInstance());
queueRepository.insertAllAndStartNew(songs); queueRepository.insertAllAndStartNew(songs);
MusicPlayerRemote.openQueue(songs, 0, true); MusicPlayerRemote.openQueue(songs, 0, true);
((MainActivity) requireActivity()).isBottomSheetInPeek(true); activity.isBottomSheetInPeek(true);
dismissBottomSheet();
dismissBottomSheet();
});
}); });
playNext = view.findViewById(R.id.play_next_text_view); playNext = view.findViewById(R.id.play_next_text_view);
playNext.setOnClickListener(v -> { playNext.setOnClickListener(v -> {
// MusicPlayerRemote.playNext(songRepository.getAlbumListSong(album.getId(), false)); albumBottomSheetViewModel.getAlbumTracks().observe(requireActivity(), songs -> {
((MainActivity) requireActivity()).isBottomSheetInPeek(true); MusicPlayerRemote.playNext(songs);
dismissBottomSheet(); activity.isBottomSheetInPeek(true);
dismissBottomSheet();
});
}); });
addToQueue = view.findViewById(R.id.add_to_queue_text_view); addToQueue = view.findViewById(R.id.add_to_queue_text_view);
addToQueue.setOnClickListener(v -> { addToQueue.setOnClickListener(v -> {
// MusicPlayerRemote.enqueue(songRepository.getAlbumListSong(album.getId(), false)); albumBottomSheetViewModel.getAlbumTracks().observe(requireActivity(), songs -> {
dismissBottomSheet(); MusicPlayerRemote.enqueue(songs);
dismissBottomSheet();
});
}); });
Download = view.findViewById(R.id.download_text_view); Download = view.findViewById(R.id.download_text_view);
Download.setOnClickListener(v -> { Download.setOnClickListener(v -> {
// List<Song> songs = songRepository.getAlbumListSong(album.getId(), false); albumBottomSheetViewModel.getAlbumTracks().observe(requireActivity(), songs -> {
// DownloadUtil.getDownloadTracker(requireContext()).toggleDownload(songs); DownloadUtil.getDownloadTracker(requireContext()).toggleDownload(songs);
dismissBottomSheet(); dismissBottomSheet();
}); });
addToPlaylist = view.findViewById(R.id.add_to_playlist_text_view);
addToPlaylist.setOnClickListener(v -> {
Toast.makeText(requireContext(), "Add to playlist", Toast.LENGTH_SHORT).show();
dismissBottomSheet();
}); });
goToArtist = view.findViewById(R.id.go_to_artist_text_view); goToArtist = view.findViewById(R.id.go_to_artist_text_view);
goToArtist.setOnClickListener(v -> { goToArtist.setOnClickListener(v -> {
Artist artist = albumBottomSheetViewModel.getArtist(); albumBottomSheetViewModel.getArtist().observe(requireActivity(), artist -> {
if(artist != null) { if (artist != null) {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putParcelable("artist_object", artist); bundle.putParcelable("artist_object", artist);
NavHostFragment.findNavController(this).navigate(R.id.artistPageFragment, bundle); NavHostFragment.findNavController(this).navigate(R.id.artistPageFragment, bundle);
} } else
else Toast.makeText(requireContext(), "Error retrieving artist", Toast.LENGTH_SHORT).show(); Toast.makeText(requireContext(), "Error retrieving artist", Toast.LENGTH_SHORT).show();
dismissBottomSheet(); dismissBottomSheet();
});
}); });
} }

View file

@ -16,15 +16,13 @@ import androidx.lifecycle.ViewModelProvider;
import com.cappielloantonio.play.App; import com.cappielloantonio.play.App;
import com.cappielloantonio.play.R; import com.cappielloantonio.play.R;
import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.service.MusicPlayerRemote;
import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.interfaces.MediaCallback;
import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Artist;
import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.ArtistRepository;
import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.repository.QueueRepository;
import com.cappielloantonio.play.repository.SongRepository; import com.cappielloantonio.play.service.MusicPlayerRemote;
import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.ui.activity.MainActivity;
import com.cappielloantonio.play.util.PreferenceUtil;
import com.cappielloantonio.play.util.SyncUtil;
import com.cappielloantonio.play.viewmodel.ArtistBottomSheetViewModel; import com.cappielloantonio.play.viewmodel.ArtistBottomSheetViewModel;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
@ -34,8 +32,9 @@ import java.util.List;
public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener { public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener {
private static final String TAG = "AlbumBottomSheetDialog"; private static final String TAG = "AlbumBottomSheetDialog";
private MainActivity activity;
private ArtistBottomSheetViewModel artistBottomSheetViewModel; private ArtistBottomSheetViewModel artistBottomSheetViewModel;
private SongRepository songRepository;
private Artist artist; private Artist artist;
private ImageView coverArtist; private ImageView coverArtist;
@ -55,14 +54,14 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement
artistBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(ArtistBottomSheetViewModel.class); artistBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(ArtistBottomSheetViewModel.class);
artistBottomSheetViewModel.setArtist(artist); artistBottomSheetViewModel.setArtist(artist);
songRepository = new SongRepository(App.getInstance());
init(view); init(view);
return view; return view;
} }
private void init(View view) { private void init(View view) {
activity = (MainActivity) requireActivity();
coverArtist = view.findViewById(R.id.artist_cover_image_view); coverArtist = view.findViewById(R.id.artist_cover_image_view);
CustomGlideRequest.Builder CustomGlideRequest.Builder
.from(requireContext(), artistBottomSheetViewModel.getArtist().getPrimary(), artistBottomSheetViewModel.getArtist().getPrimaryBlurHash(), CustomGlideRequest.ARTIST_PIC) .from(requireContext(), artistBottomSheetViewModel.getArtist().getPrimary(), artistBottomSheetViewModel.getArtist().getPrimaryBlurHash(), CustomGlideRequest.ARTIST_PIC)
@ -82,43 +81,50 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement
playRadio = view.findViewById(R.id.play_radio_text_view); playRadio = view.findViewById(R.id.play_radio_text_view);
playRadio.setOnClickListener(v -> { playRadio.setOnClickListener(v -> {
SyncUtil.getInstantMix(requireContext(), new MediaCallback() { ArtistRepository artistRepository = new ArtistRepository(App.getInstance());
MainActivity activity = (MainActivity) requireActivity(); artistRepository.getInstantMix(artist, 20, new MediaCallback() {
@Override @Override
public void onError(Exception exception) { public void onError(Exception exception) {
Log.e(TAG, "onError: " + exception.getMessage()); Log.e(TAG, "onError: " + exception.getMessage());
dismissBottomSheet();
} }
@Override @Override
public void onLoadMedia(List<?> media) { public void onLoadMedia(List<?> media) {
QueueRepository queueRepository = new QueueRepository(App.getInstance()); if (media.size() > 0) {
List<Song> mix = queueRepository.insertMix((ArrayList<Song>) media); QueueRepository queueRepository = new QueueRepository(App.getInstance());
queueRepository.insertAllAndStartNew((ArrayList<Song>) media);
activity.isBottomSheetInPeek(true); activity.isBottomSheetInPeek(true);
activity.setBottomSheetMusicInfo(mix.get(0)); activity.setBottomSheetMusicInfo((Song) media.get(0));
MusicPlayerRemote.openQueue(mix, 0, true); MusicPlayerRemote.openQueue((List<Song>) media, 0, true);
} else {
Toast.makeText(requireContext(), "Error retrieving artist's radio", Toast.LENGTH_SHORT).show();
}
dismissBottomSheet();
} }
}, SyncUtil.SONG, artist.getId(), PreferenceUtil.getInstance(requireContext()).getInstantMixSongNumber()); });
dismissBottomSheet();
}); });
playRandom = view.findViewById(R.id.play_random_text_view); playRandom = view.findViewById(R.id.play_random_text_view);
playRandom.setOnClickListener(v -> { playRandom.setOnClickListener(v -> {
// List<Song> songs = songRepository.getArtistListLiveRandomSong(artist.getId()); ArtistRepository artistRepository = new ArtistRepository(App.getInstance());
List<Song> songs = new ArrayList<>(); artistRepository.getArtistRandomSong(requireActivity(), artist, 20).observe(requireActivity(), songs -> {
if (songs.size() > 0) {
QueueRepository queueRepository = new QueueRepository(App.getInstance());
queueRepository.insertAllAndStartNew(songs);
if(songs.size() > 0) { MusicPlayerRemote.openQueue(songs, 0, true);
QueueRepository queueRepository = new QueueRepository(App.getInstance()); activity.isBottomSheetInPeek(true);
queueRepository.insertAllAndStartNew(songs); } else {
Toast.makeText(requireContext(), "Error retrieving artist's songs", Toast.LENGTH_SHORT).show();
}
MusicPlayerRemote.openQueue(songs, 0, true);
((MainActivity) requireActivity()).isBottomSheetInPeek(true);
dismissBottomSheet(); dismissBottomSheet();
} });
else Toast.makeText(requireContext(), "Error retrieving artist's songs", Toast.LENGTH_SHORT).show();
}); });
} }

View file

@ -17,16 +17,13 @@ import androidx.navigation.fragment.NavHostFragment;
import com.cappielloantonio.play.App; import com.cappielloantonio.play.App;
import com.cappielloantonio.play.R; import com.cappielloantonio.play.R;
import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.service.MusicPlayerRemote;
import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.interfaces.MediaCallback;
import com.cappielloantonio.play.model.Album;
import com.cappielloantonio.play.model.Artist;
import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.repository.QueueRepository;
import com.cappielloantonio.play.repository.SongRepository;
import com.cappielloantonio.play.service.MusicPlayerRemote;
import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.ui.activity.MainActivity;
import com.cappielloantonio.play.util.DownloadUtil; import com.cappielloantonio.play.util.DownloadUtil;
import com.cappielloantonio.play.util.PreferenceUtil;
import com.cappielloantonio.play.util.SyncUtil;
import com.cappielloantonio.play.viewmodel.SongBottomSheetViewModel; import com.cappielloantonio.play.viewmodel.SongBottomSheetViewModel;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
@ -49,7 +46,6 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements
private TextView playNext; private TextView playNext;
private TextView addToQueue; private TextView addToQueue;
private TextView download; private TextView download;
private TextView addToPlaylist;
private TextView goToAlbum; private TextView goToAlbum;
private TextView goToArtist; private TextView goToArtist;
@ -92,9 +88,18 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements
playRadio = view.findViewById(R.id.play_radio_text_view); playRadio = view.findViewById(R.id.play_radio_text_view);
playRadio.setOnClickListener(v -> { playRadio.setOnClickListener(v -> {
SyncUtil.getInstantMix(requireContext(), new MediaCallback() { List<Song> opener = new ArrayList<>();
MainActivity activity = (MainActivity) requireActivity(); opener.add(song);
MusicPlayerRemote.openQueue(opener, 0, true);
QueueRepository queueRepository = new QueueRepository(App.getInstance());
queueRepository.insertAllAndStartNew(opener);
((MainActivity) requireActivity()).isBottomSheetInPeek(true);
((MainActivity) requireActivity()).setBottomSheetMusicInfo(song);
SongRepository songRepository = new SongRepository(App.getInstance());
songRepository.getInstantMix(song, 20, new MediaCallback() {
@Override @Override
public void onError(Exception exception) { public void onError(Exception exception) {
Log.e(TAG, "onError: " + exception.getMessage()); Log.e(TAG, "onError: " + exception.getMessage());
@ -102,15 +107,9 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements
@Override @Override
public void onLoadMedia(List<?> media) { public void onLoadMedia(List<?> media) {
QueueRepository queueRepository = new QueueRepository(App.getInstance()); MusicPlayerRemote.enqueue((List<Song>) media);
List<Song> mix = queueRepository.insertMix((ArrayList<Song>) media);
activity.isBottomSheetInPeek(true);
activity.setBottomSheetMusicInfo(mix.get(0));
MusicPlayerRemote.openQueue(mix, 0, true);
} }
}, SyncUtil.SONG, song.getId(), PreferenceUtil.getInstance(requireContext()).getInstantMixSongNumber()); });
dismissBottomSheet(); dismissBottomSheet();
}); });
@ -135,37 +134,32 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements
dismissBottomSheet(); dismissBottomSheet();
}); });
addToPlaylist = view.findViewById(R.id.add_to_playlist_text_view);
addToPlaylist.setOnClickListener(v -> {
Toast.makeText(requireContext(), "Add to playlist", Toast.LENGTH_SHORT).show();
dismissBottomSheet();
});
goToAlbum = view.findViewById(R.id.go_to_album_text_view); goToAlbum = view.findViewById(R.id.go_to_album_text_view);
goToAlbum.setOnClickListener(v -> { goToAlbum.setOnClickListener(v -> {
Album album = songBottomSheetViewModel.getAlbum(); songBottomSheetViewModel.getAlbum().observe(requireActivity(), album -> {
if (album != null) {
Bundle bundle = new Bundle();
bundle.putParcelable("album_object", album);
NavHostFragment.findNavController(this).navigate(R.id.albumPageFragment, bundle);
} else
Toast.makeText(requireContext(), "Error retrieving album", Toast.LENGTH_SHORT).show();
if(album != null) { dismissBottomSheet();
Bundle bundle = new Bundle(); });
bundle.putParcelable("album_object", album);
NavHostFragment.findNavController(this).navigate(R.id.albumPageFragment, bundle);
}
else Toast.makeText(requireContext(), "Error retrieving album", Toast.LENGTH_SHORT).show();
dismissBottomSheet();
}); });
goToArtist = view.findViewById(R.id.go_to_artist_text_view); goToArtist = view.findViewById(R.id.go_to_artist_text_view);
goToArtist.setOnClickListener(v -> { goToArtist.setOnClickListener(v -> {
Artist artist = songBottomSheetViewModel.getArtist(); songBottomSheetViewModel.getArtist().observe(requireActivity(), artist -> {
if(artist != null) { if (artist != null) {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putParcelable("artist_object", artist); bundle.putParcelable("artist_object", artist);
NavHostFragment.findNavController(this).navigate(R.id.artistPageFragment, bundle); NavHostFragment.findNavController(this).navigate(R.id.artistPageFragment, bundle);
} } else
else Toast.makeText(requireContext(), "Error retrieving artist", Toast.LENGTH_SHORT).show(); Toast.makeText(requireContext(), "Error retrieving artist", Toast.LENGTH_SHORT).show();
dismissBottomSheet(); dismissBottomSheet();
});
}); });
} }

View file

@ -7,11 +7,11 @@ import com.cappielloantonio.play.model.Playlist;
import com.cappielloantonio.play.model.Queue; import com.cappielloantonio.play.model.Queue;
import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.subsonic.models.AlbumID3; import com.cappielloantonio.play.subsonic.models.AlbumID3;
import com.cappielloantonio.play.subsonic.models.AlbumWithSongsID3;
import com.cappielloantonio.play.subsonic.models.ArtistID3; import com.cappielloantonio.play.subsonic.models.ArtistID3;
import com.cappielloantonio.play.subsonic.models.ArtistInfo2; import com.cappielloantonio.play.subsonic.models.ArtistInfo2;
import com.cappielloantonio.play.subsonic.models.ArtistWithAlbumsID3; import com.cappielloantonio.play.subsonic.models.ArtistWithAlbumsID3;
import com.cappielloantonio.play.subsonic.models.Child; import com.cappielloantonio.play.subsonic.models.Child;
import com.cappielloantonio.play.subsonic.models.Playlists;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -20,7 +20,7 @@ public class MappingUtil {
public static ArrayList<Song> mapSong(List<Child> children) { public static ArrayList<Song> mapSong(List<Child> children) {
ArrayList<Song> songs = new ArrayList(); ArrayList<Song> songs = new ArrayList();
for(Child child : children){ for (Child child : children) {
songs.add(new Song(child)); songs.add(new Song(child));
} }
@ -30,17 +30,21 @@ public class MappingUtil {
public static ArrayList<Album> mapAlbum(List<AlbumID3> albumID3List) { public static ArrayList<Album> mapAlbum(List<AlbumID3> albumID3List) {
ArrayList<Album> albums = new ArrayList(); ArrayList<Album> albums = new ArrayList();
for(AlbumID3 albumID3 : albumID3List){ for (AlbumID3 albumID3 : albumID3List) {
albums.add(new Album(albumID3)); albums.add(new Album(albumID3));
} }
return albums; return albums;
} }
public static Album mapAlbum(AlbumWithSongsID3 albumWithSongsID3) {
return new Album(albumWithSongsID3);
}
public static ArrayList<Artist> mapArtist(List<ArtistID3> artistID3List) { public static ArrayList<Artist> mapArtist(List<ArtistID3> artistID3List) {
ArrayList<Artist> artists = new ArrayList(); ArrayList<Artist> artists = new ArrayList();
for(ArtistID3 artistID3 : artistID3List){ for (ArtistID3 artistID3 : artistID3List) {
artists.add(new Artist(artistID3)); artists.add(new Artist(artistID3));
} }
@ -51,6 +55,10 @@ public class MappingUtil {
return new Artist(artistInfo2); return new Artist(artistInfo2);
} }
public static Artist mapArtist(ArtistWithAlbumsID3 artistWithAlbumsID3) {
return new Artist(artistWithAlbumsID3);
}
public static Artist mapArtistWithAlbum(ArtistWithAlbumsID3 artistWithAlbumsID3) { public static Artist mapArtistWithAlbum(ArtistWithAlbumsID3 artistWithAlbumsID3) {
return new Artist(artistWithAlbumsID3); return new Artist(artistWithAlbumsID3);
} }
@ -58,7 +66,7 @@ public class MappingUtil {
public static ArrayList<Song> mapQueue(List<Queue> queueList) { public static ArrayList<Song> mapQueue(List<Queue> queueList) {
ArrayList<Song> songs = new ArrayList(); ArrayList<Song> songs = new ArrayList();
for(Queue item : queueList){ for (Queue item : queueList) {
songs.add(new Song(item)); songs.add(new Song(item));
} }
@ -68,7 +76,7 @@ public class MappingUtil {
public static ArrayList<Playlist> mapPlaylist(List<com.cappielloantonio.play.subsonic.models.Playlist> playlists) { public static ArrayList<Playlist> mapPlaylist(List<com.cappielloantonio.play.subsonic.models.Playlist> playlists) {
ArrayList<Playlist> playlist = new ArrayList(); ArrayList<Playlist> playlist = new ArrayList();
for(com.cappielloantonio.play.subsonic.models.Playlist item : playlists){ for (com.cappielloantonio.play.subsonic.models.Playlist item : playlists) {
playlist.add(new Playlist(item)); playlist.add(new Playlist(item));
} }
@ -78,7 +86,7 @@ public class MappingUtil {
public static ArrayList<Song> mapDownload(List<Download> downloads) { public static ArrayList<Song> mapDownload(List<Download> downloads) {
ArrayList<Song> songs = new ArrayList(); ArrayList<Song> songs = new ArrayList();
for(Download download : downloads){ for (Download download : downloads) {
songs.add(new Song(download)); songs.add(new Song(download));
} }
@ -88,7 +96,7 @@ public class MappingUtil {
public static ArrayList<Download> mapToDownload(List<Song> songs) { public static ArrayList<Download> mapToDownload(List<Song> songs) {
ArrayList<Download> downloads = new ArrayList(); ArrayList<Download> downloads = new ArrayList();
for(Song song : songs){ for (Song song : songs) {
downloads.add(new Download(song)); downloads.add(new Download(song));
} }

View file

@ -4,12 +4,19 @@ import android.app.Application;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Album;
import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Artist;
import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.AlbumRepository;
import com.cappielloantonio.play.repository.ArtistRepository; import com.cappielloantonio.play.repository.ArtistRepository;
import java.util.List;
public class AlbumBottomSheetViewModel extends AndroidViewModel { public class AlbumBottomSheetViewModel extends AndroidViewModel {
private AlbumRepository albumRepository;
private ArtistRepository artistRepository; private ArtistRepository artistRepository;
private Album album; private Album album;
@ -17,6 +24,7 @@ public class AlbumBottomSheetViewModel extends AndroidViewModel {
public AlbumBottomSheetViewModel(@NonNull Application application) { public AlbumBottomSheetViewModel(@NonNull Application application) {
super(application); super(application);
albumRepository = new AlbumRepository(application);
artistRepository = new ArtistRepository(application); artistRepository = new ArtistRepository(application);
} }
@ -28,9 +36,12 @@ public class AlbumBottomSheetViewModel extends AndroidViewModel {
this.album = album; this.album = album;
} }
public Artist getArtist() { public LiveData<Artist> getArtist() {
// return artistRepository.getArtistByID(album.getArtistId()); return artistRepository.getArtist(album.getArtistId());
return null; }
public MutableLiveData<List<Song>> getAlbumTracks() {
return albumRepository.getAlbumTracks(album.getId());
} }
public void setFavorite() { public void setFavorite() {

View file

@ -4,6 +4,7 @@ import android.app.Application;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Album;
import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Artist;
@ -45,13 +46,11 @@ public class SongBottomSheetViewModel extends AndroidViewModel {
} }
} }
public Album getAlbum() { public LiveData<Album> getAlbum() {
// return albumRepository.getAlbumByID(song.getAlbumId()); return albumRepository.getAlbum(song.getAlbumId());
return null;
} }
public Artist getArtist() { public LiveData<Artist> getArtist() {
// return artistRepository.getArtistByID(song.getArtistId()); return artistRepository.getArtist(song.getArtistId());
return null;
} }
} }

View file

@ -167,22 +167,6 @@
android:textFontWeight="700" android:textFontWeight="700"
android:textSize="14sp" /> android:textSize="14sp" />
<TextView
android:id="@+id/add_to_playlist_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:fontFamily="@font/opensans"
android:paddingStart="20dp"
android:paddingTop="12dp"
android:paddingEnd="20dp"
android:paddingBottom="12dp"
android:text="Aggiungi alla playlist"
android:textColor="@color/titleTextColor"
android:textFontWeight="700"
android:textSize="14sp" />
<TextView <TextView
android:id="@+id/go_to_artist_text_view" android:id="@+id/go_to_artist_text_view"
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -152,22 +152,6 @@
android:textFontWeight="700" android:textFontWeight="700"
android:textSize="14sp" /> android:textSize="14sp" />
<TextView
android:id="@+id/add_to_playlist_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:fontFamily="@font/opensans"
android:paddingStart="20dp"
android:paddingTop="12dp"
android:paddingEnd="20dp"
android:paddingBottom="12dp"
android:text="Aggiungi alla playlist"
android:textColor="@color/titleTextColor"
android:textFontWeight="700"
android:textSize="14sp" />
<TextView <TextView
android:id="@+id/go_to_album_text_view" android:id="@+id/go_to_album_text_view"
android:layout_width="match_parent" android:layout_width="match_parent"