diff --git a/app/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt b/app/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt index 3637a91b..37aa2c85 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt @@ -34,7 +34,7 @@ class JellyfinApi(context: Context, baseUrl: String) { val sessionApi = SessionApi(api) val videosApi = VideosApi(api) val mediaInfoApi = MediaInfoApi(api) - val playstateApi = PlayStateApi(api) + val playStateApi = PlayStateApi(api) companion object { @Volatile diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt index 761a6788..73a602d2 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt @@ -41,6 +41,13 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { } } + binding.checkButton.setOnClickListener { + when (viewModel.played.value) { + true -> viewModel.markAsUnplayed(args.episodeId) + false -> viewModel.markAsPlayed(args.episodeId) + } + } + binding.favoriteButton.setOnClickListener { when (viewModel.favorite.value) { true -> viewModel.unmarkAsFavorite(args.episodeId) @@ -59,6 +66,15 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { } }) + viewModel.played.observe(viewLifecycleOwner, { + val drawable = when (it) { + true -> R.drawable.ic_check_filled + false -> R.drawable.ic_check + } + + binding.checkButton.setImageResource(drawable) + }) + viewModel.favorite.observe(viewLifecycleOwner, { val drawable = when (it) { true -> R.drawable.ic_heart_filled 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 e850e523..b6c07074 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt @@ -65,6 +65,15 @@ class MediaInfoFragment : Fragment() { } }) + viewModel.played.observe(viewLifecycleOwner, { + val drawable = when (it) { + true -> R.drawable.ic_check_filled + false -> R.drawable.ic_check + } + + binding.checkButton.setImageResource(drawable) + }) + viewModel.favorite.observe(viewLifecycleOwner, { val drawable = when (it) { true -> R.drawable.ic_heart_filled @@ -111,6 +120,13 @@ class MediaInfoFragment : Fragment() { } } + binding.checkButton.setOnClickListener { + when (viewModel.played.value) { + true -> viewModel.markAsUnplayed(args.itemId) + false -> viewModel.markAsPlayed(args.itemId) + } + } + binding.favoriteButton.setOnClickListener { when (viewModel.favorite.value) { true -> viewModel.unmarkAsFavorite(args.itemId) 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 ae27d4b9..c17811bf 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt @@ -29,4 +29,8 @@ interface JellyfinRepository { suspend fun markAsFavorite(itemId: UUID) suspend fun unmarkAsFavorite(itemId: UUID) + + suspend fun markAsPlayed(itemId: UUID) + + suspend fun markAsUnplayed(itemId: UUID) } \ 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 69d8f126..56af3a4f 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt @@ -119,20 +119,20 @@ class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRep override suspend fun postPlaybackStart(itemId: UUID) { Log.d("PlayerActivity", "Sending start $itemId") withContext(Dispatchers.IO) { - jellyfinApi.playstateApi.onPlaybackStart(jellyfinApi.userId!!, itemId) + jellyfinApi.playStateApi.onPlaybackStart(jellyfinApi.userId!!, itemId) } } 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) { withContext(Dispatchers.IO) { - jellyfinApi.playstateApi.onPlaybackProgress(jellyfinApi.userId!!, itemId, positionTicks = positionTicks, isPaused = isPaused) + jellyfinApi.playStateApi.onPlaybackProgress(jellyfinApi.userId!!, itemId, positionTicks = positionTicks, isPaused = isPaused) } } @@ -147,4 +147,16 @@ class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRep jellyfinApi.userLibraryApi.unmarkFavoriteItem(jellyfinApi.userId!!, itemId) } } + + override suspend fun markAsPlayed(itemId: UUID) { + withContext(Dispatchers.IO) { + jellyfinApi.playStateApi.markPlayedItem(jellyfinApi.userId!!, itemId) + } + } + + override suspend fun markAsUnplayed(itemId: UUID) { + withContext(Dispatchers.IO) { + jellyfinApi.playStateApi.markUnplayedItem(jellyfinApi.userId!!, itemId) + } + } } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt index 8bea338d..9a836589 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt @@ -34,6 +34,9 @@ constructor( private val _mediaSources = MutableLiveData>() val mediaSources: LiveData> = _mediaSources + private val _played = MutableLiveData() + val played: LiveData = _played + private val _favorite = MutableLiveData() val favorite: LiveData = _favorite @@ -43,10 +46,25 @@ constructor( _runTime.value = "${_item.value?.runTimeTicks?.div(600000000)} min" _dateString.value = getDateString(_item.value!!) _mediaSources.value = jellyfinRepository.getMediaSources(episodeId) + _played.value = _item.value?.userData?.played _favorite.value = _item.value?.userData?.isFavorite } } + fun markAsPlayed(itemId: UUID) { + viewModelScope.launch { + jellyfinRepository.markAsPlayed(itemId) + } + _played.value = true + } + + fun markAsUnplayed(itemId: UUID) { + viewModelScope.launch { + jellyfinRepository.markAsUnplayed(itemId) + } + _played.value = false + } + fun markAsFavorite(itemId: UUID) { viewModelScope.launch { jellyfinRepository.markAsFavorite(itemId) 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 dcb28bb8..77ca0103 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt @@ -56,6 +56,9 @@ constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() { private val _navigateToPlayer = MutableLiveData() val navigateToPlayer: LiveData = _navigateToPlayer + private val _played = MutableLiveData() + val played: LiveData = _played + private val _favorite = MutableLiveData() val favorite: LiveData = _favorite @@ -70,6 +73,7 @@ constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() { _genresString.value = _item.value?.genres?.joinToString(separator = ", ") _runTime.value = "${_item.value?.runTimeTicks?.div(600000000)} min" _dateString.value = getDateString(_item.value!!) + _played.value = _item.value?.userData?.played _favorite.value = _item.value?.userData?.isFavorite if (itemType == "Series") { _nextUp.value = getNextUp(itemId) @@ -114,6 +118,20 @@ constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() { } } + fun markAsPlayed(itemId: UUID) { + viewModelScope.launch { + jellyfinRepository.markAsPlayed(itemId) + } + _played.value = true + } + + fun markAsUnplayed(itemId: UUID) { + viewModelScope.launch { + jellyfinRepository.markAsUnplayed(itemId) + } + _played.value = false + } + fun markAsFavorite(itemId: UUID) { viewModelScope.launch { jellyfinRepository.markAsFavorite(itemId) diff --git a/app/src/main/res/drawable/ic_check_filled.xml b/app/src/main/res/drawable/ic_check_filled.xml new file mode 100644 index 00000000..6c19c50c --- /dev/null +++ b/app/src/main/res/drawable/ic_check_filled.xml @@ -0,0 +1,13 @@ + + +