diff --git a/app/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt b/app/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt index cbf0f1b7..9ffefa4a 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt @@ -5,15 +5,13 @@ import androidx.databinding.BindingAdapter import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions -import dev.jdtech.jellyfin.adapters.CollectionListAdapter -import dev.jdtech.jellyfin.adapters.ServerGridAdapter -import dev.jdtech.jellyfin.adapters.ViewItemListAdapter -import dev.jdtech.jellyfin.adapters.ViewListAdapter +import dev.jdtech.jellyfin.adapters.* import dev.jdtech.jellyfin.api.JellyfinApi import dev.jdtech.jellyfin.database.Server import dev.jdtech.jellyfin.models.View import dev.jdtech.jellyfin.models.ViewItem import org.jellyfin.sdk.model.api.BaseItemDto +import org.jellyfin.sdk.model.api.BaseItemPerson @BindingAdapter("servers") fun bindServers(recyclerView: RecyclerView, data: List?) { @@ -67,4 +65,24 @@ fun bindCollectionImage(imageView: ImageView, item: BaseItemDto) { .into(imageView) imageView.contentDescription = "${item.name} image" +} + +@BindingAdapter("people") +fun bindPeople(recyclerView: RecyclerView, data: List?) { + val adapter = recyclerView.adapter as PersonListAdapter + adapter.submitList(data) +} + +@BindingAdapter("personImage") +fun bindPersonImage(imageView: ImageView, person: BaseItemPerson) { + val jellyfinApi = JellyfinApi.getInstance(imageView.context.applicationContext, "") + + Glide + .with(imageView.context) + .load(jellyfinApi.api.baseUrl.plus("/items/${person.id}/Images/Primary")) + .transition(DrawableTransitionOptions.withCrossFade()) + .placeholder(R.color.neutral_800) + .into(imageView) + + imageView.contentDescription = "${person.name} poster" } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/PersonListAdapter.kt b/app/src/main/java/dev/jdtech/jellyfin/adapters/PersonListAdapter.kt new file mode 100644 index 00000000..b1654b53 --- /dev/null +++ b/app/src/main/java/dev/jdtech/jellyfin/adapters/PersonListAdapter.kt @@ -0,0 +1,44 @@ +package dev.jdtech.jellyfin.adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import dev.jdtech.jellyfin.databinding.PersonItemBinding +import org.jellyfin.sdk.model.api.BaseItemPerson + +class PersonListAdapter :ListAdapter(DiffCallback) { + class PersonViewHolder(private var binding: PersonItemBinding) : + RecyclerView.ViewHolder(binding.root) { + fun bind(person: BaseItemPerson) { + binding.person = person + binding.executePendingBindings() + } + } + + companion object DiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: BaseItemPerson, newItem: BaseItemPerson): Boolean { + return oldItem.id == newItem.id + } + + override fun areContentsTheSame(oldItem: BaseItemPerson, newItem: BaseItemPerson): Boolean { + return oldItem == newItem + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PersonViewHolder { + return PersonViewHolder( + PersonItemBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun onBindViewHolder(holder: PersonViewHolder, position: Int) { + val item = getItem(position) + holder.bind(item) + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt index bbf65bee..3504ff1c 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt @@ -7,6 +7,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.navigation.fragment.navArgs +import dev.jdtech.jellyfin.adapters.PersonListAdapter import dev.jdtech.jellyfin.viewmodels.MediaInfoViewModel import dev.jdtech.jellyfin.databinding.FragmentMediaInfoBinding import dev.jdtech.jellyfin.viewmodels.MediaInfoViewModelFactory @@ -43,6 +44,8 @@ class MediaInfoFragment : Fragment() { binding.originalTitle.visibility = View.GONE } }) + + binding.peopleRecyclerView.adapter = PersonListAdapter() } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_media_info.xml b/app/src/main/res/layout/fragment_media_info.xml index 2db80f3b..907e83b8 100644 --- a/app/src/main/res/layout/fragment_media_info.xml +++ b/app/src/main/res/layout/fragment_media_info.xml @@ -16,13 +16,13 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:paddingHorizontal="24dp" tools:context=".fragments.MediaInfoFragment"> @@ -30,6 +30,7 @@ @@ -73,6 +74,7 @@ android:id="@+id/info" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginHorizontal="24dp" android:layout_marginBottom="12dp" android:orientation="vertical"> @@ -169,6 +171,7 @@ android:id="@+id/description" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginHorizontal="24dp" android:layout_marginBottom="24dp" android:text="@{viewModel.item.overview}" android:textAppearance="@style/TextAppearance.AppCompat.Body1" @@ -182,9 +185,23 @@ + + diff --git a/app/src/main/res/layout/person_item.xml b/app/src/main/res/layout/person_item.xml new file mode 100644 index 00000000..9355e36a --- /dev/null +++ b/app/src/main/res/layout/person_item.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file