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.databinding.FragmentSeasonBinding
import dev.jdtech.jellyfin.viewmodels.SeasonViewModel
import dev.jdtech.jellyfin.viewmodels.SeasonViewModelFactory
import org.jellyfin.sdk.model.api.BaseItemDto
@AndroidEntryPoint
class SeasonFragment : Fragment() {
private lateinit var binding: FragmentSeasonBinding
private val viewModel: SeasonViewModel by viewModels()
private val args: SeasonFragmentArgs by navArgs()
@ -33,12 +33,6 @@ class SeasonFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
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.episodesRecyclerView.adapter =
EpisodeListAdapter(EpisodeListAdapter.OnClickListener { episode ->
@ -48,6 +42,8 @@ class SeasonFragment : Fragment() {
binding.seasonName.text = args.seasonName
binding.seriesId = args.seriesId
binding.seasonId = args.seasonId
viewModel.loadEpisodes(args.seriesId, args.seasonId)
}
private fun navigateToEpisodeBottomSheetFragment(episode: BaseItemDto) {

View file

@ -1,6 +1,7 @@
package dev.jdtech.jellyfin.repository
import org.jellyfin.sdk.model.api.BaseItemDto
import org.jellyfin.sdk.model.api.ItemFields
import java.util.*
interface JellyfinRepository {
@ -11,4 +12,6 @@ interface JellyfinRepository {
suspend fun getSeasons(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.withContext
import org.jellyfin.sdk.model.api.BaseItemDto
import org.jellyfin.sdk.model.api.ItemFields
import java.util.*
class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRepository {
@ -45,4 +46,18 @@ class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRep
}
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
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import dev.jdtech.jellyfin.api.JellyfinApi
import kotlinx.coroutines.Dispatchers
import androidx.lifecycle.*
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 org.jellyfin.sdk.model.api.ItemFields
import java.util.*
import javax.inject.Inject
class SeasonViewModel(application: Application, seriesId: UUID, seasonId: UUID) :
AndroidViewModel(application) {
private val jellyfinApi = JellyfinApi.getInstance(application, "")
@HiltViewModel
class SeasonViewModel
@Inject
constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() {
private val _episodes = MutableLiveData<List<BaseItemDto>>()
val episodes: LiveData<List<BaseItemDto>> = _episodes
init {
fun loadEpisodes(seriesId: UUID, seasonId: UUID) {
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")
}
}