mirror of
https://github.com/antebudimir/tempus.git
synced 2025-12-31 17:43:32 +00:00
feat: Added API call to retrieve AlbumID3 details in album page as the object passed from search and album list are different
This commit is contained in:
parent
a67571ee4f
commit
2c3aebc83b
4 changed files with 61 additions and 34 deletions
|
|
@ -61,9 +61,9 @@ public class SongHorizontalAdapter extends RecyclerView.Adapter<SongHorizontalAd
|
||||||
holder.item.searchResultSongSubtitleTextView.setText(
|
holder.item.searchResultSongSubtitleTextView.setText(
|
||||||
holder.itemView.getContext().getString(
|
holder.itemView.getContext().getString(
|
||||||
R.string.song_subtitle_formatter,
|
R.string.song_subtitle_formatter,
|
||||||
this.showAlbum ?
|
this.showAlbum ?
|
||||||
song.getAlbum() :
|
song.getAlbum() :
|
||||||
song.getArtist(),
|
song.getArtist(),
|
||||||
MusicUtil.getReadableDurationString(song.getDuration(), false),
|
MusicUtil.getReadableDurationString(song.getDuration(), false),
|
||||||
MusicUtil.getReadableAudioQualityString(song)
|
MusicUtil.getReadableAudioQualityString(song)
|
||||||
)
|
)
|
||||||
|
|
@ -100,8 +100,8 @@ public class SongHorizontalAdapter extends RecyclerView.Adapter<SongHorizontalAd
|
||||||
if (album.getDiscTitles() != null) {
|
if (album.getDiscTitles() != null) {
|
||||||
Optional<DiscTitle> discTitle = album.getDiscTitles().stream().filter(title -> Objects.equals(title.getDisc(), songs.get(position).getDiscNumber())).findFirst();
|
Optional<DiscTitle> discTitle = album.getDiscTitles().stream().filter(title -> Objects.equals(title.getDisc(), songs.get(position).getDiscNumber())).findFirst();
|
||||||
|
|
||||||
if (discTitle.isPresent() && discTitle.get().getTitle() != null) {
|
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_titleless, discTitle.get().getTitle()));
|
holder.item.discTitleTextView.setText(holder.itemView.getContext().getString(R.string.disc_titlefull, discTitle.get().getDisc().toString() , discTitle.get().getTitle()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
package com.cappielloantonio.tempo.ui.fragment;
|
package com.cappielloantonio.tempo.ui.fragment;
|
||||||
|
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
|
|
@ -34,7 +36,6 @@ import com.cappielloantonio.tempo.util.DownloadUtil;
|
||||||
import com.cappielloantonio.tempo.util.MappingUtil;
|
import com.cappielloantonio.tempo.util.MappingUtil;
|
||||||
import com.cappielloantonio.tempo.util.MusicUtil;
|
import com.cappielloantonio.tempo.util.MusicUtil;
|
||||||
import com.cappielloantonio.tempo.viewmodel.AlbumPageViewModel;
|
import com.cappielloantonio.tempo.viewmodel.AlbumPageViewModel;
|
||||||
import com.google.android.material.chip.Chip;
|
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
@ -46,9 +47,7 @@ public class AlbumPageFragment extends Fragment implements ClickCallback {
|
||||||
private FragmentAlbumPageBinding bind;
|
private FragmentAlbumPageBinding bind;
|
||||||
private MainActivity activity;
|
private MainActivity activity;
|
||||||
private AlbumPageViewModel albumPageViewModel;
|
private AlbumPageViewModel albumPageViewModel;
|
||||||
|
|
||||||
private SongHorizontalAdapter songHorizontalAdapter;
|
private SongHorizontalAdapter songHorizontalAdapter;
|
||||||
|
|
||||||
private ListenableFuture<MediaBrowser> mediaBrowserListenableFuture;
|
private ListenableFuture<MediaBrowser> mediaBrowserListenableFuture;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -117,7 +116,7 @@ public class AlbumPageFragment extends Fragment implements ClickCallback {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void init() {
|
private void init() {
|
||||||
albumPageViewModel.setAlbum(requireArguments().getParcelable(Constants.ALBUM_OBJECT));
|
albumPageViewModel.setAlbum(getViewLifecycleOwner(), requireArguments().getParcelable(Constants.ALBUM_OBJECT));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initAppBar() {
|
private void initAppBar() {
|
||||||
|
|
@ -126,15 +125,20 @@ public class AlbumPageFragment extends Fragment implements ClickCallback {
|
||||||
if (activity.getSupportActionBar() != null) {
|
if (activity.getSupportActionBar() != null) {
|
||||||
activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
activity.getSupportActionBar().setDisplayShowHomeEnabled(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.albumNameLabel.setText(album.getName());
|
||||||
bind.albumArtistLabel.setText(albumPageViewModel.getAlbum().getArtist());
|
bind.albumArtistLabel.setText(album.getArtist());
|
||||||
bind.albumReleaseYearLabel.setText(albumPageViewModel.getAlbum().getYear() != 0 ? String.valueOf(albumPageViewModel.getAlbum().getYear()) : "");
|
bind.albumReleaseYearLabel.setText(album.getYear() != 0 ? String.valueOf(album.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.albumSongCountDurationTextview.setText(getString(R.string.album_page_tracks_count_and_duration, album.getSongCount(), album.getDuration() != null ? album.getDuration() / 60 : 0));
|
||||||
bind.albumGenresTextview.setText(albumPageViewModel.getAlbum().getGenre());
|
bind.albumGenresTextview.setText(album.getGenre());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
bind.animToolbar.setNavigationOnClickListener(v -> activity.navController.navigateUp());
|
bind.animToolbar.setNavigationOnClickListener(v -> activity.navController.navigateUp());
|
||||||
|
|
||||||
|
|
@ -164,8 +168,15 @@ public class AlbumPageFragment extends Fragment implements ClickCallback {
|
||||||
albumPageViewModel.getAlbumInfo().observe(getViewLifecycleOwner(), albumInfo -> {
|
albumPageViewModel.getAlbumInfo().observe(getViewLifecycleOwner(), albumInfo -> {
|
||||||
if (albumInfo != null) {
|
if (albumInfo != null) {
|
||||||
if (bind != null) bind.albumNotesTextview.setVisibility(View.VISIBLE);
|
if (bind != null) bind.albumNotesTextview.setVisibility(View.VISIBLE);
|
||||||
if (bind != null)
|
if (bind != null) bind.albumNotesTextview.setText(MusicUtil.getReadableString(albumInfo.getNotes()));
|
||||||
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 {
|
} else {
|
||||||
if (bind != null) bind.albumNotesTextview.setVisibility(View.GONE);
|
if (bind != null) bind.albumNotesTextview.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
@ -195,20 +206,28 @@ public class AlbumPageFragment extends Fragment implements ClickCallback {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initBackCover() {
|
private void initBackCover() {
|
||||||
CustomGlideRequest.Builder
|
albumPageViewModel.getAlbum().observe(getViewLifecycleOwner(), album -> {
|
||||||
.from(requireContext(), albumPageViewModel.getAlbum().getCoverArtId(), CustomGlideRequest.ResourceType.Album)
|
if (bind != null && album != null) {
|
||||||
.build()
|
CustomGlideRequest.Builder
|
||||||
.into(bind.albumCoverImageView);
|
.from(requireContext(), album.getCoverArtId(), CustomGlideRequest.ResourceType.Album)
|
||||||
|
.build()
|
||||||
|
.into(bind.albumCoverImageView);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initSongsView() {
|
private void initSongsView() {
|
||||||
bind.songRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
|
albumPageViewModel.getAlbum().observe(getViewLifecycleOwner(), album -> {
|
||||||
bind.songRecyclerView.setHasFixedSize(true);
|
if (bind != null && album != null) {
|
||||||
|
bind.songRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
|
||||||
|
bind.songRecyclerView.setHasFixedSize(true);
|
||||||
|
|
||||||
songHorizontalAdapter = new SongHorizontalAdapter(this, false, false, albumPageViewModel.getAlbum());
|
songHorizontalAdapter = new SongHorizontalAdapter(this, false, false, album);
|
||||||
bind.songRecyclerView.setAdapter(songHorizontalAdapter);
|
bind.songRecyclerView.setAdapter(songHorizontalAdapter);
|
||||||
|
|
||||||
albumPageViewModel.getAlbumSongLiveList().observe(getViewLifecycleOwner(), songs -> songHorizontalAdapter.setItems(songs));
|
albumPageViewModel.getAlbumSongLiveList().observe(getViewLifecycleOwner(), songs -> songHorizontalAdapter.setItems(songs));
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initializeMediaBrowser() {
|
private void initializeMediaBrowser() {
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,9 @@ import android.app.Application;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.lifecycle.AndroidViewModel;
|
import androidx.lifecycle.AndroidViewModel;
|
||||||
|
import androidx.lifecycle.LifecycleOwner;
|
||||||
import androidx.lifecycle.LiveData;
|
import androidx.lifecycle.LiveData;
|
||||||
|
import androidx.lifecycle.MutableLiveData;
|
||||||
|
|
||||||
import com.cappielloantonio.tempo.repository.AlbumRepository;
|
import com.cappielloantonio.tempo.repository.AlbumRepository;
|
||||||
import com.cappielloantonio.tempo.repository.ArtistRepository;
|
import com.cappielloantonio.tempo.repository.ArtistRepository;
|
||||||
|
|
@ -18,8 +20,8 @@ import java.util.List;
|
||||||
public class AlbumPageViewModel extends AndroidViewModel {
|
public class AlbumPageViewModel extends AndroidViewModel {
|
||||||
private final AlbumRepository albumRepository;
|
private final AlbumRepository albumRepository;
|
||||||
private final ArtistRepository artistRepository;
|
private final ArtistRepository artistRepository;
|
||||||
|
private String albumId;
|
||||||
private AlbumID3 album;
|
private final MutableLiveData<AlbumID3> album = new MutableLiveData<>(null);
|
||||||
|
|
||||||
public AlbumPageViewModel(@NonNull Application application) {
|
public AlbumPageViewModel(@NonNull Application application) {
|
||||||
super(application);
|
super(application);
|
||||||
|
|
@ -29,22 +31,27 @@ public class AlbumPageViewModel extends AndroidViewModel {
|
||||||
}
|
}
|
||||||
|
|
||||||
public LiveData<List<Child>> getAlbumSongLiveList() {
|
public LiveData<List<Child>> getAlbumSongLiveList() {
|
||||||
return albumRepository.getAlbumTracks(album.getId());
|
return albumRepository.getAlbumTracks(albumId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AlbumID3 getAlbum() {
|
public MutableLiveData<AlbumID3> getAlbum() {
|
||||||
return album;
|
return album;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAlbum(AlbumID3 album) {
|
public void setAlbum(LifecycleOwner owner, AlbumID3 album) {
|
||||||
this.album = 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<ArtistID3> getArtist() {
|
public LiveData<ArtistID3> getArtist() {
|
||||||
return artistRepository.getArtistInfo(album.getArtistId());
|
return artistRepository.getArtistInfo(albumId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public LiveData<AlbumInfo> getAlbumInfo() {
|
public LiveData<AlbumInfo> getAlbumInfo() {
|
||||||
return albumRepository.getAlbumInfo(album.getId());
|
return albumRepository.getAlbumInfo(albumId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,7 @@
|
||||||
<string name="delete_download_storage_dialog_summary">Please be aware that continuing with this action will result in the permanent deletion of all saved items downloaded from all servers.</string>
|
<string name="delete_download_storage_dialog_summary">Please be aware that continuing with this action will result in the permanent deletion of all saved items downloaded from all servers.</string>
|
||||||
<string name="delete_download_storage_dialog_title">Delete saved items</string>
|
<string name="delete_download_storage_dialog_title">Delete saved items</string>
|
||||||
<string name="description_empty_title">No description available</string>
|
<string name="description_empty_title">No description available</string>
|
||||||
|
<string name="disc_titlefull">Disc %1$s - %2$s</string>
|
||||||
<string name="disc_titleless">Disc %1$s</string>
|
<string name="disc_titleless">Disc %1$s</string>
|
||||||
<string name="download_directory_dialog_negative_button">Cancel</string>
|
<string name="download_directory_dialog_negative_button">Cancel</string>
|
||||||
<string name="download_directory_dialog_positive_button">Download</string>
|
<string name="download_directory_dialog_positive_button">Download</string>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue