From df73db0ece66e93b1d2e5ee8a239c15cce0a53e2 Mon Sep 17 00:00:00 2001 From: Jarne Demeulemeester Date: Sun, 18 Jul 2021 12:31:21 +0200 Subject: [PATCH] Move HomeViewModel to use JellyfinRepository --- .../jellyfin/repository/JellyfinRepository.kt | 8 ++- .../repository/JellyfinRepositoryImpl.kt | 52 ++++++++++++++++-- .../jellyfin/viewmodels/HomeViewModel.kt | 53 ++++--------------- 3 files changed, 64 insertions(+), 49 deletions(-) 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 c17811bf..fe9bd213 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt @@ -6,13 +6,19 @@ import org.jellyfin.sdk.model.api.MediaSourceInfo import java.util.* interface JellyfinRepository { + suspend fun getUserViews(): List + suspend fun getItem(itemId: UUID): BaseItemDto suspend fun getItems(parentId: UUID? = null): List + suspend fun getResumeItems(): List + + suspend fun getLatestMedia(parentId: UUID): List + suspend fun getSeasons(seriesId: UUID): List - suspend fun getNextUp(seriesId: UUID): List + suspend fun getNextUp(seriesId: UUID? = null): List suspend fun getEpisodes(seriesId: UUID, seasonId: UUID, fields: List? = null): List 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 56af3a4f..2c168ee1 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt @@ -8,6 +8,15 @@ import org.jellyfin.sdk.model.api.* import java.util.* class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRepository { + override suspend fun getUserViews(): List { + val views: List + withContext(Dispatchers.IO) { + views = + jellyfinApi.viewsApi.getUserViews(jellyfinApi.userId!!).content.items ?: listOf() + } + return views + } + override suspend fun getItem(itemId: UUID): BaseItemDto { val item: BaseItemDto withContext(Dispatchers.IO) { @@ -27,6 +36,26 @@ class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRep return items } + override suspend fun getResumeItems(): List { + val items: List + withContext(Dispatchers.IO) { + items = + jellyfinApi.itemsApi.getResumeItems(jellyfinApi.userId!!).content.items ?: listOf() + } + return items + } + + override suspend fun getLatestMedia(parentId: UUID): List { + val items: List + withContext(Dispatchers.IO) { + items = jellyfinApi.userLibraryApi.getLatestMedia( + jellyfinApi.userId!!, + parentId = parentId + ).content + } + return items + } + override suspend fun getSeasons(seriesId: UUID): List { val seasons: List withContext(Dispatchers.IO) { @@ -36,12 +65,12 @@ class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRep return seasons } - override suspend fun getNextUp(seriesId: UUID): List { + override suspend fun getNextUp(seriesId: UUID?): List { val nextUpItems: List withContext(Dispatchers.IO) { nextUpItems = jellyfinApi.showsApi.getNextUp( jellyfinApi.userId!!, - seriesId = seriesId.toString() + seriesId = seriesId?.toString(), ).content.items ?: listOf() } return nextUpItems @@ -126,13 +155,26 @@ class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRep override suspend fun postPlaybackStop(itemId: UUID, positionTicks: Long) { Log.d("PlayerActivity", "Sending stop $itemId") withContext(Dispatchers.IO) { - jellyfinApi.playStateApi.onPlaybackStopped(jellyfinApi.userId!!, itemId, positionTicks = positionTicks) + jellyfinApi.playStateApi.onPlaybackStopped( + jellyfinApi.userId!!, + itemId, + positionTicks = positionTicks + ) } } - override suspend fun postPlaybackProgress(itemId: UUID, positionTicks: Long, isPaused: Boolean) { + override suspend fun postPlaybackProgress( + itemId: UUID, + positionTicks: Long, + isPaused: Boolean + ) { withContext(Dispatchers.IO) { - jellyfinApi.playStateApi.onPlaybackProgress(jellyfinApi.userId!!, itemId, positionTicks = positionTicks, isPaused = isPaused) + jellyfinApi.playStateApi.onPlaybackProgress( + jellyfinApi.userId!!, + itemId, + positionTicks = positionTicks, + isPaused = isPaused + ) } } diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt index 7e7e191c..6dd3dcba 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt @@ -1,6 +1,7 @@ package dev.jdtech.jellyfin.viewmodels import android.app.Application +import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -8,14 +9,11 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.adapters.HomeItem -import dev.jdtech.jellyfin.api.JellyfinApi import dev.jdtech.jellyfin.models.HomeSection import dev.jdtech.jellyfin.models.View -import kotlinx.coroutines.Dispatchers +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.BaseItemDtoQueryResult import java.util.* import javax.inject.Inject @@ -23,9 +21,9 @@ import javax.inject.Inject class HomeViewModel @Inject constructor( - application: Application + application: Application, + private val jellyfinRepository: JellyfinRepository ) : ViewModel() { - private val jellyfinApi = JellyfinApi.getInstance(application, "") private val continueWatchingString = application.resources.getString(R.string.continue_watching) private val nextUpString = application.resources.getString(R.string.next_up) @@ -52,9 +50,9 @@ constructor( viewModelScope.launch { try { val views: MutableList = mutableListOf() - val viewsResult = getViews(jellyfinApi.userId!!) - for (view in viewsResult.items!!) { - val latestItems = getLatestMedia(jellyfinApi.userId!!, view.id) + val userViews = jellyfinRepository.getUserViews() + for (view in userViews) { + val latestItems = jellyfinRepository.getLatestMedia(view.id) if (latestItems.isEmpty()) continue val v = view.toView() v.items = latestItems @@ -63,7 +61,7 @@ constructor( val items = mutableListOf() - val resumeItems = getResumeItems() + val resumeItems = jellyfinRepository.getResumeItems() val resumeSection = HomeSection(UUID.randomUUID(), continueWatchingString, resumeItems) @@ -71,7 +69,7 @@ constructor( items.add(HomeItem.Section(resumeSection)) } - val nextUpItems = getNextUp() + val nextUpItems = jellyfinRepository.getNextUp() val nextUpSection = HomeSection(UUID.randomUUID(), nextUpString, nextUpItems) if (!nextUpItems.isNullOrEmpty()) { @@ -82,43 +80,12 @@ constructor( _finishedLoading.value = true } catch (e: Exception) { + Log.e("HomeViewModel", e.message.toString()) _finishedLoading.value = true _error.value = true } } } - - private suspend fun getViews(userId: UUID): BaseItemDtoQueryResult { - val views: BaseItemDtoQueryResult - withContext(Dispatchers.IO) { - views = jellyfinApi.viewsApi.getUserViews(userId).content - } - return views - } - - private suspend fun getLatestMedia(userId: UUID, parentId: UUID): List { - val items: List - withContext(Dispatchers.IO) { - items = jellyfinApi.userLibraryApi.getLatestMedia(userId, parentId = parentId).content - } - return items - } - - private suspend fun getNextUp(): List? { - val items: List? - withContext(Dispatchers.IO) { - items = jellyfinApi.showsApi.getNextUp(jellyfinApi.userId!!).content.items - } - return items - } - - private suspend fun getResumeItems(): List? { - val items: List? - withContext(Dispatchers.IO) { - items = jellyfinApi.itemsApi.getResumeItems(jellyfinApi.userId!!).content.items - } - return items - } } private fun BaseItemDto.toView(): View {