From 2377a15611d493d59621efc77e02d2fdc7f7502e Mon Sep 17 00:00:00 2001 From: Ray <154766448+damontecres@users.noreply.github.com> Date: Sun, 11 Jan 2026 13:21:02 -0500 Subject: [PATCH] Disable subtitle download button if user doesn't have permission (#671) ## Description Just a UI change to disable the Search & Download subtitles button if the user doesn't have permission to manage subtitles. This avoids the 403 error if the user attempts to use it. ### Related issues Closes #483 --- .../github/damontecres/wholphin/ui/playback/PlaybackDialog.kt | 4 ++++ .../github/damontecres/wholphin/ui/playback/PlaybackPage.kt | 3 +++ .../damontecres/wholphin/ui/playback/PlaybackViewModel.kt | 2 ++ 3 files changed, 9 insertions(+) diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackDialog.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackDialog.kt index 771a84e2..5051912c 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackDialog.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackDialog.kt @@ -53,6 +53,7 @@ data class PlaybackSettings( val playbackSpeed: Float, val contentScale: ContentScale, val subtitleDelay: Duration, + val hasSubtitleDownloadPermission: Boolean, ) @Composable @@ -96,6 +97,7 @@ fun PlaybackDialog( SubtitleChoiceBottomDialog( choices = settings.subtitleStreams, currentChoice = settings.subtitleIndex, + hasDownloadPermission = settings.hasSubtitleDownloadPermission, onDismissRequest = { onControllerInteraction.invoke() onDismissRequest.invoke() @@ -275,6 +277,7 @@ fun SubtitleChoiceBottomDialog( onSelectChoice: (Int) -> Unit, onSelectSearch: () -> Unit, gravity: Int, + hasDownloadPermission: Boolean, currentChoice: Int? = null, ) { // TODO enforcing a width ends up ignore the gravity @@ -366,6 +369,7 @@ fun SubtitleChoiceBottomDialog( HorizontalDivider() ListItem( selected = false, + enabled = hasDownloadPermission, onClick = onSelectSearch, leadingContent = {}, headlineContent = { diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt index 3dcf6584..122fc5d4 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt @@ -130,6 +130,7 @@ fun PlaybackPage( val player = viewModel.player val mediaInfo by viewModel.currentMediaInfo.observeAsState() + val userDto by viewModel.currentUserDto.observeAsState() val currentPlayback by viewModel.currentPlayback.collectAsState() val currentItemPlayback by viewModel.currentItemPlayback.observeAsState( @@ -561,6 +562,8 @@ fun PlaybackPage( playbackSpeed = playbackSpeed, contentScale = contentScale, subtitleDelay = subtitleDelay, + hasSubtitleDownloadPermission = + remember(userDto) { userDto?.policy?.let { it.isAdministrator || it.enableSubtitleManagement } == true }, ), onDismissRequest = { playbackDialog = null diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt index 880087e6..fe72d7e4 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt @@ -168,6 +168,8 @@ class PlaybackViewModel val subtitleSearch = MutableLiveData(null) val subtitleSearchLanguage = MutableLiveData(Locale.current.language) + val currentUserDto = serverRepository.currentUserDto + init { addCloseable { player.removeListener(this@PlaybackViewModel)