Add dependency injection to SeasonViewModel

This commit is contained in:
Jarne Demeulemeester 2021-07-06 15:41:13 +02:00
parent 7908661b82
commit b96a4192eb
No known key found for this signature in database
GPG key ID: 60884A0C1EBA43E5
5 changed files with 31 additions and 53 deletions

View file

@ -12,13 +12,13 @@ import dagger.hilt.android.AndroidEntryPoint
import dev.jdtech.jellyfin.adapters.EpisodeListAdapter import dev.jdtech.jellyfin.adapters.EpisodeListAdapter
import dev.jdtech.jellyfin.databinding.FragmentSeasonBinding import dev.jdtech.jellyfin.databinding.FragmentSeasonBinding
import dev.jdtech.jellyfin.viewmodels.SeasonViewModel import dev.jdtech.jellyfin.viewmodels.SeasonViewModel
import dev.jdtech.jellyfin.viewmodels.SeasonViewModelFactory
import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemDto
@AndroidEntryPoint @AndroidEntryPoint
class SeasonFragment : Fragment() { class SeasonFragment : Fragment() {
private lateinit var binding: FragmentSeasonBinding private lateinit var binding: FragmentSeasonBinding
private val viewModel: SeasonViewModel by viewModels()
private val args: SeasonFragmentArgs by navArgs() private val args: SeasonFragmentArgs by navArgs()
@ -33,12 +33,6 @@ class SeasonFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
val viewModelFactory = SeasonViewModelFactory(
requireNotNull(this.activity).application,
args.seriesId,
args.seasonId
)
val viewModel: SeasonViewModel by viewModels { viewModelFactory }
binding.viewModel = viewModel binding.viewModel = viewModel
binding.episodesRecyclerView.adapter = binding.episodesRecyclerView.adapter =
EpisodeListAdapter(EpisodeListAdapter.OnClickListener { episode -> EpisodeListAdapter(EpisodeListAdapter.OnClickListener { episode ->
@ -48,6 +42,8 @@ class SeasonFragment : Fragment() {
binding.seasonName.text = args.seasonName binding.seasonName.text = args.seasonName
binding.seriesId = args.seriesId binding.seriesId = args.seriesId
binding.seasonId = args.seasonId binding.seasonId = args.seasonId
viewModel.loadEpisodes(args.seriesId, args.seasonId)
} }
private fun navigateToEpisodeBottomSheetFragment(episode: BaseItemDto) { private fun navigateToEpisodeBottomSheetFragment(episode: BaseItemDto) {

View file

@ -1,6 +1,7 @@
package dev.jdtech.jellyfin.repository package dev.jdtech.jellyfin.repository
import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemDto
import org.jellyfin.sdk.model.api.ItemFields
import java.util.* import java.util.*
interface JellyfinRepository { interface JellyfinRepository {
@ -11,4 +12,6 @@ interface JellyfinRepository {
suspend fun getSeasons(seriesId: UUID): List<BaseItemDto> suspend fun getSeasons(seriesId: UUID): List<BaseItemDto>
suspend fun getNextUp(seriesId: UUID): List<BaseItemDto> suspend fun getNextUp(seriesId: UUID): List<BaseItemDto>
suspend fun getEpisodes(seriesId: UUID, seasonId: UUID, fields: List<ItemFields>? = null): List<BaseItemDto>
} }

View file

@ -4,6 +4,7 @@ import dev.jdtech.jellyfin.api.JellyfinApi
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemDto
import org.jellyfin.sdk.model.api.ItemFields
import java.util.* import java.util.*
class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRepository { class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRepository {
@ -45,4 +46,18 @@ class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRep
} }
return nextUpItems return nextUpItems
} }
override suspend fun getEpisodes(
seriesId: UUID,
seasonId: UUID,
fields: List<ItemFields>?
): List<BaseItemDto> {
val episodes: List<BaseItemDto>
withContext(Dispatchers.IO) {
episodes = jellyfinApi.showsApi.getEpisodes(
seriesId, jellyfinApi.userId!!, seasonId = seasonId, fields = fields
).content.items ?: listOf()
}
return episodes
}
} }

View file

@ -1,40 +1,25 @@
package dev.jdtech.jellyfin.viewmodels package dev.jdtech.jellyfin.viewmodels
import android.app.Application import androidx.lifecycle.*
import androidx.lifecycle.AndroidViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import androidx.lifecycle.LiveData import dev.jdtech.jellyfin.repository.JellyfinRepository
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import dev.jdtech.jellyfin.api.JellyfinApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemDto
import org.jellyfin.sdk.model.api.ItemFields import org.jellyfin.sdk.model.api.ItemFields
import java.util.* import java.util.*
import javax.inject.Inject
class SeasonViewModel(application: Application, seriesId: UUID, seasonId: UUID) : @HiltViewModel
AndroidViewModel(application) { class SeasonViewModel
private val jellyfinApi = JellyfinApi.getInstance(application, "") @Inject
constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() {
private val _episodes = MutableLiveData<List<BaseItemDto>>() private val _episodes = MutableLiveData<List<BaseItemDto>>()
val episodes: LiveData<List<BaseItemDto>> = _episodes val episodes: LiveData<List<BaseItemDto>> = _episodes
init { fun loadEpisodes(seriesId: UUID, seasonId: UUID) {
viewModelScope.launch { viewModelScope.launch {
_episodes.value = getEpisodes(seriesId, seasonId) _episodes.value = jellyfinRepository.getEpisodes(seriesId, seasonId, fields = listOf(ItemFields.OVERVIEW))
} }
} }
private suspend fun getEpisodes(seriesId: UUID, seasonId: UUID): List<BaseItemDto>? {
val episodes: List<BaseItemDto>?
withContext(Dispatchers.IO) {
episodes = jellyfinApi.showsApi.getEpisodes(
seriesId, jellyfinApi.userId!!, seasonId = seasonId, fields = listOf(
ItemFields.OVERVIEW
)
).content.items
}
return episodes
}
} }

View file

@ -1,21 +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 SeasonViewModelFactory(
private val application: Application,
private val seriesId: UUID,
private val seasonId: UUID
) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(SeasonViewModel::class.java)) {
@Suppress("UNCHECKED_CAST")
return SeasonViewModel(application, seriesId, seasonId) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}