load images throughout the interface
This commit is contained in:
parent
6711c6202c
commit
876784495a
27 changed files with 87 additions and 452 deletions
|
|
@ -11,8 +11,8 @@ import android.widget.ImageView;
|
||||||
|
|
||||||
import com.bumptech.glide.Glide;
|
import com.bumptech.glide.Glide;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
||||||
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
|
||||||
import com.kabouzeid.gramophone.misc.CustomFragmentStatePagerAdapter;
|
import com.kabouzeid.gramophone.misc.CustomFragmentStatePagerAdapter;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
|
|
||||||
|
|
@ -116,7 +116,7 @@ public class AlbumCoverPagerAdapter extends CustomFragmentStatePagerAdapter {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadAlbumCover() {
|
private void loadAlbumCover() {
|
||||||
SongGlideRequest.Builder.from(Glide.with(getContext()), song)
|
CustomGlideRequest.Builder.from(Glide.with(getContext()), song.albumId)
|
||||||
.generatePalette(getActivity()).build()
|
.generatePalette(getActivity()).build()
|
||||||
.into(new CustomPaletteTarget(albumCover) {
|
.into(new CustomPaletteTarget(albumCover) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,7 @@ import com.bumptech.glide.Glide;
|
||||||
import com.kabouzeid.appthemehelper.util.ATHUtil;
|
import com.kabouzeid.appthemehelper.util.ATHUtil;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
|
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
|
||||||
import com.kabouzeid.gramophone.glide.ArtistGlideRequest;
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
|
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
|
||||||
import com.kabouzeid.gramophone.model.Album;
|
import com.kabouzeid.gramophone.model.Album;
|
||||||
|
|
@ -70,7 +69,7 @@ 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));
|
||||||
SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
|
CustomGlideRequest.Builder.from(Glide.with(activity), album.id)
|
||||||
.build()
|
.build()
|
||||||
.into(holder.image);
|
.into(holder.image);
|
||||||
break;
|
break;
|
||||||
|
|
@ -78,7 +77,7 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
|
||||||
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));
|
||||||
ArtistGlideRequest.Builder.from(Glide.with(activity), artist)
|
CustomGlideRequest.Builder.from(Glide.with(activity), artist.id)
|
||||||
.build().into(holder.image);
|
.build().into(holder.image);
|
||||||
break;
|
break;
|
||||||
case SONG:
|
case SONG:
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,8 @@ import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter;
|
import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter;
|
||||||
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
|
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
|
||||||
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
||||||
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
|
||||||
import com.kabouzeid.gramophone.helper.SortOrder;
|
import com.kabouzeid.gramophone.helper.SortOrder;
|
||||||
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;
|
||||||
|
|
@ -130,7 +130,7 @@ 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;
|
||||||
|
|
||||||
SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
|
CustomGlideRequest.Builder.from(Glide.with(activity), album.id)
|
||||||
.generatePalette(activity).build()
|
.generatePalette(activity).build()
|
||||||
.into(new CustomPaletteTarget(holder.image) {
|
.into(new CustomPaletteTarget(holder.image) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,8 @@ import android.view.ViewGroup;
|
||||||
import com.bumptech.glide.Glide;
|
import com.bumptech.glide.Glide;
|
||||||
import com.kabouzeid.appthemehelper.util.ColorUtil;
|
import com.kabouzeid.appthemehelper.util.ColorUtil;
|
||||||
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
||||||
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
||||||
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
|
||||||
import com.kabouzeid.gramophone.helper.HorizontalAdapterHelper;
|
import com.kabouzeid.gramophone.helper.HorizontalAdapterHelper;
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||||
import com.kabouzeid.gramophone.model.Album;
|
import com.kabouzeid.gramophone.model.Album;
|
||||||
|
|
@ -51,7 +51,7 @@ 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;
|
||||||
|
|
||||||
SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
|
CustomGlideRequest.Builder.from(Glide.with(activity), album.id)
|
||||||
.generatePalette(activity).build()
|
.generatePalette(activity).build()
|
||||||
.into(new CustomPaletteTarget(holder.image) {
|
.into(new CustomPaletteTarget(holder.image) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter;
|
import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter;
|
||||||
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
|
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
|
||||||
import com.kabouzeid.gramophone.glide.ArtistGlideRequest;
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
||||||
import com.kabouzeid.gramophone.helper.SortOrder;
|
import com.kabouzeid.gramophone.helper.SortOrder;
|
||||||
import com.kabouzeid.gramophone.helper.menu.SongsMenuHelper;
|
import com.kabouzeid.gramophone.helper.menu.SongsMenuHelper;
|
||||||
|
|
@ -123,7 +123,7 @@ 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;
|
||||||
ArtistGlideRequest.Builder.from(Glide.with(activity), artist)
|
CustomGlideRequest.Builder.from(Glide.with(activity), artist.id)
|
||||||
.generatePalette(activity).build()
|
.generatePalette(activity).build()
|
||||||
.into(new CustomPaletteTarget(holder.image) {
|
.into(new CustomPaletteTarget(holder.image) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ import android.widget.TextView;
|
||||||
import com.afollestad.materialcab.MaterialCab;
|
import com.afollestad.materialcab.MaterialCab;
|
||||||
import com.bumptech.glide.Glide;
|
import com.bumptech.glide.Glide;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
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;
|
||||||
|
|
@ -83,7 +83,7 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> implements MaterialCab
|
||||||
songTitle.setText(song.title);
|
songTitle.setText(song.title);
|
||||||
songInfo.setText(song.albumName);
|
songInfo.setText(song.albumName);
|
||||||
|
|
||||||
SongGlideRequest.Builder.from(Glide.with(activity), song)
|
CustomGlideRequest.Builder.from(Glide.with(activity), song.albumId)
|
||||||
.build()
|
.build()
|
||||||
.into(albumArt);
|
.into(albumArt);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter;
|
import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter;
|
||||||
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
|
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
|
||||||
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
||||||
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.helper.SortOrder;
|
import com.kabouzeid.gramophone.helper.SortOrder;
|
||||||
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
|
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
|
||||||
|
|
@ -130,7 +130,7 @@ 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;
|
||||||
|
|
||||||
SongGlideRequest.Builder.from(Glide.with(activity), song)
|
CustomGlideRequest.Builder.from(Glide.with(activity), song.albumId)
|
||||||
.generatePalette(activity).build()
|
.generatePalette(activity).build()
|
||||||
.into(new CustomPaletteTarget(holder.image) {
|
.into(new CustomPaletteTarget(holder.image) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -1,124 +0,0 @@
|
||||||
package com.kabouzeid.gramophone.glide;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.bumptech.glide.BitmapRequestBuilder;
|
|
||||||
import com.bumptech.glide.DrawableRequestBuilder;
|
|
||||||
import com.bumptech.glide.DrawableTypeRequest;
|
|
||||||
import com.bumptech.glide.Priority;
|
|
||||||
import com.bumptech.glide.RequestManager;
|
|
||||||
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.request.target.Target;
|
|
||||||
import com.kabouzeid.gramophone.App;
|
|
||||||
import com.kabouzeid.gramophone.R;
|
|
||||||
import com.kabouzeid.gramophone.glide.artistimage.AlbumCover;
|
|
||||||
import com.kabouzeid.gramophone.glide.artistimage.ArtistImage;
|
|
||||||
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTranscoder;
|
|
||||||
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
|
||||||
import com.kabouzeid.gramophone.model.Album;
|
|
||||||
import com.kabouzeid.gramophone.model.Artist;
|
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
|
||||||
import com.kabouzeid.gramophone.util.ArtistSignatureUtil;
|
|
||||||
|
|
||||||
public class ArtistGlideRequest {
|
|
||||||
|
|
||||||
private static final DiskCacheStrategy DEFAULT_DISK_CACHE_STRATEGY = DiskCacheStrategy.ALL;
|
|
||||||
private static final int DEFAULT_ERROR_IMAGE = R.drawable.default_artist_image;
|
|
||||||
private static final int DEFAULT_ANIMATION = android.R.anim.fade_in;
|
|
||||||
|
|
||||||
public static class Builder {
|
|
||||||
final RequestManager requestManager;
|
|
||||||
final Artist artist;
|
|
||||||
|
|
||||||
public static Builder from(@NonNull RequestManager requestManager, Artist artist) {
|
|
||||||
return new Builder(requestManager, artist);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Builder(@NonNull RequestManager requestManager, Artist artist) {
|
|
||||||
this.requestManager = requestManager;
|
|
||||||
this.artist = artist;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PaletteBuilder generatePalette(Context context) {
|
|
||||||
return new PaletteBuilder(this, context);
|
|
||||||
}
|
|
||||||
|
|
||||||
public BitmapBuilder asBitmap() {
|
|
||||||
return new BitmapBuilder(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public DrawableRequestBuilder<GlideDrawable> build() {
|
|
||||||
//noinspection unchecked
|
|
||||||
return createBaseRequest(requestManager, artist)
|
|
||||||
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
|
||||||
.error(DEFAULT_ERROR_IMAGE)
|
|
||||||
.animate(DEFAULT_ANIMATION)
|
|
||||||
.priority(Priority.LOW)
|
|
||||||
.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
|
|
||||||
.signature(createSignature(artist));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class BitmapBuilder {
|
|
||||||
private final Builder builder;
|
|
||||||
|
|
||||||
public BitmapBuilder(Builder builder) {
|
|
||||||
this.builder = builder;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BitmapRequestBuilder<?, Bitmap> build() {
|
|
||||||
//noinspection unchecked
|
|
||||||
return createBaseRequest(builder.requestManager, builder.artist)
|
|
||||||
.asBitmap()
|
|
||||||
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
|
||||||
.error(DEFAULT_ERROR_IMAGE)
|
|
||||||
.animate(DEFAULT_ANIMATION)
|
|
||||||
.priority(Priority.LOW)
|
|
||||||
.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
|
|
||||||
.signature(createSignature(builder.artist));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class PaletteBuilder {
|
|
||||||
final Context context;
|
|
||||||
private final Builder builder;
|
|
||||||
|
|
||||||
public PaletteBuilder(Builder builder, Context context) {
|
|
||||||
this.builder = builder;
|
|
||||||
this.context = context;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BitmapRequestBuilder<?, BitmapPaletteWrapper> build() {
|
|
||||||
//noinspection unchecked
|
|
||||||
return createBaseRequest(builder.requestManager, builder.artist)
|
|
||||||
.asBitmap()
|
|
||||||
.transcode(new BitmapPaletteTranscoder(context), BitmapPaletteWrapper.class)
|
|
||||||
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
|
||||||
.error(DEFAULT_ERROR_IMAGE)
|
|
||||||
.animate(DEFAULT_ANIMATION)
|
|
||||||
.priority(Priority.LOW)
|
|
||||||
.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
|
|
||||||
.signature(createSignature(builder.artist));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static DrawableTypeRequest createBaseRequest(RequestManager requestManager, Artist artist) {
|
|
||||||
final List<AlbumCover> songs = new ArrayList<>();
|
|
||||||
for (final Album album : artist.albums) {
|
|
||||||
final Song song = album.safeGetFirstSong();
|
|
||||||
songs.add(new AlbumCover(album.getYear(), song.data));
|
|
||||||
}
|
|
||||||
return requestManager.load(new ArtistImage(artist.getName(), songs));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Key createSignature(Artist artist) {
|
|
||||||
return ArtistSignatureUtil.getInstance(App.getInstance()).getArtistSignature(artist.getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -7,8 +7,6 @@ import java.io.InputStream;
|
||||||
import com.bumptech.glide.Glide;
|
import com.bumptech.glide.Glide;
|
||||||
import com.bumptech.glide.GlideBuilder;
|
import com.bumptech.glide.GlideBuilder;
|
||||||
import com.bumptech.glide.module.GlideModule;
|
import com.bumptech.glide.module.GlideModule;
|
||||||
import com.kabouzeid.gramophone.glide.artistimage.ArtistImage;
|
|
||||||
import com.kabouzeid.gramophone.glide.artistimage.ArtistImageLoader;
|
|
||||||
import com.kabouzeid.gramophone.glide.audiocover.AudioFileCover;
|
import com.kabouzeid.gramophone.glide.audiocover.AudioFileCover;
|
||||||
import com.kabouzeid.gramophone.glide.audiocover.AudioFileCoverLoader;
|
import com.kabouzeid.gramophone.glide.audiocover.AudioFileCoverLoader;
|
||||||
|
|
||||||
|
|
@ -20,6 +18,5 @@ public class CustomGlideModule implements GlideModule {
|
||||||
@Override
|
@Override
|
||||||
public void registerComponents(Context context, Glide glide) {
|
public void registerComponents(Context context, Glide glide) {
|
||||||
glide.register(AudioFileCover.class, InputStream.class, new AudioFileCoverLoader.Factory());
|
glide.register(AudioFileCover.class, InputStream.class, new AudioFileCoverLoader.Factory());
|
||||||
glide.register(ArtistImage.class, InputStream.class, new ArtistImageLoader.Factory());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package com.kabouzeid.gramophone.glide;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import com.bumptech.glide.BitmapRequestBuilder;
|
import com.bumptech.glide.BitmapRequestBuilder;
|
||||||
|
|
@ -16,24 +17,24 @@ import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.glide.audiocover.AudioFileCover;
|
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 com.kabouzeid.gramophone.model.Song;
|
|
||||||
|
|
||||||
public class SongGlideRequest {
|
public class CustomGlideRequest {
|
||||||
public static final DiskCacheStrategy DEFAULT_DISK_CACHE_STRATEGY = DiskCacheStrategy.NONE;
|
public static final DiskCacheStrategy DEFAULT_DISK_CACHE_STRATEGY = DiskCacheStrategy.ALL;
|
||||||
public static final int DEFAULT_ERROR_IMAGE = R.drawable.default_album_art;
|
|
||||||
|
public static final int DEFAULT_IMAGE = R.drawable.default_album_art;
|
||||||
public static final int DEFAULT_ANIMATION = android.R.anim.fade_in;
|
public static final int DEFAULT_ANIMATION = android.R.anim.fade_in;
|
||||||
|
|
||||||
public static class Builder {
|
public static class Builder {
|
||||||
final RequestManager requestManager;
|
final RequestManager requestManager;
|
||||||
final Song song;
|
final String item;
|
||||||
|
|
||||||
public static Builder from(@NonNull RequestManager requestManager, Song song) {
|
public static Builder from(@NonNull RequestManager requestManager, String item) {
|
||||||
return new Builder(requestManager, song);
|
return new Builder(requestManager, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Builder(@NonNull RequestManager requestManager, Song song) {
|
private Builder(@NonNull RequestManager requestManager, String item) {
|
||||||
this.requestManager = requestManager;
|
this.requestManager = requestManager;
|
||||||
this.song = song;
|
this.item = item;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PaletteBuilder generatePalette(Context context) {
|
public PaletteBuilder generatePalette(Context context) {
|
||||||
|
|
@ -45,12 +46,12 @@ public class SongGlideRequest {
|
||||||
}
|
}
|
||||||
|
|
||||||
public DrawableRequestBuilder<GlideDrawable> build() {
|
public DrawableRequestBuilder<GlideDrawable> build() {
|
||||||
//noinspection unchecked
|
// noinspection unchecked
|
||||||
return createBaseRequest(requestManager, song)
|
return createBaseRequest(requestManager, item)
|
||||||
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
||||||
.error(DEFAULT_ERROR_IMAGE)
|
.error(DEFAULT_IMAGE)
|
||||||
.animate(DEFAULT_ANIMATION)
|
.animate(DEFAULT_ANIMATION)
|
||||||
.signature(createSignature(song));
|
.signature(createSignature(item));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -62,13 +63,13 @@ public class SongGlideRequest {
|
||||||
}
|
}
|
||||||
|
|
||||||
public BitmapRequestBuilder<?, Bitmap> build() {
|
public BitmapRequestBuilder<?, Bitmap> build() {
|
||||||
//noinspection unchecked
|
// noinspection unchecked
|
||||||
return createBaseRequest(builder.requestManager, builder.song)
|
return createBaseRequest(builder.requestManager, builder.item)
|
||||||
.asBitmap()
|
.asBitmap()
|
||||||
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
||||||
.error(DEFAULT_ERROR_IMAGE)
|
.error(DEFAULT_IMAGE)
|
||||||
.animate(DEFAULT_ANIMATION)
|
.animate(DEFAULT_ANIMATION)
|
||||||
.signature(createSignature(builder.song));
|
.signature(createSignature(builder.item));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -82,22 +83,22 @@ public class SongGlideRequest {
|
||||||
}
|
}
|
||||||
|
|
||||||
public BitmapRequestBuilder<?, BitmapPaletteWrapper> build() {
|
public BitmapRequestBuilder<?, BitmapPaletteWrapper> build() {
|
||||||
//noinspection unchecked
|
// noinspection unchecked
|
||||||
return createBaseRequest(builder.requestManager, builder.song)
|
return createBaseRequest(builder.requestManager, builder.item)
|
||||||
.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_ERROR_IMAGE)
|
.error(DEFAULT_IMAGE)
|
||||||
.animate(DEFAULT_ANIMATION)
|
.animate(DEFAULT_ANIMATION)
|
||||||
.signature(createSignature(builder.song));
|
.signature(createSignature(builder.item));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DrawableTypeRequest createBaseRequest(RequestManager requestManager, Song song) {
|
public static DrawableTypeRequest createBaseRequest(RequestManager requestManager, String item) {
|
||||||
return requestManager.load(new AudioFileCover(song.data));
|
return requestManager.load(new AudioFileCover(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Key createSignature(Song song) {
|
public static Key createSignature(String item) {
|
||||||
return new MediaStoreSignature("", song.dateModified, 0);
|
return new MediaStoreSignature("image/jpeg", item.hashCode(), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
package com.kabouzeid.gramophone.glide.artistimage;
|
|
||||||
|
|
||||||
public class AlbumCover {
|
|
||||||
|
|
||||||
private int year;
|
|
||||||
|
|
||||||
private String filePath;
|
|
||||||
|
|
||||||
public AlbumCover(int year, String filePath) {
|
|
||||||
this.filePath = filePath;
|
|
||||||
this.year = year;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getYear() {
|
|
||||||
return year;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setYear(int year) {
|
|
||||||
this.year = year;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFilePath() {
|
|
||||||
return filePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFilePath(String filePath) {
|
|
||||||
this.filePath = filePath;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
package com.kabouzeid.gramophone.glide.artistimage;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
|
||||||
*/
|
|
||||||
public class ArtistImage {
|
|
||||||
public final String artistName;
|
|
||||||
|
|
||||||
// filePath to get the image of the artist
|
|
||||||
public final List<AlbumCover> albumCovers;
|
|
||||||
|
|
||||||
public ArtistImage(String artistName, final List<AlbumCover> albumCovers) {
|
|
||||||
|
|
||||||
this.artistName = artistName;
|
|
||||||
this.albumCovers = albumCovers;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toIdString() {
|
|
||||||
if (artistName == null) return "";
|
|
||||||
StringBuilder id = new StringBuilder(artistName);
|
|
||||||
for (AlbumCover albumCover: albumCovers) {
|
|
||||||
id.append(albumCover.getYear()).append(albumCover.getFilePath());
|
|
||||||
}
|
|
||||||
return id.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,145 +0,0 @@
|
||||||
package com.kabouzeid.gramophone.glide.artistimage;
|
|
||||||
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.Canvas;
|
|
||||||
import android.media.MediaMetadataRetriever;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import com.bumptech.glide.Priority;
|
|
||||||
import com.bumptech.glide.load.data.DataFetcher;
|
|
||||||
import com.kabouzeid.gramophone.glide.audiocover.AudioFileCoverUtils;
|
|
||||||
import com.kabouzeid.gramophone.util.ImageUtil;
|
|
||||||
|
|
||||||
public class ArtistImageFetcher implements DataFetcher<InputStream> {
|
|
||||||
|
|
||||||
private ArtistImage model;
|
|
||||||
private InputStream stream;
|
|
||||||
|
|
||||||
public ArtistImageFetcher(final ArtistImage model) {
|
|
||||||
this.model = model;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getId() {
|
|
||||||
Log.d("MOSAIC", "get id for" + model.artistName);
|
|
||||||
// this id is used to determine whether the image is already cached
|
|
||||||
// we use the artist name as well as the album years + file paths
|
|
||||||
return model.toIdString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public InputStream loadData(Priority priority) throws Exception {
|
|
||||||
Log.d("MOSAIC", "load data for" + model.artistName);
|
|
||||||
return stream = getMosaic(model.albumCovers);
|
|
||||||
}
|
|
||||||
|
|
||||||
private InputStream getMosaic(final List<AlbumCover> albumCovers) throws FileNotFoundException {
|
|
||||||
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
|
|
||||||
|
|
||||||
int artistBitMapSize = 512;
|
|
||||||
|
|
||||||
final Map<InputStream, Integer> images = new HashMap<>();
|
|
||||||
|
|
||||||
InputStream result = null;
|
|
||||||
List<InputStream> streams = new ArrayList<>();
|
|
||||||
|
|
||||||
try {
|
|
||||||
for (final AlbumCover cover : albumCovers) {
|
|
||||||
InputStream stream = AudioFileCoverUtils.fallback(cover.getFilePath());
|
|
||||||
if (stream != null) {
|
|
||||||
images.put(stream, cover.getYear());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int nbImages = images.size();
|
|
||||||
if (nbImages > 3) {
|
|
||||||
streams = new ArrayList<>(images.keySet());
|
|
||||||
|
|
||||||
int divisor = 1;
|
|
||||||
for (int i = 1; i < nbImages && Math.pow(i, 2) <= nbImages; ++i) {
|
|
||||||
divisor = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
divisor += 1;
|
|
||||||
double nbTiles = Math.pow(divisor, 2);
|
|
||||||
|
|
||||||
if (nbImages < nbTiles) {
|
|
||||||
divisor -= 1;
|
|
||||||
nbTiles = Math.pow(divisor, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
final int resize = (artistBitMapSize / divisor) + 1;
|
|
||||||
final Bitmap bitmap = Bitmap.createBitmap(artistBitMapSize, artistBitMapSize, Bitmap.Config.RGB_565);
|
|
||||||
final Canvas canvas = new Canvas(bitmap);
|
|
||||||
|
|
||||||
int x = 0;
|
|
||||||
int y = 0;
|
|
||||||
for (int i = 0; i < streams.size() && i < nbTiles; ++i) {
|
|
||||||
final Bitmap bitmap1 = ImageUtil.resize(streams.get(i), resize, resize);
|
|
||||||
canvas.drawBitmap(bitmap1, x, y, null);
|
|
||||||
x += resize;
|
|
||||||
|
|
||||||
if (x >= artistBitMapSize) {
|
|
||||||
x = 0;
|
|
||||||
y += resize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
|
||||||
bitmap.compress(Bitmap.CompressFormat.PNG, 0, bos);
|
|
||||||
result = new ByteArrayInputStream(bos.toByteArray());
|
|
||||||
} else if (nbImages > 0) {
|
|
||||||
// we return the last cover album of the artist
|
|
||||||
Map.Entry<InputStream, Integer> maxEntryYear = null;
|
|
||||||
for (final Map.Entry<InputStream, Integer> entry : images.entrySet()) {
|
|
||||||
if (maxEntryYear == null || entry.getValue().compareTo(maxEntryYear.getValue()) > 0) {
|
|
||||||
maxEntryYear = entry;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (maxEntryYear != null) {
|
|
||||||
result = maxEntryYear.getKey();
|
|
||||||
} else {
|
|
||||||
result = images.entrySet().iterator().next().getKey();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
retriever.release();
|
|
||||||
try {
|
|
||||||
for (final InputStream stream : streams) {
|
|
||||||
stream.close();
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void cleanup() {
|
|
||||||
// already cleaned up in loadData and ByteArrayInputStream will be GC'd
|
|
||||||
if (stream != null) {
|
|
||||||
try {
|
|
||||||
stream.close();
|
|
||||||
} catch (IOException ignore) {
|
|
||||||
// can't do much about it
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void cancel() {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
package com.kabouzeid.gramophone.glide.artistimage;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
|
|
||||||
import java.io.InputStream;
|
|
||||||
|
|
||||||
import com.bumptech.glide.load.data.DataFetcher;
|
|
||||||
import com.bumptech.glide.load.model.GenericLoaderFactory;
|
|
||||||
import com.bumptech.glide.load.model.ModelLoader;
|
|
||||||
import com.bumptech.glide.load.model.ModelLoaderFactory;
|
|
||||||
import com.bumptech.glide.load.model.stream.StreamModelLoader;
|
|
||||||
|
|
||||||
public class ArtistImageLoader implements StreamModelLoader<ArtistImage> {
|
|
||||||
private Context context;
|
|
||||||
|
|
||||||
public ArtistImageLoader(Context context) {
|
|
||||||
this.context = context;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DataFetcher<InputStream> getResourceFetcher(final ArtistImage model, int width, int height) {
|
|
||||||
return new ArtistImageFetcher(model);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class Factory implements ModelLoaderFactory<ArtistImage, InputStream> {
|
|
||||||
@Override
|
|
||||||
public ModelLoader<ArtistImage, InputStream> build(Context context, GenericLoaderFactory factories) {
|
|
||||||
return new ArtistImageLoader(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void teardown() {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,9 +1,22 @@
|
||||||
package com.kabouzeid.gramophone.glide.audiocover;
|
package com.kabouzeid.gramophone.glide.audiocover;
|
||||||
|
|
||||||
public class AudioFileCover {
|
import com.kabouzeid.gramophone.App;
|
||||||
public final String filePath;
|
|
||||||
|
|
||||||
public AudioFileCover(String filePath) {
|
import org.jellyfin.apiclient.model.dto.ImageOptions;
|
||||||
this.filePath = filePath;
|
import org.jellyfin.apiclient.model.entities.ImageType;
|
||||||
|
|
||||||
|
public class AudioFileCover {
|
||||||
|
public String location;
|
||||||
|
|
||||||
|
public AudioFileCover(String item) {
|
||||||
|
ImageOptions options = new ImageOptions();
|
||||||
|
options.setImageType(ImageType.Primary);
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.location = App.getApiClient().GetImageUrl(item, options);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
this.location = "";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,12 @@
|
||||||
package com.kabouzeid.gramophone.glide.audiocover;
|
package com.kabouzeid.gramophone.glide.audiocover;
|
||||||
|
|
||||||
import android.media.MediaMetadataRetriever;
|
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
import com.bumptech.glide.Priority;
|
import com.bumptech.glide.Priority;
|
||||||
import com.bumptech.glide.load.data.DataFetcher;
|
import com.bumptech.glide.load.data.DataFetcher;
|
||||||
|
import com.bumptech.glide.load.data.HttpUrlFetcher;
|
||||||
|
import com.bumptech.glide.load.model.GlideUrl;
|
||||||
|
|
||||||
public class AudioFileCoverFetcher implements DataFetcher<InputStream> {
|
public class AudioFileCoverFetcher implements DataFetcher<InputStream> {
|
||||||
private final AudioFileCover model;
|
private final AudioFileCover model;
|
||||||
|
|
@ -21,24 +20,15 @@ public class AudioFileCoverFetcher implements DataFetcher<InputStream> {
|
||||||
@Override
|
@Override
|
||||||
public String getId() {
|
public String getId() {
|
||||||
// make sure we never return null here
|
// make sure we never return null here
|
||||||
return String.valueOf(model.filePath);
|
return String.valueOf(model.location);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InputStream loadData(final Priority priority) throws Exception {
|
public InputStream loadData(final Priority priority) throws Exception {
|
||||||
final MediaMetadataRetriever retriever = new MediaMetadataRetriever();
|
final GlideUrl url = new GlideUrl(String.valueOf(model.location));
|
||||||
try {
|
final HttpUrlFetcher retriever = new HttpUrlFetcher(url);
|
||||||
retriever.setDataSource(model.filePath);
|
|
||||||
byte[] picture = retriever.getEmbeddedPicture();
|
|
||||||
if (picture != null) {
|
|
||||||
stream = new ByteArrayInputStream(picture);
|
|
||||||
} else {
|
|
||||||
stream = AudioFileCoverUtils.fallback(model.filePath);
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
retriever.release();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
stream = retriever.loadData(Priority.NORMAL);
|
||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -49,7 +39,6 @@ public class AudioFileCoverFetcher implements DataFetcher<InputStream> {
|
||||||
try {
|
try {
|
||||||
stream.close();
|
stream.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
// can't do much about it
|
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,6 @@ public class Album implements Parcelable {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.songs = new ArrayList<>();
|
this.songs = new ArrayList<>();
|
||||||
songs.add(Song.EMPTY_SONG);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Album() {
|
public Album() {
|
||||||
|
|
|
||||||
|
|
@ -40,21 +40,19 @@ import com.bumptech.glide.Glide;
|
||||||
import com.bumptech.glide.request.animation.GlideAnimation;
|
import com.bumptech.glide.request.animation.GlideAnimation;
|
||||||
import com.bumptech.glide.request.target.SimpleTarget;
|
import com.bumptech.glide.request.target.SimpleTarget;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.model.playlist.AbsSmartPlaylist;
|
import com.kabouzeid.gramophone.model.playlist.AbsSmartPlaylist;
|
||||||
import com.kabouzeid.gramophone.widgets.AppWidgetBig;
|
import com.kabouzeid.gramophone.widgets.AppWidgetBig;
|
||||||
import com.kabouzeid.gramophone.widgets.AppWidgetCard;
|
import com.kabouzeid.gramophone.widgets.AppWidgetCard;
|
||||||
import com.kabouzeid.gramophone.widgets.AppWidgetClassic;
|
import com.kabouzeid.gramophone.widgets.AppWidgetClassic;
|
||||||
import com.kabouzeid.gramophone.widgets.AppWidgetSmall;
|
import com.kabouzeid.gramophone.widgets.AppWidgetSmall;
|
||||||
import com.kabouzeid.gramophone.glide.BlurTransformation;
|
import com.kabouzeid.gramophone.glide.BlurTransformation;
|
||||||
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
|
||||||
import com.kabouzeid.gramophone.helper.ShuffleHelper;
|
import com.kabouzeid.gramophone.helper.ShuffleHelper;
|
||||||
import com.kabouzeid.gramophone.helper.StopWatch;
|
import com.kabouzeid.gramophone.helper.StopWatch;
|
||||||
import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
|
import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
|
||||||
import com.kabouzeid.gramophone.model.Playlist;
|
import com.kabouzeid.gramophone.model.Playlist;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.provider.HistoryStore;
|
|
||||||
import com.kabouzeid.gramophone.provider.QueueStore;
|
import com.kabouzeid.gramophone.provider.QueueStore;
|
||||||
import com.kabouzeid.gramophone.provider.SongPlayCountStore;
|
|
||||||
import com.kabouzeid.gramophone.service.notification.PlayingNotification;
|
import com.kabouzeid.gramophone.service.notification.PlayingNotification;
|
||||||
import com.kabouzeid.gramophone.service.notification.PlayingNotificationImpl;
|
import com.kabouzeid.gramophone.service.notification.PlayingNotificationImpl;
|
||||||
import com.kabouzeid.gramophone.service.notification.PlayingNotificationImpl24;
|
import com.kabouzeid.gramophone.service.notification.PlayingNotificationImpl24;
|
||||||
|
|
@ -275,9 +273,7 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
mediaSession.setFlags(MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS
|
mediaSession.setFlags(MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS | MediaSession.FLAG_HANDLES_MEDIA_BUTTONS);
|
||||||
| MediaSession.FLAG_HANDLES_MEDIA_BUTTONS);
|
|
||||||
|
|
||||||
mediaSession.setMediaButtonReceiver(mediaButtonReceiverPendingIntent);
|
mediaSession.setMediaButtonReceiver(mediaButtonReceiverPendingIntent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -588,11 +584,13 @@ 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 = SongGlideRequest.Builder.from(Glide.with(MusicService.this), song)
|
final BitmapRequestBuilder<?, Bitmap> request = CustomGlideRequest.Builder.from(Glide.with(MusicService.this), song.albumId)
|
||||||
.asBitmap().build();
|
.asBitmap().build();
|
||||||
|
|
||||||
if (PreferenceUtil.getInstance(this).getBlurAlbumCover()) {
|
if (PreferenceUtil.getInstance(this).getBlurAlbumCover()) {
|
||||||
request.transform(new BlurTransformation.Builder(MusicService.this).build());
|
request.transform(new BlurTransformation.Builder(MusicService.this).build());
|
||||||
}
|
}
|
||||||
|
|
||||||
runOnUiThread(new Runnable() {
|
runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ import com.bumptech.glide.request.target.Target;
|
||||||
import com.kabouzeid.appthemehelper.util.ColorUtil;
|
import com.kabouzeid.appthemehelper.util.ColorUtil;
|
||||||
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.service.MusicService;
|
import com.kabouzeid.gramophone.service.MusicService;
|
||||||
|
|
@ -88,7 +88,7 @@ public class PlayingNotificationImpl extends PlayingNotification {
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
Glide.clear(target);
|
Glide.clear(target);
|
||||||
}
|
}
|
||||||
target = SongGlideRequest.Builder.from(Glide.with(service), song)
|
target = CustomGlideRequest.Builder.from(Glide.with(service), song.albumId)
|
||||||
.generatePalette(service).build()
|
.generatePalette(service).build()
|
||||||
.into(new SimpleTarget<BitmapPaletteWrapper>(bigNotificationImageSize, bigNotificationImageSize) {
|
.into(new SimpleTarget<BitmapPaletteWrapper>(bigNotificationImageSize, bigNotificationImageSize) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ import com.bumptech.glide.Glide;
|
||||||
import com.bumptech.glide.request.animation.GlideAnimation;
|
import com.bumptech.glide.request.animation.GlideAnimation;
|
||||||
import com.bumptech.glide.request.target.SimpleTarget;
|
import com.bumptech.glide.request.target.SimpleTarget;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.service.MusicService;
|
import com.kabouzeid.gramophone.service.MusicService;
|
||||||
|
|
@ -50,7 +50,7 @@ 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(() -> SongGlideRequest.Builder.from(Glide.with(service), song)
|
service.runOnUiThread(() -> CustomGlideRequest.Builder.from(Glide.with(service), song.albumId)
|
||||||
.generatePalette(service).build()
|
.generatePalette(service).build()
|
||||||
.into(new SimpleTarget<BitmapPaletteWrapper>(bigNotificationImageSize, bigNotificationImageSize) {
|
.into(new SimpleTarget<BitmapPaletteWrapper>(bigNotificationImageSize, bigNotificationImageSize) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -23,8 +23,8 @@ import com.kabouzeid.gramophone.adapter.song.AlbumSongAdapter;
|
||||||
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
||||||
import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog;
|
import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog;
|
||||||
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
|
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
|
||||||
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
||||||
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
|
||||||
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;
|
||||||
|
|
@ -146,7 +146,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadAlbumCover() {
|
private void loadAlbumCover() {
|
||||||
SongGlideRequest.Builder.from(Glide.with(this), getAlbum().safeGetFirstSong())
|
CustomGlideRequest.Builder.from(Glide.with(this), getAlbum().id)
|
||||||
.generatePalette(this).build()
|
.generatePalette(this).build()
|
||||||
.dontAnimate()
|
.dontAnimate()
|
||||||
.into(new CustomPaletteTarget(albumArtImageView) {
|
.into(new CustomPaletteTarget(albumArtImageView) {
|
||||||
|
|
@ -312,7 +312,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
|
||||||
durationTextView.setText(MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(this, album.songs)));
|
durationTextView.setText(MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(this, album.songs)));
|
||||||
albumYearTextView.setText(MusicUtil.getYearString(album.getYear()));
|
albumYearTextView.setText(MusicUtil.getYearString(album.getYear()));
|
||||||
|
|
||||||
adapter.swapDataSet(album.songs);
|
if (album.songs.size() != 0) adapter.swapDataSet(album.songs);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Album getAlbum() {
|
private Album getAlbum() {
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ import com.kabouzeid.gramophone.adapter.album.HorizontalAlbumAdapter;
|
||||||
import com.kabouzeid.gramophone.adapter.song.ArtistSongAdapter;
|
import com.kabouzeid.gramophone.adapter.song.ArtistSongAdapter;
|
||||||
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
||||||
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
|
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
|
||||||
import com.kabouzeid.gramophone.glide.ArtistGlideRequest;
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||||
|
|
@ -185,7 +185,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadArtistImage() {
|
private void loadArtistImage() {
|
||||||
ArtistGlideRequest.Builder.from(Glide.with(this), artist)
|
CustomGlideRequest.Builder.from(Glide.with(this), artist.id)
|
||||||
.generatePalette(this).build()
|
.generatePalette(this).build()
|
||||||
.dontAnimate()
|
.dontAnimate()
|
||||||
.into(new CustomPaletteTarget(artistImage) {
|
.into(new CustomPaletteTarget(artistImage) {
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ import com.kabouzeid.appthemehelper.ThemeStore;
|
||||||
import com.kabouzeid.appthemehelper.util.ATHUtil;
|
import com.kabouzeid.appthemehelper.util.ATHUtil;
|
||||||
import com.kabouzeid.appthemehelper.util.NavigationViewUtil;
|
import com.kabouzeid.appthemehelper.util.NavigationViewUtil;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
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;
|
||||||
|
|
@ -127,7 +127,7 @@ 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));
|
||||||
SongGlideRequest.Builder.from(Glide.with(this), song)
|
CustomGlideRequest.Builder.from(Glide.with(this), song.albumId)
|
||||||
.build()
|
.build()
|
||||||
.into(((ImageView) navigationDrawerHeader.findViewById(R.id.image)));
|
.into(((ImageView) navigationDrawerHeader.findViewById(R.id.image)));
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ import com.bumptech.glide.request.target.SimpleTarget;
|
||||||
import com.bumptech.glide.request.target.Target;
|
import com.bumptech.glide.request.target.Target;
|
||||||
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.widgets.base.BaseAppWidget;
|
import com.kabouzeid.gramophone.widgets.base.BaseAppWidget;
|
||||||
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.service.MusicService;
|
import com.kabouzeid.gramophone.service.MusicService;
|
||||||
import com.kabouzeid.gramophone.ui.activities.MainActivity;
|
import com.kabouzeid.gramophone.ui.activities.MainActivity;
|
||||||
|
|
@ -95,7 +95,7 @@ public class AppWidgetBig extends BaseAppWidget {
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
Glide.clear(target);
|
Glide.clear(target);
|
||||||
}
|
}
|
||||||
target = SongGlideRequest.Builder.from(Glide.with(appContext), song)
|
target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.albumId)
|
||||||
.asBitmap().build()
|
.asBitmap().build()
|
||||||
.into(new SimpleTarget<Bitmap>(widgetImageSize, widgetImageSize) {
|
.into(new SimpleTarget<Bitmap>(widgetImageSize, widgetImageSize) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ import com.bumptech.glide.request.target.SimpleTarget;
|
||||||
import com.bumptech.glide.request.target.Target;
|
import com.bumptech.glide.request.target.Target;
|
||||||
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.widgets.base.BaseAppWidget;
|
import com.kabouzeid.gramophone.widgets.base.BaseAppWidget;
|
||||||
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
|
||||||
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.service.MusicService;
|
import com.kabouzeid.gramophone.service.MusicService;
|
||||||
|
|
@ -99,7 +99,7 @@ public class AppWidgetCard extends BaseAppWidget {
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
Glide.clear(target);
|
Glide.clear(target);
|
||||||
}
|
}
|
||||||
target = SongGlideRequest.Builder.from(Glide.with(service), song)
|
target = CustomGlideRequest.Builder.from(Glide.with(service), song.albumId)
|
||||||
.generatePalette(service).build()
|
.generatePalette(service).build()
|
||||||
.centerCrop()
|
.centerCrop()
|
||||||
.into(new SimpleTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
|
.into(new SimpleTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ import com.bumptech.glide.request.target.SimpleTarget;
|
||||||
import com.bumptech.glide.request.target.Target;
|
import com.bumptech.glide.request.target.Target;
|
||||||
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.widgets.base.BaseAppWidget;
|
import com.kabouzeid.gramophone.widgets.base.BaseAppWidget;
|
||||||
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
|
||||||
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.service.MusicService;
|
import com.kabouzeid.gramophone.service.MusicService;
|
||||||
|
|
@ -92,7 +92,7 @@ public class AppWidgetClassic extends BaseAppWidget {
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
Glide.clear(target);
|
Glide.clear(target);
|
||||||
}
|
}
|
||||||
target = SongGlideRequest.Builder.from(Glide.with(appContext), song)
|
target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.albumId)
|
||||||
.generatePalette(service).build()
|
.generatePalette(service).build()
|
||||||
.centerCrop()
|
.centerCrop()
|
||||||
.into(new SimpleTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
|
.into(new SimpleTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ import com.bumptech.glide.request.target.SimpleTarget;
|
||||||
import com.bumptech.glide.request.target.Target;
|
import com.bumptech.glide.request.target.Target;
|
||||||
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
|
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
|
||||||
import com.kabouzeid.gramophone.widgets.base.BaseAppWidget;
|
import com.kabouzeid.gramophone.widgets.base.BaseAppWidget;
|
||||||
import com.kabouzeid.gramophone.glide.SongGlideRequest;
|
|
||||||
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.service.MusicService;
|
import com.kabouzeid.gramophone.service.MusicService;
|
||||||
|
|
@ -98,7 +98,7 @@ public class AppWidgetSmall extends BaseAppWidget {
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
Glide.clear(target);
|
Glide.clear(target);
|
||||||
}
|
}
|
||||||
target = SongGlideRequest.Builder.from(Glide.with(appContext), song)
|
target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.albumId)
|
||||||
.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