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)
implementation(libs.conductor.support.preference) implementation(libs.conductor.support.preference)
// Navigation
implementation(libs.bundles.voyager)
// Shizuku // Shizuku
implementation(libs.shizuku.api) implementation(libs.shizuku.api)
implementation(libs.shizuku.provider) implementation(libs.shizuku.provider)

View file

@ -1,6 +1,5 @@
package eu.kanade.tachiyomi.ui.more package eu.kanade.tachiyomi.ui.more
import android.os.Bundle
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState 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.unit.dp
import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.text.HtmlCompat import androidx.core.text.HtmlCompat
import cafe.adriel.voyager.navigator.LocalNavigator
import com.google.android.material.textview.MaterialTextView import com.google.android.material.textview.MaterialTextView
import dev.icerock.moko.resources.compose.stringResource 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.i18n.MR
import yokai.presentation.AppBarType import yokai.presentation.AppBarType
import yokai.presentation.YokaiScaffold import yokai.presentation.YokaiScaffold
import yokai.presentation.component.ToolTipButton 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 @Composable
override fun ScreenContent() { override fun Content() {
val name = bundle.getString(LIBRARY_NAME) ?: throw RuntimeException("Missing library name") val navigator = LocalNavigator.currentOrThrow
val website = bundle.getString(LIBRARY_WEBSITE) val backPress = LocalBackPress.currentOrThrow
val license = bundle.getString(LIBRARY_LICENSE) ?: throw RuntimeException("Missing library license")
val uriHandler = LocalUriHandler.current val uriHandler = LocalUriHandler.current
// FIXME: For some reason AppBar is offscreen // FIXME: For some reason AppBar is offscreen
YokaiScaffold( YokaiScaffold(
onNavigationIconClicked = router::handleBack, onNavigationIconClicked = {
when {
navigator.canPop -> navigator.pop()
else -> backPress()
}
},
title = name, title = name,
appBarType = AppBarType.SMALL, appBarType = AppBarType.SMALL,
scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior( 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 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.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.runtime.CompositionLocalProvider
import com.mikepenz.aboutlibraries.ui.compose.m3.LibrariesContainer import cafe.adriel.voyager.core.stack.StackEvent
import com.mikepenz.aboutlibraries.ui.compose.m3.util.htmlReadyLicenseContent import cafe.adriel.voyager.navigator.Navigator
import dev.icerock.moko.resources.compose.stringResource import cafe.adriel.voyager.transitions.ScreenTransition
import eu.kanade.tachiyomi.ui.base.controller.BaseComposeController import eu.kanade.tachiyomi.ui.base.controller.BaseComposeController
import eu.kanade.tachiyomi.util.view.withFadeTransaction import eu.kanade.tachiyomi.util.compose.LocalBackPress
import yokai.i18n.MR import soup.compose.material.motion.animation.materialSharedAxisZ
import yokai.presentation.AppBarType
import yokai.presentation.YokaiScaffold
class AboutLicenseController : BaseComposeController() { class AboutLicenseController : BaseComposeController() {
@Composable @Composable
override fun ScreenContent() { override fun ScreenContent() {
YokaiScaffold( Navigator(
onNavigationIconClicked = router::handleBack, screen = AboutLicenseScreen(),
title = stringResource(MR.strings.open_source_licenses), content = {
appBarType = AppBarType.SMALL, CompositionLocalProvider(LocalBackPress provides router::handleBack) {
scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(), ScreenTransition(
) { innerPadding -> navigator = it,
LibrariesContainer( transition = { materialSharedAxisZ(forward = it.lastEvent != StackEvent.Pop) },
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(),
) )
} }
) },
} )
} }
} }

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] [versions]
aboutlibraries = "11.2.2"
chucker = "3.5.2" chucker = "3.5.2"
coil3 = "3.0.0-alpha08" coil3 = "3.0.0-alpha08"
flexible-adapter = "c8013533" flexible-adapter = "c8013533"
@ -13,7 +14,7 @@ sqlite = "2.4.0"
sqldelight = "2.0.2" sqldelight = "2.0.2"
junit = "5.8.2" junit = "5.8.2"
kermit = "2.0.3" kermit = "2.0.3"
aboutlibraries = "11.2.2" voyager = "1.1.0-beta02"
[libraries] [libraries]
aboutlibraries = { module = "com.mikepenz:aboutlibraries-compose-m3", version.ref = "aboutlibraries" } 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" } viewstatepageradapter = { module = "com.nightlynexus.viewstatepageradapter:viewstatepageradapter", version = "1.1.0" }
viewtooltip = { module = "com.github.florent37:viewtooltip", version = "1.2.2" } 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] [plugins]
aboutlibraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "aboutlibraries" } aboutlibraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "aboutlibraries" }
firebase-crashlytics = { id = "com.google.firebase.crashlytics", version = "3.0.2" } firebase-crashlytics = { id = "com.google.firebase.crashlytics", version = "3.0.2" }
@ -116,3 +120,4 @@ sqlite = [ "sqlite-ktx" ]
test = [ "junit-api", "mockk" ] test = [ "junit-api", "mockk" ]
test-android = [ "junit-android" ] test-android = [ "junit-android" ]
test-runtime = [ "junit-engine" ] test-runtime = [ "junit-engine" ]
voyager = ["voyager-navigator", "voyager-transitions"]