Skip to content

Commit

Permalink
fix #64
Browse files Browse the repository at this point in the history
  • Loading branch information
DatL4g committed Dec 16, 2023
1 parent fd8e148 commit b204d4d
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import com.arkivanov.essenty.lifecycle.LifecycleOwner
import com.arkivanov.essenty.lifecycle.essentyLifecycle
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.shouldShowRationale
import dev.datlag.burningseries.model.common.safeCast
import dev.datlag.burningseries.shared.App
import dev.datlag.burningseries.shared.SharedRes
import dev.datlag.burningseries.shared.common.lifecycle.LocalLifecycleOwner
Expand All @@ -43,7 +44,7 @@ class MainActivity : AppCompatActivity() {
WindowCompat.setDecorFitsSystemWindows(window, false)
enableEdgeToEdge()

val di = ((applicationContext as? App) ?: (application as App)).di
val di = applicationContext.safeCast<App>()?.di ?: (application as App).di

val lifecycleOwner = object : LifecycleOwner {
override val lifecycle: Lifecycle = essentyLifecycle()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import androidx.compose.ui.layout.*
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntSize
import dev.datlag.burningseries.model.common.safeCast
import kotlin.math.absoluteValue
import kotlin.math.max
import kotlin.math.min
Expand Down Expand Up @@ -289,7 +290,7 @@ internal class RoadModifier(
override fun Density.modifyParentData(parentData: Any?): Any {
return CollapsingToolbarRoadData(
this@RoadModifier.whenCollapsed, this@RoadModifier.whenExpanded,
(parentData as? CollapsingToolbarData)?.progressListener
parentData.safeCast<CollapsingToolbarData>()?.progressListener
)
}
}
Expand All @@ -298,13 +299,13 @@ internal class ParallaxModifier(
private val ratio: Float
): ParentDataModifier {
override fun Density.modifyParentData(parentData: Any?): Any {
return CollapsingToolbarParallaxData(ratio, (parentData as? CollapsingToolbarData)?.progressListener)
return CollapsingToolbarParallaxData(ratio, parentData.safeCast<CollapsingToolbarData>()?.progressListener)
}
}

internal class PinModifier: ParentDataModifier {
override fun Density.modifyParentData(parentData: Any?): Any {
return CollapsingToolbarPinData((parentData as? CollapsingToolbarData)?.progressListener)
return CollapsingToolbarPinData(parentData.safeCast<CollapsingToolbarData>()?.progressListener)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntSize
import dev.datlag.burningseries.model.common.safeCast
import kotlin.math.max

@Stable
Expand Down Expand Up @@ -145,7 +146,7 @@ fun CollapsingToolbarScaffold(

val bodyMeasurables = measurables.subList(1, measurables.size)
val childrenAlignments = bodyMeasurables.map {
(it.parentData as? ScaffoldParentData)?.alignment
it.parentData.safeCast<ScaffoldParentData>()?.alignment
}
val bodyPlaceables = bodyMeasurables.map {
it.measure(bodyConstraints)
Expand Down Expand Up @@ -210,7 +211,7 @@ private class ScaffoldChildAlignmentModifier(
private val alignment: Alignment
) : ParentDataModifier {
override fun Density.modifyParentData(parentData: Any?): Any {
return (parentData as? ScaffoldParentData) ?: ScaffoldParentData(alignment)
return parentData.safeCast<ScaffoldParentData>()?.alignment ?: ScaffoldParentData(alignment)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.arkivanov.decompose.value.Value
import dev.datlag.burningseries.model.Genre
import dev.datlag.burningseries.model.Series
import dev.datlag.burningseries.model.algorithm.JaroWinkler
import dev.datlag.burningseries.model.common.safeCast
import dev.datlag.burningseries.model.common.safeSubList
import dev.datlag.burningseries.model.state.SearchAction
import dev.datlag.burningseries.model.state.SearchState
Expand Down Expand Up @@ -36,7 +37,7 @@ class SearchScreenComponent(
private val searchStateMachine: SearchStateMachine by di.instance()
override val searchState: StateFlow<SearchState> = searchStateMachine.state.flowOn(ioDispatcher()).stateIn(ioScope(), SharingStarted.WhileSubscribed(), SearchState.Loading)

private val allGenres = searchState.mapNotNull { it as SearchState.Success }.map { it.genres }.flowOn(ioDispatcher()).stateIn(ioScope(), SharingStarted.WhileSubscribed(), emptyList())
private val allGenres = searchState.mapNotNull { it.safeCast<SearchState.Success>() }.map { it.genres }.flowOn(ioDispatcher()).stateIn(ioScope(), SharingStarted.WhileSubscribed(), emptyList())
private val allItems = allGenres.map { it.flatMap { g -> g.items } }.flowOn(ioDispatcher())
private val maxGenres = allGenres.map { it.size }.flowOn(ioDispatcher())
private val loadedGenres = MutableStateFlow(1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import com.arkivanov.essenty.backhandler.BackCallback
import dev.datlag.burningseries.database.BurningSeries
import dev.datlag.burningseries.model.BSUtil
import dev.datlag.burningseries.model.Series
import dev.datlag.burningseries.model.common.safeCast
import dev.datlag.burningseries.model.state.EpisodeAction
import dev.datlag.burningseries.model.state.EpisodeState
import dev.datlag.burningseries.model.state.SeriesAction
Expand Down Expand Up @@ -68,7 +69,7 @@ class SeriesScreenComponent(
)
override val seriesState: StateFlow<SeriesState> = seriesStateMachine.state.flowOn(ioDispatcher()).stateIn(ioScope(), SharingStarted.WhileSubscribed(), SeriesState.Loading(initialHref))

private val successState = seriesState.mapNotNull { it as? SeriesState.Success }.flowOn(ioDispatcher())
private val successState = seriesState.mapNotNull { it.safeCast<SeriesState.Success>() }.flowOn(ioDispatcher())
private val currentSeries = successState.map { it.series }.flowOn(ioDispatcher()).stateIn(ioScope(), SharingStarted.WhileSubscribed(), null)
private val onDeviceReachable = successState.map { it.onDeviceReachable }.flowOn(ioDispatcher()).stateIn(ioScope(), SharingStarted.Eagerly, true)
override val title: StateFlow<String> = currentSeries.mapNotNull { it?.bestTitle }.flowOn(ioDispatcher()).stateIn(ioScope(), SharingStarted.WhileSubscribed(), initialTitle)
Expand Down Expand Up @@ -97,7 +98,7 @@ class SeriesScreenComponent(
private val episodeStateMachine by di.instance<EpisodeStateMachine>()
private val episodeState: StateFlow<EpisodeState> = episodeStateMachine.state.flowOn(ioDispatcher()).stateIn(ioScope(), SharingStarted.WhileSubscribed(), EpisodeState.Waiting)
override val loadingEpisodeHref: StateFlow<String?> = episodeState.map {
(it as? EpisodeState.Loading)?.episode?.href ?: (it as? EpisodeState.SuccessHoster)?.episode?.href
it.safeCast<EpisodeState.Loading>()?.episode?.href ?: it.safeCast<EpisodeState.SuccessHoster>()?.episode?.href
}.flowOn(ioDispatcher()).stateIn(ioScope(), SharingStarted.WhileSubscribed(), null)

override val dbEpisodes = commonHref.transform {
Expand Down Expand Up @@ -196,7 +197,7 @@ class SeriesScreenComponent(
}
}
is EpisodeState.ErrorHoster, is EpisodeState.ErrorStream -> {
val episode = (state as? EpisodeState.EpisodeHolder)?.episode
val episode = state.safeCast<EpisodeState.EpisodeHolder>()?.episode
val series = currentSeries.value ?: currentSeries.first() ?: currentSeries.value!!

if (episode != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import com.arkivanov.essenty.backhandler.BackCallback
import dev.datlag.burningseries.database.BurningSeries
import dev.datlag.burningseries.model.BSUtil
import dev.datlag.burningseries.model.Series
import dev.datlag.burningseries.model.common.safeCast
import dev.datlag.burningseries.model.state.EpisodeState
import dev.datlag.burningseries.network.state.EpisodeStateMachine
import dev.datlag.burningseries.shared.common.ioDispatcher
Expand Down Expand Up @@ -38,7 +39,7 @@ class VideoScreenComponent(

override val streams: List<Stream> = initialStreams.sortedBy { it.headers.size }
private val episodeStateMachine by di.instance<EpisodeStateMachine>()
override val episode: StateFlow<Series.Episode> = episodeStateMachine.state.mapNotNull { it as? EpisodeState.EpisodeHolder }.map { it.episode }.flowOn(
override val episode: StateFlow<Series.Episode> = episodeStateMachine.state.mapNotNull { it.safeCast<EpisodeState.EpisodeHolder>() }.map { it.episode }.flowOn(
ioDispatcher()
).stateIn(ioScope(), SharingStarted.WhileSubscribed(), initialEpisode)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,26 @@ suspend fun <T> suspendCatching(block: suspend CoroutineScope.() -> T): Result<T
}
Result.failure(e)
}
}

fun <T> safeCast(block: () -> T?): T? {
return scopeCatching {
block()
}.getOrNull()
}

suspend fun <T> suspendSafeCast(block: () -> T?): T? {
return suspendCatching {
block()
}.getOrNull()
}

inline fun <reified T> Any?.safeCast(): T? {
return safeCast {
if (this is T) {
this
} else {
this as? T?
}
}
}

0 comments on commit b204d4d

Please sign in to comment.