Merge "Show placeholder when art fails to load / blocking unsupported media art." into pi-car-dev
diff --git a/car-media-common/src/com/android/car/media/common/MediaItemMetadata.java b/car-media-common/src/com/android/car/media/common/MediaItemMetadata.java
index d1a3a92..b3c9841 100644
--- a/car-media-common/src/com/android/car/media/common/MediaItemMetadata.java
+++ b/car-media-common/src/com/android/car/media/common/MediaItemMetadata.java
@@ -48,6 +48,9 @@
 
 import com.bumptech.glide.Glide;
 import com.bumptech.glide.RequestBuilder;
+import com.bumptech.glide.load.DataSource;
+import com.bumptech.glide.load.engine.GlideException;
+import com.bumptech.glide.request.RequestListener;
 import com.bumptech.glide.request.RequestOptions;
 import com.bumptech.glide.request.target.SimpleTarget;
 import com.bumptech.glide.request.target.Target;
@@ -276,18 +279,37 @@
         }
         Uri imageUri = metadata.getAlbumArtUri();
         if (imageUri != null) {
+            boolean hasArtwork = false;
             if (UriUtils.isAndroidResourceUri(imageUri)) {
                 // Glide doesn't support loading resources from other applications
                 Drawable pic = UriUtils.getDrawable(context, UriUtils.getIconResource(imageUri));
                 if (pic != null) {
+                    hasArtwork = true;
                     imageView.setImageDrawable(pic);
                 } else {
                     Log.e(TAG, "Unable to load resource " + imageUri);
                 }
             } else if (flagInvalidArt || UriUtils.isContentUri(imageUri)) {
+                hasArtwork = true;
                 Glide.with(context)
                         .load(imageUri)
                         .apply(RequestOptions.placeholderOf(loadingIndicator))
+                        .listener(new RequestListener<Drawable>() {
+                            @Override
+                            public boolean onLoadFailed(@Nullable GlideException e, Object model,
+                                    Target<Drawable> target, boolean isFirstResource) {
+                                showPlaceholderOrHideView(context, metadata, imageView,
+                                        showPlaceholder);
+                                return true;
+                            }
+
+                            @Override
+                            public boolean onResourceReady(Drawable resource, Object model,
+                                    Target<Drawable> target, DataSource dataSource,
+                                    boolean isFirstResource) {
+                                return false;
+                            }
+                        })
                         .into(imageView);
                 if (!UriUtils.isContentUri(imageUri)) {
                     imageView.setColorFilter(INVALID_MEDIA_ART_TINT_COLOR);
@@ -296,10 +318,16 @@
                 Log.e(TAG, "unsupported uri: " + imageUri);
             }
 
-            imageView.setVisibility(View.VISIBLE);
-            return;
+            if (hasArtwork) {
+                imageView.setVisibility(View.VISIBLE);
+                return;
+            }
         }
+        showPlaceholderOrHideView(context, metadata, imageView, showPlaceholder);
+    }
 
+    private static void showPlaceholderOrHideView(Context context,
+            @Nullable MediaItemMetadata metadata, ImageView imageView, boolean showPlaceholder) {
         if (showPlaceholder) {
             imageView.setImageDrawable(getPlaceholderDrawable(context, metadata));
             imageView.setVisibility(View.VISIBLE);