From 8d04ff35cce6b24fe70172515791778afa20e76e Mon Sep 17 00:00:00 2001 From: Niels van Velzen Date: Wed, 22 May 2024 22:02:10 +0200 Subject: [PATCH] Remove dependency injection from BaseRowItem --- .../ui/itemhandling/BaseItemDtoBaseRowItem.kt | 55 ++++++++++--------- .../itemhandling/BaseItemPersonBaseRowItem.kt | 9 ++- .../androidtv/ui/itemhandling/BaseRowItem.kt | 14 ++--- .../ChapterItemInfoBaseRowItem.kt | 9 ++- .../ui/itemhandling/GridButtonBaseRowItem.kt | 9 ++- .../SeriesTimerInfoDtoBaseRowItem.kt | 10 +++- .../ui/presentation/CardPresenter.java | 13 ++--- 7 files changed, 67 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/BaseItemDtoBaseRowItem.kt b/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/BaseItemDtoBaseRowItem.kt index e514b16128..a740d4a79a 100644 --- a/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/BaseItemDtoBaseRowItem.kt +++ b/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/BaseItemDtoBaseRowItem.kt @@ -5,6 +5,7 @@ import android.text.format.DateFormat import androidx.core.content.ContextCompat import org.jellyfin.androidtv.R import org.jellyfin.androidtv.constant.ImageType +import org.jellyfin.androidtv.util.ImageHelper import org.jellyfin.androidtv.util.TimeUtils import org.jellyfin.androidtv.util.sdk.getFullName import org.jellyfin.androidtv.util.sdk.getSubName @@ -63,15 +64,15 @@ open class BaseItemDtoBaseRowItem @JvmOverloads constructor( override fun getChildCountStr(): String? { // Playlist if (baseItem?.type == BaseItemKind.PLAYLIST) { - val childCount = baseItem?.cumulativeRunTimeTicks?.ticks?.let { duration -> + val childCount = baseItem.cumulativeRunTimeTicks?.ticks?.let { duration -> TimeUtils.formatMillis(duration.inWholeMilliseconds) } if (childCount != null) return childCount } // Folder - if (baseItem?.isFolder == true && baseItem?.type != BaseItemKind.MUSIC_ARTIST) { - val childCount = baseItem?.childCount + if (baseItem?.isFolder == true && baseItem.type != BaseItemKind.MUSIC_ARTIST) { + val childCount = baseItem.childCount if (childCount != null && childCount > 0) return childCount.toString() } @@ -80,39 +81,40 @@ open class BaseItemDtoBaseRowItem @JvmOverloads constructor( } override fun getCardName(context: Context) = when { - baseItem?.type == BaseItemKind.AUDIO && baseItem?.albumArtist != null -> baseItem?.albumArtist - baseItem?.type == BaseItemKind.AUDIO && baseItem?.album != null -> baseItem?.album + baseItem?.type == BaseItemKind.AUDIO && baseItem.albumArtist != null -> baseItem.albumArtist + baseItem?.type == BaseItemKind.AUDIO && baseItem.album != null -> baseItem.album else -> baseItem?.getFullName(context) } override fun getFullName(context: Context) = baseItem?.getFullName(context) override fun getName(context: Context) = when (baseItem?.type) { - BaseItemKind.AUDIO -> baseItem?.getFullName(context) + BaseItemKind.AUDIO -> baseItem.getFullName(context) else -> baseItem?.name } override fun getSummary(context: Context) = baseItem?.overview override fun getSubText(context: Context) = when (baseItem?.type) { - BaseItemKind.TV_CHANNEL -> baseItem?.number + BaseItemKind.TV_CHANNEL -> baseItem.number BaseItemKind.TV_PROGRAM, - BaseItemKind.PROGRAM -> baseItem?.episodeTitle ?: baseItem?.channelName + BaseItemKind.PROGRAM -> baseItem.episodeTitle ?: baseItem.channelName + BaseItemKind.RECORDING -> { val title = listOfNotNull( - baseItem?.channelName, - baseItem?.episodeTitle + baseItem.channelName, + baseItem.episodeTitle ).joinToString(" - ") val timestamp = buildString { - append(SimpleDateFormat("d MMM").format(TimeUtils.getDate(baseItem!!.startDate))) + append(SimpleDateFormat("d MMM").format(TimeUtils.getDate(baseItem.startDate))) append(" ") append( (DateFormat.getTimeFormat(context) - .format(TimeUtils.getDate(baseItem!!.startDate))) + .format(TimeUtils.getDate(baseItem.startDate))) ) append(" - ") append( - DateFormat.getTimeFormat(context).format(TimeUtils.getDate(baseItem!!.endDate)) + DateFormat.getTimeFormat(context).format(TimeUtils.getDate(baseItem.endDate)) ) } @@ -124,6 +126,7 @@ open class BaseItemDtoBaseRowItem @JvmOverloads constructor( override fun getImageUrl( context: Context, + imageHelper: ImageHelper, imageType: ImageType, fillWidth: Int, fillHeight: Int @@ -152,32 +155,30 @@ open class BaseItemDtoBaseRowItem @JvmOverloads constructor( ), fillWidth, fillHeight ) - else -> getPrimaryImageUrl(context, fillHeight) + else -> imageHelper.getPrimaryImageUrl( + baseItem!!, + preferParentThumb, + null, + fillHeight + ) } } - override fun getPrimaryImageUrl( + override fun getBadgeImage( context: Context, - fillHeight: Int, - ) = imageHelper.getPrimaryImageUrl( - baseItem!!, - preferParentThumb, - null, - fillHeight - ) - - override fun getBadgeImage(context: Context) = when (baseItem?.type) { + imageHelper: ImageHelper, + ) = when (baseItem?.type) { BaseItemKind.LIVE_TV_PROGRAM, BaseItemKind.PROGRAM -> when { - baseItem?.seriesTimerId != null -> R.drawable.ic_record_series_red - baseItem?.timerId != null -> R.drawable.ic_record_red + baseItem.seriesTimerId != null -> R.drawable.ic_record_series_red + baseItem.timerId != null -> R.drawable.ic_record_red else -> null } else -> when { baseItem?.criticRating != null -> when { - baseItem!!.criticRating!! > 59f -> R.drawable.ic_rt_fresh + baseItem.criticRating!! > 59f -> R.drawable.ic_rt_fresh else -> R.drawable.ic_rt_rotten } diff --git a/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/BaseItemPersonBaseRowItem.kt b/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/BaseItemPersonBaseRowItem.kt index ba8793e2b3..6c42d3839e 100644 --- a/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/BaseItemPersonBaseRowItem.kt +++ b/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/BaseItemPersonBaseRowItem.kt @@ -1,6 +1,8 @@ package org.jellyfin.androidtv.ui.itemhandling import android.content.Context +import org.jellyfin.androidtv.constant.ImageType +import org.jellyfin.androidtv.util.ImageHelper import org.jellyfin.sdk.model.api.BaseItemPerson class BaseItemPersonBaseRowItem( @@ -9,9 +11,12 @@ class BaseItemPersonBaseRowItem( baseRowType = BaseRowType.Person, staticHeight = true, ) { - override fun getPrimaryImageUrl( + override fun getImageUrl( context: Context, - fillHeight: Int, + imageHelper: ImageHelper, + imageType: ImageType, + fillWidth: Int, + fillHeight: Int ) = imageHelper.getPrimaryImageUrl(person, fillHeight) override fun getItemId() = person.id diff --git a/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/BaseRowItem.kt b/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/BaseRowItem.kt index a73cc88015..f2608a53d8 100644 --- a/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/BaseRowItem.kt +++ b/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/BaseRowItem.kt @@ -9,12 +9,8 @@ import org.jellyfin.androidtv.util.ImageHelper import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemKind import org.jellyfin.sdk.model.api.SeriesTimerInfoDto -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject import java.util.UUID -// TODO: Move properties to relevant classes only (e.g. baseItem should be in -// BaseItemDtoBaseRowItem) abstract class BaseRowItem protected constructor( val baseRowType: BaseRowType, val index: Int = 0, @@ -25,9 +21,7 @@ abstract class BaseRowItem protected constructor( val chapterInfo: ChapterItemInfo? = null, val seriesTimerInfo: SeriesTimerInfoDto? = null, val gridButton: GridButton? = null, -) : KoinComponent { - val imageHelper by inject() - +) { open val showCardInfoOverlay: Boolean = false open fun getBaseItemType(): BaseItemKind? = null open fun isFavorite(): Boolean = false @@ -39,18 +33,18 @@ abstract class BaseRowItem protected constructor( open fun getImageUrl( context: Context, + imageHelper: ImageHelper, imageType: ImageType, fillWidth: Int, fillHeight: Int, - ) = getPrimaryImageUrl(context, fillHeight) + ): String? = null - open fun getPrimaryImageUrl(context: Context, fillHeight: Int): String? = null open fun getFullName(context: Context): String? = null open fun getName(context: Context): String? = null open fun getItemId(): UUID? = null open fun getSubText(context: Context): String? = null open fun getSummary(context: Context): String? = null - open fun getBadgeImage(context: Context): Drawable? = null + open fun getBadgeImage(context: Context, imageHelper: ImageHelper): Drawable? = null override fun equals(other: Any?): Boolean { if (other is BaseRowItem) return other.getItemId() == getItemId() diff --git a/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/ChapterItemInfoBaseRowItem.kt b/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/ChapterItemInfoBaseRowItem.kt index 74c79d1e0a..fa017a0098 100644 --- a/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/ChapterItemInfoBaseRowItem.kt +++ b/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/ChapterItemInfoBaseRowItem.kt @@ -1,7 +1,9 @@ package org.jellyfin.androidtv.ui.itemhandling import android.content.Context +import org.jellyfin.androidtv.constant.ImageType import org.jellyfin.androidtv.data.model.ChapterItemInfo +import org.jellyfin.androidtv.util.ImageHelper import org.jellyfin.androidtv.util.TimeUtils import org.jellyfin.sdk.model.extensions.ticks @@ -12,9 +14,12 @@ class ChapterItemInfoBaseRowItem( staticHeight = true, chapterInfo = item, ) { - override fun getPrimaryImageUrl( + override fun getImageUrl( context: Context, - fillHeight: Int, + imageHelper: ImageHelper, + imageType: ImageType, + fillWidth: Int, + fillHeight: Int ) = chapterInfo?.imagePath override fun getItemId() = chapterInfo?.itemId diff --git a/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/GridButtonBaseRowItem.kt b/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/GridButtonBaseRowItem.kt index fbff8c8e61..f58a924aa1 100644 --- a/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/GridButtonBaseRowItem.kt +++ b/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/GridButtonBaseRowItem.kt @@ -1,7 +1,9 @@ package org.jellyfin.androidtv.ui.itemhandling import android.content.Context +import org.jellyfin.androidtv.constant.ImageType import org.jellyfin.androidtv.ui.GridButton +import org.jellyfin.androidtv.util.ImageHelper class GridButtonBaseRowItem( item: GridButton, @@ -10,9 +12,12 @@ class GridButtonBaseRowItem( staticHeight = true, gridButton = item, ) { - override fun getPrimaryImageUrl( + override fun getImageUrl( context: Context, - fillHeight: Int, + imageHelper: ImageHelper, + imageType: ImageType, + fillWidth: Int, + fillHeight: Int ) = gridButton?.imageRes?.let { imageHelper.getResourceUrl(context, it) } diff --git a/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/SeriesTimerInfoDtoBaseRowItem.kt b/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/SeriesTimerInfoDtoBaseRowItem.kt index 610cfda680..da5d33327a 100644 --- a/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/SeriesTimerInfoDtoBaseRowItem.kt +++ b/app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/SeriesTimerInfoDtoBaseRowItem.kt @@ -2,6 +2,8 @@ package org.jellyfin.androidtv.ui.itemhandling import android.content.Context import org.jellyfin.androidtv.R +import org.jellyfin.androidtv.constant.ImageType +import org.jellyfin.androidtv.util.ImageHelper import org.jellyfin.androidtv.util.apiclient.getSeriesOverview import org.jellyfin.sdk.model.api.SeriesTimerInfoDto import org.jellyfin.sdk.model.serializer.toUUIDOrNull @@ -12,9 +14,12 @@ class SeriesTimerInfoDtoBaseRowItem( baseRowType = BaseRowType.SeriesTimer, seriesTimerInfo = item, ) { - override fun getPrimaryImageUrl( + override fun getImageUrl( context: Context, - fillHeight: Int, + imageHelper: ImageHelper, + imageType: ImageType, + fillWidth: Int, + fillHeight: Int ) = imageHelper.getResourceUrl( context, R.drawable.tile_land_series_timer @@ -28,5 +33,6 @@ class SeriesTimerInfoDtoBaseRowItem( else seriesTimerInfo?.channelName, seriesTimerInfo?.dayPattern ).joinToString(" ") + override fun getSummary(context: Context) = seriesTimerInfo?.getSeriesOverview(context) } diff --git a/app/src/main/java/org/jellyfin/androidtv/ui/presentation/CardPresenter.java b/app/src/main/java/org/jellyfin/androidtv/ui/presentation/CardPresenter.java index 01c85e49cf..c6e15791fc 100644 --- a/app/src/main/java/org/jellyfin/androidtv/ui/presentation/CardPresenter.java +++ b/app/src/main/java/org/jellyfin/androidtv/ui/presentation/CardPresenter.java @@ -33,16 +33,16 @@ import java.util.Locale; import java.util.Map; +import kotlin.Lazy; + public class CardPresenter extends Presenter { private int mStaticHeight = 150; private ImageType mImageType = ImageType.POSTER; private double aspect; - private boolean mShowInfo = true; - private boolean isUserView = false; - private boolean isUniformAspect = false; + private final Lazy imageHelper = KoinJavaComponent.inject(ImageHelper.class); public CardPresenter() { super(); @@ -104,8 +104,7 @@ public void setItem(BaseRowItem m, ImageType imageType, int lHeight, int pHeight } else if (imageType.equals(ImageType.THUMB)) { aspect = ImageHelper.ASPECT_RATIO_16_9; } else { - ImageHelper imageHelper = KoinJavaComponent.get(ImageHelper.class); - aspect = Utils.getSafeValue(imageHelper.getImageAspectRatio(itemDto, m.getPreferParentThumb()), ImageHelper.ASPECT_RATIO_7_9); + aspect = Utils.getSafeValue(imageHelper.getValue().getImageAspectRatio(itemDto, m.getPreferParentThumb()), ImageHelper.ASPECT_RATIO_7_9); } switch (itemDto.getType()) { case AUDIO: @@ -370,7 +369,7 @@ public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) { if (rowItem.getBaseItem() != null && rowItem.getBaseItemType() != BaseItemKind.USER_VIEW) { RatingType ratingType = KoinJavaComponent.get(UserPreferences.class).get(UserPreferences.Companion.getDefaultRatingType()); if (ratingType == RatingType.RATING_TOMATOES) { - Drawable badge = rowItem.getBadgeImage(holder.view.getContext()); + Drawable badge = rowItem.getBadgeImage(holder.view.getContext(), imageHelper.getValue()); holder.mCardView.setRating(null); if (badge != null) { holder.mCardView.setBadgeImage(badge); @@ -410,7 +409,7 @@ public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) { int fillHeight = Math.round(holder.getCardHeight() * holder.mCardView.getResources().getDisplayMetrics().density); holder.updateCardViewImage( - rowItem.getImageUrl(holder.mCardView.getContext(), mImageType, fillWidth, fillHeight), + rowItem.getImageUrl(holder.mCardView.getContext(), imageHelper.getValue(), mImageType, fillWidth, fillHeight), blurHash ); }