Skip to content

Commit

Permalink
added activate dialog on episode long click
Browse files Browse the repository at this point in the history
  • Loading branch information
DatL4g committed Dec 3, 2023
1 parent 329a063 commit b89f2d1
Show file tree
Hide file tree
Showing 18 changed files with 286 additions and 22 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
TODO

app/release/*
!app/release/.gitkeep

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,9 @@ private fun SearchBar(component: FavoriteComponent) {
modifier = Modifier.fillMaxWidth().animateContentSize(),
active = queryComp.isNotBlank() && items.isNotEmpty(),
onActiveChange = {},
placeholder = {
Text(text = stringResource(SharedRes.strings.search))
},
leadingIcon = {
Icon(
imageVector = Icons.Default.Search,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import io.kamel.image.asyncPainterResource
@Composable
fun LazyGridItemScope.EpisodeItem(episode: Home.Episode, onclick: () -> Unit) {
ElevatedCard(
modifier = Modifier.animateItemPlacement().focusScale(1.05F).height(150.dp).bounceClick().clip(MaterialTheme.shapes.medium).onClick {
modifier = Modifier.animateItemPlacement().focusScale(1.02F).height(150.dp).bounceClick().clip(MaterialTheme.shapes.medium).onClick {
onclick()
}
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ fun LazyItemScope.SeriesItem(series: DBSeries, modifier: Modifier = Modifier, on
@Composable
private fun SeriesItem(title: String, coverHref: String?, modifier: Modifier = Modifier, onClick: () -> Unit) {
ElevatedCard(
modifier = modifier.focusScale(1.05F).height(150.dp).bounceClick().clip(MaterialTheme.shapes.medium).onClick {
modifier = modifier.focusScale(1.02F).height(150.dp).bounceClick().clip(MaterialTheme.shapes.medium).onClick {
onClick()
}
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,9 @@ private fun SearchBar(component: SearchComponent) {
modifier = Modifier.fillMaxWidth().padding(8.dp).animateContentSize(),
active = queryComp.isNotBlank() && items.isNotEmpty(),
onActiveChange = {},
placeholder = {
Text(text = stringResource(SharedRes.strings.search))
},
leadingIcon = {
Icon(
imageVector = Icons.Default.Search,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,23 @@ sealed class DialogConfig : Parcelable {
data class Season(
val selected: Series.Season,
val seasons: List<Series.Season>
) : DialogConfig()
) : DialogConfig(), Parcelable

@Parcelize
data class Language(
val selected: Series.Language,
val languages: List<Series.Language>
) : DialogConfig()
) : DialogConfig(), Parcelable

@Parcelize
data class StreamUnavailable(
val series: Series,
val episode: Series.Episode
) : DialogConfig()
) : DialogConfig(), Parcelable

@Parcelize
data class Activate(
val series: Series,
val episode: Series.Episode
) : DialogConfig(), Parcelable
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,5 @@ interface SeriesComponent : Component {

fun toggleFavorite(): Any?
fun itemClicked(episode: Series.Episode): Any?
fun itemLongClicked(episode: Series.Episode)
}
Original file line number Diff line number Diff line change
Expand Up @@ -258,9 +258,17 @@ private fun CompactScreen(component: SeriesComponent) {
)
}

SeriesContent(current.series, dbEpisodes, loadingEpisode) {
component.itemClicked(it)
}
SeriesContent(
content = current.series,
dbEpisodes = dbEpisodes,
loadingEpisode = loadingEpisode,
onEpisodeClick = {
component.itemClicked(it)
},
onEpisodeLongClick = {
component.itemLongClicked(it)
}
)
}

DisposableEffect(state) {
Expand Down Expand Up @@ -390,9 +398,17 @@ private fun DefaultScreen(component: SeriesComponent) {
}
}

SeriesContent(current.series, dbEpisodes, loadingEpisode) {
component.itemClicked(it)
}
SeriesContent(
content = current.series,
dbEpisodes = dbEpisodes,
loadingEpisode = loadingEpisode,
onEpisodeClick = {
component.itemClicked(it)
},
onEpisodeLongClick = {
component.itemLongClicked(it)
}
)
}
VerticalScrollbar(rememberScrollbarAdapter(state))

Expand All @@ -407,14 +423,28 @@ private fun DefaultScreen(component: SeriesComponent) {
}
}

private fun LazyListScope.SeriesContent(content: Series, dbEpisodes: List<Episode>, loadingEpisode: String?, onEpisodeClick: (Series.Episode) -> Unit) {
private fun LazyListScope.SeriesContent(
content: Series,
dbEpisodes: List<Episode>,
loadingEpisode: String?,
onEpisodeClick: (Series.Episode) -> Unit,
onEpisodeLongClick: (Series.Episode) -> Unit
) {
items(content.episodes, key = { it.href }) { episode ->
val dbEpisode = remember(dbEpisodes, episode.href) {
dbEpisodes.firstOrNull { it.href == episode.href } ?: dbEpisodes.firstOrNull { it.href.equals(episode.href, true) }
}

EpisodeItem(episode, dbEpisode, loadingEpisode.equals(episode.href, true)) {
onEpisodeClick(episode)
}
EpisodeItem(
content = episode,
dbEpisode = dbEpisode,
isLoading = loadingEpisode.equals(episode.href, true),
onClick = {
onEpisodeClick(episode)
},
onLongClick = {
onEpisodeLongClick(episode)
}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import dev.datlag.burningseries.shared.other.StateSaver
import dev.datlag.burningseries.shared.ui.navigation.Component
import dev.datlag.burningseries.shared.ui.navigation.DialogComponent
import dev.datlag.burningseries.shared.ui.screen.initial.series.activate.ActivateScreenComponent
import dev.datlag.burningseries.shared.ui.screen.initial.series.dialog.activate.ActivateDialogComponent
import dev.datlag.burningseries.shared.ui.screen.initial.series.dialog.language.LanguageDialogComponent
import dev.datlag.burningseries.shared.ui.screen.initial.series.dialog.season.SeasonDialogComponent
import dev.datlag.burningseries.shared.ui.screen.initial.series.dialog.unavailable.UnavailableDialogComponent
Expand Down Expand Up @@ -156,6 +157,16 @@ class SeriesScreenComponent(
navigation.activate(SeriesConfig.Activate(series, episode))
}
)
is DialogConfig.Activate -> ActivateDialogComponent(
componentContext = slotContext,
di = di,
series = config.series,
episode = config.episode,
onDismiss = dialogNavigation::dismiss,
onActivate = { series, episode ->
navigation.activate(SeriesConfig.Activate(series, episode))
}
)
}
}
override val dialog: Value<ChildSlot<DialogConfig, DialogComponent>> = _dialog
Expand Down Expand Up @@ -262,6 +273,15 @@ class SeriesScreenComponent(
episodeStateMachine.dispatch(EpisodeAction.Load(episode))
}

override fun itemLongClicked(episode: Series.Episode) {
currentSeries.value?.let { series ->
showDialog(DialogConfig.Activate(
series = series,
episode = episode
))
}
}

private fun loadNewSeason(season: Series.Season) = ioScope().launchIO {
(currentSeries.value ?: currentSeries.firstOrNull())?.let { series ->
seriesStateMachine.dispatch(SeriesAction.Load(series.hrefBuilder(season.value)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,13 @@ import dev.icerock.moko.resources.compose.stringResource
import kotlin.math.roundToInt

@Composable
fun EpisodeItem(content: Series.Episode, dbEpisode: Episode?, isLoading: Boolean, onClick: () -> Unit) {
fun EpisodeItem(
content: Series.Episode,
dbEpisode: Episode?,
isLoading: Boolean,
onClick: () -> Unit,
onLongClick: () -> Unit
) {
val blurHash = remember(content.href) { BlurHash.random() }
val enabled = content.hosters.isNotEmpty()

Expand All @@ -51,9 +57,17 @@ fun EpisodeItem(content: Series.Episode, dbEpisode: Episode?, isLoading: Boolean
}

Row(
modifier = Modifier.padding(vertical = 4.dp).fillMaxWidth().focusScale(1.05F).height(100.dp).clip(MaterialTheme.shapes.medium).onClick(enabled) {
onClick()
}.ifTrue(enabled) { bounceClick(0.95F) }.ifFalse(enabled) { alpha(0.5F) },
modifier = Modifier
.padding(vertical = 4.dp)
.fillMaxWidth()
.focusScale(1.02F)
.height(100.dp)
.clip(MaterialTheme.shapes.medium)
.onClick(
enabled = enabled,
onLongClick = onLongClick,
onClick = onClick
).ifTrue(enabled) { bounceClick(0.95F) }.ifFalse(enabled) { alpha(0.5F) },
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalAlignment = Alignment.CenterVertically
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package dev.datlag.burningseries.shared.ui.screen.initial.series.dialog.activate

import dev.datlag.burningseries.model.Series
import dev.datlag.burningseries.shared.ui.navigation.DialogComponent

interface ActivateComponent : DialogComponent {
val series: Series
val episode: Series.Episode

fun activate()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package dev.datlag.burningseries.shared.ui.screen.initial.series.dialog.activate

import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.text.style.TextOverflow
import dev.datlag.burningseries.shared.SharedRes
import dev.icerock.moko.resources.compose.stringResource

@Composable
fun ActivateDialog(component: ActivateComponent) {
AlertDialog(
onDismissRequest = {
component.dismiss()
},
title = {
Text(
text = stringResource(SharedRes.strings.activate_episode_title),
style = MaterialTheme.typography.headlineMedium,
maxLines = 2,
overflow = TextOverflow.Ellipsis,
softWrap = true
)
},
text = {
Text(text = stringResource(SharedRes.strings.activate_episode_text))
},
confirmButton = {
Button(
onClick = {
component.activate()
}
) {
Text(text = stringResource(SharedRes.strings.activate))
}
},
dismissButton = {
Button(
onClick = {
component.dismiss()
}
) {
Text(text = stringResource(SharedRes.strings.later))
}
}
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package dev.datlag.burningseries.shared.ui.screen.initial.series.dialog.activate

import androidx.compose.runtime.Composable
import com.arkivanov.decompose.ComponentContext
import dev.datlag.burningseries.model.Series
import org.kodein.di.DI

class ActivateDialogComponent(
componentContext: ComponentContext,
override val di: DI,
override val series: Series,
override val episode: Series.Episode,
private val onDismiss: () -> Unit,
private val onActivate: (Series, Series.Episode) -> Unit
) : ActivateComponent, ComponentContext by componentContext {

@Composable
override fun render() {
ActivateDialog(this)
}

override fun dismiss() {
onDismiss()
}

override fun activate() {
onActivate(series, episode)
dismiss()
}
}
4 changes: 4 additions & 0 deletions app/shared/src/commonMain/resources/MR/base/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,8 @@
<string name="selected">Selected</string>
<string name="available">Available</string>
<string name="disconnect">Disconnect</string>
<string name="vlc_required">VLC is required to play videos on your PC.\nMake sure to only download and install the official package from videolan.org or your system package manager.</string>
<string name="download">Download</string>
<string name="activate_episode_title">Activate episode</string>
<string name="activate_episode_text">Do you want to activate this episode now?</string>
</resources>
4 changes: 4 additions & 0 deletions app/shared/src/commonMain/resources/MR/de/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,8 @@
<string name="selected">Ausgewählt</string>
<string name="available">Verfügbar</string>
<string name="disconnect">Unterbrechen</string>
<string name="vlc_required">VLC muss auf deinem PC installiert sein, um Videos abzuspielen.\nStelle sicher, dass du nur das offizielle Paket von videolan.org oder deinem Systempaketmanager herunterlädst und installierst.</string>
<string name="download">Herunterladen</string>
<string name="activate_episode_title">Episode aktivieren</string>
<string name="activate_episode_text">Willst du diese Episode jetzt aktivieren?</string>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -146,4 +146,5 @@ object AppIO {
}

private const val APP_NAME = "Burning-Series"
internal const val VLC_ORG = "https://www.videolan.org/vlc"
}
Loading

0 comments on commit b89f2d1

Please sign in to comment.