refactor: Start using Voyager for navigation

This commit is contained in:
Ahmad Ansori Palembani 2024-08-01 07:14:14 +07:00
parent 563a3a0289
commit 2e1faefa97
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6
6 changed files with 97 additions and 45 deletions

View file

@ -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)

View file

@ -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"

View file

@ -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) },
)
}
},
)
}
}
}

View file

@ -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(),
),
)
}
)
}
}
}

View file

@ -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
}

View file

@ -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"]