diff --git a/app/src/main/java/com/cappielloantonio/tempo/glide/CustomGlideRequest.java b/app/src/main/java/com/cappielloantonio/tempo/glide/CustomGlideRequest.java index 60596afd..0f4740ac 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/glide/CustomGlideRequest.java +++ b/app/src/main/java/com/cappielloantonio/tempo/glide/CustomGlideRequest.java @@ -5,6 +5,9 @@ import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.util.Log; +import androidx.annotation.Nullable; +import androidx.appcompat.content.res.AppCompatResources; + import com.bumptech.glide.Glide; import com.bumptech.glide.RequestBuilder; import com.bumptech.glide.RequestManager; @@ -15,6 +18,7 @@ import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.signature.ObjectKey; import com.cappielloantonio.tempo.App; +import com.cappielloantonio.tempo.R; import com.cappielloantonio.tempo.util.Preferences; import com.cappielloantonio.tempo.util.Util; import com.google.android.material.elevation.SurfaceColors; @@ -28,10 +32,49 @@ public class CustomGlideRequest { public static final DiskCacheStrategy DEFAULT_DISK_CACHE_STRATEGY = DiskCacheStrategy.ALL; - public static RequestOptions createRequestOptions(Context context, String item) { + public enum ResourceType { + Unknown, + Album, + Artist, + Directory, + Playlist, + Podcast, + Radio, + Song, + } + + public static RequestOptions createRequestOptions(Context context, String item, ResourceType type) { + Drawable drawable = new ColorDrawable(SurfaceColors.SURFACE_5.getColor(context)); + if (type != ResourceType.Unknown) { + int res = 0; + switch (type) { + case Album: + res = R.drawable.ic_album_placeholder; + break; + case Artist: + res = R.drawable.ic_artist_placeholder; + break; + case Directory: + res = R.drawable.ic_directory_placeholder; + break; + case Playlist: + res = R.drawable.ic_playlist_placeholder; + break; + case Podcast: + res = R.drawable.ic_podcast_placeholder; + break; + case Radio: + res = R.drawable.ic_radio_placeholder; + break; + case Song: + res = R.drawable.ic_song_placeholder; + break; + } + drawable = AppCompatResources.getDrawable(context, res); + } return new RequestOptions() - .placeholder(new ColorDrawable(SurfaceColors.SURFACE_5.getColor(context))) - .fallback(new ColorDrawable(SurfaceColors.SURFACE_5.getColor(context))) + .placeholder(drawable) + .fallback(drawable) .error(new ColorDrawable(SurfaceColors.SURFACE_5.getColor(context))) .diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY) .signature(new ObjectKey(item != null ? item : 0)) @@ -72,18 +115,22 @@ public class CustomGlideRequest { private final RequestManager requestManager; private Object item; - private Builder(Context context, String item) { + private Builder(Context context, String item, ResourceType type) { this.requestManager = Glide.with(context); if (item != null && !Preferences.isDataSavingMode()) { this.item = createUrl(item, Preferences.getImageSize()); } - requestManager.applyDefaultRequestOptions(createRequestOptions(context, item)); + requestManager.applyDefaultRequestOptions(createRequestOptions(context, item, type)); + } + + public static Builder from(Context context, String item, @Nullable ResourceType type) { + return new Builder(context, item, type); } public static Builder from(Context context, String item) { - return new Builder(context, item); + return Builder.from(context, item, ResourceType.Unknown); } public RequestBuilder build() { diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/AlbumAdapter.java b/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/AlbumAdapter.java index b565599b..7be8475b 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/AlbumAdapter.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/AlbumAdapter.java @@ -42,7 +42,7 @@ public class AlbumAdapter extends RecyclerView.Adapter holder.item.artistNameLabel.setText(MusicUtil.getReadableString(album.getArtist())); CustomGlideRequest.Builder - .from(holder.itemView.getContext(), album.getCoverArtId()) + .from(holder.itemView.getContext(), album.getCoverArtId(), CustomGlideRequest.ResourceType.Album) .build() .into(holder.item.albumCoverImageView); } diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/AlbumArtistPageOrSimilarAdapter.java b/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/AlbumArtistPageOrSimilarAdapter.java index b1b89a4f..cc10d792 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/AlbumArtistPageOrSimilarAdapter.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/AlbumArtistPageOrSimilarAdapter.java @@ -42,7 +42,7 @@ public class AlbumArtistPageOrSimilarAdapter extends RecyclerView.Adapter 0 ? songs.get(0).getCoverArtId() : playlistPageViewModel.getPlaylist().getCoverArtId()) + .from(requireContext(), songs.size() > 0 ? songs.get(0).getCoverArtId() : playlistPageViewModel.getPlaylist().getCoverArtId(), CustomGlideRequest.ResourceType.Song) .build() .transform(new GranularRoundedCorners(CustomGlideRequest.CORNER_RADIUS, 0, 0, 0)) .into(bind.playlistCoverImageViewTopLeft); // Pic top-right CustomGlideRequest.Builder - .from(requireContext(), songs.size() > 1 ? songs.get(1).getCoverArtId() : playlistPageViewModel.getPlaylist().getCoverArtId()) + .from(requireContext(), songs.size() > 1 ? songs.get(1).getCoverArtId() : playlistPageViewModel.getPlaylist().getCoverArtId(), CustomGlideRequest.ResourceType.Song) .build() .transform(new GranularRoundedCorners(0, CustomGlideRequest.CORNER_RADIUS, 0, 0)) .into(bind.playlistCoverImageViewTopRight); // Pic bottom-left CustomGlideRequest.Builder - .from(requireContext(), songs.size() > 2 ? songs.get(2).getCoverArtId() : playlistPageViewModel.getPlaylist().getCoverArtId()) + .from(requireContext(), songs.size() > 2 ? songs.get(2).getCoverArtId() : playlistPageViewModel.getPlaylist().getCoverArtId(), CustomGlideRequest.ResourceType.Song) .build() .transform(new GranularRoundedCorners(0, 0, 0, CustomGlideRequest.CORNER_RADIUS)) .into(bind.playlistCoverImageViewBottomLeft); // Pic bottom-right CustomGlideRequest.Builder - .from(requireContext(), songs.size() > 3 ? songs.get(3).getCoverArtId() : playlistPageViewModel.getPlaylist().getCoverArtId()) + .from(requireContext(), songs.size() > 3 ? songs.get(3).getCoverArtId() : playlistPageViewModel.getPlaylist().getCoverArtId(), CustomGlideRequest.ResourceType.Song) .build() .transform(new GranularRoundedCorners(0, 0, CustomGlideRequest.CORNER_RADIUS, 0)) .into(bind.playlistCoverImageViewBottomRight); diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java index 2b914eb2..8f1868fe 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java @@ -79,7 +79,7 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements private void init(View view) { ImageView coverAlbum = view.findViewById(R.id.album_cover_image_view); CustomGlideRequest.Builder - .from(requireContext(), albumBottomSheetViewModel.getAlbum().getCoverArtId()) + .from(requireContext(), albumBottomSheetViewModel.getAlbum().getCoverArtId(), CustomGlideRequest.ResourceType.Album) .build() .into(coverAlbum); diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java index 16686a3e..e2fdded7 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java @@ -70,7 +70,7 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement private void init(View view) { ImageView coverArtist = view.findViewById(R.id.artist_cover_image_view); CustomGlideRequest.Builder - .from(requireContext(), artistBottomSheetViewModel.getArtist().getCoverArtId()) + .from(requireContext(), artistBottomSheetViewModel.getArtist().getCoverArtId(), CustomGlideRequest.ResourceType.Artist) .build() .into(coverArtist); diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/PodcastChannelBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/PodcastChannelBottomSheetDialog.java index e4ce8702..87dc45cc 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/PodcastChannelBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/PodcastChannelBottomSheetDialog.java @@ -63,7 +63,7 @@ public class PodcastChannelBottomSheetDialog extends BottomSheetDialogFragment i ImageView coverPodcast = view.findViewById(R.id.podcast_cover_image_view); CustomGlideRequest.Builder - .from(requireContext(), podcastChannelBottomSheetViewModel.getPodcastChannel().getCoverArtId()) + .from(requireContext(), podcastChannelBottomSheetViewModel.getPodcastChannel().getCoverArtId(), CustomGlideRequest.ResourceType.Podcast) .build() .into(coverPodcast); diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/PodcastEpisodeBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/PodcastEpisodeBottomSheetDialog.java index 70fdaac5..18f81668 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/PodcastEpisodeBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/PodcastEpisodeBottomSheetDialog.java @@ -65,7 +65,7 @@ public class PodcastEpisodeBottomSheetDialog extends BottomSheetDialogFragment i ImageView coverPodcast = view.findViewById(R.id.podcast_cover_image_view); CustomGlideRequest.Builder - .from(requireContext(), podcastEpisodeBottomSheetViewModel.getPodcastEpisode().getCoverArtId()) + .from(requireContext(), podcastEpisodeBottomSheetViewModel.getPodcastEpisode().getCoverArtId(), CustomGlideRequest.ResourceType.Podcast) .build() .into(coverPodcast); diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java index 1f1f2fa4..ccbf3ef0 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java @@ -74,7 +74,7 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements private void init(View view) { ImageView coverSong = view.findViewById(R.id.song_cover_image_view); CustomGlideRequest.Builder - .from(requireContext(), songBottomSheetViewModel.getSong().getCoverArtId()) + .from(requireContext(), songBottomSheetViewModel.getSong().getCoverArtId(), CustomGlideRequest.ResourceType.Song) .build() .into(coverSong); diff --git a/app/src/main/res/drawable/ic_album_placeholder.xml b/app/src/main/res/drawable/ic_album_placeholder.xml new file mode 100644 index 00000000..8c90306d --- /dev/null +++ b/app/src/main/res/drawable/ic_album_placeholder.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/ic_artist_placeholder.xml b/app/src/main/res/drawable/ic_artist_placeholder.xml new file mode 100644 index 00000000..f6b215c0 --- /dev/null +++ b/app/src/main/res/drawable/ic_artist_placeholder.xml @@ -0,0 +1,19 @@ + + + + diff --git a/app/src/main/res/drawable/ic_directory_placeholder.xml b/app/src/main/res/drawable/ic_directory_placeholder.xml new file mode 100644 index 00000000..0fd911bf --- /dev/null +++ b/app/src/main/res/drawable/ic_directory_placeholder.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/ic_playlist_placeholder.xml b/app/src/main/res/drawable/ic_playlist_placeholder.xml new file mode 100644 index 00000000..a367231b --- /dev/null +++ b/app/src/main/res/drawable/ic_playlist_placeholder.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/ic_podcast_placeholder.xml b/app/src/main/res/drawable/ic_podcast_placeholder.xml new file mode 100644 index 00000000..eac90bb3 --- /dev/null +++ b/app/src/main/res/drawable/ic_podcast_placeholder.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/ic_radio_placeholder.xml b/app/src/main/res/drawable/ic_radio_placeholder.xml new file mode 100644 index 00000000..407f4ef6 --- /dev/null +++ b/app/src/main/res/drawable/ic_radio_placeholder.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/ic_song_placeholder.xml b/app/src/main/res/drawable/ic_song_placeholder.xml new file mode 100644 index 00000000..673427cd --- /dev/null +++ b/app/src/main/res/drawable/ic_song_placeholder.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/layout/item_home_discover_song.xml b/app/src/main/res/layout/item_home_discover_song.xml index a6823895..f2d3bb9b 100644 --- a/app/src/main/res/layout/item_home_discover_song.xml +++ b/app/src/main/res/layout/item_home_discover_song.xml @@ -8,6 +8,7 @@ android:id="@+id/discover_song_cover_image_view" android:layout_width="match_parent" android:layout_height="196dp" + android:background="?attr/colorSurfaceContainerHighest" android:foreground="@drawable/gradient_discover_background_image" />