From 930cf764ca954a3fc04d1fbf69f24601bac5bcb5 Mon Sep 17 00:00:00 2001 From: Jarne Demeulemeester Date: Fri, 18 Jun 2021 14:56:32 +0200 Subject: [PATCH] Add item count to media items --- .../dev/jdtech/jellyfin/BindingAdapters.kt | 10 +++++-- .../jellyfin/adapters/ViewItemListAdapter.kt | 28 +++++++++++++----- .../jellyfin/adapters/ViewListAdapter.kt | 2 ++ .../java/dev/jdtech/jellyfin/models/View.kt | 2 +- .../jellyfin/viewmodels/HomeViewModel.kt | 24 +-------------- .../main/res/drawable/circle_background.xml | 5 ++++ app/src/main/res/layout/base_item.xml | 29 +++++++++++++++---- app/src/main/res/layout/collection_item.xml | 1 + app/src/main/res/layout/view_item.xml | 2 +- 9 files changed, 62 insertions(+), 41 deletions(-) create mode 100644 app/src/main/res/drawable/circle_background.xml diff --git a/app/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt b/app/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt index 1def0be9..cbf0f1b7 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt @@ -28,16 +28,20 @@ fun bindViews(recyclerView: RecyclerView, data: List?) { } @BindingAdapter("items") -fun bindItems(recyclerView: RecyclerView, data: List?) { +fun bindItems(recyclerView: RecyclerView, data: List?) { val adapter = recyclerView.adapter as ViewItemListAdapter adapter.submitList(data) } @BindingAdapter("itemImage") -fun bindItemImage(imageView: ImageView, item: ViewItem) { +fun bindItemImage(imageView: ImageView, item: BaseItemDto) { + val jellyfinApi = JellyfinApi.getInstance(imageView.context.applicationContext, "") + + val itemId = if (item.type == "Episode") item.seriesId else item.id + Glide .with(imageView.context) - .load(item.primaryImageUrl) + .load(jellyfinApi.api.baseUrl.plus("/items/${itemId}/Images/Primary")) .transition(DrawableTransitionOptions.withCrossFade()) .placeholder(R.color.neutral_800) .into(imageView) diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemListAdapter.kt b/app/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemListAdapter.kt index 49de8167..3b099812 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemListAdapter.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemListAdapter.kt @@ -1,6 +1,7 @@ package dev.jdtech.jellyfin.adapters import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter @@ -9,26 +10,37 @@ import dev.jdtech.jellyfin.databinding.BaseItemBinding import dev.jdtech.jellyfin.models.ViewItem import org.jellyfin.sdk.model.api.BaseItemDto -class ViewItemListAdapter : ListAdapter(DiffCallback) { - class ItemViewHolder(private var binding: BaseItemBinding) : RecyclerView.ViewHolder(binding.root) { - fun bind(view: ViewItem) { - binding.item = view +class ViewItemListAdapter : + ListAdapter(DiffCallback) { + class ItemViewHolder(private var binding: BaseItemBinding) : + RecyclerView.ViewHolder(binding.root) { + fun bind(item: BaseItemDto) { + binding.item = item + binding.itemName.text = if (item.type == "Episode") item.seriesName else item.name + binding.itemCount.visibility = + if (item.userData?.unplayedItemCount != null) View.VISIBLE else View.GONE binding.executePendingBindings() } } - companion object DiffCallback : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: ViewItem, newItem: ViewItem): Boolean { + companion object DiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: BaseItemDto, newItem: BaseItemDto): Boolean { return oldItem.id == newItem.id } - override fun areContentsTheSame(oldItem: ViewItem, newItem: ViewItem): Boolean { + override fun areContentsTheSame(oldItem: BaseItemDto, newItem: BaseItemDto): Boolean { return oldItem == newItem } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder(BaseItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)) + return ItemViewHolder( + BaseItemBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) } override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt b/app/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt index c3067e82..45de5ee2 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt @@ -12,6 +12,8 @@ class ViewListAdapter : ListAdapter(DiffCa class ViewViewHolder(private var binding: ViewItemBinding) : RecyclerView.ViewHolder(binding.root) { fun bind(view: View) { binding.view = view + // TODO: Change to string placeholder + binding.viewName.text = "Latest ${view.name}" binding.itemsRecyclerView.adapter = ViewItemListAdapter() binding.executePendingBindings() } diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/View.kt b/app/src/main/java/dev/jdtech/jellyfin/models/View.kt index 2afd44c3..7c88dd6b 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/models/View.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/models/View.kt @@ -6,5 +6,5 @@ import java.util.* data class View( val id: UUID, val name: String?, - var items: List? = null + var items: List? = null ) \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt index d103d298..107e9af7 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt @@ -31,17 +31,10 @@ class HomeViewModel( val views: MutableList = mutableListOf() val viewsResult = getViews(jellyfinApi.userId!!) for (view in viewsResult.items!!) { - val items: MutableList = mutableListOf() val latestItems = getLatestMedia(jellyfinApi.userId!!, view.id) if (latestItems.isEmpty()) continue val v = view.toView() - for (item in latestItems) { - val i = jellyfinApi.api.baseUrl?.let { item.toViewItem(it) } - if (i != null) { - items.add(i) - } - } - v.items = items + v.items = latestItems views.add(v) } @@ -68,21 +61,6 @@ class HomeViewModel( } -private fun BaseItemDto.toViewItem(baseUrl: String): ViewItem { - return when (type) { - "Episode" -> ViewItem( - id = seriesId!!, - name = seriesName, - primaryImageUrl = baseUrl.plus("/items/${seriesId}/Images/Primary") - ) - else -> ViewItem( - id = id, - name = name, - primaryImageUrl = baseUrl.plus("/items/${id}/Images/Primary") - ) - } -} - private fun BaseItemDto.toView(): View { return View( id = id, diff --git a/app/src/main/res/drawable/circle_background.xml b/app/src/main/res/drawable/circle_background.xml new file mode 100644 index 00000000..b3f5e5dc --- /dev/null +++ b/app/src/main/res/drawable/circle_background.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/base_item.xml b/app/src/main/res/layout/base_item.xml index 873d4737..52f3c6de 100644 --- a/app/src/main/res/layout/base_item.xml +++ b/app/src/main/res/layout/base_item.xml @@ -7,10 +7,10 @@ + type="org.jellyfin.sdk.model.api.BaseItemDto" /> - - + + + \ No newline at end of file diff --git a/app/src/main/res/layout/collection_item.xml b/app/src/main/res/layout/collection_item.xml index a5d170e2..14b78619 100644 --- a/app/src/main/res/layout/collection_item.xml +++ b/app/src/main/res/layout/collection_item.xml @@ -30,6 +30,7 @@ android:layout_height="wrap_content" android:text="@{collection.name}" android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1" + android:textSize="18sp" tools:text="Movies" /> \ No newline at end of file diff --git a/app/src/main/res/layout/view_item.xml b/app/src/main/res/layout/view_item.xml index 887fb0d0..5e01ff01 100644 --- a/app/src/main/res/layout/view_item.xml +++ b/app/src/main/res/layout/view_item.xml @@ -20,8 +20,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="24dp" - android:text="@{view.name}" android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1" + android:textSize="18sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:text="Movies" />