Make library (collection) clickable and pass the id to LibraryFragment
This commit is contained in:
parent
63011f50ae
commit
20bc0632ef
11 changed files with 61 additions and 29 deletions
|
@ -2,6 +2,7 @@ plugins {
|
|||
id 'com.android.application'
|
||||
id 'kotlin-android'
|
||||
id 'org.jetbrains.kotlin.kapt'
|
||||
id 'androidx.navigation.safeargs.kotlin'
|
||||
}
|
||||
|
||||
android {
|
||||
|
|
|
@ -8,9 +8,10 @@ import androidx.recyclerview.widget.RecyclerView
|
|||
import dev.jdtech.jellyfin.databinding.CollectionItemBinding
|
||||
import org.jellyfin.sdk.model.api.BaseItemDto
|
||||
|
||||
class CollectionListAdapter :
|
||||
ListAdapter<BaseItemDto, CollectionListAdapter.ViewViewHolder>(DiffCallback) {
|
||||
class ViewViewHolder(private var binding: CollectionItemBinding) :
|
||||
class CollectionListAdapter(
|
||||
private val onClickListener: OnClickListener
|
||||
) : ListAdapter<BaseItemDto, CollectionListAdapter.CollectionViewHolder>(DiffCallback) {
|
||||
class CollectionViewHolder(private var binding: CollectionItemBinding) :
|
||||
RecyclerView.ViewHolder(binding.root) {
|
||||
fun bind(collection: BaseItemDto) {
|
||||
binding.collection = collection
|
||||
|
@ -28,8 +29,8 @@ class CollectionListAdapter :
|
|||
}
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewViewHolder {
|
||||
return ViewViewHolder(
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CollectionViewHolder {
|
||||
return CollectionViewHolder(
|
||||
CollectionItemBinding.inflate(
|
||||
LayoutInflater.from(parent.context),
|
||||
parent,
|
||||
|
@ -38,8 +39,15 @@ class CollectionListAdapter :
|
|||
)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: ViewViewHolder, position: Int) {
|
||||
override fun onBindViewHolder(holder: CollectionViewHolder, position: Int) {
|
||||
val collection = getItem(position)
|
||||
holder.itemView.setOnClickListener {
|
||||
onClickListener.onClick(collection)
|
||||
}
|
||||
holder.bind(collection)
|
||||
}
|
||||
|
||||
class OnClickListener(val clickListener: (collection: BaseItemDto) -> Unit) {
|
||||
fun onClick(collection: BaseItemDto) = clickListener(collection)
|
||||
}
|
||||
}
|
|
@ -6,23 +6,23 @@ import androidx.fragment.app.Fragment
|
|||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.navigation.fragment.navArgs
|
||||
import dev.jdtech.jellyfin.viewmodels.LibraryViewModel
|
||||
import dev.jdtech.jellyfin.adapters.ViewItemListAdapter
|
||||
import dev.jdtech.jellyfin.databinding.FragmentLibraryBinding
|
||||
import dev.jdtech.jellyfin.viewmodels.LibraryViewModelFactory
|
||||
|
||||
class LibraryFragment : Fragment() {
|
||||
|
||||
companion object {
|
||||
fun newInstance() = LibraryFragment()
|
||||
}
|
||||
|
||||
private lateinit var binding: FragmentLibraryBinding
|
||||
private lateinit var viewModel: LibraryViewModel
|
||||
|
||||
private val args: LibraryFragmentArgs by navArgs()
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
): View {
|
||||
binding = FragmentLibraryBinding.inflate(inflater, container, false)
|
||||
|
||||
binding.lifecycleOwner = this
|
||||
|
@ -32,7 +32,8 @@ class LibraryFragment : Fragment() {
|
|||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
viewModel = ViewModelProvider(this).get(LibraryViewModel::class.java)
|
||||
val viewModelFactory = LibraryViewModelFactory(requireNotNull(this.activity).application, args.libraryId)
|
||||
viewModel = ViewModelProvider(this, viewModelFactory).get(LibraryViewModel::class.java)
|
||||
binding.viewModel = viewModel
|
||||
binding.itemsRecyclerView.adapter = ViewItemListAdapter()
|
||||
}
|
||||
|
|
|
@ -7,7 +7,6 @@ import android.view.ViewGroup
|
|||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import dev.jdtech.jellyfin.R
|
||||
import dev.jdtech.jellyfin.adapters.CollectionListAdapter
|
||||
import dev.jdtech.jellyfin.databinding.FragmentMediaBinding
|
||||
import dev.jdtech.jellyfin.viewmodels.MediaViewModel
|
||||
|
@ -23,7 +22,15 @@ class MediaFragment : Fragment() {
|
|||
|
||||
binding.lifecycleOwner = this
|
||||
binding.viewModel = viewModel
|
||||
binding.viewsRecyclerView.adapter = CollectionListAdapter()
|
||||
binding.viewsRecyclerView.adapter =
|
||||
CollectionListAdapter(CollectionListAdapter.OnClickListener { library ->
|
||||
findNavController().navigate(
|
||||
MediaFragmentDirections.actionNavigationMediaToLibraryFragment(
|
||||
library.id
|
||||
)
|
||||
)
|
||||
|
||||
})
|
||||
|
||||
viewModel.finishedLoading.observe(viewLifecycleOwner, {
|
||||
if (it) {
|
||||
|
@ -31,10 +38,6 @@ class MediaFragment : Fragment() {
|
|||
}
|
||||
})
|
||||
|
||||
binding.button.setOnClickListener {
|
||||
findNavController().navigate(R.id.action_navigation_media_to_libraryFragment)
|
||||
}
|
||||
|
||||
return binding.root
|
||||
}
|
||||
}
|
|
@ -5,7 +5,6 @@ import androidx.fragment.app.Fragment
|
|||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.Toast
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import dev.jdtech.jellyfin.R
|
||||
|
|
|
@ -9,7 +9,7 @@ import kotlinx.coroutines.withContext
|
|||
import org.jellyfin.sdk.model.api.BaseItemDto
|
||||
import java.util.*
|
||||
|
||||
class LibraryViewModel(application: Application) : AndroidViewModel(application) {
|
||||
class LibraryViewModel(application: Application, userId: UUID) : AndroidViewModel(application) {
|
||||
private val jellyfinApi = JellyfinApi.getInstance(application, "")
|
||||
|
||||
private val _items = MutableLiveData<List<BaseItemDto>>()
|
||||
|
@ -20,7 +20,7 @@ class LibraryViewModel(application: Application) : AndroidViewModel(application)
|
|||
|
||||
init {
|
||||
viewModelScope.launch {
|
||||
_items.value = getItems(jellyfinApi.userId!!, UUID.fromString("0c419071-40d8-02bb-5843-0fed7e2cd79e"))
|
||||
_items.value = getItems(jellyfinApi.userId!!, userId)
|
||||
_finishedLoading.value = true
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
package dev.jdtech.jellyfin.viewmodels
|
||||
|
||||
import android.app.Application
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import java.lang.IllegalArgumentException
|
||||
import java.util.*
|
||||
|
||||
class LibraryViewModelFactory(
|
||||
private val application: Application,
|
||||
private val libraryId: UUID
|
||||
) : ViewModelProvider.Factory {
|
||||
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
|
||||
if (modelClass.isAssignableFrom(LibraryViewModel::class.java)) {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
return LibraryViewModel(application, libraryId) as T
|
||||
}
|
||||
throw IllegalArgumentException("Unknown ViewModel class")
|
||||
}
|
||||
}
|
|
@ -15,6 +15,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="12dp"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:foreground="?android:attr/selectableItemBackground"
|
||||
android:orientation="vertical">
|
||||
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
|
|
|
@ -44,12 +44,5 @@
|
|||
tools:itemCount="4"
|
||||
tools:listitem="@layout/collection_item" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Test button"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</layout>
|
||||
|
|
|
@ -30,5 +30,9 @@
|
|||
android:id="@+id/libraryFragment"
|
||||
android:name="dev.jdtech.jellyfin.fragments.LibraryFragment"
|
||||
android:label="library_fragment"
|
||||
tools:layout="@layout/fragment_library" />
|
||||
tools:layout="@layout/fragment_library" >
|
||||
<argument
|
||||
android:name="libraryId"
|
||||
app:argType="java.util.UUID" />
|
||||
</fragment>
|
||||
</navigation>
|
|
@ -11,6 +11,8 @@ buildscript {
|
|||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
def nav_version = "2.3.5"
|
||||
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue