Skip to content

Commit

Permalink
Use Tmdb primary images
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisbanes committed Jun 10, 2019
1 parent d4eae31 commit 97e8450
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 19 deletions.
14 changes: 9 additions & 5 deletions app/src/main/java/app/tivi/ui/databinding/TiviBindingAdapters.kt
Expand Up @@ -57,9 +57,10 @@ fun loadBackdrop(
saturateOnLoad: Boolean? saturateOnLoad: Boolean?
) { ) {
val image = if (path != null) ShowTmdbImage(path = path, type = ImageType.BACKDROP, showId = 0) else null val image = if (path != null) ShowTmdbImage(path = path, type = ImageType.BACKDROP, showId = 0) else null
loadImage(view, image, urlProvider, saturateOnLoad) loadImage(view, null, urlProvider, saturateOnLoad, image, urlProvider, saturateOnLoad)
} }


@Suppress("UNUSED_PARAMETER")
@BindingAdapter( @BindingAdapter(
"image", "image",
"tmdbImageUrlProvider", "tmdbImageUrlProvider",
Expand All @@ -68,18 +69,21 @@ fun loadBackdrop(
) )
fun loadImage( fun loadImage(
view: ImageView, view: ImageView,
previousImage: TmdbImageEntity?,
previousUrlProvider: TmdbImageUrlProvider?,
previousSaturateOnLoad: Boolean?,
image: TmdbImageEntity?, image: TmdbImageEntity?,
urlProvider: TmdbImageUrlProvider?, urlProvider: TmdbImageUrlProvider?,
saturateOnLoad: Boolean? saturateOnLoad: Boolean?
) { ) {
val requestKey = Objects.hash(image, urlProvider) val requestKey = Objects.hash(image, urlProvider)
if (view.getTag(R.id.loading) == requestKey) {
// We're already loading this image, ignore the call
return
}
view.setTag(R.id.loading, requestKey) view.setTag(R.id.loading, requestKey)


if (urlProvider != null && image != null) { if (urlProvider != null && image != null) {
if (previousUrlProvider == urlProvider && previousImage == image) {
return
}

view.setImageDrawable(null) view.setImageDrawable(null)


view.doOnLayout { view.doOnLayout {
Expand Down
12 changes: 9 additions & 3 deletions data-android/schemas/app.tivi.data.TiviDatabase/21.json
Expand Up @@ -2,7 +2,7 @@
"formatVersion": 1, "formatVersion": 1,
"database": { "database": {
"version": 21, "version": 21,
"identityHash": "7432faa9533ec59c4c9d20967824dfa1", "identityHash": "364dc66dca74ffa97cd348917bcb983a",
"entities": [ "entities": [
{ {
"tableName": "shows", "tableName": "shows",
Expand Down Expand Up @@ -916,7 +916,7 @@
}, },
{ {
"tableName": "show_images", "tableName": "show_images",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `show_id` INTEGER NOT NULL, `path` TEXT NOT NULL, `type` TEXT NOT NULL, `lang` TEXT, `rating` REAL NOT NULL, FOREIGN KEY(`show_id`) REFERENCES `shows`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `show_id` INTEGER NOT NULL, `path` TEXT NOT NULL, `type` TEXT NOT NULL, `lang` TEXT, `rating` REAL NOT NULL, `is_primary` INTEGER NOT NULL, FOREIGN KEY(`show_id`) REFERENCES `shows`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )",
"fields": [ "fields": [
{ {
"fieldPath": "id", "fieldPath": "id",
Expand Down Expand Up @@ -953,6 +953,12 @@
"columnName": "rating", "columnName": "rating",
"affinity": "REAL", "affinity": "REAL",
"notNull": true "notNull": true
},
{
"fieldPath": "isPrimary",
"columnName": "is_primary",
"affinity": "INTEGER",
"notNull": true
} }
], ],
"primaryKey": { "primaryKey": {
Expand Down Expand Up @@ -1002,7 +1008,7 @@
], ],
"setupQueries": [ "setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7432faa9533ec59c4c9d20967824dfa1')" "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '364dc66dca74ffa97cd348917bcb983a')"
] ]
} }
} }
3 changes: 2 additions & 1 deletion data/src/main/java/app/tivi/data/entities/ShowTmdbImage.kt
Expand Up @@ -39,5 +39,6 @@ data class ShowTmdbImage(
@ColumnInfo(name = "path") override val path: String, @ColumnInfo(name = "path") override val path: String,
@ColumnInfo(name = "type") override val type: ImageType, @ColumnInfo(name = "type") override val type: ImageType,
@ColumnInfo(name = "lang") override val language: String? = null, @ColumnInfo(name = "lang") override val language: String? = null,
@ColumnInfo(name = "rating") override val rating: Float = 0f @ColumnInfo(name = "rating") override val rating: Float = 0f,
@ColumnInfo(name = "is_primary") override val isPrimary: Boolean = false
) : TiviEntity, TmdbImageEntity ) : TiviEntity, TmdbImageEntity
11 changes: 9 additions & 2 deletions data/src/main/java/app/tivi/data/entities/TiviEntity.kt
Expand Up @@ -33,12 +33,19 @@ interface TmdbImageEntity : TiviEntity {
val type: ImageType val type: ImageType
val language: String? val language: String?
val rating: Float val rating: Float
val isPrimary: Boolean
} }


enum class ImageType(val storageKey: String) { enum class ImageType(val storageKey: String) {
BACKDROP("backdrop"), BACKDROP("backdrop"),
POSTER("poster") POSTER("poster")
} }


fun <T : TmdbImageEntity> Collection<T>.findHighestRatedPoster() = filter { it.type == ImageType.POSTER }.maxBy { it.rating } fun <T : TmdbImageEntity> Collection<T>.findHighestRatedPoster(): T? {
fun <T : TmdbImageEntity> Collection<T>.findHighestRatedBackdrop() = filter { it.type == ImageType.BACKDROP }.maxBy { it.rating } return filter { it.type == ImageType.POSTER }
.maxBy { it.rating + (if (it.isPrimary) 10f else 0f) }
}
fun <T : TmdbImageEntity> Collection<T>.findHighestRatedBackdrop(): T? {
return filter { it.type == ImageType.BACKDROP }
.maxBy { it.rating + (if (it.isPrimary) 10f else 0f) }
}
16 changes: 10 additions & 6 deletions data/src/main/java/app/tivi/data/mappers/TmdbImagesToShowImages.kt
Expand Up @@ -19,26 +19,30 @@ package app.tivi.data.mappers
import app.tivi.data.entities.ImageType import app.tivi.data.entities.ImageType
import app.tivi.data.entities.ShowTmdbImage import app.tivi.data.entities.ShowTmdbImage
import com.uwetrottmann.tmdb2.entities.Image import com.uwetrottmann.tmdb2.entities.Image
import com.uwetrottmann.tmdb2.entities.Images import com.uwetrottmann.tmdb2.entities.TvShow
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton


@Singleton @Singleton
class TmdbImagesToShowImages @Inject constructor() : Mapper<Images, List<ShowTmdbImage>> { class TmdbImagesToShowImages @Inject constructor() : Mapper<TvShow, List<ShowTmdbImage>> {
override suspend fun map(from: Images): List<ShowTmdbImage> { override suspend fun map(from: TvShow): List<ShowTmdbImage> {
fun mapImage(image: Image, type: ImageType): ShowTmdbImage { fun mapImage(image: Image, type: ImageType): ShowTmdbImage {
return ShowTmdbImage( return ShowTmdbImage(
showId = 0, showId = 0,
path = image.file_path!!, path = image.file_path!!,
type = type, type = type,
language = image.iso_639_1, language = image.iso_639_1,
rating = image.vote_average?.toFloat() ?: 0f rating = image.vote_average?.toFloat() ?: 0f,
isPrimary = image.file_path!! == when (type) {
ImageType.BACKDROP -> from.backdrop_path
ImageType.POSTER -> from.poster_path
}
) )
} }


val result = mutableListOf<ShowTmdbImage>() val result = mutableListOf<ShowTmdbImage>()
from.posters?.mapTo(result) { mapImage(it, ImageType.POSTER) } from.images?.posters?.mapTo(result) { mapImage(it, ImageType.POSTER) }
from.backdrops?.mapTo(result) { mapImage(it, ImageType.BACKDROP) } from.images?.backdrops?.mapTo(result) { mapImage(it, ImageType.BACKDROP) }
return result return result
} }
} }
Expand Up @@ -24,6 +24,8 @@ import app.tivi.data.entities.TiviShow
import app.tivi.data.mappers.TmdbImagesToShowImages import app.tivi.data.mappers.TmdbImagesToShowImages
import app.tivi.extensions.executeWithRetry import app.tivi.extensions.executeWithRetry
import com.uwetrottmann.tmdb2.Tmdb import com.uwetrottmann.tmdb2.Tmdb
import com.uwetrottmann.tmdb2.entities.AppendToResponse
import com.uwetrottmann.tmdb2.enumerations.AppendToResponseItem
import javax.inject.Inject import javax.inject.Inject


class TmdbShowImagesDataSource @Inject constructor( class TmdbShowImagesDataSource @Inject constructor(
Expand All @@ -35,8 +37,8 @@ class TmdbShowImagesDataSource @Inject constructor(
val tmdbId = show.tmdbId val tmdbId = show.tmdbId
return if (tmdbId != null) { return if (tmdbId != null) {
retrofitRunner.executeForResponse(mapper) { retrofitRunner.executeForResponse(mapper) {
// TODO Need to use devices locale!! tmdb.tvService().tv(tmdbId, null, AppendToResponse(AppendToResponseItem.IMAGES))
tmdb.tvService().images(tmdbId, "en,null").executeWithRetry() .executeWithRetry()
} }
} else { } else {
ErrorResult(IllegalArgumentException("TmdbId for show does not exist [$show]")) ErrorResult(IllegalArgumentException("TmdbId for show does not exist [$show]"))
Expand Down

0 comments on commit 97e8450

Please sign in to comment.