feat: Implement Episode download functionality

This commit is contained in:
2026-02-22 15:41:42 +01:00
parent 9ec09a0e94
commit 8c7ddab9c2
9 changed files with 220 additions and 12 deletions

View File

@@ -17,7 +17,9 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Add
import androidx.compose.material.icons.outlined.ArrowBack
import androidx.compose.material.icons.outlined.Cast
import androidx.compose.material.icons.outlined.Close
import androidx.compose.material.icons.outlined.Download
import androidx.compose.material.icons.outlined.DownloadDone
import androidx.compose.material.icons.outlined.MoreVert
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -38,6 +40,7 @@ import hu.bbara.purefin.common.ui.components.MediaActionButton
import hu.bbara.purefin.common.ui.components.MediaPlaybackSettings
import hu.bbara.purefin.common.ui.components.MediaResumeButton
import hu.bbara.purefin.core.model.Episode
import hu.bbara.purefin.feature.download.DownloadState
import hu.bbara.purefin.player.PlayerActivity
@Composable
@@ -69,6 +72,8 @@ internal fun EpisodeTopBar(
@Composable
internal fun EpisodeDetails(
episode: Episode,
downloadState: DownloadState,
onDownloadClick: () -> Unit,
modifier: Modifier = Modifier
) {
val scheme = MaterialTheme.colorScheme
@@ -153,8 +158,14 @@ internal fun EpisodeDetails(
MediaActionButton(
backgroundColor = MaterialTheme.colorScheme.secondary,
iconColor = MaterialTheme.colorScheme.onSecondary,
icon = Icons.Outlined.Download,
height = 48.dp
icon = when (downloadState) {
is DownloadState.NotDownloaded -> Icons.Outlined.Download
is DownloadState.Downloading -> Icons.Outlined.Close
is DownloadState.Downloaded -> Icons.Outlined.DownloadDone
is DownloadState.Failed -> Icons.Outlined.Download
},
height = 48.dp,
onClick = onDownloadClick
)
}
}

View File

@@ -18,6 +18,7 @@ import hu.bbara.purefin.common.ui.PurefinWaitingScreen
import hu.bbara.purefin.common.ui.components.MediaHero
import hu.bbara.purefin.core.data.navigation.EpisodeDto
import hu.bbara.purefin.core.model.Episode
import hu.bbara.purefin.feature.download.DownloadState
import hu.bbara.purefin.feature.shared.content.episode.EpisodeScreenViewModel
@Composable
@@ -36,6 +37,7 @@ fun EpisodeScreen(
}
val episode = viewModel.episode.collectAsState()
val downloadState = viewModel.downloadState.collectAsState()
if (episode.value == null) {
PurefinWaitingScreen()
@@ -44,7 +46,9 @@ fun EpisodeScreen(
EpisodeScreenInternal(
episode = episode.value!!,
downloadState = downloadState.value,
onBack = viewModel::onBack,
onDownloadClick = viewModel::onDownloadClick,
modifier = modifier
)
}
@@ -52,7 +56,9 @@ fun EpisodeScreen(
@Composable
private fun EpisodeScreenInternal(
episode: Episode,
downloadState: DownloadState,
onBack: () -> Unit,
onDownloadClick: () -> Unit,
modifier: Modifier = Modifier,
) {
@@ -79,6 +85,8 @@ private fun EpisodeScreenInternal(
)
EpisodeDetails(
episode = episode,
downloadState = downloadState,
onDownloadClick = onDownloadClick,
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp)