From 5804a69ce238e9bb3cb123c155ce94457fcd1992 Mon Sep 17 00:00:00 2001 From: acclorite Date: Thu, 20 Jun 2024 15:36:24 +0300 Subject: [PATCH] Navigation.kt: Fixed crash on release build. --- .../presentation/data/Navigation.kt | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/data/Navigation.kt b/app/src/main/java/ua/acclorite/book_story/presentation/data/Navigation.kt index b1d1a639..c36a3b42 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/data/Navigation.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/data/Navigation.kt @@ -7,6 +7,7 @@ import android.os.Parcelable import androidx.activity.ComponentActivity import androidx.activity.compose.BackHandler import androidx.activity.viewModels +import androidx.annotation.Keep import androidx.compose.animation.EnterTransition import androidx.compose.animation.ExitTransition import androidx.compose.foundation.background @@ -68,57 +69,73 @@ val LocalNavigator = compositionLocalOf { */ @Immutable @Parcelize +@Keep sealed class Screen : Parcelable { @Parcelize + @Keep data object Library : Screen() @Parcelize + @Keep data object History : Screen() @Parcelize + @Keep data object Browse : Screen() @Parcelize + @Keep data class BookInfo( val bookId: Int ) : Screen() @Parcelize + @Keep data class Reader( val bookId: Int ) : Screen() @Parcelize + @Keep data object Settings : Screen() { @Parcelize + @Keep data object General : Screen() @Parcelize + @Keep data object Appearance : Screen() @Parcelize + @Keep data object ReaderSettings : Screen() } @Parcelize + @Keep data object About : Screen() { @Parcelize + @Keep data object Licenses : Screen() @Parcelize + @Keep data class LicenseInfo(val licenseId: String) : Screen() @Parcelize + @Keep data object Credits : Screen() } @Parcelize + @Keep data class Help( val fromStart: Boolean ) : Screen() @Parcelize + @Keep data object Start : Screen() } @@ -167,12 +184,18 @@ class Navigator @AssistedInject constructor( /** * Retrieves screen that was put via [putScreen]. * + * @exception ClassCastException throws an exception if could not cast saved screen as [S]. * @exception Exception if there is no such screen saved that specified in [S], throws an [Exception]. */ inline fun retrieveScreen(): S { for (arg in screens.value) { if (arg.getRoute() == getRoute()) { - return arg as S + println("Arg route: ${arg.getRoute()}") + println("Screen route: ${getRoute()}") + + val screen = arg as? S + ?: throw ClassCastException("Cannot cast ${arg::class} as ${S::class}") + return screen } }