Add dependency injection to LibraryViewModel

This commit is contained in:
Jarne Demeulemeester 2021-07-06 15:17:22 +02:00
parent e79731f21b
commit beb7c6f838
No known key found for this signature in database
GPG key ID: 60884A0C1EBA43E5
5 changed files with 21 additions and 40 deletions

View file

@ -12,13 +12,13 @@ import dagger.hilt.android.AndroidEntryPoint
import dev.jdtech.jellyfin.viewmodels.LibraryViewModel
import dev.jdtech.jellyfin.adapters.ViewItemListAdapter
import dev.jdtech.jellyfin.databinding.FragmentLibraryBinding
import dev.jdtech.jellyfin.viewmodels.LibraryViewModelFactory
import org.jellyfin.sdk.model.api.BaseItemDto
@AndroidEntryPoint
class LibraryFragment : Fragment() {
private lateinit var binding: FragmentLibraryBinding
private val viewModel: LibraryViewModel by viewModels()
private val args: LibraryFragmentArgs by navArgs()
@ -35,14 +35,12 @@ class LibraryFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val viewModelFactory =
LibraryViewModelFactory(requireNotNull(this.activity).application, args.libraryId)
val viewModel: LibraryViewModel by viewModels { viewModelFactory }
binding.viewModel = viewModel
binding.itemsRecyclerView.adapter =
ViewItemListAdapter(ViewItemListAdapter.OnClickListener { item ->
navigateToMediaInfoFragment(item)
})
viewModel.loadItems(args.libraryId)
}
private fun navigateToMediaInfoFragment(item: BaseItemDto) {

View file

@ -5,4 +5,6 @@ import java.util.*
interface JellyfinRepository {
suspend fun getItem(itemId: UUID): BaseItemDto
suspend fun getItems(parentId: UUID): List<BaseItemDto>
}

View file

@ -14,4 +14,12 @@ class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRep
}
return item
}
override suspend fun getItems(parentId: UUID): List<BaseItemDto> {
val items: List<BaseItemDto>
withContext(Dispatchers.IO) {
items = jellyfinApi.itemsApi.getItems(jellyfinApi.userId!!, parentId = parentId).content.items ?: listOf()
}
return items
}
}

View file

@ -1,16 +1,17 @@
package dev.jdtech.jellyfin.viewmodels
import android.app.Application
import androidx.lifecycle.*
import dev.jdtech.jellyfin.api.JellyfinApi
import kotlinx.coroutines.Dispatchers
import dagger.hilt.android.lifecycle.HiltViewModel
import dev.jdtech.jellyfin.repository.JellyfinRepository
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.jellyfin.sdk.model.api.BaseItemDto
import java.util.*
import javax.inject.Inject
class LibraryViewModel(application: Application, userId: UUID) : AndroidViewModel(application) {
private val jellyfinApi = JellyfinApi.getInstance(application, "")
@HiltViewModel
class LibraryViewModel
@Inject
constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() {
private val _items = MutableLiveData<List<BaseItemDto>>()
val items: LiveData<List<BaseItemDto>> = _items
@ -18,18 +19,10 @@ class LibraryViewModel(application: Application, userId: UUID) : AndroidViewMode
private val _finishedLoading = MutableLiveData<Boolean>()
val finishedLoading: LiveData<Boolean> = _finishedLoading
init {
fun loadItems(parentId: UUID) {
viewModelScope.launch {
_items.value = getItems(jellyfinApi.userId!!, userId)
_items.value = jellyfinRepository.getItems(parentId)
_finishedLoading.value = true
}
}
private suspend fun getItems(userId: UUID, parentId: UUID): List<BaseItemDto> {
val items: List<BaseItemDto>
withContext(Dispatchers.IO) {
items = jellyfinApi.itemsApi.getItems(userId, parentId = parentId).content.items!!
}
return items
}
}

View file

@ -1,20 +0,0 @@
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")
}
}