Add dependency injection to SeasonViewModel
This commit is contained in:
parent
7908661b82
commit
b96a4192eb
5 changed files with 31 additions and 53 deletions
|
@ -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) {
|
||||
|
|
|
@ -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>
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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")
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue