From 636e0053c5c7dd9c77b52a3003f20be656b607fb Mon Sep 17 00:00:00 2001 From: Adrian Ulrich Date: Fri, 20 Jun 2014 16:20:07 +0200 Subject: [PATCH] implement cover shadow loader --- res/values/translatable.xml | 3 +++ res/xml/preference_coverart.xml | 17 ++++++++---- .../android/vanilla/PlaybackService.java | 4 +++ .../android/vanilla/PrefKeys.java | 1 + .../blinkenlights/android/vanilla/Song.java | 27 ++++++++++++++++--- 5 files changed, 43 insertions(+), 9 deletions(-) diff --git a/res/values/translatable.xml b/res/values/translatable.xml index ec033c04..ea765870 100644 --- a/res/values/translatable.xml +++ b/res/values/translatable.xml @@ -212,6 +212,9 @@ THE SOFTWARE. Load artwork from folder Search for image files named cover.jpg, album.jpg or artwork.jpg and display them as album cover + Load artwork from hidden folder + Try to load artwork from \'/sdcard/Music/.vanilla/ARTIST/ALBUM.jpg\' + Double Tap Widget Double-tapping the 1x1 widget will open the player. Incurs a 400ms delay before the widget responds to actions. Use ScrobbleDroid API diff --git a/res/xml/preference_coverart.xml b/res/xml/preference_coverart.xml index 3614905e..1551f269 100644 --- a/res/xml/preference_coverart.xml +++ b/res/xml/preference_coverart.xml @@ -23,14 +23,21 @@ THE SOFTWARE. - + + + + diff --git a/src/ch/blinkenlights/android/vanilla/PlaybackService.java b/src/ch/blinkenlights/android/vanilla/PlaybackService.java index b2eec031..86baa2d4 100644 --- a/src/ch/blinkenlights/android/vanilla/PlaybackService.java +++ b/src/ch/blinkenlights/android/vanilla/PlaybackService.java @@ -416,6 +416,7 @@ public final class PlaybackService extends Service Song.mCoverLoadMode = settings.getBoolean(PrefKeys.COVERLOADER_ANDROID, true) ? Song.mCoverLoadMode | Song.COVER_MODE_ANDROID : Song.mCoverLoadMode & ~(Song.COVER_MODE_ANDROID); Song.mCoverLoadMode = settings.getBoolean(PrefKeys.COVERLOADER_VANILLA, true) ? Song.mCoverLoadMode | Song.COVER_MODE_VANILLA : Song.mCoverLoadMode & ~(Song.COVER_MODE_VANILLA); + Song.mCoverLoadMode = settings.getBoolean(PrefKeys.COVERLOADER_SHADOW , true) ? Song.mCoverLoadMode | Song.COVER_MODE_SHADOW : Song.mCoverLoadMode & ~(Song.COVER_MODE_SHADOW); mHeadsetOnly = settings.getBoolean(PrefKeys.HEADSET_ONLY, false); mStockBroadcast = settings.getBoolean(PrefKeys.STOCK_BROADCAST, false); @@ -778,6 +779,9 @@ public final class PlaybackService extends Service } else if (PrefKeys.COVERLOADER_VANILLA.equals(key)) { Song.mCoverLoadMode = settings.getBoolean(PrefKeys.COVERLOADER_VANILLA, true) ? Song.mCoverLoadMode | Song.COVER_MODE_VANILLA : Song.mCoverLoadMode & ~(Song.COVER_MODE_VANILLA); Song.mFlushCoverCache = true; + } else if (PrefKeys.COVERLOADER_SHADOW.equals(key)) { + Song.mCoverLoadMode = settings.getBoolean(PrefKeys.COVERLOADER_SHADOW, true) ? Song.mCoverLoadMode | Song.COVER_MODE_SHADOW : Song.mCoverLoadMode & ~(Song.COVER_MODE_SHADOW); + Song.mFlushCoverCache = true; } else if (PrefKeys.NOTIFICATION_INVERTED_COLOR.equals(key)) { updateNotification(); } else if (PrefKeys.HEADSET_ONLY.equals(key)) { diff --git a/src/ch/blinkenlights/android/vanilla/PrefKeys.java b/src/ch/blinkenlights/android/vanilla/PrefKeys.java index cf4b72ad..9ade8db3 100644 --- a/src/ch/blinkenlights/android/vanilla/PrefKeys.java +++ b/src/ch/blinkenlights/android/vanilla/PrefKeys.java @@ -34,6 +34,7 @@ public class PrefKeys { public static final String DEFAULT_PLAYLIST_ACTION = "default_playlist_action"; public static final String COVERLOADER_ANDROID = "coverloader_android"; public static final String COVERLOADER_VANILLA = "coverloader_vanilla"; + public static final String COVERLOADER_SHADOW = "coverloader_shadow"; public static final String DISABLE_LOCKSCREEN = "disable_lockscreen"; public static final String DISPLAY_MODE = "display_mode"; public static final String DOUBLE_TAP = "double_tap"; diff --git a/src/ch/blinkenlights/android/vanilla/Song.java b/src/ch/blinkenlights/android/vanilla/Song.java index 0099f8a1..0f9b1c56 100644 --- a/src/ch/blinkenlights/android/vanilla/Song.java +++ b/src/ch/blinkenlights/android/vanilla/Song.java @@ -66,6 +66,10 @@ public class Song implements Comparable { * Use vanilla musics cover load mechanism */ public static final int COVER_MODE_VANILLA = 0x2; + /** + * Use vanilla musics SHADOW cover load mechanism + */ + public static final int COVER_MODE_SHADOW = 0x4; public static final String[] EMPTY_PROJECTION = { @@ -167,10 +171,25 @@ public class Song implements Comparable { } } -/** - * fixme: add shadow folder (/sdcard/.covers/artist/album.jpg) - * and checkout why some files load partial (fd vs fis) - */ + if (inputStream == null && (mCoverLoadMode & COVER_MODE_SHADOW) != 0) { + String[] projection = new String [] { MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM }; + QueryTask query = MediaUtils.buildQuery(MediaUtils.TYPE_SONG, key.id, projection, null); + Cursor cursor = query.runQuery(mContext.getContentResolver()); + if (cursor.getCount() > 0) { + cursor.moveToNext(); + String thisArtist = cursor.getString(0); + String thisAlbum = cursor.getString(1); + String shadowPath = "/sdcard/Music/.vanilla/"+(thisArtist.replaceAll("/", "_"))+"/"+(thisAlbum.replaceAll("/", "_"))+".jpg"; + + File guessedFile = new File(shadowPath); + if (guessedFile.exists() && !guessedFile.isDirectory()) { + inputStream = new FileInputStream(guessedFile); + sampleInputStream = new FileInputStream(guessedFile); + } + } + cursor.close(); + } + if (inputStream == null && (mCoverLoadMode & COVER_MODE_ANDROID) != 0) { Uri uri = Uri.parse("content://media/external/audio/media/" + key.id + "/albumart"); ContentResolver res = mContext.getContentResolver();