diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1819030911..293adc9cb8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -258,6 +258,9 @@ dependencies { implementation(libs.conductor) implementation(libs.conductor.support.preference) + // Navigation + implementation(libs.bundles.voyager) + // Shizuku implementation(libs.shizuku.api) implementation(libs.shizuku.provider) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutLibraryLicenseController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutLibraryLicenseScreen.kt similarity index 75% rename from app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutLibraryLicenseController.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutLibraryLicenseScreen.kt index eec3e2276d..c3ef8b0f15 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutLibraryLicenseController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutLibraryLicenseScreen.kt @@ -1,6 +1,5 @@ package eu.kanade.tachiyomi.ui.more -import android.os.Bundle import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState @@ -15,26 +14,36 @@ import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.core.text.HtmlCompat +import cafe.adriel.voyager.navigator.LocalNavigator import com.google.android.material.textview.MaterialTextView import dev.icerock.moko.resources.compose.stringResource -import eu.kanade.tachiyomi.ui.base.controller.BaseComposeController +import eu.kanade.tachiyomi.util.compose.LocalBackPress +import eu.kanade.tachiyomi.util.compose.currentOrThrow import yokai.i18n.MR import yokai.presentation.AppBarType import yokai.presentation.YokaiScaffold import yokai.presentation.component.ToolTipButton +import yokai.util.Screen -class AboutLibraryLicenseController(private val bundle: Bundle) : BaseComposeController(bundle) { +class AboutLibraryLicenseScreen( + private val name: String, + private val website: String?, + private val license: String, +) : Screen() { @Composable - override fun ScreenContent() { - val name = bundle.getString(LIBRARY_NAME) ?: throw RuntimeException("Missing library name") - val website = bundle.getString(LIBRARY_WEBSITE) - val license = bundle.getString(LIBRARY_LICENSE) ?: throw RuntimeException("Missing library license") - + override fun Content() { + val navigator = LocalNavigator.currentOrThrow + val backPress = LocalBackPress.currentOrThrow val uriHandler = LocalUriHandler.current // FIXME: For some reason AppBar is offscreen YokaiScaffold( - onNavigationIconClicked = router::handleBack, + onNavigationIconClicked = { + when { + navigator.canPop -> navigator.pop() + else -> backPress() + } + }, title = name, appBarType = AppBarType.SMALL, scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior( @@ -73,7 +82,3 @@ class AboutLibraryLicenseController(private val bundle: Bundle) : BaseComposeCon ) } } - -const val LIBRARY_NAME = "aboutLibraries__LibraryName" -const val LIBRARY_WEBSITE = "aboutLibraries__LibraryWebsite" -const val LIBRARY_LICENSE = "aboutLibraries__LibraryLicense" diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutLicenseController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutLicenseController.kt index 01a32aa77a..6a2ea78a8e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutLicenseController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutLicenseController.kt @@ -1,43 +1,27 @@ package eu.kanade.tachiyomi.ui.more -import android.os.Bundle -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import com.mikepenz.aboutlibraries.ui.compose.m3.LibrariesContainer -import com.mikepenz.aboutlibraries.ui.compose.m3.util.htmlReadyLicenseContent -import dev.icerock.moko.resources.compose.stringResource +import androidx.compose.runtime.CompositionLocalProvider +import cafe.adriel.voyager.core.stack.StackEvent +import cafe.adriel.voyager.navigator.Navigator +import cafe.adriel.voyager.transitions.ScreenTransition import eu.kanade.tachiyomi.ui.base.controller.BaseComposeController -import eu.kanade.tachiyomi.util.view.withFadeTransaction -import yokai.i18n.MR -import yokai.presentation.AppBarType -import yokai.presentation.YokaiScaffold +import eu.kanade.tachiyomi.util.compose.LocalBackPress +import soup.compose.material.motion.animation.materialSharedAxisZ class AboutLicenseController : BaseComposeController() { @Composable override fun ScreenContent() { - YokaiScaffold( - onNavigationIconClicked = router::handleBack, - title = stringResource(MR.strings.open_source_licenses), - appBarType = AppBarType.SMALL, - scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(), - ) { innerPadding -> - LibrariesContainer( - modifier = Modifier.fillMaxSize(), - contentPadding = innerPadding, - onLibraryClick = { - router.pushController( - AboutLibraryLicenseController( - Bundle().apply { - this.putString(LIBRARY_NAME, it.name) - it.website?.let { website -> this.putString(LIBRARY_WEBSITE, website) } - this.putString(LIBRARY_LICENSE, it.licenses.firstOrNull()?.htmlReadyLicenseContent.orEmpty()) - } - ).withFadeTransaction(), + Navigator( + screen = AboutLicenseScreen(), + content = { + CompositionLocalProvider(LocalBackPress provides router::handleBack) { + ScreenTransition( + navigator = it, + transition = { materialSharedAxisZ(forward = it.lastEvent != StackEvent.Pop) }, ) } - ) - } + }, + ) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutLicenseScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutLicenseScreen.kt new file mode 100644 index 0000000000..c98bc48cfa --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutLicenseScreen.kt @@ -0,0 +1,45 @@ +package eu.kanade.tachiyomi.ui.more + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import cafe.adriel.voyager.navigator.LocalNavigator +import com.mikepenz.aboutlibraries.ui.compose.m3.LibrariesContainer +import com.mikepenz.aboutlibraries.ui.compose.m3.util.htmlReadyLicenseContent +import dev.icerock.moko.resources.compose.stringResource +import eu.kanade.tachiyomi.util.compose.LocalBackPress +import eu.kanade.tachiyomi.util.compose.currentOrThrow +import yokai.i18n.MR +import yokai.presentation.AppBarType +import yokai.presentation.YokaiScaffold +import yokai.util.Screen + +class AboutLicenseScreen : Screen() { + @Composable + override fun Content() { + val navigator = LocalNavigator.currentOrThrow + val backPress = LocalBackPress.currentOrThrow + + YokaiScaffold( + onNavigationIconClicked = backPress, + title = stringResource(MR.strings.open_source_licenses), + appBarType = AppBarType.SMALL, + scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(), + ) { innerPadding -> + LibrariesContainer( + modifier = Modifier.fillMaxSize(), + contentPadding = innerPadding, + onLibraryClick = { + navigator.push( + AboutLibraryLicenseScreen( + it.name, + it.website, + it.licenses.firstOrNull()?.htmlReadyLicenseContent.orEmpty(), + ), + ) + } + ) + } + } +} diff --git a/app/src/main/java/yokai/util/Navigation.kt b/app/src/main/java/yokai/util/Navigation.kt new file mode 100644 index 0000000000..b5531f7e1e --- /dev/null +++ b/app/src/main/java/yokai/util/Navigation.kt @@ -0,0 +1,10 @@ +package yokai.util + +import cafe.adriel.voyager.core.screen.Screen +import cafe.adriel.voyager.core.screen.ScreenKey +import cafe.adriel.voyager.core.screen.uniqueScreenKey + +abstract class Screen : Screen { + + override val key: ScreenKey = uniqueScreenKey +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7825d74b68..bb31e9da42 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,4 +1,5 @@ [versions] +aboutlibraries = "11.2.2" chucker = "3.5.2" coil3 = "3.0.0-alpha08" flexible-adapter = "c8013533" @@ -13,7 +14,7 @@ sqlite = "2.4.0" sqldelight = "2.0.2" junit = "5.8.2" kermit = "2.0.3" -aboutlibraries = "11.2.2" +voyager = "1.1.0-beta02" [libraries] aboutlibraries = { module = "com.mikepenz:aboutlibraries-compose-m3", version.ref = "aboutlibraries" } @@ -96,6 +97,9 @@ unifile = { module = "com.github.tachiyomiorg:unifile", version = "a9de196cc7" } viewstatepageradapter = { module = "com.nightlynexus.viewstatepageradapter:viewstatepageradapter", version = "1.1.0" } viewtooltip = { module = "com.github.florent37:viewtooltip", version = "1.2.2" } +voyager-navigator = { module = "cafe.adriel.voyager:voyager-navigator", version.ref = "voyager" } +voyager-transitions = { module = "cafe.adriel.voyager:voyager-transitions", version.ref = "voyager" } + [plugins] aboutlibraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "aboutlibraries" } firebase-crashlytics = { id = "com.google.firebase.crashlytics", version = "3.0.2" } @@ -116,3 +120,4 @@ sqlite = [ "sqlite-ktx" ] test = [ "junit-api", "mockk" ] test-android = [ "junit-android" ] test-runtime = [ "junit-engine" ] +voyager = ["voyager-navigator", "voyager-transitions"]