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() {
|
||||
CustomGlideRequest.Builder.from(Glide.with(getContext()), song.albumId)
|
||||
CustomGlideRequest.Builder
|
||||
.from(Glide.with(getContext()), song.primary)
|
||||
.generatePalette(getActivity()).build()
|
||||
.into(new CustomPaletteTarget(albumCover) {
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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>() {
|
||||
|
|
|
|||
|
|
@ -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>() {
|
||||
|
|
|
|||
|
|
@ -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>() {
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue