From 8c6a4cd4c7bc147545822be21620c27d29d15f25 Mon Sep 17 00:00:00 2001 From: Adrian Ulrich Date: Sun, 4 Apr 2021 14:32:01 +0200 Subject: [PATCH] introduce MEDIUM cover size Turns out that widget image views may run out of heap space if we use the large cover everywhere, oops. Since having the full cover everywhere indeed doesn't make sense, we introduce a MEDIUM size for use in widgets and other remote views. --- app/src/main/AndroidManifest.xml | 2 +- .../ch/blinkenlights/android/vanilla/CoverCache.java | 6 +++++- .../ch/blinkenlights/android/vanilla/CoverView.java | 2 +- .../android/vanilla/FourLongWidget.java | 2 +- .../android/vanilla/FourSquareWidget.java | 2 +- .../android/vanilla/FourWhiteWidget.java | 2 +- .../android/vanilla/MediaSessionTracker.java | 2 +- .../blinkenlights/android/vanilla/OneCellWidget.java | 2 +- .../android/vanilla/PlaybackService.java | 2 +- .../android/vanilla/RemoteControlImplICS.java | 2 +- .../java/ch/blinkenlights/android/vanilla/Song.java | 12 +++++++++++- .../ch/blinkenlights/android/vanilla/WidgetD.java | 2 +- 12 files changed, 26 insertions(+), 12 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a2300379..240fb4f1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,7 +24,7 @@ THE SOFTWARE. diff --git a/app/src/main/java/ch/blinkenlights/android/vanilla/CoverCache.java b/app/src/main/java/ch/blinkenlights/android/vanilla/CoverCache.java index c86bbf26..ca218e15 100644 --- a/app/src/main/java/ch/blinkenlights/android/vanilla/CoverCache.java +++ b/app/src/main/java/ch/blinkenlights/android/vanilla/CoverCache.java @@ -53,7 +53,11 @@ public class CoverCache { */ public final static int SIZE_SMALL = (int)(44 * METRICS.density); /** - * Returned size of large (cover view) album covers + * Cover to use in remote views with a medium size. + */ + public final static int SIZE_MEDIUM = (int)(240 * METRICS.density); + /** + * Cover to use in the highest quality possible (full cover view). */ public final static int SIZE_LARGE = (METRICS.heightPixels > METRICS.widthPixels ? METRICS.widthPixels : METRICS.heightPixels); /** diff --git a/app/src/main/java/ch/blinkenlights/android/vanilla/CoverView.java b/app/src/main/java/ch/blinkenlights/android/vanilla/CoverView.java index d4d42f78..f678621b 100644 --- a/app/src/main/java/ch/blinkenlights/android/vanilla/CoverView.java +++ b/app/src/main/java/ch/blinkenlights/android/vanilla/CoverView.java @@ -227,7 +227,7 @@ public final class CoverView extends View implements Handler.Callback { */ private Bitmap generateBitmap(Song song) { int style = mCoverStyle; - Bitmap cover = song == null ? null : song.getCover(mContext); + Bitmap cover = song == null ? null : song.getLargeCover(mContext); if (cover == null && style != CoverBitmap.STYLE_OVERLAPPING_BOX) { cover = CoverBitmap.generateDefaultCover(mContext, getWidth(), getHeight()); diff --git a/app/src/main/java/ch/blinkenlights/android/vanilla/FourLongWidget.java b/app/src/main/java/ch/blinkenlights/android/vanilla/FourLongWidget.java index a8267dd3..2f689e35 100644 --- a/app/src/main/java/ch/blinkenlights/android/vanilla/FourLongWidget.java +++ b/app/src/main/java/ch/blinkenlights/android/vanilla/FourLongWidget.java @@ -111,7 +111,7 @@ public class FourLongWidget extends AppWidgetProvider { views.setTextViewText(R.id.title, song.title); views.setTextViewText(R.id.artist, song.artist); views.setTextViewText(R.id.album, song.album); - Bitmap cover = song.getCover(context); + Bitmap cover = song.getMediumCover(context); if (cover == null) { views.setImageViewResource(R.id.cover, R.drawable.fallback_cover_large); } else { diff --git a/app/src/main/java/ch/blinkenlights/android/vanilla/FourSquareWidget.java b/app/src/main/java/ch/blinkenlights/android/vanilla/FourSquareWidget.java index aeadfda2..16020c71 100644 --- a/app/src/main/java/ch/blinkenlights/android/vanilla/FourSquareWidget.java +++ b/app/src/main/java/ch/blinkenlights/android/vanilla/FourSquareWidget.java @@ -109,7 +109,7 @@ public class FourSquareWidget extends AppWidgetProvider { views.setViewVisibility(R.id.buttons, View.VISIBLE); views.setTextViewText(R.id.title, song.title); views.setTextViewText(R.id.artist, song.artist); - cover = song.getCover(context); + cover = song.getMediumCover(context); playResource = playing ? R.drawable.hidden_pause : R.drawable.hidden_play; nextResource = R.drawable.hidden_next; } diff --git a/app/src/main/java/ch/blinkenlights/android/vanilla/FourWhiteWidget.java b/app/src/main/java/ch/blinkenlights/android/vanilla/FourWhiteWidget.java index f94147c0..b08e7f07 100644 --- a/app/src/main/java/ch/blinkenlights/android/vanilla/FourWhiteWidget.java +++ b/app/src/main/java/ch/blinkenlights/android/vanilla/FourWhiteWidget.java @@ -114,7 +114,7 @@ public class FourWhiteWidget extends AppWidgetProvider { views.setViewVisibility(R.id.title, View.VISIBLE); views.setTextViewText(R.id.title, song.title); views.setTextViewText(R.id.artist, song.artist); - Bitmap cover = song.getCover(context); + Bitmap cover = song.getMediumCover(context); if (cover == null) { views.setViewVisibility(R.id.cover, View.INVISIBLE); } else { diff --git a/app/src/main/java/ch/blinkenlights/android/vanilla/MediaSessionTracker.java b/app/src/main/java/ch/blinkenlights/android/vanilla/MediaSessionTracker.java index fe41f39c..4660f1d4 100644 --- a/app/src/main/java/ch/blinkenlights/android/vanilla/MediaSessionTracker.java +++ b/app/src/main/java/ch/blinkenlights/android/vanilla/MediaSessionTracker.java @@ -114,7 +114,7 @@ public class MediaSessionTracker { .build(); if (song != null) { - final Bitmap cover = song.getCover(mContext); + final Bitmap cover = song.getMediumCover(mContext); MediaMetadataCompat.Builder metadataBuilder = new MediaMetadataCompat.Builder() .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, song.artist) .putString(MediaMetadataCompat.METADATA_KEY_ALBUM, song.album) diff --git a/app/src/main/java/ch/blinkenlights/android/vanilla/OneCellWidget.java b/app/src/main/java/ch/blinkenlights/android/vanilla/OneCellWidget.java index 047f26db..7b013856 100644 --- a/app/src/main/java/ch/blinkenlights/android/vanilla/OneCellWidget.java +++ b/app/src/main/java/ch/blinkenlights/android/vanilla/OneCellWidget.java @@ -118,7 +118,7 @@ public class OneCellWidget extends AppWidgetProvider { views.setInt(R.id.title, "setText", R.string.app_name); } else { views.setTextViewText(R.id.title, song.title); - cover = song.getCover(context); + cover = song.getMediumCover(context); } if (cover == null) { diff --git a/app/src/main/java/ch/blinkenlights/android/vanilla/PlaybackService.java b/app/src/main/java/ch/blinkenlights/android/vanilla/PlaybackService.java index 0cdb42fc..56998735 100644 --- a/app/src/main/java/ch/blinkenlights/android/vanilla/PlaybackService.java +++ b/app/src/main/java/ch/blinkenlights/android/vanilla/PlaybackService.java @@ -2119,7 +2119,7 @@ public final class PlaybackService extends Service public Notification createNotification(Song song, int state, int mode) { final boolean playing = (state & FLAG_PLAYING) != 0; - final Bitmap cover = song.getCover(this); + final Bitmap cover = song.getMediumCover(this); ComponentName service = new ComponentName(this, PlaybackService.class); diff --git a/app/src/main/java/ch/blinkenlights/android/vanilla/RemoteControlImplICS.java b/app/src/main/java/ch/blinkenlights/android/vanilla/RemoteControlImplICS.java index 7d6ba823..2d185f32 100644 --- a/app/src/main/java/ch/blinkenlights/android/vanilla/RemoteControlImplICS.java +++ b/app/src/main/java/ch/blinkenlights/android/vanilla/RemoteControlImplICS.java @@ -138,7 +138,7 @@ public class RemoteControlImplICS implements RemoteControl.Client { editor.putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, artist_album); editor.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, song.title); - Bitmap bitmap = song.getCover(mContext); + Bitmap bitmap = song.getMediumCover(mContext); if (bitmap != null && mShowCover == 1 && (isPlaying || keepPaused)) { // Create a copy of the cover art, since RemoteControlClient likes // to recycle what we give it. diff --git a/app/src/main/java/ch/blinkenlights/android/vanilla/Song.java b/app/src/main/java/ch/blinkenlights/android/vanilla/Song.java index 20d93784..f667f778 100644 --- a/app/src/main/java/ch/blinkenlights/android/vanilla/Song.java +++ b/app/src/main/java/ch/blinkenlights/android/vanilla/Song.java @@ -232,10 +232,20 @@ public class Song implements Comparable { * @param context A context to use. * @return The album art or null if no album art could be found */ - public Bitmap getCover(Context context) { + public Bitmap getLargeCover(Context context) { return getCoverInternal(context, CoverCache.SIZE_LARGE); } + /** + * Query the medium album art for this song. + * + * @param context A context to use. + * @return The album art or null if no album art could be found + */ + public Bitmap getMediumCover(Context context) { + return getCoverInternal(context, CoverCache.SIZE_MEDIUM); + } + /** * Query the small album art for this song. * diff --git a/app/src/main/java/ch/blinkenlights/android/vanilla/WidgetD.java b/app/src/main/java/ch/blinkenlights/android/vanilla/WidgetD.java index 68947d97..92857b94 100644 --- a/app/src/main/java/ch/blinkenlights/android/vanilla/WidgetD.java +++ b/app/src/main/java/ch/blinkenlights/android/vanilla/WidgetD.java @@ -105,7 +105,7 @@ public class WidgetD extends AppWidgetProvider { views.setViewVisibility(R.id.buttons, View.VISIBLE); views.setTextViewText(R.id.title, song.title); views.setTextViewText(R.id.artist, song.artist); - cover = song.getCover(context); + cover = song.getMediumCover(context); } if (cover == null) {