Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package eu.kanade.tachiyomi.ui.browse

import java.util.concurrent.atomic.AtomicReference

internal enum class BrowseSearchTarget {
ANIME,
MANGA,
UNKNOWN,
}

internal class BrowseReselectTargetResolver(
initialSearchTarget: BrowseSearchTarget = BrowseSearchTarget.UNKNOWN,
) {
private val lastKnownSearchTarget = AtomicReference(initialSearchTarget)

fun updateForPage(page: Int) {
lastKnownSearchTarget.updateAndGet { current ->
updateBrowseSearchTarget(current, page)
}
}

fun resolvedTarget(): BrowseSearchTarget {
return resolveBrowseReselectTarget(lastKnownSearchTarget.get())
}
}

private const val ANIME_SOURCES_PAGE = 0
private const val MANGA_SOURCES_PAGE = 1
private const val ANIME_EXTENSIONS_PAGE = 2
private const val MANGA_EXTENSIONS_PAGE = 3
private const val ANIME_MIGRATION_PAGE = 4
private const val MANGA_MIGRATION_PAGE = 5

internal fun browseSearchTargetForPage(page: Int): BrowseSearchTarget {
return when (page) {
ANIME_SOURCES_PAGE, ANIME_EXTENSIONS_PAGE, ANIME_MIGRATION_PAGE -> BrowseSearchTarget.ANIME
MANGA_SOURCES_PAGE, MANGA_EXTENSIONS_PAGE, MANGA_MIGRATION_PAGE -> BrowseSearchTarget.MANGA
else -> BrowseSearchTarget.UNKNOWN
}
}

internal fun updateBrowseSearchTarget(
lastKnownSearchTarget: BrowseSearchTarget,
page: Int,
): BrowseSearchTarget {
return when (val pageTarget = browseSearchTargetForPage(page)) {
BrowseSearchTarget.UNKNOWN -> lastKnownSearchTarget
else -> pageTarget
}
}

internal fun resolveBrowseReselectTarget(lastKnownSearchTarget: BrowseSearchTarget): BrowseSearchTarget {
return when (lastKnownSearchTarget) {
BrowseSearchTarget.UNKNOWN -> BrowseSearchTarget.ANIME
else -> lastKnownSearchTarget
}
}
17 changes: 16 additions & 1 deletion app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseTab.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.platform.LocalContext
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import cafe.adriel.voyager.core.model.rememberScreenModel
Expand All @@ -26,6 +27,7 @@ import eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch.GlobalAnimeSearch
import eu.kanade.tachiyomi.ui.browse.manga.extension.MangaExtensionsScreenModel
import eu.kanade.tachiyomi.ui.browse.manga.extension.mangaExtensionsTab
import eu.kanade.tachiyomi.ui.browse.manga.migration.sources.migrateMangaSourceTab
import eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch.GlobalMangaSearchScreen
import eu.kanade.tachiyomi.ui.browse.manga.source.mangaSourcesTab
import eu.kanade.tachiyomi.ui.browse.novel.source.novelSourcesTab
import eu.kanade.tachiyomi.ui.main.MainActivity
Expand All @@ -41,6 +43,8 @@ import uy.kohesive.injekt.api.get

data object BrowseTab : Tab {

private val reselectTargetResolver = BrowseReselectTargetResolver()

override val options: TabOptions
@Composable
get() {
Expand All @@ -54,7 +58,11 @@ data object BrowseTab : Tab {
}

override suspend fun onReselect(navigator: Navigator) {
navigator.push(GlobalAnimeSearchScreen())
when (reselectTargetResolver.resolvedTarget()) {
BrowseSearchTarget.ANIME -> navigator.push(GlobalAnimeSearchScreen())
BrowseSearchTarget.MANGA -> navigator.push(GlobalMangaSearchScreen())
BrowseSearchTarget.UNKNOWN -> navigator.push(GlobalAnimeSearchScreen())
}
}

private val switchToTabNumberChannel = Channel<Int>(1, BufferOverflow.DROP_OLDEST)
Expand Down Expand Up @@ -119,6 +127,13 @@ data object BrowseTab : Tab {
}
}

LaunchedEffect(state) {
snapshotFlow { state.currentPage }
.collectLatest { page ->
reselectTargetResolver.updateForPage(page)
}
}

LaunchedEffect(Unit) {
(context as? MainActivity)?.ready = true
}
Expand Down
53 changes: 53 additions & 0 deletions app/src/test/java/eu/kanade/tachiyomi/ui/browse/BrowseTabTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.ui.browse

import eu.kanade.tachiyomi.feature.novel.IncompatibleReason
import eu.kanade.tachiyomi.feature.novel.LightNovelPluginUiState
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
Expand Down Expand Up @@ -31,4 +32,56 @@ class BrowseTabTest {
),
)
}

@Test
fun `anime pages map to anime target`() {
assertEquals(BrowseSearchTarget.ANIME, browseSearchTargetForPage(0))
assertEquals(BrowseSearchTarget.ANIME, browseSearchTargetForPage(2))
assertEquals(BrowseSearchTarget.ANIME, browseSearchTargetForPage(4))
}

@Test
fun `manga pages map to manga target`() {
assertEquals(BrowseSearchTarget.MANGA, browseSearchTargetForPage(1))
assertEquals(BrowseSearchTarget.MANGA, browseSearchTargetForPage(3))
assertEquals(BrowseSearchTarget.MANGA, browseSearchTargetForPage(5))
}

@Test
fun `unknown pages keep target unchanged for novel and absent states`() {
assertEquals(
BrowseSearchTarget.MANGA,
updateBrowseSearchTarget(BrowseSearchTarget.MANGA, 6),
)
assertEquals(
BrowseSearchTarget.ANIME,
updateBrowseSearchTarget(BrowseSearchTarget.ANIME, 6),
)
assertEquals(
BrowseSearchTarget.ANIME,
updateBrowseSearchTarget(BrowseSearchTarget.ANIME, 999),
)
}

@Test
fun `unknown reselect target defaults to anime`() {
assertEquals(BrowseSearchTarget.ANIME, resolveBrowseReselectTarget(BrowseSearchTarget.UNKNOWN))
}

@Test
fun `resolver defaults to anime when unknown`() {
val resolver = BrowseReselectTargetResolver()

assertEquals(BrowseSearchTarget.ANIME, resolver.resolvedTarget())
}

@Test
fun `resolver preserves last non novel target`() {
val resolver = BrowseReselectTargetResolver()

resolver.updateForPage(1)
resolver.updateForPage(6)

assertEquals(BrowseSearchTarget.MANGA, resolver.resolvedTarget())
}
}
Loading