From be2c4dcb9a115aa58008d431df87717087b2b1f0 Mon Sep 17 00:00:00 2001 From: jarnedemeulemeester Date: Wed, 25 Aug 2021 18:01:18 +0200 Subject: [PATCH] Improve image loading --- .../dev/jdtech/jellyfin/BindingAdapters.kt | 90 +++++++++---------- app/src/main/res/layout/collection_item.xml | 2 +- .../main/res/layout/episode_bottom_sheet.xml | 2 +- app/src/main/res/layout/episode_item.xml | 2 +- .../main/res/layout/fragment_media_info.xml | 2 +- app/src/main/res/layout/home_episode_item.xml | 2 +- 6 files changed, 47 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt b/app/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt index 40315453..cf6c6580 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt @@ -11,6 +11,7 @@ import dev.jdtech.jellyfin.database.Server import dev.jdtech.jellyfin.models.FavoriteSection import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemPerson +import org.jellyfin.sdk.model.api.ImageType import java.util.* @BindingAdapter("servers") @@ -35,11 +36,12 @@ fun bindItems(recyclerView: RecyclerView, data: List?) { fun bindItemImage(imageView: ImageView, item: BaseItemDto) { val jellyfinApi = JellyfinApi.getInstance(imageView.context.applicationContext, "") - val itemId = if (item.type == "Episode") item.seriesId else item.id + val itemId = + if (item.type == "Episode" || item.type == "Season" && item.imageTags.isNullOrEmpty()) item.seriesId else item.id Glide .with(imageView.context) - .load(jellyfinApi.api.baseUrl.plus("/items/${itemId}/Images/Primary")) + .load(jellyfinApi.api.baseUrl.plus("/items/${itemId}/Images/${ImageType.PRIMARY}")) .transition(DrawableTransitionOptions.withCrossFade()) .placeholder(R.color.neutral_800) .into(imageView) @@ -49,17 +51,16 @@ fun bindItemImage(imageView: ImageView, item: BaseItemDto) { @BindingAdapter("itemBackdropImage") fun bindItemBackdropImage(imageView: ImageView, item: BaseItemDto?) { - if (item != null) { - val jellyfinApi = JellyfinApi.getInstance(imageView.context.applicationContext, "") + if (item == null) return + val jellyfinApi = JellyfinApi.getInstance(imageView.context.applicationContext, "") - Glide - .with(imageView.context) - .load(jellyfinApi.api.baseUrl.plus("/items/${item.id}/Images/Backdrop")) - .transition(DrawableTransitionOptions.withCrossFade()) - .into(imageView) + Glide + .with(imageView.context) + .load(jellyfinApi.api.baseUrl.plus("/items/${item.id}/Images/${ImageType.BACKDROP}")) + .transition(DrawableTransitionOptions.withCrossFade()) + .into(imageView) - imageView.contentDescription = "${item.name} backdrop" - } + imageView.contentDescription = "${item.name} backdrop" } @BindingAdapter("itemBackdropById") @@ -68,7 +69,7 @@ fun bindItemBackdropById(imageView: ImageView, itemId: UUID) { Glide .with(imageView.context) - .load(jellyfinApi.api.baseUrl.plus("/items/${itemId}/Images/Backdrop")) + .load(jellyfinApi.api.baseUrl.plus("/items/${itemId}/Images/${ImageType.BACKDROP}")) .transition(DrawableTransitionOptions.withCrossFade()) .into(imageView) } @@ -79,20 +80,6 @@ fun bindCollections(recyclerView: RecyclerView, data: List?) { adapter.submitList(data) } -@BindingAdapter("collectionImage") -fun bindCollectionImage(imageView: ImageView, item: BaseItemDto) { - val jellyfinApi = JellyfinApi.getInstance(imageView.context.applicationContext, "") - - Glide - .with(imageView.context) - .load(jellyfinApi.api.baseUrl.plus("/items/${item.id}/Images/Primary")) - .transition(DrawableTransitionOptions.withCrossFade()) - .placeholder(R.color.neutral_800) - .into(imageView) - - imageView.contentDescription = "${item.name} image" -} - @BindingAdapter("people") fun bindPeople(recyclerView: RecyclerView, data: List?) { val adapter = recyclerView.adapter as PersonListAdapter @@ -105,7 +92,7 @@ fun bindPersonImage(imageView: ImageView, person: BaseItemPerson) { Glide .with(imageView.context) - .load(jellyfinApi.api.baseUrl.plus("/items/${person.id}/Images/Primary")) + .load(jellyfinApi.api.baseUrl.plus("/items/${person.id}/Images/${ImageType.PRIMARY}")) .transition(DrawableTransitionOptions.withCrossFade()) .placeholder(R.color.neutral_800) .into(imageView) @@ -125,15 +112,38 @@ fun bindHomeEpisodes(recyclerView: RecyclerView, data: List?) { adapter.submitList(data) } -@BindingAdapter("episodeImage") -fun bindEpisodeImage(imageView: ImageView, episode: BaseItemDto) { +@BindingAdapter("baseItemImage") +fun bindBaseItemImage(imageView: ImageView, episode: BaseItemDto?) { + if (episode == null) return + val jellyfinApi = JellyfinApi.getInstance(imageView.context.applicationContext, "") - val imageType = if (episode.type == "Movie") "Backdrop" else "Primary" + var imageItemId = episode.id + var imageType = ImageType.PRIMARY + + if (!episode.imageTags.isNullOrEmpty()) { + when (episode.type) { + "Movie" -> { + if (episode.imageTags!!.keys.contains(ImageType.BACKDROP)) { + imageType = ImageType.BACKDROP + } + } + else -> { + if (!episode.imageTags!!.keys.contains(ImageType.PRIMARY)) { + imageType = ImageType.BACKDROP + } + } + } + } else { + if (episode.type == "Episode") { + imageItemId = episode.seriesId!! + imageType = ImageType.BACKDROP + } + } Glide .with(imageView.context) - .load(jellyfinApi.api.baseUrl.plus("/items/${episode.id}/Images/$imageType")) + .load(jellyfinApi.api.baseUrl.plus("/items/${imageItemId}/Images/$imageType")) .transition(DrawableTransitionOptions.withCrossFade()) .placeholder(R.color.neutral_800) .into(imageView) @@ -147,28 +157,12 @@ fun bindSeasonPoster(imageView: ImageView, seasonId: UUID) { Glide .with(imageView.context) - .load(jellyfinApi.api.baseUrl.plus("/items/${seasonId}/Images/Primary")) + .load(jellyfinApi.api.baseUrl.plus("/items/${seasonId}/Images/${ImageType.PRIMARY}")) .transition(DrawableTransitionOptions.withCrossFade()) .placeholder(R.color.neutral_800) .into(imageView) } -@BindingAdapter("itemPrimaryImage") -fun bindItemPrimaryImage(imageView: ImageView, item: BaseItemDto?) { - if (item != null) { - val jellyfinApi = JellyfinApi.getInstance(imageView.context.applicationContext, "") - - Glide - .with(imageView.context) - .load(jellyfinApi.api.baseUrl.plus("/items/${item.id}/Images/Primary")) - .transition(DrawableTransitionOptions.withCrossFade()) - .placeholder(R.color.neutral_800) - .into(imageView) - - imageView.contentDescription = "${item.name} poster" - } -} - @BindingAdapter("favoriteSections") fun bindFavoriteSections(recyclerView: RecyclerView, data: List?) { val adapter = recyclerView.adapter as FavoritesListAdapter diff --git a/app/src/main/res/layout/collection_item.xml b/app/src/main/res/layout/collection_item.xml index 2261215b..ad5ba921 100644 --- a/app/src/main/res/layout/collection_item.xml +++ b/app/src/main/res/layout/collection_item.xml @@ -24,7 +24,7 @@ android:layout_height="0dp" android:adjustViewBounds="true" android:scaleType="centerCrop" - app:collectionImage="@{collection}" + app:baseItemImage="@{collection}" app:layout_constraintDimensionRatio="H,16:9" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/episode_bottom_sheet.xml b/app/src/main/res/layout/episode_bottom_sheet.xml index 5bb2b42b..7c1bbdd1 100644 --- a/app/src/main/res/layout/episode_bottom_sheet.xml +++ b/app/src/main/res/layout/episode_bottom_sheet.xml @@ -33,7 +33,7 @@ android:layout_height="85dp" android:layout_marginStart="24dp" android:scaleType="centerCrop" - app:itemPrimaryImage="@{viewModel.item}" + app:baseItemImage="@{viewModel.item}" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/holder" app:shapeAppearance="@style/roundedImageView" /> diff --git a/app/src/main/res/layout/episode_item.xml b/app/src/main/res/layout/episode_item.xml index 428b9fac..2e6c5b3a 100644 --- a/app/src/main/res/layout/episode_item.xml +++ b/app/src/main/res/layout/episode_item.xml @@ -24,7 +24,7 @@ android:layout_width="100dp" android:layout_height="100dp" android:scaleType="centerCrop" - app:episodeImage="@{episode}" + app:baseItemImage="@{episode}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" diff --git a/app/src/main/res/layout/fragment_media_info.xml b/app/src/main/res/layout/fragment_media_info.xml index 3ebd9fec..f01d5ab0 100644 --- a/app/src/main/res/layout/fragment_media_info.xml +++ b/app/src/main/res/layout/fragment_media_info.xml @@ -358,7 +358,7 @@ android:layout_width="0dp" android:layout_height="0dp" android:adjustViewBounds="true" - app:itemPrimaryImage="@{viewModel.nextUp}" + app:baseItemImage="@{viewModel.nextUp}" app:layout_constraintDimensionRatio="H,16:9" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/home_episode_item.xml b/app/src/main/res/layout/home_episode_item.xml index 06b52350..84ba99ce 100644 --- a/app/src/main/res/layout/home_episode_item.xml +++ b/app/src/main/res/layout/home_episode_item.xml @@ -22,7 +22,7 @@ android:layout_width="0dp" android:layout_height="0dp" android:scaleType="centerCrop" - app:episodeImage="@{episode}" + app:baseItemImage="@{episode}" app:layout_constraintDimensionRatio="H,16:9" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"