diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/SongHorizontalAdapter.java b/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/SongHorizontalAdapter.java index d5a51cd3..13b502b5 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/SongHorizontalAdapter.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/SongHorizontalAdapter.java @@ -61,9 +61,9 @@ public void onBindViewHolder(ViewHolder holder, int position) { holder.item.searchResultSongSubtitleTextView.setText( holder.itemView.getContext().getString( R.string.song_subtitle_formatter, - this.showAlbum ? - song.getAlbum() : - song.getArtist(), + this.showAlbum ? + song.getAlbum() : + song.getArtist(), MusicUtil.getReadableDurationString(song.getDuration(), false), MusicUtil.getReadableAudioQualityString(song) ) @@ -100,8 +100,8 @@ public void onBindViewHolder(ViewHolder holder, int position) { if (album.getDiscTitles() != null) { Optional discTitle = album.getDiscTitles().stream().filter(title -> Objects.equals(title.getDisc(), songs.get(position).getDiscNumber())).findFirst(); - if (discTitle.isPresent() && discTitle.get().getTitle() != null) { - holder.item.discTitleTextView.setText(holder.itemView.getContext().getString(R.string.disc_titleless, discTitle.get().getTitle())); + if (discTitle.isPresent() && discTitle.get().getDisc() != null && discTitle.get().getTitle() != null && !discTitle.get().getTitle().isEmpty()) { + holder.item.discTitleTextView.setText(holder.itemView.getContext().getString(R.string.disc_titlefull, discTitle.get().getDisc().toString() , discTitle.get().getTitle())); } } } diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java index e5d5b53f..23ff68bd 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java @@ -1,6 +1,8 @@ package com.cappielloantonio.tempo.ui.fragment; import android.content.ComponentName; +import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; @@ -34,7 +36,6 @@ import com.cappielloantonio.tempo.util.MappingUtil; import com.cappielloantonio.tempo.util.MusicUtil; import com.cappielloantonio.tempo.viewmodel.AlbumPageViewModel; -import com.google.android.material.chip.Chip; import com.google.common.util.concurrent.ListenableFuture; import java.util.Collections; @@ -46,9 +47,7 @@ public class AlbumPageFragment extends Fragment implements ClickCallback { private FragmentAlbumPageBinding bind; private MainActivity activity; private AlbumPageViewModel albumPageViewModel; - private SongHorizontalAdapter songHorizontalAdapter; - private ListenableFuture mediaBrowserListenableFuture; @Override @@ -117,7 +116,7 @@ public boolean onOptionsItemSelected(@NonNull MenuItem item) { } private void init() { - albumPageViewModel.setAlbum(requireArguments().getParcelable(Constants.ALBUM_OBJECT)); + albumPageViewModel.setAlbum(getViewLifecycleOwner(), requireArguments().getParcelable(Constants.ALBUM_OBJECT)); } private void initAppBar() { @@ -126,15 +125,20 @@ private void initAppBar() { if (activity.getSupportActionBar() != null) { activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); activity.getSupportActionBar().setDisplayShowHomeEnabled(true); + } - bind.animToolbar.setTitle(albumPageViewModel.getAlbum().getName()); + albumPageViewModel.getAlbum().observe(getViewLifecycleOwner(), album -> { + if (bind != null && album != null) { + bind.animToolbar.setTitle(album.getName()); - bind.albumNameLabel.setText(albumPageViewModel.getAlbum().getName()); - bind.albumArtistLabel.setText(albumPageViewModel.getAlbum().getArtist()); - bind.albumReleaseYearLabel.setText(albumPageViewModel.getAlbum().getYear() != 0 ? String.valueOf(albumPageViewModel.getAlbum().getYear()) : ""); - bind.albumSongCountDurationTextview.setText(getString(R.string.album_page_tracks_count_and_duration, albumPageViewModel.getAlbum().getSongCount(), albumPageViewModel.getAlbum().getDuration() != null ? albumPageViewModel.getAlbum().getDuration() / 60 : 0)); - bind.albumGenresTextview.setText(albumPageViewModel.getAlbum().getGenre()); + bind.albumNameLabel.setText(album.getName()); + bind.albumArtistLabel.setText(album.getArtist()); + bind.albumReleaseYearLabel.setText(album.getYear() != 0 ? String.valueOf(album.getYear()) : ""); + bind.albumSongCountDurationTextview.setText(getString(R.string.album_page_tracks_count_and_duration, album.getSongCount(), album.getDuration() != null ? album.getDuration() / 60 : 0)); + bind.albumGenresTextview.setText(album.getGenre()); + } + }); bind.animToolbar.setNavigationOnClickListener(v -> activity.navController.navigateUp()); @@ -164,8 +168,15 @@ private void initAlbumNotes() { albumPageViewModel.getAlbumInfo().observe(getViewLifecycleOwner(), albumInfo -> { if (albumInfo != null) { if (bind != null) bind.albumNotesTextview.setVisibility(View.VISIBLE); - if (bind != null) - bind.albumNotesTextview.setText(MusicUtil.getReadableString(albumInfo.getNotes())); + if (bind != null) bind.albumNotesTextview.setText(MusicUtil.getReadableString(albumInfo.getNotes())); + + if (bind != null && albumInfo.getLastFmUrl() != null && !albumInfo.getLastFmUrl().isEmpty()) { + bind.albumNotesTextview.setOnClickListener(v -> { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(Uri.parse(albumInfo.getLastFmUrl())); + startActivity(intent); + }); + } } else { if (bind != null) bind.albumNotesTextview.setVisibility(View.GONE); } @@ -195,20 +206,28 @@ private void initMusicButton() { } private void initBackCover() { - CustomGlideRequest.Builder - .from(requireContext(), albumPageViewModel.getAlbum().getCoverArtId(), CustomGlideRequest.ResourceType.Album) - .build() - .into(bind.albumCoverImageView); + albumPageViewModel.getAlbum().observe(getViewLifecycleOwner(), album -> { + if (bind != null && album != null) { + CustomGlideRequest.Builder + .from(requireContext(), album.getCoverArtId(), CustomGlideRequest.ResourceType.Album) + .build() + .into(bind.albumCoverImageView); + } + }); } private void initSongsView() { - bind.songRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); - bind.songRecyclerView.setHasFixedSize(true); + albumPageViewModel.getAlbum().observe(getViewLifecycleOwner(), album -> { + if (bind != null && album != null) { + bind.songRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); + bind.songRecyclerView.setHasFixedSize(true); - songHorizontalAdapter = new SongHorizontalAdapter(this, false, false, albumPageViewModel.getAlbum()); - bind.songRecyclerView.setAdapter(songHorizontalAdapter); + songHorizontalAdapter = new SongHorizontalAdapter(this, false, false, album); + bind.songRecyclerView.setAdapter(songHorizontalAdapter); - albumPageViewModel.getAlbumSongLiveList().observe(getViewLifecycleOwner(), songs -> songHorizontalAdapter.setItems(songs)); + albumPageViewModel.getAlbumSongLiveList().observe(getViewLifecycleOwner(), songs -> songHorizontalAdapter.setItems(songs)); + } + }); } private void initializeMediaBrowser() { diff --git a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/AlbumPageViewModel.java b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/AlbumPageViewModel.java index e5c30894..9bbd5ae1 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/AlbumPageViewModel.java +++ b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/AlbumPageViewModel.java @@ -4,7 +4,9 @@ import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; import com.cappielloantonio.tempo.repository.AlbumRepository; import com.cappielloantonio.tempo.repository.ArtistRepository; @@ -18,8 +20,8 @@ public class AlbumPageViewModel extends AndroidViewModel { private final AlbumRepository albumRepository; private final ArtistRepository artistRepository; - - private AlbumID3 album; + private String albumId; + private final MutableLiveData album = new MutableLiveData<>(null); public AlbumPageViewModel(@NonNull Application application) { super(application); @@ -29,22 +31,27 @@ public AlbumPageViewModel(@NonNull Application application) { } public LiveData> getAlbumSongLiveList() { - return albumRepository.getAlbumTracks(album.getId()); + return albumRepository.getAlbumTracks(albumId); } - public AlbumID3 getAlbum() { + public MutableLiveData getAlbum() { return album; } - public void setAlbum(AlbumID3 album) { - this.album = album; + public void setAlbum(LifecycleOwner owner, AlbumID3 album) { + this.albumId = album.getId(); + this.album.postValue(album); + + albumRepository.getAlbum(album.getId()).observe(owner, albums -> { + if (albums != null) this.album.setValue(album); + }); } public LiveData getArtist() { - return artistRepository.getArtistInfo(album.getArtistId()); + return artistRepository.getArtistInfo(albumId); } public LiveData getAlbumInfo() { - return albumRepository.getAlbumInfo(album.getId()); + return albumRepository.getAlbumInfo(albumId); } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2e8e8f0d..a2ab19e8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -59,6 +59,7 @@ Please be aware that continuing with this action will result in the permanent deletion of all saved items downloaded from all servers. Delete saved items No description available + Disc %1$s - %2$s Disc %1$s Cancel Download