From 1f1762538fe0a2953fc464c6f23f2f588a687559 Mon Sep 17 00:00:00 2001 From: Jovche Mitrejchevski Date: Tue, 24 Jul 2018 08:16:53 +0200 Subject: [PATCH 1/4] Support vector drawables to be used as default artwork --- .../android/exoplayer2/ui/PlayerView.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java index e8d5e48927..87fd09771e 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java @@ -22,10 +22,15 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.RectF; +import android.graphics.drawable.Drawable; +import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.content.ContextCompat; +import android.support.v4.graphics.drawable.DrawableCompat; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -368,7 +373,7 @@ public class PlayerView extends FrameLayout { artworkView = findViewById(R.id.exo_artwork); this.useArtwork = useArtwork && artworkView != null; if (defaultArtworkId != 0) { - defaultArtwork = BitmapFactory.decodeResource(context.getResources(), defaultArtworkId); + defaultArtwork = loadFromResource(defaultArtworkId); } // Subtitle view. @@ -416,6 +421,21 @@ public class PlayerView extends FrameLayout { hideController(); } + private Bitmap loadFromResource(int defaultArtworkId) { + Drawable drawable = ContextCompat.getDrawable(getContext(), defaultArtworkId); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + drawable = (DrawableCompat.wrap(drawable)).mutate(); + } + + Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), + drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); + drawable.draw(canvas); + + return bitmap; + } + /** * Switches the view targeted by a given {@link Player}. * From 46232977f6d037497055660de3804017405544b3 Mon Sep 17 00:00:00 2001 From: Jovche Mitrejchevski Date: Thu, 26 Jul 2018 09:50:55 +0200 Subject: [PATCH 2/4] Convert defaultArtwork from Bitmap to Drawable Using bitmaps is still supported, but also this will allow using other types of drawables to be set as artwork. --- .../android/exoplayer2/ui/PlayerView.java | 55 ++++++++++--------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java index 87fd09771e..12447168db 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java @@ -25,6 +25,7 @@ import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.RectF; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Build; import android.support.annotation.NonNull; @@ -251,7 +252,7 @@ public class PlayerView extends FrameLayout { private Player player; private boolean useController; private boolean useArtwork; - private Bitmap defaultArtwork; + private Drawable defaultArtwork; private boolean showBuffering; private boolean keepContentOnPlayerReset; private @Nullable ErrorMessageProvider errorMessageProvider; @@ -373,7 +374,7 @@ public class PlayerView extends FrameLayout { artworkView = findViewById(R.id.exo_artwork); this.useArtwork = useArtwork && artworkView != null; if (defaultArtworkId != 0) { - defaultArtwork = loadFromResource(defaultArtworkId); + defaultArtwork = ContextCompat.getDrawable(getContext(), defaultArtworkId); } // Subtitle view. @@ -421,21 +422,6 @@ public class PlayerView extends FrameLayout { hideController(); } - private Bitmap loadFromResource(int defaultArtworkId) { - Drawable drawable = ContextCompat.getDrawable(getContext(), defaultArtworkId); - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - drawable = (DrawableCompat.wrap(drawable)).mutate(); - } - - Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), - drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(bitmap); - drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); - drawable.draw(canvas); - - return bitmap; - } - /** * Switches the view targeted by a given {@link Player}. * @@ -573,7 +559,7 @@ public class PlayerView extends FrameLayout { } /** Returns the default artwork to display. */ - public Bitmap getDefaultArtwork() { + public Drawable getDefaultArtwork() { return defaultArtwork; } @@ -584,6 +570,16 @@ public class PlayerView extends FrameLayout { * @param defaultArtwork the default artwork to display. */ public void setDefaultArtwork(Bitmap defaultArtwork) { + setDefaultArtwork(new BitmapDrawable(getResources(), defaultArtwork)); + } + + /** + * Sets the default artwork to display if {@code useArtwork} is {@code true} and no artwork is + * present in the media. + * + * @param defaultArtwork the default artwork to display + */ + public void setDefaultArtwork(Drawable defaultArtwork) { if (this.defaultArtwork != defaultArtwork) { this.defaultArtwork = defaultArtwork; updateForCurrentTrackSelections(/* isNewPlayer= */ false); @@ -1061,7 +1057,7 @@ public class PlayerView extends FrameLayout { } } } - if (setArtworkFromBitmap(defaultArtwork)) { + if (setDrawableArtwork(defaultArtwork)) { return; } } @@ -1075,21 +1071,30 @@ public class PlayerView extends FrameLayout { if (metadataEntry instanceof ApicFrame) { byte[] bitmapData = ((ApicFrame) metadataEntry).pictureData; Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapData, 0, bitmapData.length); - return setArtworkFromBitmap(bitmap); + return setArtworkFromBitmap(new BitmapDrawable(getResources(), bitmap)); } } return false; } - private boolean setArtworkFromBitmap(Bitmap bitmap) { - if (bitmap != null) { - int bitmapWidth = bitmap.getWidth(); - int bitmapHeight = bitmap.getHeight(); + private boolean setDrawableArtwork(Drawable drawable) { + if(drawable instanceof BitmapDrawable) { + return setArtworkFromBitmap(((BitmapDrawable) drawable)); + } else { + artworkView.setImageDrawable(drawable); + } + return true; + } + + private boolean setArtworkFromBitmap(BitmapDrawable bitmapDrawable) { + if (bitmapDrawable != null) { + int bitmapWidth = bitmapDrawable.getBitmap().getWidth(); + int bitmapHeight = bitmapDrawable.getBitmap().getHeight(); if (bitmapWidth > 0 && bitmapHeight > 0) { if (contentFrame != null) { contentFrame.setAspectRatio((float) bitmapWidth / bitmapHeight); } - artworkView.setImageBitmap(bitmap); + artworkView.setImageBitmap(bitmapDrawable.getBitmap()); artworkView.setVisibility(VISIBLE); return true; } From 72a2b82370bcfafacca3956ae3205751ab8b4f4d Mon Sep 17 00:00:00 2001 From: Jovche Mitrejchevski Date: Thu, 26 Jul 2018 12:26:29 +0200 Subject: [PATCH 3/4] Suggestions from Code Review --- .../android/exoplayer2/ui/PlayerView.java | 27 +++---------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java index 12447168db..f07bd81070 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java @@ -22,16 +22,13 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.RectF; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; -import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; -import android.support.v4.graphics.drawable.DrawableCompat; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -568,7 +565,9 @@ public class PlayerView extends FrameLayout { * present in the media. * * @param defaultArtwork the default artwork to display. + * @deprecated use (@link {@link #setDefaultArtwork(Drawable)} instead. */ + @Deprecated public void setDefaultArtwork(Bitmap defaultArtwork) { setDefaultArtwork(new BitmapDrawable(getResources(), defaultArtwork)); } @@ -1071,37 +1070,19 @@ public class PlayerView extends FrameLayout { if (metadataEntry instanceof ApicFrame) { byte[] bitmapData = ((ApicFrame) metadataEntry).pictureData; Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapData, 0, bitmapData.length); - return setArtworkFromBitmap(new BitmapDrawable(getResources(), bitmap)); + return setDrawableArtwork(new BitmapDrawable(getResources(), bitmap)); } } return false; } private boolean setDrawableArtwork(Drawable drawable) { - if(drawable instanceof BitmapDrawable) { - return setArtworkFromBitmap(((BitmapDrawable) drawable)); - } else { + if(drawable != null) { artworkView.setImageDrawable(drawable); } return true; } - private boolean setArtworkFromBitmap(BitmapDrawable bitmapDrawable) { - if (bitmapDrawable != null) { - int bitmapWidth = bitmapDrawable.getBitmap().getWidth(); - int bitmapHeight = bitmapDrawable.getBitmap().getHeight(); - if (bitmapWidth > 0 && bitmapHeight > 0) { - if (contentFrame != null) { - contentFrame.setAspectRatio((float) bitmapWidth / bitmapHeight); - } - artworkView.setImageBitmap(bitmapDrawable.getBitmap()); - artworkView.setVisibility(VISIBLE); - return true; - } - } - return false; - } - private void hideArtwork() { if (artworkView != null) { artworkView.setImageResource(android.R.color.transparent); // Clears any bitmap reference. From 5635ca27928d6b21a7b302bbe2368794b4f9150f Mon Sep 17 00:00:00 2001 From: Jovche Mitrejchevski Date: Fri, 27 Jul 2018 12:03:18 +0200 Subject: [PATCH 4/4] Reset aspect ratio --- .../main/java/com/google/android/exoplayer2/ui/PlayerView.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java index f07bd81070..7f7625d5d7 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java @@ -1079,6 +1079,9 @@ public class PlayerView extends FrameLayout { private boolean setDrawableArtwork(Drawable drawable) { if(drawable != null) { artworkView.setImageDrawable(drawable); + if(contentFrame != null) { + contentFrame.setAspectRatio(0); + } } return true; }