Add dependency injection to MediaInfoViewModel
This commit is contained in:
parent
beb7c6f838
commit
2c8ddaad24
5 changed files with 60 additions and 75 deletions
|
@ -15,13 +15,13 @@ import dev.jdtech.jellyfin.adapters.PersonListAdapter
|
|||
import dev.jdtech.jellyfin.adapters.ViewItemListAdapter
|
||||
import dev.jdtech.jellyfin.databinding.FragmentMediaInfoBinding
|
||||
import dev.jdtech.jellyfin.viewmodels.MediaInfoViewModel
|
||||
import dev.jdtech.jellyfin.viewmodels.MediaInfoViewModelFactory
|
||||
import org.jellyfin.sdk.model.api.BaseItemDto
|
||||
|
||||
@AndroidEntryPoint
|
||||
class MediaInfoFragment : Fragment() {
|
||||
|
||||
private lateinit var binding: FragmentMediaInfoBinding
|
||||
private val viewModel: MediaInfoViewModel by viewModels()
|
||||
|
||||
private val args: MediaInfoFragmentArgs by navArgs()
|
||||
|
||||
|
@ -39,10 +39,6 @@ class MediaInfoFragment : Fragment() {
|
|||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
val viewModelFactory =
|
||||
MediaInfoViewModelFactory(requireNotNull(this.activity).application, args.itemId)
|
||||
val viewModel: MediaInfoViewModel by viewModels { viewModelFactory }
|
||||
|
||||
binding.viewModel = viewModel
|
||||
|
||||
viewModel.item.observe(viewLifecycleOwner, { item ->
|
||||
|
@ -69,17 +65,12 @@ class MediaInfoFragment : Fragment() {
|
|||
}
|
||||
|
||||
binding.seasonsRecyclerView.adapter =
|
||||
ViewItemListAdapter(ViewItemListAdapter.OnClickListener {
|
||||
findNavController().navigate(
|
||||
MediaInfoFragmentDirections.actionMediaInfoFragmentToSeasonFragment(
|
||||
it.seriesId!!,
|
||||
it.id,
|
||||
it.seriesName,
|
||||
it.name
|
||||
)
|
||||
)
|
||||
ViewItemListAdapter(ViewItemListAdapter.OnClickListener { season ->
|
||||
navigateToSeasonFragment(season)
|
||||
}, fixedWidth = true)
|
||||
binding.peopleRecyclerView.adapter = PersonListAdapter()
|
||||
|
||||
viewModel.loadData(args.itemId)
|
||||
}
|
||||
|
||||
private fun navigateToEpisodeBottomSheetFragment(episode: BaseItemDto) {
|
||||
|
@ -89,4 +80,15 @@ class MediaInfoFragment : Fragment() {
|
|||
)
|
||||
)
|
||||
}
|
||||
|
||||
private fun navigateToSeasonFragment(season: BaseItemDto) {
|
||||
findNavController().navigate(
|
||||
MediaInfoFragmentDirections.actionMediaInfoFragmentToSeasonFragment(
|
||||
season.seriesId!!,
|
||||
season.id,
|
||||
season.seriesName,
|
||||
season.name
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
|
@ -7,4 +7,8 @@ interface JellyfinRepository {
|
|||
suspend fun getItem(itemId: UUID): BaseItemDto
|
||||
|
||||
suspend fun getItems(parentId: UUID): List<BaseItemDto>
|
||||
|
||||
suspend fun getSeasons(seriesId: UUID): List<BaseItemDto>
|
||||
|
||||
suspend fun getNextUp(seriesId: UUID): List<BaseItemDto>
|
||||
}
|
|
@ -18,8 +18,31 @@ class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRep
|
|||
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()
|
||||
items = jellyfinApi.itemsApi.getItems(
|
||||
jellyfinApi.userId!!,
|
||||
parentId = parentId
|
||||
).content.items ?: listOf()
|
||||
}
|
||||
return items
|
||||
}
|
||||
|
||||
override suspend fun getSeasons(seriesId: UUID): List<BaseItemDto> {
|
||||
val seasons: List<BaseItemDto>
|
||||
withContext(Dispatchers.IO) {
|
||||
seasons = jellyfinApi.showsApi.getSeasons(seriesId, jellyfinApi.userId!!).content.items
|
||||
?: listOf()
|
||||
}
|
||||
return seasons
|
||||
}
|
||||
|
||||
override suspend fun getNextUp(seriesId: UUID): List<BaseItemDto> {
|
||||
val nextUpItems: List<BaseItemDto>
|
||||
withContext(Dispatchers.IO) {
|
||||
nextUpItems = jellyfinApi.showsApi.getNextUp(
|
||||
jellyfinApi.userId!!,
|
||||
seriesId = seriesId.toString()
|
||||
).content.items ?: listOf()
|
||||
}
|
||||
return nextUpItems
|
||||
}
|
||||
}
|
|
@ -1,22 +1,24 @@
|
|||
package dev.jdtech.jellyfin.viewmodels
|
||||
|
||||
import android.app.Application
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import androidx.lifecycle.AndroidViewModel
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import dev.jdtech.jellyfin.api.JellyfinApi
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import dev.jdtech.jellyfin.repository.JellyfinRepository
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.jellyfin.sdk.model.api.BaseItemDto
|
||||
import org.jellyfin.sdk.model.api.BaseItemPerson
|
||||
import java.util.*
|
||||
import javax.inject.Inject
|
||||
|
||||
class MediaInfoViewModel(application: Application, itemId: UUID) : AndroidViewModel(application) {
|
||||
private val jellyfinApi = JellyfinApi.getInstance(application, "")
|
||||
@HiltViewModel
|
||||
class MediaInfoViewModel
|
||||
@Inject
|
||||
constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() {
|
||||
|
||||
private val _item = MutableLiveData<BaseItemDto>()
|
||||
val item: LiveData<BaseItemDto> = _item
|
||||
|
@ -47,9 +49,9 @@ class MediaInfoViewModel(application: Application, itemId: UUID) : AndroidViewMo
|
|||
private val _seasons = MutableLiveData<List<BaseItemDto>>()
|
||||
val seasons: LiveData<List<BaseItemDto>> = _seasons
|
||||
|
||||
init {
|
||||
fun loadData(itemId: UUID) {
|
||||
viewModelScope.launch {
|
||||
_item.value = getItemDetails(itemId)
|
||||
_item.value = jellyfinRepository.getItem(itemId)
|
||||
_actors.value = getActors(_item.value!!)
|
||||
_director.value = getDirector(_item.value!!)
|
||||
_writers.value = getWriters(_item.value!!)
|
||||
|
@ -58,30 +60,13 @@ class MediaInfoViewModel(application: Application, itemId: UUID) : AndroidViewMo
|
|||
_genresString.value = _item.value?.genres?.joinToString(separator = ", ")
|
||||
_runTime.value = "${_item.value?.runTimeTicks?.div(600000000)} min"
|
||||
_dateString.value = getDateString(_item.value!!)
|
||||
_item.value!!.status?.let { Log.i("MediaInfoViewModel", it) }
|
||||
if (_item.value!!.type == "Series") {
|
||||
_nextUp.value = getNextUp(itemId)
|
||||
_seasons.value = getSeasons(itemId)
|
||||
_seasons.value = jellyfinRepository.getSeasons(itemId)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun getItemDetails(itemId: UUID): BaseItemDto {
|
||||
val item: BaseItemDto
|
||||
withContext(Dispatchers.IO) {
|
||||
item = jellyfinApi.userLibraryApi.getItem(jellyfinApi.userId!!, itemId).content
|
||||
}
|
||||
return item
|
||||
}
|
||||
|
||||
private suspend fun getSeasons(itemId: UUID): List<BaseItemDto>? {
|
||||
val seasons: List<BaseItemDto>?
|
||||
withContext(Dispatchers.IO) {
|
||||
seasons = jellyfinApi.showsApi.getSeasons(itemId, jellyfinApi.userId!!).content.items
|
||||
}
|
||||
return seasons
|
||||
}
|
||||
|
||||
private suspend fun getActors(item: BaseItemDto): List<BaseItemPerson>? {
|
||||
val actors: List<BaseItemPerson>?
|
||||
withContext(Dispatchers.Default) {
|
||||
|
@ -107,21 +92,12 @@ class MediaInfoViewModel(application: Application, itemId: UUID) : AndroidViewMo
|
|||
}
|
||||
|
||||
private suspend fun getNextUp(seriesId: UUID): BaseItemDto? {
|
||||
val nextUpItems: List<BaseItemDto>?
|
||||
withContext(Dispatchers.IO) {
|
||||
nextUpItems = jellyfinApi.showsApi.getNextUp(
|
||||
jellyfinApi.userId!!,
|
||||
seriesId = seriesId.toString()
|
||||
).content.items
|
||||
val nextUpItems = jellyfinRepository.getNextUp(seriesId)
|
||||
return if (nextUpItems.isNotEmpty()) {
|
||||
nextUpItems[0]
|
||||
} else {
|
||||
null
|
||||
}
|
||||
if (nextUpItems != null) {
|
||||
return if (nextUpItems.isNotEmpty()) {
|
||||
nextUpItems[0]
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
private fun getDateString(item: BaseItemDto): String {
|
||||
|
|
|
@ -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 MediaInfoViewModelFactory(
|
||||
private val application: Application,
|
||||
private val itemId: UUID
|
||||
) : ViewModelProvider.Factory {
|
||||
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
|
||||
if (modelClass.isAssignableFrom(MediaInfoViewModel::class.java)) {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
return MediaInfoViewModel(application, itemId) as T
|
||||
}
|
||||
throw IllegalArgumentException("Unknown ViewModel class")
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue