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.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) {
|
||||||
|
|
|
@ -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>
|
||||||
}
|
}
|
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -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