improve image caching and fix several crashes

This commit is contained in:
dkanada 2020-05-05 12:58:46 +09:00
commit a1ae9a2360
26 changed files with 178 additions and 87 deletions

View file

@ -117,7 +117,8 @@ public class AlbumCoverPagerAdapter extends CustomFragmentStatePagerAdapter {
}
private void loadAlbumCover() {
CustomGlideRequest.Builder.from(Glide.with(getContext()), song.albumId)
CustomGlideRequest.Builder
.from(Glide.with(getContext()), song.primary)
.generatePalette(getActivity()).build()
.into(new CustomPaletteTarget(albumCover) {
@Override

View file

@ -69,15 +69,16 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
final Album album = (Album) dataSet.get(position);
holder.title.setText(album.getTitle());
holder.text.setText(MusicUtil.getAlbumInfoString(activity, album));
CustomGlideRequest.Builder.from(Glide.with(activity), album.id)
.build()
.into(holder.image);
CustomGlideRequest.Builder
.from(Glide.with(activity), album.primary)
.build().into(holder.image);
break;
case ARTIST:
final Artist artist = (Artist) dataSet.get(position);
holder.title.setText(artist.getName());
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);
break;
case SONG:

View file

@ -128,7 +128,8 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
protected void loadAlbumCover(Album album, final ViewHolder holder) {
if (holder.image == null) return;
CustomGlideRequest.Builder.from(Glide.with(activity), album.id)
CustomGlideRequest.Builder
.from(Glide.with(activity), album.primary)
.generatePalette(activity).build()
.into(new CustomPaletteTarget(holder.image) {
@Override

View file

@ -51,7 +51,8 @@ public class HorizontalAlbumAdapter extends AlbumAdapter {
protected void loadAlbumCover(Album album, final ViewHolder holder) {
if (holder.image == null) return;
CustomGlideRequest.Builder.from(Glide.with(activity), album.id)
CustomGlideRequest.Builder
.from(Glide.with(activity), album.primary)
.generatePalette(activity).build()
.into(new CustomPaletteTarget(holder.image) {
@Override

View file

@ -123,7 +123,9 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
protected void loadArtistImage(Artist artist, final ViewHolder holder) {
if (holder.image == null) return;
CustomGlideRequest.Builder.from(Glide.with(activity), artist.id)
CustomGlideRequest.Builder
.from(Glide.with(activity), artist.primary)
.generatePalette(activity).build()
.into(new CustomPaletteTarget(holder.image) {
@Override

View file

@ -22,6 +22,7 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
import com.kabouzeid.gramophone.helper.menu.SongsMenuHelper;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.NavigationUtil;
@ -83,9 +84,9 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> implements MaterialCab
songTitle.setText(song.title);
songInfo.setText(song.albumName);
CustomGlideRequest.Builder.from(Glide.with(activity), song.albumId)
.build()
.into(albumArt);
CustomGlideRequest.Builder
.from(Glide.with(activity), song.primary)
.build().into(albumArt);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
albumArt.setTransitionName(activity.getString(R.string.transition_album_art));
@ -101,11 +102,8 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> implements MaterialCab
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.action_go_to_album) {
Pair[] albumPairs = new Pair[]{
Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_art))
};
NavigationUtil.goToAlbum(activity, song.albumId, albumPairs);
Pair[] albumPairs = new Pair[]{Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_art))};
NavigationUtil.goToAlbum(activity, new Album(song), albumPairs);
return true;
}

View file

@ -11,6 +11,7 @@ import android.view.View;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
@ -83,7 +84,7 @@ public class PlaylistSongAdapter extends AbsOffsetSongAdapter {
protected boolean onSongMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.action_go_to_album) {
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;
}

View file

@ -25,6 +25,7 @@ import com.kabouzeid.gramophone.helper.SortOrder;
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
import com.kabouzeid.gramophone.helper.menu.SongsMenuHelper;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.MusicUtil;
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) {
if (holder.image == null) return;
CustomGlideRequest.Builder.from(Glide.with(activity), song.albumId)
CustomGlideRequest.Builder
.from(Glide.with(activity), song.primary)
.generatePalette(activity).build()
.into(new CustomPaletteTarget(holder.image) {
@Override
@ -248,7 +250,7 @@ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, S
switch (item.getItemId()) {
case R.id.action_go_to_album:
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;
}
}

View file

@ -13,11 +13,14 @@ import com.bumptech.glide.load.Key;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.signature.MediaStoreSignature;
import com.kabouzeid.gramophone.App;
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.BitmapPaletteWrapper;
import org.jellyfin.apiclient.model.dto.ImageOptions;
import org.jellyfin.apiclient.model.entities.ImageType;
public class CustomGlideRequest {
public static final DiskCacheStrategy DEFAULT_DISK_CACHE_STRATEGY = DiskCacheStrategy.ALL;
@ -49,7 +52,7 @@ public class CustomGlideRequest {
// noinspection unchecked
return createBaseRequest(requestManager, item)
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
.error(DEFAULT_IMAGE)
.placeholder(DEFAULT_IMAGE)
.animate(DEFAULT_ANIMATION)
.signature(createSignature(item));
}
@ -67,7 +70,7 @@ public class CustomGlideRequest {
return createBaseRequest(builder.requestManager, builder.item)
.asBitmap()
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
.error(DEFAULT_IMAGE)
.placeholder(DEFAULT_IMAGE)
.animate(DEFAULT_ANIMATION)
.signature(createSignature(builder.item));
}
@ -88,17 +91,26 @@ public class CustomGlideRequest {
.asBitmap()
.transcode(new BitmapPaletteTranscoder(context), BitmapPaletteWrapper.class)
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
.error(DEFAULT_IMAGE)
.placeholder(DEFAULT_IMAGE)
.animate(DEFAULT_ANIMATION)
.signature(createSignature(builder.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) {
return new MediaStoreSignature("image/jpeg", item.hashCode(), 0);
return new MediaStoreSignature("image/jpeg", item != null ? item.hashCode() : 0, 0);
}
}

View file

@ -11,7 +11,6 @@ public class AudioFileCover {
public AudioFileCover(String item) {
ImageOptions options = new ImageOptions();
options.setImageType(ImageType.Primary);
options.setQuality(60);
options.setMaxHeight(800);
this.location = App.getApiClient().GetImageUrl(item, options);

View file

@ -12,6 +12,8 @@ import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
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.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
@ -37,10 +39,10 @@ public class SongMenuHelper {
SongDetailDialog.create(song).show(activity.getSupportFragmentManager(), "SONG_DETAILS");
return true;
case R.id.action_go_to_album:
NavigationUtil.goToAlbum(activity, song.albumId);
NavigationUtil.goToAlbum(activity, new Album(song));
return true;
case R.id.action_go_to_artist:
NavigationUtil.goToArtist(activity, song.artistId);
NavigationUtil.goToArtist(activity, new Artist(song));
return true;
}
return false;

View file

@ -2,9 +2,12 @@ package com.kabouzeid.gramophone.model;
import android.os.Parcel;
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.ImageOptions;
import org.jellyfin.apiclient.model.entities.ImageType;
import java.util.ArrayList;
import java.util.List;
@ -19,17 +22,37 @@ public class Album implements Parcelable {
public String artistId;
public String artistName;
public String primary;
public Album(BaseItemDto itemDto) {
this.id = itemDto.getId();
this.title = itemDto.getName();
this.year = itemDto.getProductionYear() != null ? itemDto.getProductionYear() : 0;
this.artistId = itemDto.getAlbumArtists().get(0).getId();
this.artistName = itemDto.getAlbumArtists().get(0).getName();
if (itemDto.getAlbumArtists().size() != 0) {
this.artistId = itemDto.getAlbumArtists().get(0).getId();
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<>();
}
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() {
this.songs = new ArrayList<>();
}
@ -90,6 +113,8 @@ public class Album implements Parcelable {
dest.writeString(artistId);
dest.writeString(artistName);
dest.writeString(primary);
}
protected Album(Parcel in) {
@ -101,6 +126,8 @@ public class Album implements Parcelable {
this.artistId = in.readString();
this.artistName = in.readString();
this.primary = in.readString();
}
public static final Creator<Album> CREATOR = new Creator<Album>() {

View file

@ -5,6 +5,7 @@ import android.os.Parcelable;
import org.jellyfin.apiclient.model.dto.BaseItemDto;
import org.jellyfin.apiclient.model.dto.GenreDto;
import org.jellyfin.apiclient.model.entities.ImageType;
import java.util.ArrayList;
import java.util.List;
@ -16,12 +17,14 @@ public class Artist implements Parcelable {
public String id;
public String name;
public long duration;
public String primary;
public Artist(BaseItemDto itemDto) {
this.id = itemDto.getId();
this.name = itemDto.getName();
this.duration = itemDto.getRunTimeTicks() / 10000;
this.primary = itemDto.getImageTags().containsKey(ImageType.Primary) ? id : null;
this.genres = 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() {
this.albums = new ArrayList<>();
this.songs = new ArrayList<>();
@ -87,7 +100,8 @@ public class Artist implements Parcelable {
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeString(name);
dest.writeLong(duration);
dest.writeString(primary);
}
protected Artist(Parcel in) {
@ -97,7 +111,8 @@ public class Artist implements Parcelable {
this.id = 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>() {

View file

@ -17,9 +17,10 @@ public class Song implements Parcelable {
public final String albumId;
public final String albumName;
public final String artistId;
public final String artistName;
public String artistId;
public String artistName;
public String primary;
public boolean favorite;
public Song(BaseItemDto itemDto) {
@ -27,14 +28,20 @@ public class Song implements Parcelable {
this.title = itemDto.getName();
this.trackNumber = itemDto.getIndexNumber() != null ? itemDto.getIndexNumber() : 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.albumName = itemDto.getAlbum();
this.artistId = itemDto.getAlbumArtists().get(0).getId();
this.artistName = itemDto.getAlbumArtists().get(0).getName();
if (itemDto.getAlbumArtists().size() != 0) {
this.artistId = itemDto.getAlbumArtists().get(0).getId();
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();
}
@ -51,6 +58,7 @@ public class Song implements Parcelable {
this.artistId = artistId;
this.artistName = artistName;
this.primary = null;
this.favorite = false;
}
@ -91,6 +99,9 @@ public class Song implements Parcelable {
dest.writeString(this.artistId);
dest.writeString(this.artistName);
dest.writeString(this.primary);
dest.writeString(Boolean.toString(favorite));
}
protected Song(Parcel in) {
@ -106,7 +117,8 @@ public class Song implements Parcelable {
this.artistId = 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>() {

View file

@ -581,7 +581,7 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
if (PreferenceUtil.getInstance(this).getShowAlbumCover()) {
final Point screenSize = Util.getScreenSize(MusicService.this);
final BitmapRequestBuilder<?, Bitmap> request = CustomGlideRequest.Builder
.from(Glide.with(MusicService.this), song.albumId)
.from(Glide.with(MusicService.this), song.primary)
.asBitmap().build();
if (PreferenceUtil.getInstance(this).getBlurAlbumCover()) {

View file

@ -88,7 +88,7 @@ public class PlayingNotificationImpl extends PlayingNotification {
if (target != null) {
Glide.clear(target);
}
target = CustomGlideRequest.Builder.from(Glide.with(service), song.albumId)
target = CustomGlideRequest.Builder.from(Glide.with(service), song.primary)
.generatePalette(service).build()
.into(new SimpleTarget<BitmapPaletteWrapper>(bigNotificationImageSize, bigNotificationImageSize) {
@Override

View file

@ -50,7 +50,8 @@ public class PlayingNotificationImpl24 extends PlayingNotification {
final PendingIntent deleteIntent = PendingIntent.getService(service, 0, intent, 0);
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()
.into(new SimpleTarget<BitmapPaletteWrapper>(bigNotificationImageSize, bigNotificationImageSize) {
@Override

View file

@ -1,11 +1,14 @@
package com.kabouzeid.gramophone.ui.activities;
import android.graphics.PorterDuff;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.appcompat.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@ -15,6 +18,8 @@ import android.widget.TextView;
import com.afollestad.materialcab.MaterialCab;
import com.afollestad.materialdialogs.util.DialogUtils;
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.kabouzeid.appthemehelper.util.ColorUtil;
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.glide.CustomGlideRequest;
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.interfaces.MediaCallback;
import com.kabouzeid.gramophone.interfaces.PaletteColorHolder;
import com.kabouzeid.gramophone.misc.SimpleObservableScrollViewCallbacks;
import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Artist;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
@ -46,7 +53,6 @@ import butterknife.ButterKnife;
public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder {
public static final String EXTRA_ALBUM = "extra_album";
public static final String EXTRA_ALBUM_ID = "extra_album_id";
private Album album;
@ -94,15 +100,11 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
setUpToolBar();
setUpViews();
if (Build.VERSION.SDK_INT > 21) postponeEnterTransition();
Album album = getIntent().getExtras().getParcelable(EXTRA_ALBUM);
String id = getIntent().getExtras().getString(EXTRA_ALBUM_ID);
setAlbum(album);
if (album != null) {
setAlbum(album);
id = album.getId();
}
QueryUtil.getAlbum(id, new MediaCallback() {
QueryUtil.getAlbum(album.id, new MediaCallback() {
@Override
public void onLoadMedia(List<?> media) {
Album album = (Album) media.get(0);
@ -153,7 +155,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
setUpSongsAdapter();
artistTextView.setOnClickListener(v -> {
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() {
CustomGlideRequest.Builder.from(Glide.with(this), getAlbum().id)
CustomGlideRequest.Builder
.from(Glide.with(this), getAlbum().primary)
.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()
.into(new CustomPaletteTarget(albumArtImageView) {
@Override
@ -261,7 +276,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
super.onBackPressed();
return true;
case R.id.action_go_to_artist:
NavigationUtil.goToArtist(this, getAlbum().getArtistId());
NavigationUtil.goToArtist(this, new Artist(album));
return true;
}
return super.onOptionsItemSelected(item);

View file

@ -1,6 +1,7 @@
package com.kabouzeid.gramophone.ui.activities;
import android.graphics.PorterDuff;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
@ -21,6 +22,8 @@ import java.util.List;
import com.afollestad.materialcab.MaterialCab;
import com.afollestad.materialdialogs.util.DialogUtils;
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.kabouzeid.appthemehelper.util.ColorUtil;
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.glide.CustomGlideRequest;
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.interfaces.CabHolder;
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 static final String EXTRA_ARTIST = "extra_artist";
public static final String EXTRA_ARTIST_ID = "extra_artist_id";
@BindView(R.id.list)
ObservableListView songListView;
@ -115,15 +118,11 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
setUpToolbar();
setUpViews();
if (Build.VERSION.SDK_INT > 21) postponeEnterTransition();
Artist artist = getIntent().getExtras().getParcelable(EXTRA_ARTIST);
String id = getIntent().getExtras().getString(EXTRA_ARTIST_ID);
setArtist(artist);
if (artist != null) {
setArtist(artist);
id = artist.getId();
}
QueryUtil.getArtist(id, new MediaCallback() {
QueryUtil.getArtist(artist.id, new MediaCallback() {
@Override
public void onLoadMedia(List<?> media) {
Artist artist = (Artist) media.get(0);
@ -210,8 +209,21 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
}
private void loadArtistImage() {
CustomGlideRequest.Builder.from(Glide.with(this), artist.id)
CustomGlideRequest.Builder
.from(Glide.with(this), artist.primary)
.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()
.into(new CustomPaletteTarget(artistImage) {
@Override

View file

@ -202,9 +202,9 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
((TextView) navigationDrawerHeader.findViewById(R.id.title)).setText(song.title);
((TextView) navigationDrawerHeader.findViewById(R.id.text)).setText(MusicUtil.getSongInfoString(song));
CustomGlideRequest.Builder.from(Glide.with(this), song.albumId)
.build()
.into(((ImageView) navigationDrawerHeader.findViewById(R.id.image)));
CustomGlideRequest.Builder
.from(Glide.with(this), song.primary)
.build().into(((ImageView) navigationDrawerHeader.findViewById(R.id.image)));
} else {
if (navigationDrawerHeader != null) {
navigationView.removeHeaderView(navigationDrawerHeader);

View file

@ -15,6 +15,8 @@ import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
import com.kabouzeid.gramophone.dialogs.SongShareDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
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.ui.fragments.AbsMusicServiceFragment;
import com.kabouzeid.gramophone.util.MusicUtil;
@ -67,10 +69,10 @@ public abstract class AbsPlayerFragment extends AbsMusicServiceFragment implemen
SongDetailDialog.create(song).show(getFragmentManager(), "SONG_DETAIL");
return true;
case R.id.action_go_to_album:
NavigationUtil.goToAlbum(getActivity(), song.albumId);
NavigationUtil.goToAlbum(getActivity(), new Album(song));
return true;
case R.id.action_go_to_artist:
NavigationUtil.goToArtist(getActivity(), song.artistId);
NavigationUtil.goToArtist(getActivity(), new Artist(song));
return true;
}
return false;

View file

@ -11,6 +11,7 @@ import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Artist;
import com.kabouzeid.gramophone.model.Genre;
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.ArtistDetailActivity;
import com.kabouzeid.gramophone.ui.activities.GenreDetailActivity;
@ -46,20 +47,6 @@ public class NavigationUtil {
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) {
if (sharedElements != null && sharedElements.length > 0) {
// noinspection unchecked

View file

@ -94,7 +94,7 @@ public class AppWidgetBig extends BaseAppWidget {
if (target != null) {
Glide.clear(target);
}
target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.albumId)
target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.primary)
.asBitmap().build()
.into(new SimpleTarget<Bitmap>(widgetImageSize, widgetImageSize) {
@Override

View file

@ -98,7 +98,7 @@ public class AppWidgetCard extends BaseAppWidget {
if (target != null) {
Glide.clear(target);
}
target = CustomGlideRequest.Builder.from(Glide.with(service), song.albumId)
target = CustomGlideRequest.Builder.from(Glide.with(service), song.primary)
.generatePalette(service).build()
.centerCrop()
.into(new SimpleTarget<BitmapPaletteWrapper>(imageSize, imageSize) {

View file

@ -91,7 +91,7 @@ public class AppWidgetClassic extends BaseAppWidget {
if (target != null) {
Glide.clear(target);
}
target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.albumId)
target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.primary)
.generatePalette(service).build()
.centerCrop()
.into(new SimpleTarget<BitmapPaletteWrapper>(imageSize, imageSize) {

View file

@ -97,7 +97,7 @@ public class AppWidgetSmall extends BaseAppWidget {
if (target != null) {
Glide.clear(target);
}
target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.albumId)
target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.primary)
.generatePalette(service).build()
.centerCrop()
.into(new SimpleTarget<BitmapPaletteWrapper>(imageSize, imageSize) {