Make library (collection) clickable and pass the id to LibraryFragment

This commit is contained in:
Jarne Demeulemeester 2021-06-19 17:56:41 +02:00
parent 63011f50ae
commit 20bc0632ef
No known key found for this signature in database
GPG key ID: B61B7B150DB6A6D2
11 changed files with 61 additions and 29 deletions

View file

@ -2,6 +2,7 @@ plugins {
id 'com.android.application'
id 'kotlin-android'
id 'org.jetbrains.kotlin.kapt'
id 'androidx.navigation.safeargs.kotlin'
}
android {

View file

@ -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)
}
}

View file

@ -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()
}

View file

@ -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
}
}

View file

@ -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

View file

@ -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
}
}

View file

@ -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")
}
}

View file

@ -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

View file

@ -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>

View file

@ -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>

View file

@ -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"
}
}