Merge Voyager screens (#8656)
* Merge Voyager screens
* cleanups
(cherry picked from commit 3d66eaea83)
# Conflicts:
# app/src/main/java/eu/kanade/presentation/components/MangaBottomActionMenu.kt
# app/src/main/java/eu/kanade/presentation/more/settings/screen/AboutScreen.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/base/changehandler/OneWayFadeChangeHandler.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/ConductorExtensions.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSearchScreen.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchController.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesFilterController.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesTab.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryScreen.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadController.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/main/WhatsNewDialogController.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreTab.kt
# app/src/main/res/layout/main_activity.xml
This commit is contained in:
+15
-12
@@ -1,6 +1,5 @@
|
||||
package exh.debug
|
||||
|
||||
import android.app.Activity
|
||||
import android.util.Log
|
||||
import androidx.compose.animation.AnimatedVisibility
|
||||
import androidx.compose.animation.Crossfade
|
||||
@@ -30,6 +29,7 @@ import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Switch
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.DisposableEffect
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.produceState
|
||||
@@ -43,6 +43,9 @@ import androidx.compose.ui.input.pointer.pointerInput
|
||||
import androidx.compose.ui.text.AnnotatedString
|
||||
import androidx.compose.ui.text.SpanStyle
|
||||
import androidx.compose.ui.unit.dp
|
||||
import cafe.adriel.voyager.core.screen.Screen
|
||||
import cafe.adriel.voyager.navigator.LocalNavigator
|
||||
import cafe.adriel.voyager.navigator.currentOrThrow
|
||||
import eu.kanade.core.prefs.PreferenceMutableState
|
||||
import eu.kanade.presentation.components.AppBar
|
||||
import eu.kanade.presentation.components.Divider
|
||||
@@ -53,8 +56,8 @@ import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget
|
||||
import eu.kanade.presentation.more.settings.widget.TrailingWidgetBuffer
|
||||
import eu.kanade.presentation.util.plus
|
||||
import eu.kanade.presentation.util.topSmallPaddingValues
|
||||
import eu.kanade.tachiyomi.ui.base.controller.BasicFullComposeController
|
||||
import exh.util.capitalize
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
@@ -63,12 +66,17 @@ import kotlin.reflect.KFunction
|
||||
import kotlin.reflect.KVisibility
|
||||
import kotlin.reflect.full.declaredFunctions
|
||||
|
||||
class SettingsDebugController : BasicFullComposeController() {
|
||||
class SettingsDebugScreen : Screen {
|
||||
|
||||
data class DebugToggle(val name: String, val pref: PreferenceMutableState<Boolean>, val default: Boolean)
|
||||
|
||||
@Composable
|
||||
override fun ComposeContent() {
|
||||
override fun Content() {
|
||||
val navigator = LocalNavigator.currentOrThrow
|
||||
val scope = rememberCoroutineScope()
|
||||
DisposableEffect(Unit) {
|
||||
onDispose { navigator.pop() }
|
||||
}
|
||||
val functions by produceState<List<Pair<KFunction<*>, String>>?>(initialValue = null) {
|
||||
value = withContext(Dispatchers.Default) {
|
||||
DebugFunctions::class.declaredFunctions.filter {
|
||||
@@ -82,7 +90,7 @@ class SettingsDebugController : BasicFullComposeController() {
|
||||
}
|
||||
val toggles by produceState(initialValue = emptyList()) {
|
||||
value = withContext(Dispatchers.Default) {
|
||||
DebugToggles.values().map { DebugToggle(it.name, it.asPref(viewScope), it.default) }
|
||||
DebugToggles.values().map { DebugToggle(it.name, it.asPref(scope), it.default) }
|
||||
}
|
||||
}
|
||||
Scaffold(
|
||||
@@ -96,7 +104,7 @@ class SettingsDebugController : BasicFullComposeController() {
|
||||
Crossfade(functions == null) {
|
||||
when (it) {
|
||||
true -> LoadingScreen()
|
||||
false -> FunctionList(paddingValues, functions.orEmpty(), toggles)
|
||||
false -> FunctionList(paddingValues, functions.orEmpty(), toggles, scope)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -107,8 +115,8 @@ class SettingsDebugController : BasicFullComposeController() {
|
||||
paddingValues: PaddingValues,
|
||||
functions: List<Pair<KFunction<*>, String>>,
|
||||
toggles: List<DebugToggle>,
|
||||
scope: CoroutineScope,
|
||||
) {
|
||||
val scope = rememberCoroutineScope()
|
||||
Box(Modifier.fillMaxSize()) {
|
||||
var running by remember { mutableStateOf(false) }
|
||||
var result by remember { mutableStateOf<Pair<String, String>?>(null) }
|
||||
@@ -227,9 +235,4 @@ class SettingsDebugController : BasicFullComposeController() {
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onActivityStopped(activity: Activity) {
|
||||
super.onActivityStopped(activity)
|
||||
router.popCurrentController()
|
||||
}
|
||||
}
|
||||
@@ -4,17 +4,16 @@ import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.bluelinelabs.conductor.Router
|
||||
import cafe.adriel.voyager.navigator.Navigator
|
||||
import eu.kanade.tachiyomi.databinding.SourceFilterMangadexHeaderBinding
|
||||
import eu.kanade.tachiyomi.source.CatalogueSource
|
||||
import eu.kanade.tachiyomi.source.online.RandomMangaSource
|
||||
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
|
||||
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceController
|
||||
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreen
|
||||
import eu.kanade.tachiyomi.util.lang.launchUI
|
||||
import eu.kanade.tachiyomi.util.lang.withIOContext
|
||||
import exh.md.follows.MangaDexFollowsController
|
||||
import exh.md.follows.MangaDexFollowsScreen
|
||||
|
||||
class MangaDexFabHeaderAdapter(val router: Router, val source: CatalogueSource, val onClick: () -> Unit) :
|
||||
class MangaDexFabHeaderAdapter(val navigator: Navigator, val source: CatalogueSource, val onClick: () -> Unit) :
|
||||
RecyclerView.Adapter<MangaDexFabHeaderAdapter.SavedSearchesViewHolder>() {
|
||||
|
||||
private lateinit var binding: SourceFilterMangadexHeaderBinding
|
||||
@@ -33,7 +32,7 @@ class MangaDexFabHeaderAdapter(val router: Router, val source: CatalogueSource,
|
||||
inner class SavedSearchesViewHolder(view: View) : RecyclerView.ViewHolder(view) {
|
||||
fun bind() {
|
||||
binding.mangadexFollows.setOnClickListener {
|
||||
router.replaceTopController(MangaDexFollowsController(source).withFadeTransaction())
|
||||
navigator.replace(MangaDexFollowsScreen(source.id))
|
||||
onClick()
|
||||
}
|
||||
binding.mangadexRandom.setOnClickListener {
|
||||
@@ -41,11 +40,11 @@ class MangaDexFabHeaderAdapter(val router: Router, val source: CatalogueSource,
|
||||
val randomMangaUrl = withIOContext {
|
||||
(source as? RandomMangaSource)?.fetchRandomMangaUrl()
|
||||
}
|
||||
router.replaceTopController(
|
||||
BrowseSourceController(
|
||||
source,
|
||||
navigator.replace(
|
||||
BrowseSourceScreen(
|
||||
source.id,
|
||||
"id:$randomMangaUrl",
|
||||
).withFadeTransaction(),
|
||||
),
|
||||
)
|
||||
onClick()
|
||||
}
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
package exh.md.follows
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.core.os.bundleOf
|
||||
import cafe.adriel.voyager.navigator.Navigator
|
||||
import eu.kanade.tachiyomi.source.CatalogueSource
|
||||
import eu.kanade.tachiyomi.ui.base.controller.BasicFullComposeController
|
||||
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceController
|
||||
|
||||
/**
|
||||
* Controller that shows the latest manga from the catalogue. Inherit [BrowseSourceController].
|
||||
*/
|
||||
class MangaDexFollowsController(bundle: Bundle) : BasicFullComposeController(bundle) {
|
||||
|
||||
constructor(source: CatalogueSource) : this(
|
||||
bundleOf(
|
||||
SOURCE_ID_KEY to source.id,
|
||||
),
|
||||
)
|
||||
|
||||
private val sourceId = args.getLong(SOURCE_ID_KEY)
|
||||
|
||||
@Composable
|
||||
override fun ComposeContent() {
|
||||
Navigator(screen = MangaDexFollowsScreen(sourceId))
|
||||
}
|
||||
}
|
||||
|
||||
private const val SOURCE_ID_KEY = "source_id"
|
||||
@@ -1,6 +1,5 @@
|
||||
package exh.md.follows
|
||||
|
||||
import androidx.activity.compose.BackHandler
|
||||
import androidx.compose.material3.SnackbarHost
|
||||
import androidx.compose.material3.SnackbarHostState
|
||||
import androidx.compose.runtime.Composable
|
||||
@@ -23,19 +22,16 @@ import eu.kanade.presentation.browse.components.RemoveMangaDialog
|
||||
import eu.kanade.presentation.components.ChangeCategoryDialog
|
||||
import eu.kanade.presentation.components.DuplicateMangaDialog
|
||||
import eu.kanade.presentation.components.Scaffold
|
||||
import eu.kanade.presentation.util.LocalRouter
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.ui.base.controller.pushController
|
||||
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreenModel
|
||||
import eu.kanade.tachiyomi.ui.category.CategoryController
|
||||
import eu.kanade.tachiyomi.ui.manga.MangaController
|
||||
import eu.kanade.tachiyomi.ui.category.CategoryScreen
|
||||
import eu.kanade.tachiyomi.ui.manga.MangaScreen
|
||||
import eu.kanade.tachiyomi.util.lang.launchIO
|
||||
|
||||
class MangaDexFollowsScreen(private val sourceId: Long) : Screen {
|
||||
|
||||
@Composable
|
||||
override fun Content() {
|
||||
val router = LocalRouter.currentOrThrow
|
||||
val navigator = LocalNavigator.currentOrThrow
|
||||
val scope = rememberCoroutineScope()
|
||||
val haptic = LocalHapticFeedback.current
|
||||
@@ -44,20 +40,13 @@ class MangaDexFollowsScreen(private val sourceId: Long) : Screen {
|
||||
|
||||
val snackbarHostState = remember { SnackbarHostState() }
|
||||
|
||||
val navigateUp: () -> Unit = {
|
||||
when {
|
||||
navigator.canPop -> navigator.pop()
|
||||
router.backstackSize > 1 -> router.popCurrentController()
|
||||
}
|
||||
}
|
||||
|
||||
Scaffold(
|
||||
topBar = { scrollBehavior ->
|
||||
BrowseSourceSimpleToolbar(
|
||||
title = stringResource(R.string.mangadex_follows),
|
||||
displayMode = screenModel.displayMode,
|
||||
onDisplayModeChange = { screenModel.displayMode = it },
|
||||
navigateUp = navigateUp,
|
||||
navigateUp = navigator::pop,
|
||||
scrollBehavior = scrollBehavior,
|
||||
)
|
||||
},
|
||||
@@ -82,7 +71,7 @@ class MangaDexFollowsScreen(private val sourceId: Long) : Screen {
|
||||
onWebViewClick = null,
|
||||
onHelpClick = null,
|
||||
onLocalSourceHelpClick = null,
|
||||
onMangaClick = { router.pushController(MangaController(it.id, true)) },
|
||||
onMangaClick = { navigator.push(MangaScreen(it.id, true)) },
|
||||
onMangaLongClick = { manga ->
|
||||
scope.launchIO {
|
||||
val duplicateManga = screenModel.getDuplicateLibraryManga(manga)
|
||||
@@ -109,7 +98,7 @@ class MangaDexFollowsScreen(private val sourceId: Long) : Screen {
|
||||
DuplicateMangaDialog(
|
||||
onDismissRequest = onDismissRequest,
|
||||
onConfirm = { screenModel.addFavorite(dialog.manga) },
|
||||
onOpenManga = { router.pushController(MangaController(dialog.duplicate.id)) },
|
||||
onOpenManga = { navigator.push(MangaScreen(dialog.duplicate.id)) },
|
||||
duplicateFrom = screenModel.getSourceOrStub(dialog.duplicate),
|
||||
)
|
||||
}
|
||||
@@ -127,7 +116,7 @@ class MangaDexFollowsScreen(private val sourceId: Long) : Screen {
|
||||
initialSelection = dialog.initialSelection,
|
||||
onDismissRequest = onDismissRequest,
|
||||
onEditCategories = {
|
||||
router.pushController(CategoryController())
|
||||
navigator.push(CategoryScreen())
|
||||
},
|
||||
onConfirm = { include, _ ->
|
||||
screenModel.changeMangaFavorite(dialog.manga)
|
||||
@@ -137,7 +126,5 @@ class MangaDexFollowsScreen(private val sourceId: Long) : Screen {
|
||||
}
|
||||
else -> {}
|
||||
}
|
||||
|
||||
BackHandler(onBack = navigateUp)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package exh.md.follows
|
||||
|
||||
import android.content.Context
|
||||
import com.bluelinelabs.conductor.Router
|
||||
import cafe.adriel.voyager.navigator.Navigator
|
||||
import eu.kanade.domain.manga.model.Manga
|
||||
import eu.kanade.domain.source.model.SourcePagingSourceType
|
||||
import eu.kanade.tachiyomi.source.model.FilterList
|
||||
@@ -22,7 +22,7 @@ class MangaDexFollowsScreenModel(sourceId: Long) : BrowseSourceScreenModel(sourc
|
||||
return map { it to metadata }
|
||||
}
|
||||
|
||||
override fun initFilterSheet(context: Context, router: Router) {
|
||||
override fun initFilterSheet(context: Context, navigator: Navigator) {
|
||||
// No-op: we don't allow filtering in recs
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
package exh.md.similar
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.core.os.bundleOf
|
||||
import cafe.adriel.voyager.navigator.Navigator
|
||||
import eu.kanade.domain.manga.model.Manga
|
||||
import eu.kanade.tachiyomi.source.CatalogueSource
|
||||
import eu.kanade.tachiyomi.ui.base.controller.BasicFullComposeController
|
||||
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceController
|
||||
|
||||
/**
|
||||
* Controller that shows the latest manga from the catalogue. Inherit [BrowseSourceController].
|
||||
*/
|
||||
class MangaDexSimilarController(bundle: Bundle) : BasicFullComposeController(bundle) {
|
||||
|
||||
constructor(manga: Manga, source: CatalogueSource) : this(
|
||||
bundleOf(
|
||||
MANGA_ID to manga.id,
|
||||
SOURCE_ID_KEY to source.id,
|
||||
),
|
||||
)
|
||||
|
||||
val mangaId = args.getLong(MANGA_ID)
|
||||
val sourceId = args.getLong(SOURCE_ID_KEY)
|
||||
|
||||
@Composable
|
||||
override fun ComposeContent() {
|
||||
Navigator(screen = MangaDexSimilarScreen(mangaId, sourceId))
|
||||
}
|
||||
}
|
||||
|
||||
private const val MANGA_ID = "manga_id"
|
||||
private const val SOURCE_ID_KEY = "source_id"
|
||||
@@ -17,10 +17,8 @@ import eu.kanade.domain.manga.model.Manga
|
||||
import eu.kanade.presentation.browse.BrowseSourceContent
|
||||
import eu.kanade.presentation.browse.components.BrowseSourceSimpleToolbar
|
||||
import eu.kanade.presentation.components.Scaffold
|
||||
import eu.kanade.presentation.util.LocalRouter
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.ui.base.controller.pushController
|
||||
import eu.kanade.tachiyomi.ui.manga.MangaController
|
||||
import eu.kanade.tachiyomi.ui.manga.MangaScreen
|
||||
|
||||
class MangaDexSimilarScreen(val mangaId: Long, val sourceId: Long) : Screen {
|
||||
|
||||
@@ -28,26 +26,18 @@ class MangaDexSimilarScreen(val mangaId: Long, val sourceId: Long) : Screen {
|
||||
override fun Content() {
|
||||
val screenModel = rememberScreenModel { MangaDexSimilarScreenModel(mangaId, sourceId) }
|
||||
val state by screenModel.state.collectAsState()
|
||||
val router = LocalRouter.currentOrThrow
|
||||
val navigator = LocalNavigator.currentOrThrow
|
||||
|
||||
val onMangaClick: (Manga) -> Unit = {
|
||||
router.pushController(MangaController(it.id, true))
|
||||
navigator.push(MangaScreen(it.id, true))
|
||||
}
|
||||
|
||||
val snackbarHostState = remember { SnackbarHostState() }
|
||||
|
||||
val navigateUp: () -> Unit = {
|
||||
when {
|
||||
navigator.canPop -> navigator.pop()
|
||||
router.backstackSize > 1 -> router.popCurrentController()
|
||||
}
|
||||
}
|
||||
|
||||
Scaffold(
|
||||
topBar = { scrollBehavior ->
|
||||
BrowseSourceSimpleToolbar(
|
||||
navigateUp = navigateUp,
|
||||
navigateUp = navigator::pop,
|
||||
title = stringResource(R.string.similar, screenModel.manga.title),
|
||||
displayMode = screenModel.displayMode,
|
||||
onDisplayModeChange = { screenModel.displayMode = it },
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package exh.md.similar
|
||||
|
||||
import android.content.Context
|
||||
import com.bluelinelabs.conductor.Router
|
||||
import cafe.adriel.voyager.navigator.Navigator
|
||||
import eu.kanade.domain.manga.interactor.GetManga
|
||||
import eu.kanade.domain.manga.model.Manga
|
||||
import eu.kanade.domain.source.model.SourcePagingSourceType
|
||||
@@ -16,9 +16,6 @@ import kotlinx.coroutines.runBlocking
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
|
||||
/**
|
||||
* Presenter of [MangaDexSimilarController]. Inherit BrowseCataloguePresenter.
|
||||
*/
|
||||
class MangaDexSimilarScreenModel(
|
||||
val mangaId: Long,
|
||||
sourceId: Long,
|
||||
@@ -35,7 +32,7 @@ class MangaDexSimilarScreenModel(
|
||||
return map { it to metadata }
|
||||
}
|
||||
|
||||
override fun initFilterSheet(context: Context, router: Router) {
|
||||
override fun initFilterSheet(context: Context, navigator: Navigator) {
|
||||
// No-op: we don't allow filtering in recs
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
package exh.pagepreview
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.core.os.bundleOf
|
||||
import cafe.adriel.voyager.navigator.Navigator
|
||||
import eu.kanade.tachiyomi.ui.base.controller.BasicFullComposeController
|
||||
|
||||
class PagePreviewController : BasicFullComposeController {
|
||||
|
||||
@Suppress("unused")
|
||||
constructor(bundle: Bundle? = null) : super(bundle)
|
||||
|
||||
constructor(mangaId: Long) : super(
|
||||
bundleOf(MANGA_ID to mangaId),
|
||||
)
|
||||
|
||||
@Composable
|
||||
override fun ComposeContent() {
|
||||
Navigator(screen = PagePreviewScreen(args.getLong(MANGA_ID, -1)))
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val MANGA_ID = "manga_id"
|
||||
}
|
||||
}
|
||||
@@ -7,8 +7,8 @@ import androidx.compose.runtime.getValue
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import cafe.adriel.voyager.core.model.rememberScreenModel
|
||||
import cafe.adriel.voyager.core.screen.Screen
|
||||
import cafe.adriel.voyager.navigator.LocalNavigator
|
||||
import cafe.adriel.voyager.navigator.currentOrThrow
|
||||
import eu.kanade.presentation.util.LocalRouter
|
||||
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
||||
import exh.pagepreview.components.PagePreviewScreen
|
||||
|
||||
@@ -19,7 +19,7 @@ class PagePreviewScreen(private val mangaId: Long) : Screen {
|
||||
val screenModel = rememberScreenModel { PagePreviewScreenModel(mangaId) }
|
||||
val context = LocalContext.current
|
||||
val state by screenModel.state.collectAsState()
|
||||
val router = LocalRouter.currentOrThrow
|
||||
val navigator = LocalNavigator.currentOrThrow
|
||||
PagePreviewScreen(
|
||||
state = state,
|
||||
pageDialogOpen = screenModel.pageDialogOpen,
|
||||
@@ -27,7 +27,7 @@ class PagePreviewScreen(private val mangaId: Long) : Screen {
|
||||
onOpenPage = { openPage(context, state, it) },
|
||||
onOpenPageDialog = { screenModel.pageDialogOpen = true },
|
||||
onDismissPageDialog = { screenModel.pageDialogOpen = false },
|
||||
navigateUp = router::popCurrentController,
|
||||
navigateUp = navigator::pop,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
package exh.recs
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.core.os.bundleOf
|
||||
import cafe.adriel.voyager.navigator.Navigator
|
||||
import eu.kanade.domain.manga.model.Manga
|
||||
import eu.kanade.tachiyomi.source.CatalogueSource
|
||||
import eu.kanade.tachiyomi.ui.base.controller.BasicFullComposeController
|
||||
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceController
|
||||
|
||||
/**
|
||||
* Controller that shows the latest manga from the catalogue. Inherit [BrowseSourceController].
|
||||
*/
|
||||
class RecommendsController(bundle: Bundle) : BasicFullComposeController(bundle) {
|
||||
|
||||
constructor(manga: Manga, source: CatalogueSource) : this(
|
||||
bundleOf(
|
||||
MANGA_ID to manga.id,
|
||||
SOURCE_ID_KEY to source.id,
|
||||
),
|
||||
)
|
||||
|
||||
val mangaId = args.getLong(MANGA_ID)
|
||||
val sourceId = args.getLong(SOURCE_ID_KEY)
|
||||
|
||||
@Composable
|
||||
override fun ComposeContent() {
|
||||
Navigator(screen = RecommendsScreen(mangaId, sourceId))
|
||||
}
|
||||
}
|
||||
|
||||
private const val MANGA_ID = "manga_id"
|
||||
private const val SOURCE_ID_KEY = "source_id"
|
||||
@@ -17,7 +17,6 @@ import eu.kanade.domain.manga.model.Manga
|
||||
import eu.kanade.presentation.browse.BrowseSourceContent
|
||||
import eu.kanade.presentation.browse.components.BrowseSourceSimpleToolbar
|
||||
import eu.kanade.presentation.components.Scaffold
|
||||
import eu.kanade.presentation.util.LocalRouter
|
||||
import eu.kanade.tachiyomi.ui.browse.source.SourcesScreen
|
||||
|
||||
class RecommendsScreen(val mangaId: Long, val sourceId: Long) : Screen {
|
||||
@@ -26,7 +25,6 @@ class RecommendsScreen(val mangaId: Long, val sourceId: Long) : Screen {
|
||||
override fun Content() {
|
||||
val screenModel = rememberScreenModel { RecommendsScreenModel(mangaId, sourceId) }
|
||||
val state by screenModel.state.collectAsState()
|
||||
val router = LocalRouter.currentOrThrow
|
||||
val navigator = LocalNavigator.currentOrThrow
|
||||
|
||||
val onMangaClick: (Manga) -> Unit = { manga ->
|
||||
@@ -35,17 +33,10 @@ class RecommendsScreen(val mangaId: Long, val sourceId: Long) : Screen {
|
||||
|
||||
val snackbarHostState = remember { SnackbarHostState() }
|
||||
|
||||
val navigateUp: () -> Unit = {
|
||||
when {
|
||||
navigator.canPop -> navigator.pop()
|
||||
router.backstackSize > 1 -> router.popCurrentController()
|
||||
}
|
||||
}
|
||||
|
||||
Scaffold(
|
||||
topBar = { scrollBehavior ->
|
||||
BrowseSourceSimpleToolbar(
|
||||
navigateUp = navigateUp,
|
||||
navigateUp = navigator::pop,
|
||||
title = screenModel.manga.title,
|
||||
displayMode = screenModel.displayMode,
|
||||
onDisplayModeChange = { screenModel.displayMode = it },
|
||||
|
||||
@@ -8,9 +8,6 @@ import kotlinx.coroutines.runBlocking
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
|
||||
/**
|
||||
* Presenter of [RecommendsController]. Inherit BrowseCataloguePresenter.
|
||||
*/
|
||||
class RecommendsScreenModel(
|
||||
val mangaId: Long,
|
||||
sourceId: Long,
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
package exh.uconfig
|
||||
|
||||
import android.app.Dialog
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.ui.base.controller.DialogController
|
||||
import eu.kanade.tachiyomi.util.lang.launchIO
|
||||
import eu.kanade.tachiyomi.util.lang.launchUI
|
||||
import eu.kanade.tachiyomi.util.system.toast
|
||||
import exh.log.xLogE
|
||||
import kotlinx.coroutines.MainScope
|
||||
import kotlinx.coroutines.cancel
|
||||
|
||||
class ConfiguringDialogController : DialogController() {
|
||||
private var materialDialog: AlertDialog? = null
|
||||
val scope = MainScope()
|
||||
|
||||
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
|
||||
if (savedViewState == null) {
|
||||
scope.launchIO {
|
||||
try {
|
||||
EHConfigurator(activity!!).configureAll()
|
||||
launchUI {
|
||||
activity?.toast(R.string.eh_settings_successfully_uploaded)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
launchUI {
|
||||
activity?.let {
|
||||
MaterialAlertDialogBuilder(it)
|
||||
.setTitle(R.string.eh_settings_configuration_failed)
|
||||
.setMessage(it.getString(R.string.eh_settings_configuration_failed_message, e.message))
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
.show()
|
||||
}
|
||||
}
|
||||
this@ConfiguringDialogController.xLogE("Configuration error!", e)
|
||||
}
|
||||
launchUI {
|
||||
finish()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return MaterialAlertDialogBuilder(activity!!)
|
||||
.setTitle(R.string.eh_settings_uploading_to_server)
|
||||
.setMessage(R.string.eh_settings_uploading_to_server_message)
|
||||
.setCancelable(false)
|
||||
.create()
|
||||
.also {
|
||||
materialDialog = it
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroyView(view: View) {
|
||||
super.onDestroyView(view)
|
||||
materialDialog = null
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
scope.cancel()
|
||||
}
|
||||
|
||||
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
|
||||
super.onRestoreInstanceState(savedInstanceState)
|
||||
finish()
|
||||
}
|
||||
|
||||
fun finish() {
|
||||
router.popController(this)
|
||||
}
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
package exh.uconfig
|
||||
|
||||
import android.app.Dialog
|
||||
import android.os.Bundle
|
||||
import com.bluelinelabs.conductor.Router
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import eu.kanade.domain.UnsortedPreferences
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.ui.base.controller.DialogController
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
import uy.kohesive.injekt.injectLazy
|
||||
|
||||
class WarnConfigureDialogController : DialogController() {
|
||||
private val prefs: UnsortedPreferences by injectLazy()
|
||||
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
|
||||
return MaterialAlertDialogBuilder(activity!!)
|
||||
.setTitle(R.string.settings_profile_note)
|
||||
.setMessage(R.string.settings_profile_note_message)
|
||||
.setPositiveButton(android.R.string.ok) { _, _ ->
|
||||
prefs.exhShowSettingsUploadWarning().set(false)
|
||||
ConfiguringDialogController().showDialog(router)
|
||||
}
|
||||
.setCancelable(false)
|
||||
.create()
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun uploadSettings(router: Router) {
|
||||
if (Injekt.get<UnsortedPreferences>().exhShowSettingsUploadWarning().get()) {
|
||||
WarnConfigureDialogController().showDialog(router)
|
||||
} else {
|
||||
ConfiguringDialogController().showDialog(router)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package exh.ui.batchadd
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import cafe.adriel.voyager.navigator.Navigator
|
||||
import eu.kanade.tachiyomi.ui.base.controller.BasicFullComposeController
|
||||
|
||||
/**
|
||||
* Batch add screen
|
||||
*/
|
||||
class BatchAddController : BasicFullComposeController() {
|
||||
|
||||
@Composable
|
||||
override fun ComposeContent() {
|
||||
Navigator(screen = BatchAddScreen())
|
||||
}
|
||||
}
|
||||
@@ -34,7 +34,6 @@ import eu.kanade.presentation.components.AppBar
|
||||
import eu.kanade.presentation.components.Button
|
||||
import eu.kanade.presentation.components.LazyColumn
|
||||
import eu.kanade.presentation.components.Scaffold
|
||||
import eu.kanade.presentation.util.LocalRouter
|
||||
import eu.kanade.presentation.util.padding
|
||||
import eu.kanade.presentation.util.plus
|
||||
import eu.kanade.tachiyomi.R
|
||||
@@ -46,19 +45,13 @@ class BatchAddScreen : Screen {
|
||||
val screenModel = rememberScreenModel { BatchAddScreenModel() }
|
||||
val state by screenModel.state.collectAsState()
|
||||
val navigator = LocalNavigator.currentOrThrow
|
||||
val router = LocalRouter.currentOrThrow
|
||||
val context = LocalContext.current
|
||||
|
||||
Scaffold(
|
||||
topBar = { scrollBehavior ->
|
||||
AppBar(
|
||||
title = stringResource(R.string.batch_add),
|
||||
navigateUp = {
|
||||
when {
|
||||
navigator.canPop -> navigator.pop()
|
||||
else -> router.popCurrentController()
|
||||
}
|
||||
},
|
||||
navigateUp = navigator::pop,
|
||||
scrollBehavior = scrollBehavior,
|
||||
)
|
||||
},
|
||||
|
||||
@@ -26,8 +26,8 @@ import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.source.online.UrlImportableSource
|
||||
import eu.kanade.tachiyomi.ui.base.activity.BaseActivity
|
||||
import eu.kanade.tachiyomi.ui.main.MainActivity
|
||||
import eu.kanade.tachiyomi.ui.manga.MangaController
|
||||
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
||||
import eu.kanade.tachiyomi.util.Constants
|
||||
import eu.kanade.tachiyomi.util.view.setComposeContent
|
||||
import exh.GalleryAddEvent
|
||||
import exh.GalleryAdder
|
||||
@@ -113,7 +113,7 @@ class InterceptActivity : BaseActivity() {
|
||||
Intent(this, MainActivity::class.java)
|
||||
.setAction(MainActivity.SHORTCUT_MANGA)
|
||||
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
|
||||
.putExtra(MangaController.MANGA_EXTRA, it.mangaId)
|
||||
.putExtra(Constants.MANGA_EXTRA, it.mangaId)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
package exh.ui.metadata
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.core.os.bundleOf
|
||||
import cafe.adriel.voyager.navigator.Navigator
|
||||
import eu.kanade.domain.manga.model.Manga
|
||||
import eu.kanade.tachiyomi.ui.base.controller.BasicFullComposeController
|
||||
|
||||
class MetadataViewController : BasicFullComposeController {
|
||||
constructor(manga: Manga) : super(
|
||||
bundleOf(
|
||||
MANGA_EXTRA to manga.id,
|
||||
SOURCE_EXTRA to manga.source,
|
||||
),
|
||||
)
|
||||
|
||||
@Suppress("unused")
|
||||
constructor(bundle: Bundle) : super(bundle)
|
||||
|
||||
@Composable
|
||||
override fun ComposeContent() {
|
||||
Navigator(screen = MetadataViewScreen(args.getLong(MANGA_EXTRA), args.getLong(SOURCE_EXTRA)))
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val MANGA_EXTRA = "manga"
|
||||
const val SOURCE_EXTRA = "source"
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
package exh.ui.smartsearch
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.core.os.bundleOf
|
||||
import cafe.adriel.voyager.navigator.Navigator
|
||||
import eu.kanade.tachiyomi.ui.base.controller.BasicFullComposeController
|
||||
import eu.kanade.tachiyomi.ui.browse.source.SourcesScreen
|
||||
import eu.kanade.tachiyomi.util.system.getSerializableCompat
|
||||
|
||||
class SmartSearchController(bundle: Bundle) : BasicFullComposeController() {
|
||||
private val sourceId = bundle.getLong(ARG_SOURCE_ID, -1)
|
||||
private val smartSearchConfig = bundle.getSerializableCompat<SourcesScreen.SmartSearchConfig>(ARG_SMART_SEARCH_CONFIG)!!
|
||||
|
||||
constructor(sourceId: Long, smartSearchConfig: SourcesScreen.SmartSearchConfig) : this(
|
||||
bundleOf(
|
||||
ARG_SOURCE_ID to sourceId,
|
||||
ARG_SMART_SEARCH_CONFIG to smartSearchConfig,
|
||||
),
|
||||
)
|
||||
|
||||
@Composable
|
||||
override fun ComposeContent() {
|
||||
Navigator(screen = SmartSearchScreen(sourceId, smartSearchConfig))
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val ARG_SOURCE_ID = "SOURCE_ID"
|
||||
private const val ARG_SMART_SEARCH_CONFIG = "SMART_SEARCH_CONFIG"
|
||||
}
|
||||
}
|
||||
@@ -19,15 +19,14 @@ import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import cafe.adriel.voyager.core.model.rememberScreenModel
|
||||
import cafe.adriel.voyager.core.screen.Screen
|
||||
import cafe.adriel.voyager.navigator.LocalNavigator
|
||||
import cafe.adriel.voyager.navigator.currentOrThrow
|
||||
import eu.kanade.presentation.components.AppBar
|
||||
import eu.kanade.presentation.components.Scaffold
|
||||
import eu.kanade.presentation.util.LocalRouter
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
|
||||
import eu.kanade.tachiyomi.ui.browse.source.SourcesScreen
|
||||
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceController
|
||||
import eu.kanade.tachiyomi.ui.manga.MangaController
|
||||
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreen
|
||||
import eu.kanade.tachiyomi.ui.manga.MangaScreen
|
||||
import eu.kanade.tachiyomi.util.system.toast
|
||||
|
||||
class SmartSearchScreen(private val sourceId: Long, private val smartSearchConfig: SourcesScreen.SmartSearchConfig) : Screen {
|
||||
@@ -36,27 +35,27 @@ class SmartSearchScreen(private val sourceId: Long, private val smartSearchConfi
|
||||
override fun Content() {
|
||||
val screenModel = rememberScreenModel { SmartSearchScreenModel(sourceId, smartSearchConfig) }
|
||||
|
||||
val router = LocalRouter.currentOrThrow
|
||||
val navigator = LocalNavigator.currentOrThrow
|
||||
val context = LocalContext.current
|
||||
val state by screenModel.state.collectAsState()
|
||||
LaunchedEffect(state) {
|
||||
val results = state
|
||||
if (results != null) {
|
||||
if (results is SmartSearchScreenModel.SearchResults.Found) {
|
||||
val transaction = MangaController(results.manga.id, true, smartSearchConfig).withFadeTransaction()
|
||||
router.replaceTopController(transaction)
|
||||
navigator.replace(MangaScreen(results.manga.id, true, smartSearchConfig))
|
||||
} else {
|
||||
if (results is SmartSearchScreenModel.SearchResults.NotFound) {
|
||||
context.toast(R.string.could_not_find_entry)
|
||||
} else {
|
||||
context.toast(R.string.automatic_search_error)
|
||||
}
|
||||
val transaction = BrowseSourceController(
|
||||
screenModel.source,
|
||||
smartSearchConfig.origTitle,
|
||||
smartSearchConfig,
|
||||
).withFadeTransaction()
|
||||
router.replaceTopController(transaction)
|
||||
navigator.push(
|
||||
BrowseSourceScreen(
|
||||
sourceId = screenModel.source.id,
|
||||
query = smartSearchConfig.origTitle,
|
||||
smartSearchConfig = smartSearchConfig,
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -65,7 +64,7 @@ class SmartSearchScreen(private val sourceId: Long, private val smartSearchConfi
|
||||
topBar = { scrollBehavior ->
|
||||
AppBar(
|
||||
title = screenModel.source.name,
|
||||
navigateUp = router::popCurrentController,
|
||||
navigateUp = navigator::pop,
|
||||
scrollBehavior = scrollBehavior,
|
||||
)
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user