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 'com.android.application'
id 'kotlin-android' id 'kotlin-android'
id 'org.jetbrains.kotlin.kapt' id 'org.jetbrains.kotlin.kapt'
id 'androidx.navigation.safeargs.kotlin'
} }
android { android {

View file

@ -8,9 +8,10 @@ import androidx.recyclerview.widget.RecyclerView
import dev.jdtech.jellyfin.databinding.CollectionItemBinding import dev.jdtech.jellyfin.databinding.CollectionItemBinding
import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemDto
class CollectionListAdapter : class CollectionListAdapter(
ListAdapter<BaseItemDto, CollectionListAdapter.ViewViewHolder>(DiffCallback) { private val onClickListener: OnClickListener
class ViewViewHolder(private var binding: CollectionItemBinding) : ) : ListAdapter<BaseItemDto, CollectionListAdapter.CollectionViewHolder>(DiffCallback) {
class CollectionViewHolder(private var binding: CollectionItemBinding) :
RecyclerView.ViewHolder(binding.root) { RecyclerView.ViewHolder(binding.root) {
fun bind(collection: BaseItemDto) { fun bind(collection: BaseItemDto) {
binding.collection = collection binding.collection = collection
@ -28,8 +29,8 @@ class CollectionListAdapter :
} }
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CollectionViewHolder {
return ViewViewHolder( return CollectionViewHolder(
CollectionItemBinding.inflate( CollectionItemBinding.inflate(
LayoutInflater.from(parent.context), LayoutInflater.from(parent.context),
parent, 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) val collection = getItem(position)
holder.itemView.setOnClickListener {
onClickListener.onClick(collection)
}
holder.bind(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.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.navigation.fragment.navArgs
import dev.jdtech.jellyfin.viewmodels.LibraryViewModel import dev.jdtech.jellyfin.viewmodels.LibraryViewModel
import dev.jdtech.jellyfin.adapters.ViewItemListAdapter import dev.jdtech.jellyfin.adapters.ViewItemListAdapter
import dev.jdtech.jellyfin.databinding.FragmentLibraryBinding import dev.jdtech.jellyfin.databinding.FragmentLibraryBinding
import dev.jdtech.jellyfin.viewmodels.LibraryViewModelFactory
class LibraryFragment : Fragment() { class LibraryFragment : Fragment() {
companion object {
fun newInstance() = LibraryFragment()
}
private lateinit var binding: FragmentLibraryBinding private lateinit var binding: FragmentLibraryBinding
private lateinit var viewModel: LibraryViewModel private lateinit var viewModel: LibraryViewModel
private val args: LibraryFragmentArgs by navArgs()
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View {
binding = FragmentLibraryBinding.inflate(inflater, container, false) binding = FragmentLibraryBinding.inflate(inflater, container, false)
binding.lifecycleOwner = this binding.lifecycleOwner = this
@ -32,7 +32,8 @@ class LibraryFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) 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.viewModel = viewModel
binding.itemsRecyclerView.adapter = ViewItemListAdapter() binding.itemsRecyclerView.adapter = ViewItemListAdapter()
} }

View file

@ -7,7 +7,6 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import dev.jdtech.jellyfin.R
import dev.jdtech.jellyfin.adapters.CollectionListAdapter import dev.jdtech.jellyfin.adapters.CollectionListAdapter
import dev.jdtech.jellyfin.databinding.FragmentMediaBinding import dev.jdtech.jellyfin.databinding.FragmentMediaBinding
import dev.jdtech.jellyfin.viewmodels.MediaViewModel import dev.jdtech.jellyfin.viewmodels.MediaViewModel
@ -23,7 +22,15 @@ class MediaFragment : Fragment() {
binding.lifecycleOwner = this binding.lifecycleOwner = this
binding.viewModel = viewModel binding.viewModel = viewModel
binding.viewsRecyclerView.adapter = CollectionListAdapter() binding.viewsRecyclerView.adapter =
CollectionListAdapter(CollectionListAdapter.OnClickListener { library ->
findNavController().navigate(
MediaFragmentDirections.actionNavigationMediaToLibraryFragment(
library.id
)
)
})
viewModel.finishedLoading.observe(viewLifecycleOwner, { viewModel.finishedLoading.observe(viewLifecycleOwner, {
if (it) { if (it) {
@ -31,10 +38,6 @@ class MediaFragment : Fragment() {
} }
}) })
binding.button.setOnClickListener {
findNavController().navigate(R.id.action_navigation_media_to_libraryFragment)
}
return binding.root return binding.root
} }
} }

View file

@ -5,7 +5,6 @@ import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.R

View file

@ -9,7 +9,7 @@ import kotlinx.coroutines.withContext
import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemDto
import java.util.* 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 jellyfinApi = JellyfinApi.getInstance(application, "")
private val _items = MutableLiveData<List<BaseItemDto>>() private val _items = MutableLiveData<List<BaseItemDto>>()
@ -20,7 +20,7 @@ class LibraryViewModel(application: Application) : AndroidViewModel(application)
init { init {
viewModelScope.launch { viewModelScope.launch {
_items.value = getItems(jellyfinApi.userId!!, UUID.fromString("0c419071-40d8-02bb-5843-0fed7e2cd79e")) _items.value = getItems(jellyfinApi.userId!!, userId)
_finishedLoading.value = true _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_height="wrap_content"
android:layout_marginHorizontal="12dp" android:layout_marginHorizontal="12dp"
android:layout_marginBottom="32dp" android:layout_marginBottom="32dp"
android:foreground="?android:attr/selectableItemBackground"
android:orientation="vertical"> android:orientation="vertical">
<com.google.android.material.imageview.ShapeableImageView <com.google.android.material.imageview.ShapeableImageView

View file

@ -44,12 +44,5 @@
tools:itemCount="4" tools:itemCount="4"
tools:listitem="@layout/collection_item" /> 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> </androidx.constraintlayout.widget.ConstraintLayout>
</layout> </layout>

View file

@ -30,5 +30,9 @@
android:id="@+id/libraryFragment" android:id="@+id/libraryFragment"
android:name="dev.jdtech.jellyfin.fragments.LibraryFragment" android:name="dev.jdtech.jellyfin.fragments.LibraryFragment"
android:label="library_fragment" 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> </navigation>

View file

@ -11,6 +11,8 @@ buildscript {
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files
def nav_version = "2.3.5"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
} }
} }