Add "Next up" section to MediaInfoFragment
This commit is contained in:
parent
4329b76448
commit
5ff4ec7e42
4 changed files with 79 additions and 3 deletions
|
@ -147,3 +147,19 @@ fun bindSeasonPoster(imageView: ImageView, seasonId: UUID) {
|
||||||
.placeholder(R.color.neutral_800)
|
.placeholder(R.color.neutral_800)
|
||||||
.into(imageView)
|
.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"
|
||||||
|
}
|
||||||
|
}
|
|
@ -42,6 +42,9 @@ class MediaInfoViewModel(application: Application, itemId: UUID) : AndroidViewMo
|
||||||
private val _dateString = MutableLiveData<String>()
|
private val _dateString = MutableLiveData<String>()
|
||||||
val dateString: LiveData<String> = _dateString
|
val dateString: LiveData<String> = _dateString
|
||||||
|
|
||||||
|
private val _nextUp = MutableLiveData<BaseItemDto>()
|
||||||
|
val nextUp: LiveData<BaseItemDto> = _nextUp
|
||||||
|
|
||||||
private val _seasons = MutableLiveData<List<BaseItemDto>>()
|
private val _seasons = MutableLiveData<List<BaseItemDto>>()
|
||||||
val seasons: LiveData<List<BaseItemDto>> = _seasons
|
val seasons: LiveData<List<BaseItemDto>> = _seasons
|
||||||
|
|
||||||
|
@ -51,12 +54,14 @@ class MediaInfoViewModel(application: Application, itemId: UUID) : AndroidViewMo
|
||||||
_actors.value = getActors(_item.value!!)
|
_actors.value = getActors(_item.value!!)
|
||||||
_director.value = getDirector(_item.value!!)
|
_director.value = getDirector(_item.value!!)
|
||||||
_writers.value = getWriters(_item.value!!)
|
_writers.value = getWriters(_item.value!!)
|
||||||
_writersString.value = _writers.value?.joinToString(separator = ", ") { it.name.toString() }
|
_writersString.value =
|
||||||
|
_writers.value?.joinToString(separator = ", ") { it.name.toString() }
|
||||||
_genresString.value = _item.value?.genres?.joinToString(separator = ", ")
|
_genresString.value = _item.value?.genres?.joinToString(separator = ", ")
|
||||||
_runTime.value = "${_item.value?.runTimeTicks?.div(600000000)} min"
|
_runTime.value = "${_item.value?.runTimeTicks?.div(600000000)} min"
|
||||||
_dateString.value = getDateString(_item.value!!)
|
_dateString.value = getDateString(_item.value!!)
|
||||||
_item.value!!.status?.let { Log.i("MediaInfoViewModel", it) }
|
_item.value!!.status?.let { Log.i("MediaInfoViewModel", it) }
|
||||||
if (_item.value!!.type == "Series") {
|
if (_item.value!!.type == "Series") {
|
||||||
|
_nextUp.value = getNextUp(itemId)
|
||||||
_seasons.value = getSeasons(itemId)
|
_seasons.value = getSeasons(itemId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -102,6 +107,24 @@ class MediaInfoViewModel(application: Application, itemId: UUID) : AndroidViewMo
|
||||||
return writers
|
return writers
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private suspend fun getNextUp(seriesId: UUID): BaseItemDto? {
|
||||||
|
val nextUpItems: List<BaseItemDto>?
|
||||||
|
withContext(Dispatchers.IO) {
|
||||||
|
nextUpItems = jellyfinApi.showsApi.getNextUp(
|
||||||
|
jellyfinApi.userId!!,
|
||||||
|
seriesId = seriesId.toString()
|
||||||
|
).content.items
|
||||||
|
}
|
||||||
|
if (nextUpItems != null) {
|
||||||
|
return if (nextUpItems.isNotEmpty()) {
|
||||||
|
nextUpItems[0]
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
private fun getDateString(item: BaseItemDto): String {
|
private fun getDateString(item: BaseItemDto): String {
|
||||||
val dateString: String = item.productionYear.toString()
|
val dateString: String = item.productionYear.toString()
|
||||||
return when (item.status) {
|
return when (item.status) {
|
||||||
|
|
|
@ -31,8 +31,8 @@
|
||||||
android:id="@+id/item_banner"
|
android:id="@+id/item_banner"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="200dp"
|
android:layout_height="200dp"
|
||||||
app:itemBackdropImage="@{viewModel.item}"
|
|
||||||
android:scaleType="centerCrop"
|
android:scaleType="centerCrop"
|
||||||
|
app:itemBackdropImage="@{viewModel.item}"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
@ -56,7 +56,7 @@
|
||||||
android:textAppearance="@style/TextAppearance.MaterialComponents.Headline5"
|
android:textAppearance="@style/TextAppearance.MaterialComponents.Headline5"
|
||||||
app:layout_constraintBottom_toTopOf="@id/original_title"
|
app:layout_constraintBottom_toTopOf="@id/original_title"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
tools:text="Alita: Battle Angel"/>
|
tools:text="Alita: Battle Angel" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/original_title"
|
android:id="@+id/original_title"
|
||||||
|
@ -276,6 +276,41 @@
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
|
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
|
||||||
tools:text="An angel falls. A warrior rises. When Alita awakens with no memory of who she is in a future world she does not recognize, she is taken in by Ido, a compassionate doctor who realizes that somewhere in this abandoned cyborg shell is the heart and soul of a young woman with an extraordinary past." />
|
tools:text="An angel falls. A warrior rises. When Alita awakens with no memory of who she is in a future world she does not recognize, she is taken in by Ido, a compassionate doctor who realizes that somewhere in this abandoned cyborg shell is the heart and soul of a young woman with an extraordinary past." />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_marginBottom="24dp"
|
||||||
|
android:visibility="@{viewModel.nextUp != null ? View.VISIBLE : View.GONE}">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginBottom="12dp"
|
||||||
|
android:text="@string/next_up"
|
||||||
|
android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"
|
||||||
|
android:textSize="18sp" />
|
||||||
|
|
||||||
|
<com.google.android.material.imageview.ShapeableImageView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:adjustViewBounds="true"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginBottom="8dp"
|
||||||
|
app:itemPrimaryImage="@{viewModel.nextUp}"
|
||||||
|
app:shapeAppearance="@style/roundedImageView" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:text="@{String.format(@string/episode_name_extended, viewModel.nextUp.parentIndexNumber, viewModel.nextUp.indexNumber, viewModel.nextUp.name)}"
|
||||||
|
android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"
|
||||||
|
tools:text="The Girl Flautist" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|
|
@ -33,4 +33,6 @@
|
||||||
<string name="favorite_button_description">Favorite</string>
|
<string name="favorite_button_description">Favorite</string>
|
||||||
<string name="episode_watched_indicator">Episode watched indicator</string>
|
<string name="episode_watched_indicator">Episode watched indicator</string>
|
||||||
<string name="episode_name">%1$d. %2$s</string>
|
<string name="episode_name">%1$d. %2$s</string>
|
||||||
|
<string name="episode_name_extended">S%1$dE%2$d - %3$s</string>
|
||||||
|
<string name="next_up">Next up</string>
|
||||||
</resources>
|
</resources>
|
Loading…
Reference in a new issue