improve image caching and fix several crashes
This commit is contained in:
parent
9a20e51bcc
commit
a1ae9a2360
26 changed files with 178 additions and 87 deletions
|
|
@ -117,7 +117,8 @@ public class AlbumCoverPagerAdapter extends CustomFragmentStatePagerAdapter {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadAlbumCover() {
|
private void loadAlbumCover() {
|
||||||
CustomGlideRequest.Builder.from(Glide.with(getContext()), song.albumId)
|
CustomGlideRequest.Builder
|
||||||
|
.from(Glide.with(getContext()), song.primary)
|
||||||
.generatePalette(getActivity()).build()
|
.generatePalette(getActivity()).build()
|
||||||
.into(new CustomPaletteTarget(albumCover) {
|
.into(new CustomPaletteTarget(albumCover) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -69,15 +69,16 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
|
||||||
final Album album = (Album) dataSet.get(position);
|
final Album album = (Album) dataSet.get(position);
|
||||||
holder.title.setText(album.getTitle());
|
holder.title.setText(album.getTitle());
|
||||||
holder.text.setText(MusicUtil.getAlbumInfoString(activity, album));
|
holder.text.setText(MusicUtil.getAlbumInfoString(activity, album));
|
||||||
CustomGlideRequest.Builder.from(Glide.with(activity), album.id)
|
CustomGlideRequest.Builder
|
||||||
.build()
|
.from(Glide.with(activity), album.primary)
|
||||||
.into(holder.image);
|
.build().into(holder.image);
|
||||||
break;
|
break;
|
||||||
case ARTIST:
|
case ARTIST:
|
||||||
final Artist artist = (Artist) dataSet.get(position);
|
final Artist artist = (Artist) dataSet.get(position);
|
||||||
holder.title.setText(artist.getName());
|
holder.title.setText(artist.getName());
|
||||||
holder.text.setText(MusicUtil.getArtistInfoString(activity, artist));
|
holder.text.setText(MusicUtil.getArtistInfoString(activity, artist));
|
||||||
CustomGlideRequest.Builder.from(Glide.with(activity), artist.id)
|
CustomGlideRequest.Builder
|
||||||
|
.from(Glide.with(activity), artist.primary)
|
||||||
.build().into(holder.image);
|
.build().into(holder.image);
|
||||||
break;
|
break;
|
||||||
case SONG:
|
case SONG:
|
||||||
|
|
|
||||||
|
|
@ -128,7 +128,8 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
|
||||||
protected void loadAlbumCover(Album album, final ViewHolder holder) {
|
protected void loadAlbumCover(Album album, final ViewHolder holder) {
|
||||||
if (holder.image == null) return;
|
if (holder.image == null) return;
|
||||||
|
|
||||||
CustomGlideRequest.Builder.from(Glide.with(activity), album.id)
|
CustomGlideRequest.Builder
|
||||||
|
.from(Glide.with(activity), album.primary)
|
||||||
.generatePalette(activity).build()
|
.generatePalette(activity).build()
|
||||||
.into(new CustomPaletteTarget(holder.image) {
|
.into(new CustomPaletteTarget(holder.image) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,8 @@ public class HorizontalAlbumAdapter extends AlbumAdapter {
|
||||||
protected void loadAlbumCover(Album album, final ViewHolder holder) {
|
protected void loadAlbumCover(Album album, final ViewHolder holder) {
|
||||||
if (holder.image == null) return;
|
if (holder.image == null) return;
|
||||||
|
|
||||||
CustomGlideRequest.Builder.from(Glide.with(activity), album.id)
|
CustomGlideRequest.Builder
|
||||||
|
.from(Glide.with(activity), album.primary)
|
||||||
.generatePalette(activity).build()
|
.generatePalette(activity).build()
|
||||||
.into(new CustomPaletteTarget(holder.image) {
|
.into(new CustomPaletteTarget(holder.image) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -123,7 +123,9 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
|
||||||
|
|
||||||
protected void loadArtistImage(Artist artist, final ViewHolder holder) {
|
protected void loadArtistImage(Artist artist, final ViewHolder holder) {
|
||||||
if (holder.image == null) return;
|
if (holder.image == null) return;
|
||||||
CustomGlideRequest.Builder.from(Glide.with(activity), artist.id)
|
|
||||||
|
CustomGlideRequest.Builder
|
||||||
|
.from(Glide.with(activity), artist.primary)
|
||||||
.generatePalette(activity).build()
|
.generatePalette(activity).build()
|
||||||
.into(new CustomPaletteTarget(holder.image) {
|
.into(new CustomPaletteTarget(holder.image) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
|
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
|
||||||
import com.kabouzeid.gramophone.helper.menu.SongsMenuHelper;
|
import com.kabouzeid.gramophone.helper.menu.SongsMenuHelper;
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||||
|
import com.kabouzeid.gramophone.model.Album;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
|
|
||||||
|
|
@ -83,9 +84,9 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> implements MaterialCab
|
||||||
songTitle.setText(song.title);
|
songTitle.setText(song.title);
|
||||||
songInfo.setText(song.albumName);
|
songInfo.setText(song.albumName);
|
||||||
|
|
||||||
CustomGlideRequest.Builder.from(Glide.with(activity), song.albumId)
|
CustomGlideRequest.Builder
|
||||||
.build()
|
.from(Glide.with(activity), song.primary)
|
||||||
.into(albumArt);
|
.build().into(albumArt);
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
albumArt.setTransitionName(activity.getString(R.string.transition_album_art));
|
albumArt.setTransitionName(activity.getString(R.string.transition_album_art));
|
||||||
|
|
@ -101,11 +102,8 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> implements MaterialCab
|
||||||
@Override
|
@Override
|
||||||
public boolean onMenuItemClick(MenuItem item) {
|
public boolean onMenuItemClick(MenuItem item) {
|
||||||
if (item.getItemId() == R.id.action_go_to_album) {
|
if (item.getItemId() == R.id.action_go_to_album) {
|
||||||
Pair[] albumPairs = new Pair[]{
|
Pair[] albumPairs = new Pair[]{Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_art))};
|
||||||
Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_art))
|
NavigationUtil.goToAlbum(activity, new Album(song), albumPairs);
|
||||||
};
|
|
||||||
|
|
||||||
NavigationUtil.goToAlbum(activity, song.albumId, albumPairs);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import android.view.View;
|
||||||
import com.kabouzeid.appthemehelper.ThemeStore;
|
import com.kabouzeid.appthemehelper.ThemeStore;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||||
|
import com.kabouzeid.gramophone.model.Album;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
|
|
@ -83,7 +84,7 @@ public class PlaylistSongAdapter extends AbsOffsetSongAdapter {
|
||||||
protected boolean onSongMenuItemClick(MenuItem item) {
|
protected boolean onSongMenuItemClick(MenuItem item) {
|
||||||
if (item.getItemId() == R.id.action_go_to_album) {
|
if (item.getItemId() == R.id.action_go_to_album) {
|
||||||
Pair[] albumPairs = new Pair[]{Pair.create(image, activity.getString(R.string.transition_album_art))};
|
Pair[] albumPairs = new Pair[]{Pair.create(image, activity.getString(R.string.transition_album_art))};
|
||||||
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition() - 1).albumId, albumPairs);
|
NavigationUtil.goToAlbum(activity, new Album(dataSet.get(getAdapterPosition() - 1)), albumPairs);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ import com.kabouzeid.gramophone.helper.SortOrder;
|
||||||
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
|
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
|
||||||
import com.kabouzeid.gramophone.helper.menu.SongsMenuHelper;
|
import com.kabouzeid.gramophone.helper.menu.SongsMenuHelper;
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||||
|
import com.kabouzeid.gramophone.model.Album;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
|
|
@ -132,7 +133,8 @@ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, S
|
||||||
protected void loadAlbumCover(Song song, final ViewHolder holder) {
|
protected void loadAlbumCover(Song song, final ViewHolder holder) {
|
||||||
if (holder.image == null) return;
|
if (holder.image == null) return;
|
||||||
|
|
||||||
CustomGlideRequest.Builder.from(Glide.with(activity), song.albumId)
|
CustomGlideRequest.Builder
|
||||||
|
.from(Glide.with(activity), song.primary)
|
||||||
.generatePalette(activity).build()
|
.generatePalette(activity).build()
|
||||||
.into(new CustomPaletteTarget(holder.image) {
|
.into(new CustomPaletteTarget(holder.image) {
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -248,7 +250,7 @@ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, S
|
||||||
switch (item.getItemId()) {
|
switch (item.getItemId()) {
|
||||||
case R.id.action_go_to_album:
|
case R.id.action_go_to_album:
|
||||||
Pair[] albumPairs = new Pair[]{Pair.create(image, activity.getResources().getString(R.string.transition_album_art))};
|
Pair[] albumPairs = new Pair[]{Pair.create(image, activity.getResources().getString(R.string.transition_album_art))};
|
||||||
NavigationUtil.goToAlbum(activity, getSong().albumId, albumPairs);
|
NavigationUtil.goToAlbum(activity, new Album(getSong()), albumPairs);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,11 +13,14 @@ import com.bumptech.glide.load.Key;
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
||||||
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
|
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
|
||||||
import com.bumptech.glide.signature.MediaStoreSignature;
|
import com.bumptech.glide.signature.MediaStoreSignature;
|
||||||
|
import com.kabouzeid.gramophone.App;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.glide.audiocover.AudioFileCover;
|
|
||||||
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTranscoder;
|
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTranscoder;
|
||||||
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
||||||
|
|
||||||
|
import org.jellyfin.apiclient.model.dto.ImageOptions;
|
||||||
|
import org.jellyfin.apiclient.model.entities.ImageType;
|
||||||
|
|
||||||
public class CustomGlideRequest {
|
public class CustomGlideRequest {
|
||||||
public static final DiskCacheStrategy DEFAULT_DISK_CACHE_STRATEGY = DiskCacheStrategy.ALL;
|
public static final DiskCacheStrategy DEFAULT_DISK_CACHE_STRATEGY = DiskCacheStrategy.ALL;
|
||||||
|
|
||||||
|
|
@ -49,7 +52,7 @@ public class CustomGlideRequest {
|
||||||
// noinspection unchecked
|
// noinspection unchecked
|
||||||
return createBaseRequest(requestManager, item)
|
return createBaseRequest(requestManager, item)
|
||||||
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
||||||
.error(DEFAULT_IMAGE)
|
.placeholder(DEFAULT_IMAGE)
|
||||||
.animate(DEFAULT_ANIMATION)
|
.animate(DEFAULT_ANIMATION)
|
||||||
.signature(createSignature(item));
|
.signature(createSignature(item));
|
||||||
}
|
}
|
||||||
|
|
@ -67,7 +70,7 @@ public class CustomGlideRequest {
|
||||||
return createBaseRequest(builder.requestManager, builder.item)
|
return createBaseRequest(builder.requestManager, builder.item)
|
||||||
.asBitmap()
|
.asBitmap()
|
||||||
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
||||||
.error(DEFAULT_IMAGE)
|
.placeholder(DEFAULT_IMAGE)
|
||||||
.animate(DEFAULT_ANIMATION)
|
.animate(DEFAULT_ANIMATION)
|
||||||
.signature(createSignature(builder.item));
|
.signature(createSignature(builder.item));
|
||||||
}
|
}
|
||||||
|
|
@ -88,17 +91,26 @@ public class CustomGlideRequest {
|
||||||
.asBitmap()
|
.asBitmap()
|
||||||
.transcode(new BitmapPaletteTranscoder(context), BitmapPaletteWrapper.class)
|
.transcode(new BitmapPaletteTranscoder(context), BitmapPaletteWrapper.class)
|
||||||
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
||||||
.error(DEFAULT_IMAGE)
|
.placeholder(DEFAULT_IMAGE)
|
||||||
.animate(DEFAULT_ANIMATION)
|
.animate(DEFAULT_ANIMATION)
|
||||||
.signature(createSignature(builder.item));
|
.signature(createSignature(builder.item));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DrawableTypeRequest createBaseRequest(RequestManager requestManager, String item) {
|
public static DrawableTypeRequest createBaseRequest(RequestManager requestManager, String item) {
|
||||||
return requestManager.load(new AudioFileCover(item));
|
if (item == null) {
|
||||||
|
return requestManager.load(R.drawable.default_album_art);
|
||||||
|
}
|
||||||
|
|
||||||
|
ImageOptions options = new ImageOptions();
|
||||||
|
options.setImageType(ImageType.Primary);
|
||||||
|
options.setMaxHeight(800);
|
||||||
|
|
||||||
|
String url = App.getApiClient().GetImageUrl(item, options);
|
||||||
|
return requestManager.load(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Key createSignature(String item) {
|
public static Key createSignature(String item) {
|
||||||
return new MediaStoreSignature("image/jpeg", item.hashCode(), 0);
|
return new MediaStoreSignature("image/jpeg", item != null ? item.hashCode() : 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ public class AudioFileCover {
|
||||||
public AudioFileCover(String item) {
|
public AudioFileCover(String item) {
|
||||||
ImageOptions options = new ImageOptions();
|
ImageOptions options = new ImageOptions();
|
||||||
options.setImageType(ImageType.Primary);
|
options.setImageType(ImageType.Primary);
|
||||||
options.setQuality(60);
|
|
||||||
options.setMaxHeight(800);
|
options.setMaxHeight(800);
|
||||||
|
|
||||||
this.location = App.getApiClient().GetImageUrl(item, options);
|
this.location = App.getApiClient().GetImageUrl(item, options);
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,8 @@ import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
||||||
import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
|
import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
|
import com.kabouzeid.gramophone.model.Album;
|
||||||
|
import com.kabouzeid.gramophone.model.Artist;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
|
|
@ -37,10 +39,10 @@ public class SongMenuHelper {
|
||||||
SongDetailDialog.create(song).show(activity.getSupportFragmentManager(), "SONG_DETAILS");
|
SongDetailDialog.create(song).show(activity.getSupportFragmentManager(), "SONG_DETAILS");
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_go_to_album:
|
case R.id.action_go_to_album:
|
||||||
NavigationUtil.goToAlbum(activity, song.albumId);
|
NavigationUtil.goToAlbum(activity, new Album(song));
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_go_to_artist:
|
case R.id.action_go_to_artist:
|
||||||
NavigationUtil.goToArtist(activity, song.artistId);
|
NavigationUtil.goToArtist(activity, new Artist(song));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,12 @@ package com.kabouzeid.gramophone.model;
|
||||||
|
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
|
import com.kabouzeid.gramophone.App;
|
||||||
|
|
||||||
import org.jellyfin.apiclient.model.dto.BaseItemDto;
|
import org.jellyfin.apiclient.model.dto.BaseItemDto;
|
||||||
|
import org.jellyfin.apiclient.model.dto.ImageOptions;
|
||||||
|
import org.jellyfin.apiclient.model.entities.ImageType;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -19,17 +22,37 @@ public class Album implements Parcelable {
|
||||||
public String artistId;
|
public String artistId;
|
||||||
public String artistName;
|
public String artistName;
|
||||||
|
|
||||||
|
public String primary;
|
||||||
|
|
||||||
public Album(BaseItemDto itemDto) {
|
public Album(BaseItemDto itemDto) {
|
||||||
this.id = itemDto.getId();
|
this.id = itemDto.getId();
|
||||||
this.title = itemDto.getName();
|
this.title = itemDto.getName();
|
||||||
this.year = itemDto.getProductionYear() != null ? itemDto.getProductionYear() : 0;
|
this.year = itemDto.getProductionYear() != null ? itemDto.getProductionYear() : 0;
|
||||||
|
|
||||||
|
if (itemDto.getAlbumArtists().size() != 0) {
|
||||||
this.artistId = itemDto.getAlbumArtists().get(0).getId();
|
this.artistId = itemDto.getAlbumArtists().get(0).getId();
|
||||||
this.artistName = itemDto.getAlbumArtists().get(0).getName();
|
this.artistName = itemDto.getAlbumArtists().get(0).getName();
|
||||||
|
} else if (itemDto.getArtistItems().size() != 0) {
|
||||||
|
this.artistId = itemDto.getArtistItems().get(0).getId();
|
||||||
|
this.artistName = itemDto.getArtistItems().get(0).getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.primary = itemDto.getImageTags().containsKey(ImageType.Primary) ? id : null;
|
||||||
|
|
||||||
this.songs = new ArrayList<>();
|
this.songs = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Album(Song song) {
|
||||||
|
this.id = song.albumId;
|
||||||
|
this.title = song.albumName;
|
||||||
|
this.year = song.year;
|
||||||
|
|
||||||
|
this.artistId = song.artistId;
|
||||||
|
this.artistName = song.artistName;
|
||||||
|
|
||||||
|
this.primary = song.primary;
|
||||||
|
}
|
||||||
|
|
||||||
public Album() {
|
public Album() {
|
||||||
this.songs = new ArrayList<>();
|
this.songs = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
@ -90,6 +113,8 @@ public class Album implements Parcelable {
|
||||||
|
|
||||||
dest.writeString(artistId);
|
dest.writeString(artistId);
|
||||||
dest.writeString(artistName);
|
dest.writeString(artistName);
|
||||||
|
|
||||||
|
dest.writeString(primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Album(Parcel in) {
|
protected Album(Parcel in) {
|
||||||
|
|
@ -101,6 +126,8 @@ public class Album implements Parcelable {
|
||||||
|
|
||||||
this.artistId = in.readString();
|
this.artistId = in.readString();
|
||||||
this.artistName = in.readString();
|
this.artistName = in.readString();
|
||||||
|
|
||||||
|
this.primary = in.readString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Creator<Album> CREATOR = new Creator<Album>() {
|
public static final Creator<Album> CREATOR = new Creator<Album>() {
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import android.os.Parcelable;
|
||||||
|
|
||||||
import org.jellyfin.apiclient.model.dto.BaseItemDto;
|
import org.jellyfin.apiclient.model.dto.BaseItemDto;
|
||||||
import org.jellyfin.apiclient.model.dto.GenreDto;
|
import org.jellyfin.apiclient.model.dto.GenreDto;
|
||||||
|
import org.jellyfin.apiclient.model.entities.ImageType;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -16,12 +17,14 @@ public class Artist implements Parcelable {
|
||||||
|
|
||||||
public String id;
|
public String id;
|
||||||
public String name;
|
public String name;
|
||||||
public long duration;
|
|
||||||
|
public String primary;
|
||||||
|
|
||||||
public Artist(BaseItemDto itemDto) {
|
public Artist(BaseItemDto itemDto) {
|
||||||
this.id = itemDto.getId();
|
this.id = itemDto.getId();
|
||||||
this.name = itemDto.getName();
|
this.name = itemDto.getName();
|
||||||
this.duration = itemDto.getRunTimeTicks() / 10000;
|
|
||||||
|
this.primary = itemDto.getImageTags().containsKey(ImageType.Primary) ? id : null;
|
||||||
|
|
||||||
this.genres = new ArrayList<>();
|
this.genres = new ArrayList<>();
|
||||||
this.albums = new ArrayList<>();
|
this.albums = new ArrayList<>();
|
||||||
|
|
@ -34,6 +37,16 @@ public class Artist implements Parcelable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Artist(Album album) {
|
||||||
|
this.id = album.artistId;
|
||||||
|
this.name = album.artistName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Artist(Song song) {
|
||||||
|
this.id = song.artistId;
|
||||||
|
this.name = song.artistName;
|
||||||
|
}
|
||||||
|
|
||||||
public Artist() {
|
public Artist() {
|
||||||
this.albums = new ArrayList<>();
|
this.albums = new ArrayList<>();
|
||||||
this.songs = new ArrayList<>();
|
this.songs = new ArrayList<>();
|
||||||
|
|
@ -87,7 +100,8 @@ public class Artist implements Parcelable {
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
dest.writeString(id);
|
dest.writeString(id);
|
||||||
dest.writeString(name);
|
dest.writeString(name);
|
||||||
dest.writeLong(duration);
|
|
||||||
|
dest.writeString(primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Artist(Parcel in) {
|
protected Artist(Parcel in) {
|
||||||
|
|
@ -97,7 +111,8 @@ public class Artist implements Parcelable {
|
||||||
|
|
||||||
this.id = in.readString();
|
this.id = in.readString();
|
||||||
this.name = in.readString();
|
this.name = in.readString();
|
||||||
this.duration = in.readLong();
|
|
||||||
|
this.primary = in.readString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Parcelable.Creator<Artist> CREATOR = new Parcelable.Creator<Artist>() {
|
public static final Parcelable.Creator<Artist> CREATOR = new Parcelable.Creator<Artist>() {
|
||||||
|
|
|
||||||
|
|
@ -17,9 +17,10 @@ public class Song implements Parcelable {
|
||||||
public final String albumId;
|
public final String albumId;
|
||||||
public final String albumName;
|
public final String albumName;
|
||||||
|
|
||||||
public final String artistId;
|
public String artistId;
|
||||||
public final String artistName;
|
public String artistName;
|
||||||
|
|
||||||
|
public String primary;
|
||||||
public boolean favorite;
|
public boolean favorite;
|
||||||
|
|
||||||
public Song(BaseItemDto itemDto) {
|
public Song(BaseItemDto itemDto) {
|
||||||
|
|
@ -27,14 +28,20 @@ public class Song implements Parcelable {
|
||||||
this.title = itemDto.getName();
|
this.title = itemDto.getName();
|
||||||
this.trackNumber = itemDto.getIndexNumber() != null ? itemDto.getIndexNumber() : 0;
|
this.trackNumber = itemDto.getIndexNumber() != null ? itemDto.getIndexNumber() : 0;
|
||||||
this.year = itemDto.getProductionYear() != null ? itemDto.getProductionYear() : 0;
|
this.year = itemDto.getProductionYear() != null ? itemDto.getProductionYear() : 0;
|
||||||
this.duration = itemDto.getRunTimeTicks() / 10000;
|
this.duration = itemDto.getRunTimeTicks() != null ? itemDto.getRunTimeTicks() / 10000 : 0;
|
||||||
|
|
||||||
this.albumId = itemDto.getAlbumId();
|
this.albumId = itemDto.getAlbumId();
|
||||||
this.albumName = itemDto.getAlbum();
|
this.albumName = itemDto.getAlbum();
|
||||||
|
|
||||||
|
if (itemDto.getAlbumArtists().size() != 0) {
|
||||||
this.artistId = itemDto.getAlbumArtists().get(0).getId();
|
this.artistId = itemDto.getAlbumArtists().get(0).getId();
|
||||||
this.artistName = itemDto.getAlbumArtists().get(0).getName();
|
this.artistName = itemDto.getAlbumArtists().get(0).getName();
|
||||||
|
} else if (itemDto.getArtistItems().size() != 0) {
|
||||||
|
this.artistId = itemDto.getArtistItems().get(0).getId();
|
||||||
|
this.artistName = itemDto.getArtistItems().get(0).getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.primary = itemDto.getAlbumPrimaryImageTag() != null ? albumId : null;
|
||||||
this.favorite = itemDto.getUserData() != null && itemDto.getUserData().getIsFavorite();
|
this.favorite = itemDto.getUserData() != null && itemDto.getUserData().getIsFavorite();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -51,6 +58,7 @@ public class Song implements Parcelable {
|
||||||
this.artistId = artistId;
|
this.artistId = artistId;
|
||||||
this.artistName = artistName;
|
this.artistName = artistName;
|
||||||
|
|
||||||
|
this.primary = null;
|
||||||
this.favorite = false;
|
this.favorite = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -91,6 +99,9 @@ public class Song implements Parcelable {
|
||||||
|
|
||||||
dest.writeString(this.artistId);
|
dest.writeString(this.artistId);
|
||||||
dest.writeString(this.artistName);
|
dest.writeString(this.artistName);
|
||||||
|
|
||||||
|
dest.writeString(this.primary);
|
||||||
|
dest.writeString(Boolean.toString(favorite));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Song(Parcel in) {
|
protected Song(Parcel in) {
|
||||||
|
|
@ -106,7 +117,8 @@ public class Song implements Parcelable {
|
||||||
this.artistId = in.readString();
|
this.artistId = in.readString();
|
||||||
this.artistName = in.readString();
|
this.artistName = in.readString();
|
||||||
|
|
||||||
this.favorite = false;
|
this.primary = in.readString();
|
||||||
|
this.favorite = Boolean.valueOf(in.readString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Creator<Song> CREATOR = new Creator<Song>() {
|
public static final Creator<Song> CREATOR = new Creator<Song>() {
|
||||||
|
|
|
||||||
|
|
@ -581,7 +581,7 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
if (PreferenceUtil.getInstance(this).getShowAlbumCover()) {
|
if (PreferenceUtil.getInstance(this).getShowAlbumCover()) {
|
||||||
final Point screenSize = Util.getScreenSize(MusicService.this);
|
final Point screenSize = Util.getScreenSize(MusicService.this);
|
||||||
final BitmapRequestBuilder<?, Bitmap> request = CustomGlideRequest.Builder
|
final BitmapRequestBuilder<?, Bitmap> request = CustomGlideRequest.Builder
|
||||||
.from(Glide.with(MusicService.this), song.albumId)
|
.from(Glide.with(MusicService.this), song.primary)
|
||||||
.asBitmap().build();
|
.asBitmap().build();
|
||||||
|
|
||||||
if (PreferenceUtil.getInstance(this).getBlurAlbumCover()) {
|
if (PreferenceUtil.getInstance(this).getBlurAlbumCover()) {
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,7 @@ public class PlayingNotificationImpl extends PlayingNotification {
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
Glide.clear(target);
|
Glide.clear(target);
|
||||||
}
|
}
|
||||||
target = CustomGlideRequest.Builder.from(Glide.with(service), song.albumId)
|
target = CustomGlideRequest.Builder.from(Glide.with(service), song.primary)
|
||||||
.generatePalette(service).build()
|
.generatePalette(service).build()
|
||||||
.into(new SimpleTarget<BitmapPaletteWrapper>(bigNotificationImageSize, bigNotificationImageSize) {
|
.into(new SimpleTarget<BitmapPaletteWrapper>(bigNotificationImageSize, bigNotificationImageSize) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,8 @@ public class PlayingNotificationImpl24 extends PlayingNotification {
|
||||||
final PendingIntent deleteIntent = PendingIntent.getService(service, 0, intent, 0);
|
final PendingIntent deleteIntent = PendingIntent.getService(service, 0, intent, 0);
|
||||||
|
|
||||||
final int bigNotificationImageSize = service.getResources().getDimensionPixelSize(R.dimen.notification_big_image_size);
|
final int bigNotificationImageSize = service.getResources().getDimensionPixelSize(R.dimen.notification_big_image_size);
|
||||||
service.runOnUiThread(() -> CustomGlideRequest.Builder.from(Glide.with(service), song.albumId)
|
service.runOnUiThread(() -> CustomGlideRequest.Builder
|
||||||
|
.from(Glide.with(service), song.primary)
|
||||||
.generatePalette(service).build()
|
.generatePalette(service).build()
|
||||||
.into(new SimpleTarget<BitmapPaletteWrapper>(bigNotificationImageSize, bigNotificationImageSize) {
|
.into(new SimpleTarget<BitmapPaletteWrapper>(bigNotificationImageSize, bigNotificationImageSize) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,14 @@
|
||||||
package com.kabouzeid.gramophone.ui.activities;
|
package com.kabouzeid.gramophone.ui.activities;
|
||||||
|
|
||||||
import android.graphics.PorterDuff;
|
import android.graphics.PorterDuff;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.GridLayoutManager;
|
import androidx.recyclerview.widget.GridLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import androidx.appcompat.widget.Toolbar;
|
import androidx.appcompat.widget.Toolbar;
|
||||||
|
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
@ -15,6 +18,8 @@ import android.widget.TextView;
|
||||||
import com.afollestad.materialcab.MaterialCab;
|
import com.afollestad.materialcab.MaterialCab;
|
||||||
import com.afollestad.materialdialogs.util.DialogUtils;
|
import com.afollestad.materialdialogs.util.DialogUtils;
|
||||||
import com.bumptech.glide.Glide;
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.bumptech.glide.request.RequestListener;
|
||||||
|
import com.bumptech.glide.request.target.Target;
|
||||||
import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView;
|
import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView;
|
||||||
import com.kabouzeid.appthemehelper.util.ColorUtil;
|
import com.kabouzeid.appthemehelper.util.ColorUtil;
|
||||||
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
||||||
|
|
@ -24,12 +29,14 @@ import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
||||||
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
|
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
|
||||||
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
||||||
|
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||||
import com.kabouzeid.gramophone.interfaces.MediaCallback;
|
import com.kabouzeid.gramophone.interfaces.MediaCallback;
|
||||||
import com.kabouzeid.gramophone.interfaces.PaletteColorHolder;
|
import com.kabouzeid.gramophone.interfaces.PaletteColorHolder;
|
||||||
import com.kabouzeid.gramophone.misc.SimpleObservableScrollViewCallbacks;
|
import com.kabouzeid.gramophone.misc.SimpleObservableScrollViewCallbacks;
|
||||||
import com.kabouzeid.gramophone.model.Album;
|
import com.kabouzeid.gramophone.model.Album;
|
||||||
|
import com.kabouzeid.gramophone.model.Artist;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
|
|
@ -46,7 +53,6 @@ import butterknife.ButterKnife;
|
||||||
|
|
||||||
public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder {
|
public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder {
|
||||||
public static final String EXTRA_ALBUM = "extra_album";
|
public static final String EXTRA_ALBUM = "extra_album";
|
||||||
public static final String EXTRA_ALBUM_ID = "extra_album_id";
|
|
||||||
|
|
||||||
private Album album;
|
private Album album;
|
||||||
|
|
||||||
|
|
@ -94,15 +100,11 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
|
||||||
setUpToolBar();
|
setUpToolBar();
|
||||||
setUpViews();
|
setUpViews();
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT > 21) postponeEnterTransition();
|
||||||
Album album = getIntent().getExtras().getParcelable(EXTRA_ALBUM);
|
Album album = getIntent().getExtras().getParcelable(EXTRA_ALBUM);
|
||||||
String id = getIntent().getExtras().getString(EXTRA_ALBUM_ID);
|
|
||||||
|
|
||||||
if (album != null) {
|
|
||||||
setAlbum(album);
|
setAlbum(album);
|
||||||
id = album.getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
QueryUtil.getAlbum(id, new MediaCallback() {
|
QueryUtil.getAlbum(album.id, new MediaCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onLoadMedia(List<?> media) {
|
public void onLoadMedia(List<?> media) {
|
||||||
Album album = (Album) media.get(0);
|
Album album = (Album) media.get(0);
|
||||||
|
|
@ -153,7 +155,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
|
||||||
setUpSongsAdapter();
|
setUpSongsAdapter();
|
||||||
artistTextView.setOnClickListener(v -> {
|
artistTextView.setOnClickListener(v -> {
|
||||||
if (album != null) {
|
if (album != null) {
|
||||||
NavigationUtil.goToArtist(AlbumDetailActivity.this, album.getArtistId());
|
NavigationUtil.goToArtist(AlbumDetailActivity.this, new Artist(album));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -161,8 +163,21 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadAlbumCover() {
|
private void loadAlbumCover() {
|
||||||
CustomGlideRequest.Builder.from(Glide.with(this), getAlbum().id)
|
CustomGlideRequest.Builder
|
||||||
|
.from(Glide.with(this), getAlbum().primary)
|
||||||
.generatePalette(this).build()
|
.generatePalette(this).build()
|
||||||
|
.listener(new RequestListener<Object, BitmapPaletteWrapper>() {
|
||||||
|
@Override
|
||||||
|
public boolean onException(Exception e, Object model, Target<BitmapPaletteWrapper> target, boolean isFirstResource) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onResourceReady(BitmapPaletteWrapper resource, Object model, Target<BitmapPaletteWrapper> target, boolean dataSource, boolean isFirstResource) {
|
||||||
|
if (Build.VERSION.SDK_INT > 21) startPostponedEnterTransition();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
})
|
||||||
.dontAnimate()
|
.dontAnimate()
|
||||||
.into(new CustomPaletteTarget(albumArtImageView) {
|
.into(new CustomPaletteTarget(albumArtImageView) {
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -261,7 +276,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
|
||||||
super.onBackPressed();
|
super.onBackPressed();
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_go_to_artist:
|
case R.id.action_go_to_artist:
|
||||||
NavigationUtil.goToArtist(this, getAlbum().getArtistId());
|
NavigationUtil.goToArtist(this, new Artist(album));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package com.kabouzeid.gramophone.ui.activities;
|
package com.kabouzeid.gramophone.ui.activities;
|
||||||
|
|
||||||
import android.graphics.PorterDuff;
|
import android.graphics.PorterDuff;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
|
|
@ -21,6 +22,8 @@ import java.util.List;
|
||||||
import com.afollestad.materialcab.MaterialCab;
|
import com.afollestad.materialcab.MaterialCab;
|
||||||
import com.afollestad.materialdialogs.util.DialogUtils;
|
import com.afollestad.materialdialogs.util.DialogUtils;
|
||||||
import com.bumptech.glide.Glide;
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.bumptech.glide.request.RequestListener;
|
||||||
|
import com.bumptech.glide.request.target.Target;
|
||||||
import com.github.ksoichiro.android.observablescrollview.ObservableListView;
|
import com.github.ksoichiro.android.observablescrollview.ObservableListView;
|
||||||
import com.kabouzeid.appthemehelper.util.ColorUtil;
|
import com.kabouzeid.appthemehelper.util.ColorUtil;
|
||||||
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
||||||
|
|
@ -31,6 +34,7 @@ import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
||||||
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
|
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
|
||||||
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
||||||
|
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||||
import com.kabouzeid.gramophone.interfaces.MediaCallback;
|
import com.kabouzeid.gramophone.interfaces.MediaCallback;
|
||||||
|
|
@ -49,7 +53,6 @@ import org.jellyfin.apiclient.model.querying.ItemQuery;
|
||||||
|
|
||||||
public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder {
|
public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder {
|
||||||
public static final String EXTRA_ARTIST = "extra_artist";
|
public static final String EXTRA_ARTIST = "extra_artist";
|
||||||
public static final String EXTRA_ARTIST_ID = "extra_artist_id";
|
|
||||||
|
|
||||||
@BindView(R.id.list)
|
@BindView(R.id.list)
|
||||||
ObservableListView songListView;
|
ObservableListView songListView;
|
||||||
|
|
@ -115,15 +118,11 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
|
||||||
setUpToolbar();
|
setUpToolbar();
|
||||||
setUpViews();
|
setUpViews();
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT > 21) postponeEnterTransition();
|
||||||
Artist artist = getIntent().getExtras().getParcelable(EXTRA_ARTIST);
|
Artist artist = getIntent().getExtras().getParcelable(EXTRA_ARTIST);
|
||||||
String id = getIntent().getExtras().getString(EXTRA_ARTIST_ID);
|
|
||||||
|
|
||||||
if (artist != null) {
|
|
||||||
setArtist(artist);
|
setArtist(artist);
|
||||||
id = artist.getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
QueryUtil.getArtist(id, new MediaCallback() {
|
QueryUtil.getArtist(artist.id, new MediaCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onLoadMedia(List<?> media) {
|
public void onLoadMedia(List<?> media) {
|
||||||
Artist artist = (Artist) media.get(0);
|
Artist artist = (Artist) media.get(0);
|
||||||
|
|
@ -210,8 +209,21 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadArtistImage() {
|
private void loadArtistImage() {
|
||||||
CustomGlideRequest.Builder.from(Glide.with(this), artist.id)
|
CustomGlideRequest.Builder
|
||||||
|
.from(Glide.with(this), artist.primary)
|
||||||
.generatePalette(this).build()
|
.generatePalette(this).build()
|
||||||
|
.listener(new RequestListener<Object, BitmapPaletteWrapper>() {
|
||||||
|
@Override
|
||||||
|
public boolean onException(Exception e, Object model, Target<BitmapPaletteWrapper> target, boolean isFirstResource) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onResourceReady(BitmapPaletteWrapper resource, Object model, Target<BitmapPaletteWrapper> target, boolean dataSource, boolean isFirstResource) {
|
||||||
|
if (Build.VERSION.SDK_INT > 21) startPostponedEnterTransition();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
})
|
||||||
.dontAnimate()
|
.dontAnimate()
|
||||||
.into(new CustomPaletteTarget(artistImage) {
|
.into(new CustomPaletteTarget(artistImage) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -202,9 +202,9 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
|
||||||
((TextView) navigationDrawerHeader.findViewById(R.id.title)).setText(song.title);
|
((TextView) navigationDrawerHeader.findViewById(R.id.title)).setText(song.title);
|
||||||
((TextView) navigationDrawerHeader.findViewById(R.id.text)).setText(MusicUtil.getSongInfoString(song));
|
((TextView) navigationDrawerHeader.findViewById(R.id.text)).setText(MusicUtil.getSongInfoString(song));
|
||||||
|
|
||||||
CustomGlideRequest.Builder.from(Glide.with(this), song.albumId)
|
CustomGlideRequest.Builder
|
||||||
.build()
|
.from(Glide.with(this), song.primary)
|
||||||
.into(((ImageView) navigationDrawerHeader.findViewById(R.id.image)));
|
.build().into(((ImageView) navigationDrawerHeader.findViewById(R.id.image)));
|
||||||
} else {
|
} else {
|
||||||
if (navigationDrawerHeader != null) {
|
if (navigationDrawerHeader != null) {
|
||||||
navigationView.removeHeaderView(navigationDrawerHeader);
|
navigationView.removeHeaderView(navigationDrawerHeader);
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,8 @@ import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
|
||||||
import com.kabouzeid.gramophone.dialogs.SongShareDialog;
|
import com.kabouzeid.gramophone.dialogs.SongShareDialog;
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.interfaces.PaletteColorHolder;
|
import com.kabouzeid.gramophone.interfaces.PaletteColorHolder;
|
||||||
|
import com.kabouzeid.gramophone.model.Album;
|
||||||
|
import com.kabouzeid.gramophone.model.Artist;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.ui.fragments.AbsMusicServiceFragment;
|
import com.kabouzeid.gramophone.ui.fragments.AbsMusicServiceFragment;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
|
|
@ -67,10 +69,10 @@ public abstract class AbsPlayerFragment extends AbsMusicServiceFragment implemen
|
||||||
SongDetailDialog.create(song).show(getFragmentManager(), "SONG_DETAIL");
|
SongDetailDialog.create(song).show(getFragmentManager(), "SONG_DETAIL");
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_go_to_album:
|
case R.id.action_go_to_album:
|
||||||
NavigationUtil.goToAlbum(getActivity(), song.albumId);
|
NavigationUtil.goToAlbum(getActivity(), new Album(song));
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_go_to_artist:
|
case R.id.action_go_to_artist:
|
||||||
NavigationUtil.goToArtist(getActivity(), song.artistId);
|
NavigationUtil.goToArtist(getActivity(), new Artist(song));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import com.kabouzeid.gramophone.model.Album;
|
||||||
import com.kabouzeid.gramophone.model.Artist;
|
import com.kabouzeid.gramophone.model.Artist;
|
||||||
import com.kabouzeid.gramophone.model.Genre;
|
import com.kabouzeid.gramophone.model.Genre;
|
||||||
import com.kabouzeid.gramophone.model.Playlist;
|
import com.kabouzeid.gramophone.model.Playlist;
|
||||||
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.ui.activities.AlbumDetailActivity;
|
import com.kabouzeid.gramophone.ui.activities.AlbumDetailActivity;
|
||||||
import com.kabouzeid.gramophone.ui.activities.ArtistDetailActivity;
|
import com.kabouzeid.gramophone.ui.activities.ArtistDetailActivity;
|
||||||
import com.kabouzeid.gramophone.ui.activities.GenreDetailActivity;
|
import com.kabouzeid.gramophone.ui.activities.GenreDetailActivity;
|
||||||
|
|
@ -46,20 +47,6 @@ public class NavigationUtil {
|
||||||
startActivitySharedElements(activity, intent, sharedElements);
|
startActivitySharedElements(activity, intent, sharedElements);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void goToArtist(@NonNull final Activity activity, final String artist, @Nullable Pair... sharedElements) {
|
|
||||||
final Intent intent = new Intent(activity, ArtistDetailActivity.class);
|
|
||||||
intent.putExtra(ArtistDetailActivity.EXTRA_ARTIST_ID, artist);
|
|
||||||
|
|
||||||
startActivitySharedElements(activity, intent, sharedElements);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void goToAlbum(@NonNull final Activity activity, final String album, @Nullable Pair... sharedElements) {
|
|
||||||
final Intent intent = new Intent(activity, AlbumDetailActivity.class);
|
|
||||||
intent.putExtra(AlbumDetailActivity.EXTRA_ALBUM_ID, album);
|
|
||||||
|
|
||||||
startActivitySharedElements(activity, intent, sharedElements);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void startActivitySharedElements(@NonNull final Activity activity, Intent intent, @Nullable Pair... sharedElements) {
|
public static void startActivitySharedElements(@NonNull final Activity activity, Intent intent, @Nullable Pair... sharedElements) {
|
||||||
if (sharedElements != null && sharedElements.length > 0) {
|
if (sharedElements != null && sharedElements.length > 0) {
|
||||||
// noinspection unchecked
|
// noinspection unchecked
|
||||||
|
|
|
||||||
|
|
@ -94,7 +94,7 @@ public class AppWidgetBig extends BaseAppWidget {
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
Glide.clear(target);
|
Glide.clear(target);
|
||||||
}
|
}
|
||||||
target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.albumId)
|
target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.primary)
|
||||||
.asBitmap().build()
|
.asBitmap().build()
|
||||||
.into(new SimpleTarget<Bitmap>(widgetImageSize, widgetImageSize) {
|
.into(new SimpleTarget<Bitmap>(widgetImageSize, widgetImageSize) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,7 @@ public class AppWidgetCard extends BaseAppWidget {
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
Glide.clear(target);
|
Glide.clear(target);
|
||||||
}
|
}
|
||||||
target = CustomGlideRequest.Builder.from(Glide.with(service), song.albumId)
|
target = CustomGlideRequest.Builder.from(Glide.with(service), song.primary)
|
||||||
.generatePalette(service).build()
|
.generatePalette(service).build()
|
||||||
.centerCrop()
|
.centerCrop()
|
||||||
.into(new SimpleTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
|
.into(new SimpleTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,7 @@ public class AppWidgetClassic extends BaseAppWidget {
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
Glide.clear(target);
|
Glide.clear(target);
|
||||||
}
|
}
|
||||||
target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.albumId)
|
target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.primary)
|
||||||
.generatePalette(service).build()
|
.generatePalette(service).build()
|
||||||
.centerCrop()
|
.centerCrop()
|
||||||
.into(new SimpleTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
|
.into(new SimpleTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
|
||||||
|
|
|
||||||
|
|
@ -97,7 +97,7 @@ public class AppWidgetSmall extends BaseAppWidget {
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
Glide.clear(target);
|
Glide.clear(target);
|
||||||
}
|
}
|
||||||
target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.albumId)
|
target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.primary)
|
||||||
.generatePalette(service).build()
|
.generatePalette(service).build()
|
||||||
.centerCrop()
|
.centerCrop()
|
||||||
.into(new SimpleTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
|
.into(new SimpleTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue