From a66f0d5fcd57ceff232d2d5d31a959c178165348 Mon Sep 17 00:00:00 2001 From: dkanada Date: Wed, 23 Sep 2020 01:19:44 +0900 Subject: [PATCH] use blurhash for most objects --- app/build.gradle | 1 - .../adapter/AlbumCoverPagerAdapter.java | 4 +- .../gramophone/adapter/GenreAdapter.java | 4 +- .../gramophone/adapter/PlaylistAdapter.java | 4 +- .../gramophone/adapter/SearchAdapter.java | 4 +- .../adapter/album/AlbumAdapter.java | 4 +- .../adapter/album/HorizontalAlbumAdapter.java | 4 +- .../adapter/artist/ArtistAdapter.java | 4 +- .../adapter/song/ArtistSongAdapter.java | 2 +- .../gramophone/adapter/song/SongAdapter.java | 4 +- .../gramophone/glide/CustomGlideRequest.java | 54 +++++++++++-------- .../BitmapPaletteCrossFadeFactory.java | 3 +- .../com/dkanada/gramophone/model/Album.java | 4 ++ .../com/dkanada/gramophone/model/Artist.java | 4 ++ .../com/dkanada/gramophone/model/Song.java | 6 +++ .../gramophone/service/MusicService.java | 4 +- .../notification/PlayingNotificationImpl.java | 5 +- .../PlayingNotificationImpl24.java | 4 +- .../ui/activities/AlbumDetailActivity.java | 5 +- .../ui/activities/ArtistDetailActivity.java | 5 +- .../ui/activities/MainActivity.java | 2 +- .../gramophone/widgets/AppWidgetAlbum.java | 3 +- .../gramophone/widgets/AppWidgetCard.java | 6 +-- .../gramophone/widgets/AppWidgetClassic.java | 6 +-- 24 files changed, 85 insertions(+), 61 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a5ad3de6..20dd2ec5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,6 @@ android { dependencies { implementation 'com.github.jellyfin.jellyfin-apiclient-java:android:0.7.3' implementation 'com.github.woltapp:blurhash:f41a23cc50' - implementation 'com.github.florent37:glidepalette:2.1.2' implementation 'com.google.android.exoplayer:exoplayer:2.11.4' implementation 'com.google.android.material:material:1.2.1' diff --git a/app/src/main/java/com/dkanada/gramophone/adapter/AlbumCoverPagerAdapter.java b/app/src/main/java/com/dkanada/gramophone/adapter/AlbumCoverPagerAdapter.java index cd562f22..8636e334 100644 --- a/app/src/main/java/com/dkanada/gramophone/adapter/AlbumCoverPagerAdapter.java +++ b/app/src/main/java/com/dkanada/gramophone/adapter/AlbumCoverPagerAdapter.java @@ -108,8 +108,8 @@ public class AlbumCoverPagerAdapter extends CustomFragmentStatePagerAdapter { private void loadAlbumCover() { CustomGlideRequest.Builder - .from(Glide.with(getContext()), song.primary) - .palette(getActivity()).build() + .from(getContext(), song.primary, song.blurHash) + .palette().build() .into(new CustomPaletteTarget(binding.playerImage) { @Override public void onColorReady(int color) { diff --git a/app/src/main/java/com/dkanada/gramophone/adapter/GenreAdapter.java b/app/src/main/java/com/dkanada/gramophone/adapter/GenreAdapter.java index 60913015..abbff569 100644 --- a/app/src/main/java/com/dkanada/gramophone/adapter/GenreAdapter.java +++ b/app/src/main/java/com/dkanada/gramophone/adapter/GenreAdapter.java @@ -83,8 +83,8 @@ public class GenreAdapter extends RecyclerView.Adapter if (holder.image == null) return; CustomGlideRequest.Builder - .from(Glide.with(activity), genre.id) - .palette(activity).build() + .from(activity, genre.id, genre.id) + .palette().build() .into(new CustomPaletteTarget(holder.image) { @Override public void onLoadCleared(Drawable placeholder) { diff --git a/app/src/main/java/com/dkanada/gramophone/adapter/PlaylistAdapter.java b/app/src/main/java/com/dkanada/gramophone/adapter/PlaylistAdapter.java index 25395465..27dc0099 100644 --- a/app/src/main/java/com/dkanada/gramophone/adapter/PlaylistAdapter.java +++ b/app/src/main/java/com/dkanada/gramophone/adapter/PlaylistAdapter.java @@ -93,8 +93,8 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter implements MaterialCab songInfo.setText(song.albumName); CustomGlideRequest.Builder - .from(Glide.with(activity), song.primary) + .from(activity, song.primary, song.blurHash) .build().into(albumArt); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { diff --git a/app/src/main/java/com/dkanada/gramophone/adapter/song/SongAdapter.java b/app/src/main/java/com/dkanada/gramophone/adapter/song/SongAdapter.java index df74f470..a99d07a9 100644 --- a/app/src/main/java/com/dkanada/gramophone/adapter/song/SongAdapter.java +++ b/app/src/main/java/com/dkanada/gramophone/adapter/song/SongAdapter.java @@ -134,8 +134,8 @@ public class SongAdapter extends AbsMultiSelectAdapter build() { - Object uri = item != null ? createUrl(item) : DEFAULT_IMAGE; - - return requestManager.load(uri) - .transition(DrawableTransitionOptions.withCrossFade()); + return requestManager.load(item) + .transition(DrawableTransitionOptions.withCrossFade(DEFAULT_DURATION)); } } @@ -66,10 +77,8 @@ public class CustomGlideRequest { } public RequestBuilder build() { - Object uri = builder.item != null ? createUrl(builder.item) : DEFAULT_IMAGE; - - return builder.requestManager.asBitmap().load(uri) - .transition(BitmapTransitionOptions.withCrossFade()); + return builder.requestManager.asBitmap().load(builder.item) + .transition(BitmapTransitionOptions.withCrossFade(DEFAULT_DURATION)); } } @@ -83,16 +92,15 @@ public class CustomGlideRequest { } public RequestBuilder build() { - Object uri = builder.item != null ? createUrl(builder.item) : DEFAULT_IMAGE; - - return builder.requestManager.as(BitmapPaletteWrapper.class).load(uri) + return builder.requestManager.as(BitmapPaletteWrapper.class).load(builder.item) .transition(with(new BitmapPaletteCrossFadeFactory())); } } - public static RequestOptions createRequestOptions(String item) { + public static RequestOptions createRequestOptions(String item, Drawable placeholder) { return new RequestOptions() .centerCrop() + .placeholder(placeholder) .error(DEFAULT_IMAGE) .diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY) .signature(new ObjectKey(item != null ? item : 0)); diff --git a/app/src/main/java/com/dkanada/gramophone/glide/palette/BitmapPaletteCrossFadeFactory.java b/app/src/main/java/com/dkanada/gramophone/glide/palette/BitmapPaletteCrossFadeFactory.java index 3c8d48b6..db0e95c9 100644 --- a/app/src/main/java/com/dkanada/gramophone/glide/palette/BitmapPaletteCrossFadeFactory.java +++ b/app/src/main/java/com/dkanada/gramophone/glide/palette/BitmapPaletteCrossFadeFactory.java @@ -4,10 +4,11 @@ import android.graphics.Bitmap; import com.bumptech.glide.request.transition.BitmapContainerTransitionFactory; import com.bumptech.glide.request.transition.DrawableCrossFadeFactory; +import com.dkanada.gramophone.glide.CustomGlideRequest; public class BitmapPaletteCrossFadeFactory extends BitmapContainerTransitionFactory { public BitmapPaletteCrossFadeFactory() { - super(new DrawableCrossFadeFactory.Builder().build()); + super(new DrawableCrossFadeFactory.Builder(CustomGlideRequest.DEFAULT_DURATION).build()); } @Override diff --git a/app/src/main/java/com/dkanada/gramophone/model/Album.java b/app/src/main/java/com/dkanada/gramophone/model/Album.java index 4d9fbc59..8f139f13 100644 --- a/app/src/main/java/com/dkanada/gramophone/model/Album.java +++ b/app/src/main/java/com/dkanada/gramophone/model/Album.java @@ -20,6 +20,7 @@ public class Album implements Parcelable { public String artistName; public String primary; + public String blurHash; public Album(BaseItemDto itemDto) { this.id = itemDto.getId(); @@ -35,6 +36,9 @@ public class Album implements Parcelable { } this.primary = itemDto.getImageTags().containsKey(ImageType.Primary) ? id : null; + if (itemDto.getImageBlurHashes().get(ImageType.Primary) != null) { + this.blurHash = (String) itemDto.getImageBlurHashes().get(ImageType.Primary).values().toArray()[0]; + } this.songs = new ArrayList<>(); } diff --git a/app/src/main/java/com/dkanada/gramophone/model/Artist.java b/app/src/main/java/com/dkanada/gramophone/model/Artist.java index cab041b0..da1a2647 100644 --- a/app/src/main/java/com/dkanada/gramophone/model/Artist.java +++ b/app/src/main/java/com/dkanada/gramophone/model/Artist.java @@ -19,12 +19,16 @@ public class Artist implements Parcelable { public String name; public String primary; + public String blurHash; public Artist(BaseItemDto itemDto) { this.id = itemDto.getId(); this.name = itemDto.getName(); this.primary = itemDto.getImageTags().containsKey(ImageType.Primary) ? id : null; + if (itemDto.getImageBlurHashes().get(ImageType.Primary) != null) { + this.blurHash = (String) itemDto.getImageBlurHashes().get(ImageType.Primary).values().toArray()[0]; + } this.genres = new ArrayList<>(); this.albums = new ArrayList<>(); diff --git a/app/src/main/java/com/dkanada/gramophone/model/Song.java b/app/src/main/java/com/dkanada/gramophone/model/Song.java index 7388c467..587c6cdd 100644 --- a/app/src/main/java/com/dkanada/gramophone/model/Song.java +++ b/app/src/main/java/com/dkanada/gramophone/model/Song.java @@ -5,6 +5,7 @@ import android.os.Parcelable; import org.jellyfin.apiclient.model.dto.BaseItemDto; import org.jellyfin.apiclient.model.dto.MediaSourceInfo; +import org.jellyfin.apiclient.model.entities.ImageType; import org.jellyfin.apiclient.model.entities.MediaStream; public class Song implements Parcelable { @@ -24,6 +25,7 @@ public class Song implements Parcelable { public String artistName; public String primary; + public String blurHash; public boolean favorite; public String path; @@ -59,6 +61,10 @@ public class Song implements Parcelable { this.primary = itemDto.getAlbumPrimaryImageTag() != null ? albumId : null; this.favorite = itemDto.getUserData() != null && itemDto.getUserData().getIsFavorite(); + if (itemDto.getImageBlurHashes().get(ImageType.Primary) != null) { + this.blurHash = (String) itemDto.getImageBlurHashes().get(ImageType.Primary).values().toArray()[0]; + } + if (itemDto.getMediaSources() != null && itemDto.getMediaSources().get(0) != null) { MediaSourceInfo source = itemDto.getMediaSources().get(0); diff --git a/app/src/main/java/com/dkanada/gramophone/service/MusicService.java b/app/src/main/java/com/dkanada/gramophone/service/MusicService.java index 525e1a7f..d6cfbffe 100644 --- a/app/src/main/java/com/dkanada/gramophone/service/MusicService.java +++ b/app/src/main/java/com/dkanada/gramophone/service/MusicService.java @@ -1,5 +1,6 @@ package com.dkanada.gramophone.service; +import android.annotation.SuppressLint; import android.app.PendingIntent; import android.app.Service; import android.appwidget.AppWidgetManager; @@ -520,6 +521,7 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP .build()); } + @SuppressLint("CheckResult") private void updateMediaSessionMetaData() { final Song song = getCurrentSong(); @@ -545,7 +547,7 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP if (PreferenceUtil.getInstance(this).getShowAlbumCover()) { final Point screenSize = Util.getScreenSize(MusicService.this); final RequestBuilder request = CustomGlideRequest.Builder - .from(Glide.with(MusicService.this), song.primary) + .from(MusicService.this, song.primary, song.blurHash) .bitmap().build(); if (PreferenceUtil.getInstance(this).getBlurAlbumCover()) { diff --git a/app/src/main/java/com/dkanada/gramophone/service/notification/PlayingNotificationImpl.java b/app/src/main/java/com/dkanada/gramophone/service/notification/PlayingNotificationImpl.java index 2f343460..f0e429ab 100644 --- a/app/src/main/java/com/dkanada/gramophone/service/notification/PlayingNotificationImpl.java +++ b/app/src/main/java/com/dkanada/gramophone/service/notification/PlayingNotificationImpl.java @@ -89,8 +89,9 @@ public class PlayingNotificationImpl extends PlayingNotification { Glide.with(service).clear(target); } - target = CustomGlideRequest.Builder.from(Glide.with(service), song.primary) - .palette(service).build() + target = CustomGlideRequest.Builder + .from(service, song.primary, song.blurHash) + .palette().build() .into(new SimpleTarget(bigNotificationImageSize, bigNotificationImageSize) { @Override public void onResourceReady(BitmapPaletteWrapper resource, Transition glideAnimation) { diff --git a/app/src/main/java/com/dkanada/gramophone/service/notification/PlayingNotificationImpl24.java b/app/src/main/java/com/dkanada/gramophone/service/notification/PlayingNotificationImpl24.java index 619caacf..4f69949d 100644 --- a/app/src/main/java/com/dkanada/gramophone/service/notification/PlayingNotificationImpl24.java +++ b/app/src/main/java/com/dkanada/gramophone/service/notification/PlayingNotificationImpl24.java @@ -51,8 +51,8 @@ public class PlayingNotificationImpl24 extends PlayingNotification { final int bigNotificationImageSize = service.getResources().getDimensionPixelSize(R.dimen.notification_big_image_size); service.runOnUiThread(() -> CustomGlideRequest.Builder - .from(Glide.with(service), song.primary) - .palette(service).build() + .from(service, song.primary, song.blurHash) + .palette().build() .into(new SimpleTarget(bigNotificationImageSize, bigNotificationImageSize) { @Override public void onResourceReady(BitmapPaletteWrapper resource, Transition glideAnimation) { diff --git a/app/src/main/java/com/dkanada/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/dkanada/gramophone/ui/activities/AlbumDetailActivity.java index 3877c156..796a5e4f 100644 --- a/app/src/main/java/com/dkanada/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/dkanada/gramophone/ui/activities/AlbumDetailActivity.java @@ -110,9 +110,8 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements private void loadAlbumCover(String primary) { CustomGlideRequest.Builder - .from(Glide.with(this), primary) - .palette(this).build() - .dontAnimate() + .from(this, primary, primary) + .palette().build().dontAnimate() .into(new CustomPaletteTarget(binding.image) { @Override public void onColorReady(int color) { diff --git a/app/src/main/java/com/dkanada/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/dkanada/gramophone/ui/activities/ArtistDetailActivity.java index 89aafc43..c96ef604 100644 --- a/app/src/main/java/com/dkanada/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/dkanada/gramophone/ui/activities/ArtistDetailActivity.java @@ -146,9 +146,8 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement private void loadArtistImage(String primary) { CustomGlideRequest.Builder - .from(Glide.with(this), primary) - .palette(this).build() - .dontAnimate() + .from(this, primary, primary) + .palette().build().dontAnimate() .into(new CustomPaletteTarget(binding.image) { @Override public void onColorReady(int color) { diff --git a/app/src/main/java/com/dkanada/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/dkanada/gramophone/ui/activities/MainActivity.java index 12325f08..e391f5fe 100644 --- a/app/src/main/java/com/dkanada/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/dkanada/gramophone/ui/activities/MainActivity.java @@ -189,7 +189,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity { navigationBinding.text.setText(MusicUtil.getSongInfoString(song)); CustomGlideRequest.Builder - .from(Glide.with(this), song.primary) + .from(this, song.primary, song.blurHash) .build().into(navigationBinding.image); } else if (binding.navigationView.getHeaderCount() != 0) { binding.navigationView.removeHeaderView(navigationBinding.getRoot()); diff --git a/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetAlbum.java b/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetAlbum.java index 7d331b57..9e0e7022 100644 --- a/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetAlbum.java +++ b/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetAlbum.java @@ -96,7 +96,8 @@ public class AppWidgetAlbum extends BaseAppWidget { Glide.with(appContext).clear(target); } - target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.primary) + target = CustomGlideRequest.Builder + .from(appContext, song.primary, song.blurHash) .bitmap().build() .into(new SimpleTarget(widgetImageSize, widgetImageSize) { @Override diff --git a/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetCard.java b/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetCard.java index 4a308f34..02b8a644 100644 --- a/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetCard.java +++ b/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetCard.java @@ -100,9 +100,9 @@ public class AppWidgetCard extends BaseAppWidget { Glide.with(service).clear(target); } - target = CustomGlideRequest.Builder.from(Glide.with(service), song.primary) - .palette(service).build() - .centerCrop() + target = CustomGlideRequest.Builder + .from(service, song.primary, song.blurHash) + .palette().build() .into(new SimpleTarget(imageSize, imageSize) { @Override public void onResourceReady(BitmapPaletteWrapper resource, Transition glideAnimation) { diff --git a/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetClassic.java b/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetClassic.java index 251b5845..2b76fa69 100644 --- a/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetClassic.java +++ b/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetClassic.java @@ -93,9 +93,9 @@ public class AppWidgetClassic extends BaseAppWidget { Glide.with(appContext).clear(target); } - target = CustomGlideRequest.Builder.from(Glide.with(appContext), song.primary) - .palette(service).build() - .centerCrop() + target = CustomGlideRequest.Builder + .from(appContext, song.primary, song.blurHash) + .palette().build() .into(new SimpleTarget(imageSize, imageSize) { @Override public void onResourceReady(BitmapPaletteWrapper resource, Transition glideAnimation) {