diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt index 4c3a91e2..dfad556e 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt @@ -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 + ) + ) + } } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt b/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt index 6e40a9a9..a7d98bdf 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt @@ -7,4 +7,8 @@ interface JellyfinRepository { suspend fun getItem(itemId: UUID): BaseItemDto suspend fun getItems(parentId: UUID): List + + suspend fun getSeasons(seriesId: UUID): List + + suspend fun getNextUp(seriesId: UUID): List } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt b/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt index 7558dfa1..a5920811 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt @@ -18,8 +18,31 @@ class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRep override suspend fun getItems(parentId: UUID): List { val items: List 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 { + val seasons: List + withContext(Dispatchers.IO) { + seasons = jellyfinApi.showsApi.getSeasons(seriesId, jellyfinApi.userId!!).content.items + ?: listOf() + } + return seasons + } + + override suspend fun getNextUp(seriesId: UUID): List { + val nextUpItems: List + withContext(Dispatchers.IO) { + nextUpItems = jellyfinApi.showsApi.getNextUp( + jellyfinApi.userId!!, + seriesId = seriesId.toString() + ).content.items ?: listOf() + } + return nextUpItems + } } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt index 3081a924..05cf40ae 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt @@ -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() val item: LiveData = _item @@ -47,9 +49,9 @@ class MediaInfoViewModel(application: Application, itemId: UUID) : AndroidViewMo private val _seasons = MutableLiveData>() val seasons: LiveData> = _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? { - val seasons: List? - withContext(Dispatchers.IO) { - seasons = jellyfinApi.showsApi.getSeasons(itemId, jellyfinApi.userId!!).content.items - } - return seasons - } - private suspend fun getActors(item: BaseItemDto): List? { val actors: List? withContext(Dispatchers.Default) { @@ -107,21 +92,12 @@ class MediaInfoViewModel(application: Application, itemId: UUID) : AndroidViewMo } private suspend fun getNextUp(seriesId: UUID): BaseItemDto? { - val nextUpItems: List? - 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 { diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModelFactory.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModelFactory.kt deleted file mode 100644 index 0fe48a75..00000000 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModelFactory.kt +++ /dev/null @@ -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 create(modelClass: Class): T { - if (modelClass.isAssignableFrom(MediaInfoViewModel::class.java)) { - @Suppress("UNCHECKED_CAST") - return MediaInfoViewModel(application, itemId) as T - } - throw IllegalArgumentException("Unknown ViewModel class") - } -} \ No newline at end of file