From cd847f4a93ef5e5854873623f6fb113b91f27aa5 Mon Sep 17 00:00:00 2001 From: Christopher Eby Date: Fri, 14 Oct 2011 16:05:45 -0500 Subject: [PATCH] Add default cover for no info modes The improves swiping: before, with no default cover, one just swiped a black screen with no scrolling feedback, which was rather unintuitive. --- orig/default_cover.svgz | Bin 0 -> 1489 bytes res/drawable-hdpi/default_cover.png | Bin 0 -> 13952 bytes res/drawable-mdpi/default_cover.png | Bin 0 -> 6105 bytes src/org/kreed/vanilla/CoverBitmap.java | 90 ++++++++++++++----------- src/org/kreed/vanilla/CoverView.java | 51 ++++++++++++-- 5 files changed, 96 insertions(+), 45 deletions(-) create mode 100644 orig/default_cover.svgz create mode 100644 res/drawable-hdpi/default_cover.png create mode 100644 res/drawable-mdpi/default_cover.png diff --git a/orig/default_cover.svgz b/orig/default_cover.svgz new file mode 100644 index 0000000000000000000000000000000000000000..df377ad2e1922b0ae7e52292d268798d36a82162 GIT binary patch literal 1489 zcmV;?1ups@iwFP!000000F75!Z`(K!e$TJqDlaWo2T7e&>=f7rEedRRfo+R@T+kA2 z3(;Xvl8^lQ4kc2u6Q>&+fyuePnc;ATS$sHFCE5$w7EQghh>I;G>a59&db6~CeE;Mm z7HT_Q=e%rcv9#*O`fz`<_|0+9M=5wGa&#!VE&5VFwi(|E^lsaAyVUazhl5*aqT9%g z_Z~UU{mspy-EVFXLV#PhX`U@Dt+4B5ISA&NCrVL?x@$e+63?2&vspY-=*3=SO;t5@ zJ80JJ?U}I5*ORpJ=HL%PgfZq}>QU-|gwvktjvt*%Rq*keD#aLkz?&uCCY2sbNX4tp z4BT^cNdFH0CIv%q+oqS9Sc9f;YteZR-ybHXgWbH#&&-(YU*KLGNzE(K?sz6z&(H_` zLy>per4=N*2c)*3@6kL9mJTE|J zlp7^4IeroaS_ib+uGtw`@S{7G0IrBm)|8D*Z-YpE?*>u>r&e^Ql-yafPP1OO0*(ov z(T0-(4Zw;lnj01MuLMy{hJ6WYSN4ExtvGN%J>lp+KBygcwzJAn+BCEZE^m;3fg zK7W<&cxE5T(h6Nd3GvxPJOMGFE=|Ii__HXzCJMyBWh{*2IGU&%4fUfgI_M33E95tI zzy7X&v|>&OlzJ!Rn?qKij4D1O(OfZW@tOB+Tk!givX^J4@P7u?f#(lmUqA;P?mD z4J#Tx7c5Jow@7QJ8s z9!=bYP!`88n7x!x6i&%c0)iTT%&lp+&0!-|ayr?I=bDP+tX9qOI@`1*ryuK0cV}(2 zFLKeoVps8gVfawgkRwOW0TLxIGN~oZWFQ#(uZSGyhV-1Jk`}(gtN5{~iYJk)4l~x= zq7og?dB^99G8D=fHtiRtdiu}9r|FtxS^94yALqhW0({l<;P-TyR8!AVn5-4=?u!cQ zM2+y@VUj{^PmBxU?z9uL(a|i7s9{83ebwYyRVXFzTL<&(ivl@o$=YbqmEwND9G4~v zPlsVH-&vFk&!l14ZRYe`l-iWxlCMO$wEk2~^n$yQO~0#P?rL?D)*bJ*##KEppaGOA z1o-YnBaVajcZz#9I)<(6OBlR+Q8#%Gvqd(KBE1!X`s(dibSXAlNSTl<PzIBC}CV z$T{3131X{iyg*ZZi z>j#)p7TGj%Sro%uM9>JLB%+Mie(3tdk8y%1G$fz;VPFTo8->sakWbwt@}Zm90fPGDTAJPd$z$c;kukyfCIZH&a|>Eb1!?lH8> ra3;>rg}R34LL(iRSbN^}QmEdoo3FQl|NB%^yubMgG&~stHVyy)&GpR3 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/default_cover.png b/res/drawable-hdpi/default_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..ea714f249b88e8f945268015cd4340e15e435fb9 GIT binary patch literal 13952 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 literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/default_cover.png b/res/drawable-mdpi/default_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..dbecaa7075332cfa95556bb8f1a64ae811a5ee92 GIT binary patch literal 6105 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 Z?)C@C1zkHkyVqlQKwDi;twGf$;y)Rn*0KNq literal 0 HcmV?d00001 diff --git a/src/org/kreed/vanilla/CoverBitmap.java b/src/org/kreed/vanilla/CoverBitmap.java index 0484f96f..e698dc1b 100644 --- a/src/org/kreed/vanilla/CoverBitmap.java +++ b/src/org/kreed/vanilla/CoverBitmap.java @@ -136,15 +136,18 @@ public final class CoverBitmap { */ public static Bitmap createBitmap(Context context, int style, Song song, int width, int height, Bitmap bitmap) { + if (song == null) + return null; + switch (style) { case STYLE_OVERLAPPING_BOX: return createOverlappingBitmap(context, song, width, height, bitmap); case STYLE_INFO_BELOW: return createSeparatedBitmap(context, song, width, height, bitmap); case STYLE_NO_INFO: - return createScaledBitmap(context, song, width, height, bitmap); + return createScaledBitmap(song.getCover(context), width, height, bitmap); case STYLE_NO_INFO_ZOOMED: - return createZoomedBitmap(context, song, width, height, bitmap); + return createZoomedBitmap(song.getCover(context), width, height, bitmap); default: throw new IllegalArgumentException("Invalid bitmap type given: " + style); } @@ -152,7 +155,7 @@ public final class CoverBitmap { private static Bitmap createOverlappingBitmap(Context context, Song song, int width, int height, Bitmap bitmap) { - if (song == null || width < 1 || height < 1) + if (width < 1 || height < 1) return null; if (TEXT_SIZE == -1) @@ -246,7 +249,7 @@ public final class CoverBitmap { private static Bitmap createSeparatedBitmap(Context context, Song song, int width, int height, Bitmap bitmap) { - if (song == null || width < 1 || height < 1) + if (width < 1 || height < 1) return null; if (TEXT_SIZE == -1) @@ -346,69 +349,76 @@ public final class CoverBitmap { return bitmap; } - private static Bitmap createZoomedBitmap(Context context, Song song, int width, int height, Bitmap bitmap) + /** + * Scales a bitmap to completely fill a rectangle of the given size. Aspect + * ratio is preserved, thus, parts of the image will be cut off if the + * aspect ratio of the rectangle does not match that of the source bitmap. + * + * @param source The source bitmap. + * @param width Width of the result + * @param height Height of the result + * @param reuse A bitmap to store the result in if possible + * @return The zoomed bitmap. + */ + public static Bitmap createZoomedBitmap(Bitmap source, int width, int height, Bitmap reuse) { - if (song == null || width < 1 || height < 1) + if (source == null || width < 1 || height < 1) return null; - Bitmap cover = song.getCover(context); - if (cover == null) - return null; + Bitmap bitmap = null; - if (bitmap != null && (bitmap.getHeight() != height || bitmap.getWidth() != width)) { - bitmap.recycle(); - bitmap = null; + if (reuse != null) { + if (reuse.getHeight() == height && reuse.getWidth() == width) + bitmap = reuse; + else + reuse.recycle(); } if (bitmap == null) bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); - int coverWidth = cover.getWidth(); - int coverHeight = cover.getHeight(); + int sourceWidth = source.getWidth(); + int sourceHeight = source.getHeight(); int size = Math.max(width, height); - float scale = coverWidth < coverHeight ? (float)size / coverWidth : (float)size / coverHeight; + float scale = sourceWidth < sourceHeight ? (float)size / sourceWidth : (float)size / sourceHeight; - int srcWidth = (int)(Math.min(width, coverWidth * scale) / scale); - int srcHeight = (int)(Math.min(height, coverHeight * scale) / scale); - int xOffset = (coverWidth - srcWidth) / 2; - int yOffset = (coverHeight - srcHeight) / 2; - Rect src = new Rect(xOffset, yOffset, coverWidth - xOffset, coverHeight - yOffset); + int srcWidth = (int)(Math.min(width, sourceWidth * scale) / scale); + int srcHeight = (int)(Math.min(height, sourceHeight * scale) / scale); + int xOffset = (sourceWidth - srcWidth) / 2; + int yOffset = (sourceHeight - srcHeight) / 2; + Rect src = new Rect(xOffset, yOffset, sourceWidth - xOffset, sourceHeight - yOffset); Rect dest = new Rect(0, 0, width, height); - canvas.drawBitmap(cover, src, dest, null); + canvas.drawBitmap(source, src, dest, null); return bitmap; } /** - * Scales a cover to fit in a rectangle of the given size. Aspect ratio is + * Scales a bitmap to fit in a rectangle of the given size. Aspect ratio is * preserved. At least one dimension of the result will match the provided * dimension exactly. * - * @param context A context to use. - * @param song The song to display information for + * @param source The source bitmap. * @param width Maximum width of image * @param height Maximum height of image - * @param bitmap A bitmap that will simply be recycled. - * @return The scaled Bitmap, or null if a cover could not be found. + * @param reuse A bitmap that will simply be recycled. (This method does not + * support reuse.) + * @return The scaled bitmap. */ - private static Bitmap createScaledBitmap(Context context, Song song, int width, int height, Bitmap bitmap) + public static Bitmap createScaledBitmap(Bitmap source, int width, int height, Bitmap reuse) { - if (song == null || width < 1 || height < 1) + if (source == null || width < 1 || height < 1) return null; - if (bitmap != null) - bitmap.recycle(); + if (reuse != null) + reuse.recycle(); - Bitmap cover = song.getCover(context); - if (cover == null) - return null; - - int coverWidth = cover.getWidth(); - int coverHeight = cover.getHeight(); - float scale = Math.min((float)width / coverWidth, (float)height / coverHeight); - coverWidth *= scale; - coverHeight *= scale; - return Bitmap.createScaledBitmap(cover, coverWidth, coverHeight, false); + int sourceWidth = source.getWidth(); + int sourceHeight = source.getHeight(); + float scale = Math.min((float)width / sourceWidth, (float)height / sourceHeight); + sourceWidth *= scale; + sourceHeight *= scale; + return Bitmap.createScaledBitmap(source, sourceWidth, sourceHeight, false); } } diff --git a/src/org/kreed/vanilla/CoverView.java b/src/org/kreed/vanilla/CoverView.java index e6100754..5b39c4a9 100644 --- a/src/org/kreed/vanilla/CoverView.java +++ b/src/org/kreed/vanilla/CoverView.java @@ -24,6 +24,7 @@ package org.kreed.vanilla; import android.content.Context; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.os.Handler; @@ -75,6 +76,10 @@ public final class CoverView extends View implements Handler.Callback { * Cache of cover bitmaps generated for songs. The song ids are the keys. */ private final Cache mBitmapCache = new Cache(8); + /** + * Cover art to use when a song has no cover art in no info display styles. + */ + private Bitmap mDefaultCover; private final Scroller mScroller; private VelocityTracker mVelocityTracker; @@ -126,6 +131,32 @@ public final class CoverView extends View implements Handler.Callback { scrollTo(getWidth(), 0); } + /** + * Create the cover to show when a song has no cover art. Only used in the + * no info modes. + * + * @return The default cover, now also stored in mDefaultCover. + */ + private Bitmap generateDefaultCover() + { + int style = mCoverStyle; + Bitmap result = null; + + if (style == CoverBitmap.STYLE_NO_INFO || style == CoverBitmap.STYLE_NO_INFO_ZOOMED) { + Bitmap def = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.default_cover); + int width = getWidth(); + int height = getHeight(); + + if (style == CoverBitmap.STYLE_NO_INFO) + result = CoverBitmap.createScaledBitmap(def, width, height, null); + else + result = CoverBitmap.createZoomedBitmap(def, width, height, null); + } + + mDefaultCover = result; + return result; + } + /** * Recreate all the necessary cached bitmaps. */ @@ -137,6 +168,7 @@ public final class CoverView extends View implements Handler.Callback { ((Bitmap)bitmaps[i]).recycle(); bitmaps[i] = null; } + mDefaultCover = null; for (int i = 3; --i != -1; ) setSong(i, mSongs[i]); } @@ -317,12 +349,21 @@ public final class CoverView extends View implements Handler.Callback { if (song == null || song.id == -1) return; - Bitmap bitmap = CoverBitmap.createBitmap(getContext(), mCoverStyle, song, getWidth(), getHeight(), mBitmapCache.discardOldest()); - if (bitmap != null) { - mBitmaps[i] = bitmap; - mBitmapCache.put(song.id, bitmap); - postInvalidate(); + Bitmap reuse = mBitmapCache.discardOldest(); + if (reuse == mDefaultCover) + reuse = null; + + int style = mCoverStyle; + Bitmap bitmap = CoverBitmap.createBitmap(getContext(), style, song, getWidth(), getHeight(), reuse); + if (bitmap == null && (style == CoverBitmap.STYLE_NO_INFO || style == CoverBitmap.STYLE_NO_INFO_ZOOMED)) { + bitmap = mDefaultCover; + if (bitmap == null) + bitmap = generateDefaultCover(); } + + mBitmaps[i] = bitmap; + mBitmapCache.put(song.id, bitmap); + postInvalidate(); } /**