From 876784495a330f4330b66b13d4f82ee0eb1d0b82 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sat, 25 Apr 2020 21:57:02 +0900 Subject: [PATCH] load images throughout the interface --- .../adapter/AlbumCoverPagerAdapter.java | 4 +- .../gramophone/adapter/SearchAdapter.java | 7 +- .../adapter/album/AlbumAdapter.java | 4 +- .../adapter/album/HorizontalAlbumAdapter.java | 4 +- .../adapter/artist/ArtistAdapter.java | 4 +- .../adapter/song/ArtistSongAdapter.java | 4 +- .../gramophone/adapter/song/SongAdapter.java | 4 +- .../gramophone/glide/ArtistGlideRequest.java | 124 --------------- .../gramophone/glide/CustomGlideModule.java | 3 - ...deRequest.java => CustomGlideRequest.java} | 51 +++--- .../glide/artistimage/AlbumCover.java | 29 ---- .../glide/artistimage/ArtistImage.java | 28 ---- .../glide/artistimage/ArtistImageFetcher.java | 145 ------------------ .../glide/artistimage/ArtistImageLoader.java | 35 ----- .../glide/audiocover/AudioFileCover.java | 21 ++- .../audiocover/AudioFileCoverFetcher.java | 23 +-- .../com/kabouzeid/gramophone/model/Album.java | 1 - .../gramophone/service/MusicService.java | 12 +- .../notification/PlayingNotificationImpl.java | 4 +- .../PlayingNotificationImpl24.java | 4 +- .../ui/activities/AlbumDetailActivity.java | 6 +- .../ui/activities/ArtistDetailActivity.java | 4 +- .../ui/activities/MainActivity.java | 4 +- .../gramophone/widgets/AppWidgetBig.java | 4 +- .../gramophone/widgets/AppWidgetCard.java | 4 +- .../gramophone/widgets/AppWidgetClassic.java | 4 +- .../gramophone/widgets/AppWidgetSmall.java | 4 +- 27 files changed, 88 insertions(+), 453 deletions(-) delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/glide/ArtistGlideRequest.java rename app/src/main/java/com/kabouzeid/gramophone/glide/{SongGlideRequest.java => CustomGlideRequest.java} (72%) delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/AlbumCover.java delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/ArtistImage.java delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/ArtistImageFetcher.java delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/ArtistImageLoader.java diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumCoverPagerAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumCoverPagerAdapter.java index 48966d84..275976d3 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumCoverPagerAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumCoverPagerAdapter.java @@ -11,8 +11,8 @@ import android.widget.ImageView; import com.bumptech.glide.Glide; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.glide.CustomGlideRequest; import com.kabouzeid.gramophone.glide.CustomPaletteTarget; -import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.misc.CustomFragmentStatePagerAdapter; import com.kabouzeid.gramophone.model.Song; @@ -116,7 +116,7 @@ public class AlbumCoverPagerAdapter extends CustomFragmentStatePagerAdapter { } private void loadAlbumCover() { - SongGlideRequest.Builder.from(Glide.with(getContext()), song) + CustomGlideRequest.Builder.from(Glide.with(getContext()), song.albumId) .generatePalette(getActivity()).build() .into(new CustomPaletteTarget(albumCover) { @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java index fe27d4ad..87962f4f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java @@ -13,8 +13,7 @@ import com.bumptech.glide.Glide; import com.kabouzeid.appthemehelper.util.ATHUtil; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; -import com.kabouzeid.gramophone.glide.ArtistGlideRequest; -import com.kabouzeid.gramophone.glide.SongGlideRequest; +import com.kabouzeid.gramophone.glide.CustomGlideRequest; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.menu.SongMenuHelper; import com.kabouzeid.gramophone.model.Album; @@ -70,7 +69,7 @@ public class SearchAdapter extends RecyclerView.Adapter implements MaterialCab songTitle.setText(song.title); songInfo.setText(song.albumName); - SongGlideRequest.Builder.from(Glide.with(activity), song) + CustomGlideRequest.Builder.from(Glide.with(activity), song.albumId) .build() .into(albumArt); diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java index b59e8cee..730b515a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java @@ -18,8 +18,8 @@ import com.kabouzeid.appthemehelper.util.MaterialValueHelper; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter; import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; +import com.kabouzeid.gramophone.glide.CustomGlideRequest; import com.kabouzeid.gramophone.glide.CustomPaletteTarget; -import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.SortOrder; import com.kabouzeid.gramophone.helper.menu.SongMenuHelper; @@ -130,7 +130,7 @@ public class SongAdapter extends AbsMultiSelectAdapter 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 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 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 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()); - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/glide/CustomGlideModule.java b/app/src/main/java/com/kabouzeid/gramophone/glide/CustomGlideModule.java index 51e9f4d9..d11f2072 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/glide/CustomGlideModule.java +++ b/app/src/main/java/com/kabouzeid/gramophone/glide/CustomGlideModule.java @@ -7,8 +7,6 @@ import java.io.InputStream; import com.bumptech.glide.Glide; import com.bumptech.glide.GlideBuilder; 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.AudioFileCoverLoader; @@ -20,6 +18,5 @@ public class CustomGlideModule implements GlideModule { @Override public void registerComponents(Context context, Glide glide) { glide.register(AudioFileCover.class, InputStream.class, new AudioFileCoverLoader.Factory()); - glide.register(ArtistImage.class, InputStream.class, new ArtistImageLoader.Factory()); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/glide/SongGlideRequest.java b/app/src/main/java/com/kabouzeid/gramophone/glide/CustomGlideRequest.java similarity index 72% rename from app/src/main/java/com/kabouzeid/gramophone/glide/SongGlideRequest.java rename to app/src/main/java/com/kabouzeid/gramophone/glide/CustomGlideRequest.java index e4de3e0c..84f0cabb 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/glide/SongGlideRequest.java +++ b/app/src/main/java/com/kabouzeid/gramophone/glide/CustomGlideRequest.java @@ -2,6 +2,7 @@ package com.kabouzeid.gramophone.glide; import android.content.Context; import android.graphics.Bitmap; + import androidx.annotation.NonNull; 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.palette.BitmapPaletteTranscoder; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper; -import com.kabouzeid.gramophone.model.Song; -public class SongGlideRequest { - public static final DiskCacheStrategy DEFAULT_DISK_CACHE_STRATEGY = DiskCacheStrategy.NONE; - public static final int DEFAULT_ERROR_IMAGE = R.drawable.default_album_art; +public class CustomGlideRequest { + public static final DiskCacheStrategy DEFAULT_DISK_CACHE_STRATEGY = DiskCacheStrategy.ALL; + + public static final int DEFAULT_IMAGE = R.drawable.default_album_art; public static final int DEFAULT_ANIMATION = android.R.anim.fade_in; public static class Builder { final RequestManager requestManager; - final Song song; + final String item; - public static Builder from(@NonNull RequestManager requestManager, Song song) { - return new Builder(requestManager, song); + public static Builder from(@NonNull RequestManager requestManager, String item) { + return new Builder(requestManager, item); } - private Builder(@NonNull RequestManager requestManager, Song song) { + private Builder(@NonNull RequestManager requestManager, String item) { this.requestManager = requestManager; - this.song = song; + this.item = item; } public PaletteBuilder generatePalette(Context context) { @@ -45,12 +46,12 @@ public class SongGlideRequest { } public DrawableRequestBuilder build() { - //noinspection unchecked - return createBaseRequest(requestManager, song) + // noinspection unchecked + return createBaseRequest(requestManager, item) .diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY) - .error(DEFAULT_ERROR_IMAGE) + .error(DEFAULT_IMAGE) .animate(DEFAULT_ANIMATION) - .signature(createSignature(song)); + .signature(createSignature(item)); } } @@ -62,13 +63,13 @@ public class SongGlideRequest { } public BitmapRequestBuilder build() { - //noinspection unchecked - return createBaseRequest(builder.requestManager, builder.song) + // noinspection unchecked + return createBaseRequest(builder.requestManager, builder.item) .asBitmap() .diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY) - .error(DEFAULT_ERROR_IMAGE) + .error(DEFAULT_IMAGE) .animate(DEFAULT_ANIMATION) - .signature(createSignature(builder.song)); + .signature(createSignature(builder.item)); } } @@ -82,22 +83,22 @@ public class SongGlideRequest { } public BitmapRequestBuilder build() { - //noinspection unchecked - return createBaseRequest(builder.requestManager, builder.song) + // noinspection unchecked + return createBaseRequest(builder.requestManager, builder.item) .asBitmap() .transcode(new BitmapPaletteTranscoder(context), BitmapPaletteWrapper.class) .diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY) - .error(DEFAULT_ERROR_IMAGE) + .error(DEFAULT_IMAGE) .animate(DEFAULT_ANIMATION) - .signature(createSignature(builder.song)); + .signature(createSignature(builder.item)); } } - public static DrawableTypeRequest createBaseRequest(RequestManager requestManager, Song song) { - return requestManager.load(new AudioFileCover(song.data)); + public static DrawableTypeRequest createBaseRequest(RequestManager requestManager, String item) { + return requestManager.load(new AudioFileCover(item)); } - public static Key createSignature(Song song) { - return new MediaStoreSignature("", song.dateModified, 0); + public static Key createSignature(String item) { + return new MediaStoreSignature("image/jpeg", item.hashCode(), 0); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/AlbumCover.java b/app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/AlbumCover.java deleted file mode 100644 index 357db2b2..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/AlbumCover.java +++ /dev/null @@ -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; - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/ArtistImage.java b/app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/ArtistImage.java deleted file mode 100644 index 51b1cbc3..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/ArtistImage.java +++ /dev/null @@ -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 albumCovers; - - public ArtistImage(String artistName, final List 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(); - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/ArtistImageFetcher.java b/app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/ArtistImageFetcher.java deleted file mode 100644 index 11e3abe0..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/ArtistImageFetcher.java +++ /dev/null @@ -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 { - - 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 albumCovers) throws FileNotFoundException { - MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - - int artistBitMapSize = 512; - - final Map images = new HashMap<>(); - - InputStream result = null; - List 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 maxEntryYear = null; - for (final Map.Entry 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() { - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/ArtistImageLoader.java b/app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/ArtistImageLoader.java deleted file mode 100644 index 414d9891..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/ArtistImageLoader.java +++ /dev/null @@ -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 { - private Context context; - - public ArtistImageLoader(Context context) { - this.context = context; - } - - @Override - public DataFetcher getResourceFetcher(final ArtistImage model, int width, int height) { - return new ArtistImageFetcher(model); - } - - public static class Factory implements ModelLoaderFactory { - @Override - public ModelLoader build(Context context, GenericLoaderFactory factories) { - return new ArtistImageLoader(context); - } - - @Override - public void teardown() { - } - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/glide/audiocover/AudioFileCover.java b/app/src/main/java/com/kabouzeid/gramophone/glide/audiocover/AudioFileCover.java index e59bdb36..584f96cc 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/glide/audiocover/AudioFileCover.java +++ b/app/src/main/java/com/kabouzeid/gramophone/glide/audiocover/AudioFileCover.java @@ -1,9 +1,22 @@ package com.kabouzeid.gramophone.glide.audiocover; -public class AudioFileCover { - public final String filePath; +import com.kabouzeid.gramophone.App; - public AudioFileCover(String filePath) { - this.filePath = filePath; +import org.jellyfin.apiclient.model.dto.ImageOptions; +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 = ""; + } } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/glide/audiocover/AudioFileCoverFetcher.java b/app/src/main/java/com/kabouzeid/gramophone/glide/audiocover/AudioFileCoverFetcher.java index c7bd16ce..a52374f1 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/glide/audiocover/AudioFileCoverFetcher.java +++ b/app/src/main/java/com/kabouzeid/gramophone/glide/audiocover/AudioFileCoverFetcher.java @@ -1,13 +1,12 @@ package com.kabouzeid.gramophone.glide.audiocover; -import android.media.MediaMetadataRetriever; - -import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import com.bumptech.glide.Priority; 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 { private final AudioFileCover model; @@ -21,24 +20,15 @@ public class AudioFileCoverFetcher implements DataFetcher { @Override public String getId() { // make sure we never return null here - return String.valueOf(model.filePath); + return String.valueOf(model.location); } @Override public InputStream loadData(final Priority priority) throws Exception { - final MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - try { - retriever.setDataSource(model.filePath); - byte[] picture = retriever.getEmbeddedPicture(); - if (picture != null) { - stream = new ByteArrayInputStream(picture); - } else { - stream = AudioFileCoverUtils.fallback(model.filePath); - } - } finally { - retriever.release(); - } + final GlideUrl url = new GlideUrl(String.valueOf(model.location)); + final HttpUrlFetcher retriever = new HttpUrlFetcher(url); + stream = retriever.loadData(Priority.NORMAL); return stream; } @@ -49,7 +39,6 @@ public class AudioFileCoverFetcher implements DataFetcher { try { stream.close(); } catch (IOException e) { - // can't do much about it e.printStackTrace(); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/Album.java b/app/src/main/java/com/kabouzeid/gramophone/model/Album.java index d8949c1c..e7df5773 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/Album.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/Album.java @@ -29,7 +29,6 @@ public class Album implements Parcelable { } this.songs = new ArrayList<>(); - songs.add(Song.EMPTY_SONG); } public Album() { diff --git a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java index c42d57f8..b0af4070 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -40,21 +40,19 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.glide.CustomGlideRequest; import com.kabouzeid.gramophone.model.playlist.AbsSmartPlaylist; import com.kabouzeid.gramophone.widgets.AppWidgetBig; import com.kabouzeid.gramophone.widgets.AppWidgetCard; import com.kabouzeid.gramophone.widgets.AppWidgetClassic; import com.kabouzeid.gramophone.widgets.AppWidgetSmall; import com.kabouzeid.gramophone.glide.BlurTransformation; -import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.helper.ShuffleHelper; import com.kabouzeid.gramophone.helper.StopWatch; import com.kabouzeid.gramophone.loader.PlaylistSongLoader; import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.Song; -import com.kabouzeid.gramophone.provider.HistoryStore; 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.PlayingNotificationImpl; 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.FLAG_HANDLES_MEDIA_BUTTONS); - + mediaSession.setFlags(MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS | MediaSession.FLAG_HANDLES_MEDIA_BUTTONS); mediaSession.setMediaButtonReceiver(mediaButtonReceiverPendingIntent); } @@ -588,11 +584,13 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP if (PreferenceUtil.getInstance(this).getShowAlbumCover()) { final Point screenSize = Util.getScreenSize(MusicService.this); - final BitmapRequestBuilder request = SongGlideRequest.Builder.from(Glide.with(MusicService.this), song) + final BitmapRequestBuilder request = CustomGlideRequest.Builder.from(Glide.with(MusicService.this), song.albumId) .asBitmap().build(); + if (PreferenceUtil.getInstance(this).getBlurAlbumCover()) { request.transform(new BlurTransformation.Builder(MusicService.this).build()); } + runOnUiThread(new Runnable() { @Override public void run() { diff --git a/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotificationImpl.java b/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotificationImpl.java index 5eb4a8aa..8f9c51b1 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotificationImpl.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotificationImpl.java @@ -21,7 +21,7 @@ import com.bumptech.glide.request.target.Target; import com.kabouzeid.appthemehelper.util.ColorUtil; import com.kabouzeid.appthemehelper.util.MaterialValueHelper; 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.model.Song; import com.kabouzeid.gramophone.service.MusicService; @@ -88,7 +88,7 @@ public class PlayingNotificationImpl extends PlayingNotification { if (target != null) { Glide.clear(target); } - target = SongGlideRequest.Builder.from(Glide.with(service), song) + target = CustomGlideRequest.Builder.from(Glide.with(service), song.albumId) .generatePalette(service).build() .into(new SimpleTarget(bigNotificationImageSize, bigNotificationImageSize) { @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotificationImpl24.java b/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotificationImpl24.java index e0c2930c..1c0bc3ba 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotificationImpl24.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotificationImpl24.java @@ -16,7 +16,7 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget; 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.model.Song; 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 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() .into(new SimpleTarget(bigNotificationImageSize, bigNotificationImageSize) { @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java index 89869257..464f6d6c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java @@ -23,8 +23,8 @@ import com.kabouzeid.gramophone.adapter.song.AlbumSongAdapter; import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog; import com.kabouzeid.gramophone.dialogs.SleepTimerDialog; +import com.kabouzeid.gramophone.glide.CustomGlideRequest; import com.kabouzeid.gramophone.glide.CustomPaletteTarget; -import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.interfaces.MediaCallback; @@ -146,7 +146,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements } private void loadAlbumCover() { - SongGlideRequest.Builder.from(Glide.with(this), getAlbum().safeGetFirstSong()) + CustomGlideRequest.Builder.from(Glide.with(this), getAlbum().id) .generatePalette(this).build() .dontAnimate() .into(new CustomPaletteTarget(albumArtImageView) { @@ -312,7 +312,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements durationTextView.setText(MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(this, album.songs))); albumYearTextView.setText(MusicUtil.getYearString(album.getYear())); - adapter.swapDataSet(album.songs); + if (album.songs.size() != 0) adapter.swapDataSet(album.songs); } private Album getAlbum() { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index 6a81c02e..e3dff596 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -29,7 +29,7 @@ import com.kabouzeid.gramophone.adapter.album.HorizontalAlbumAdapter; import com.kabouzeid.gramophone.adapter.song.ArtistSongAdapter; import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; 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.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.interfaces.CabHolder; @@ -185,7 +185,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement } private void loadArtistImage() { - ArtistGlideRequest.Builder.from(Glide.with(this), artist) + CustomGlideRequest.Builder.from(Glide.with(this), artist.id) .generatePalette(this).build() .dontAnimate() .into(new CustomPaletteTarget(artistImage) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 444e6057..666e555c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -22,7 +22,7 @@ import com.kabouzeid.appthemehelper.ThemeStore; import com.kabouzeid.appthemehelper.util.ATHUtil; import com.kabouzeid.appthemehelper.util.NavigationViewUtil; 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.model.Song; 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.text)).setText(MusicUtil.getSongInfoString(song)); - SongGlideRequest.Builder.from(Glide.with(this), song) + CustomGlideRequest.Builder.from(Glide.with(this), song.albumId) .build() .into(((ImageView) navigationDrawerHeader.findViewById(R.id.image))); } else { diff --git a/app/src/main/java/com/kabouzeid/gramophone/widgets/AppWidgetBig.java b/app/src/main/java/com/kabouzeid/gramophone/widgets/AppWidgetBig.java index f69fcfba..6cf0afdb 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/widgets/AppWidgetBig.java +++ b/app/src/main/java/com/kabouzeid/gramophone/widgets/AppWidgetBig.java @@ -18,8 +18,8 @@ import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.target.Target; import com.kabouzeid.appthemehelper.util.MaterialValueHelper; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.glide.CustomGlideRequest; import com.kabouzeid.gramophone.widgets.base.BaseAppWidget; -import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.service.MusicService; import com.kabouzeid.gramophone.ui.activities.MainActivity; @@ -95,7 +95,7 @@ public class AppWidgetBig extends BaseAppWidget { if (target != null) { Glide.clear(target); } - target = SongGlideRequest.Builder.from(Glide.with(appContext), song) + target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.albumId) .asBitmap().build() .into(new SimpleTarget(widgetImageSize, widgetImageSize) { @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/widgets/AppWidgetCard.java b/app/src/main/java/com/kabouzeid/gramophone/widgets/AppWidgetCard.java index be90ffb3..9babad8c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/widgets/AppWidgetCard.java +++ b/app/src/main/java/com/kabouzeid/gramophone/widgets/AppWidgetCard.java @@ -18,8 +18,8 @@ import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.target.Target; import com.kabouzeid.appthemehelper.util.MaterialValueHelper; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.glide.CustomGlideRequest; import com.kabouzeid.gramophone.widgets.base.BaseAppWidget; -import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.service.MusicService; @@ -99,7 +99,7 @@ public class AppWidgetCard extends BaseAppWidget { if (target != null) { Glide.clear(target); } - target = SongGlideRequest.Builder.from(Glide.with(service), song) + target = CustomGlideRequest.Builder.from(Glide.with(service), song.albumId) .generatePalette(service).build() .centerCrop() .into(new SimpleTarget(imageSize, imageSize) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/widgets/AppWidgetClassic.java b/app/src/main/java/com/kabouzeid/gramophone/widgets/AppWidgetClassic.java index 9fbd998e..ff6a4c9f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/widgets/AppWidgetClassic.java +++ b/app/src/main/java/com/kabouzeid/gramophone/widgets/AppWidgetClassic.java @@ -18,8 +18,8 @@ import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.target.Target; import com.kabouzeid.appthemehelper.util.MaterialValueHelper; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.glide.CustomGlideRequest; import com.kabouzeid.gramophone.widgets.base.BaseAppWidget; -import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.service.MusicService; @@ -92,7 +92,7 @@ public class AppWidgetClassic extends BaseAppWidget { if (target != null) { Glide.clear(target); } - target = SongGlideRequest.Builder.from(Glide.with(appContext), song) + target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.albumId) .generatePalette(service).build() .centerCrop() .into(new SimpleTarget(imageSize, imageSize) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/widgets/AppWidgetSmall.java b/app/src/main/java/com/kabouzeid/gramophone/widgets/AppWidgetSmall.java index b64ce8a0..65c80c9e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/widgets/AppWidgetSmall.java +++ b/app/src/main/java/com/kabouzeid/gramophone/widgets/AppWidgetSmall.java @@ -18,8 +18,8 @@ import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.target.Target; import com.kabouzeid.appthemehelper.util.MaterialValueHelper; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.glide.CustomGlideRequest; import com.kabouzeid.gramophone.widgets.base.BaseAppWidget; -import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.service.MusicService; @@ -98,7 +98,7 @@ public class AppWidgetSmall extends BaseAppWidget { if (target != null) { Glide.clear(target); } - target = SongGlideRequest.Builder.from(Glide.with(appContext), song) + target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.albumId) .generatePalette(service).build() .centerCrop() .into(new SimpleTarget(imageSize, imageSize) {