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 '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 {
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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_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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
|
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue