Skip to content

Commit cf91b7f

Browse files
committed
537: make browse reselect search context-aware
1 parent a658d0f commit cf91b7f

2 files changed

Lines changed: 91 additions & 1 deletion

File tree

app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseTab.kt

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.compose.foundation.pager.rememberPagerState
77
import androidx.compose.runtime.Composable
88
import androidx.compose.runtime.LaunchedEffect
99
import androidx.compose.runtime.getValue
10+
import androidx.compose.runtime.snapshotFlow
1011
import androidx.compose.ui.platform.LocalContext
1112
import androidx.lifecycle.compose.collectAsStateWithLifecycle
1213
import cafe.adriel.voyager.core.model.rememberScreenModel
@@ -26,6 +27,7 @@ import eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch.GlobalAnimeSearch
2627
import eu.kanade.tachiyomi.ui.browse.manga.extension.MangaExtensionsScreenModel
2728
import eu.kanade.tachiyomi.ui.browse.manga.extension.mangaExtensionsTab
2829
import eu.kanade.tachiyomi.ui.browse.manga.migration.sources.migrateMangaSourceTab
30+
import eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch.GlobalMangaSearchScreen
2931
import eu.kanade.tachiyomi.ui.browse.manga.source.mangaSourcesTab
3032
import eu.kanade.tachiyomi.ui.browse.novel.source.novelSourcesTab
3133
import eu.kanade.tachiyomi.ui.main.MainActivity
@@ -41,6 +43,9 @@ import uy.kohesive.injekt.api.get
4143

4244
data object BrowseTab : Tab {
4345

46+
@Volatile
47+
private var lastKnownSearchTarget = BrowseSearchTarget.UNKNOWN
48+
4449
override val options: TabOptions
4550
@Composable
4651
get() {
@@ -54,7 +59,11 @@ data object BrowseTab : Tab {
5459
}
5560

5661
override suspend fun onReselect(navigator: Navigator) {
57-
navigator.push(GlobalAnimeSearchScreen())
62+
when (resolveBrowseReselectTarget(lastKnownSearchTarget)) {
63+
BrowseSearchTarget.ANIME -> navigator.push(GlobalAnimeSearchScreen())
64+
BrowseSearchTarget.MANGA -> navigator.push(GlobalMangaSearchScreen())
65+
BrowseSearchTarget.UNKNOWN -> navigator.push(GlobalAnimeSearchScreen())
66+
}
5867
}
5968

6069
private val switchToTabNumberChannel = Channel<Int>(1, BufferOverflow.DROP_OLDEST)
@@ -119,6 +128,13 @@ data object BrowseTab : Tab {
119128
}
120129
}
121130

131+
LaunchedEffect(state) {
132+
snapshotFlow { state.currentPage }
133+
.collectLatest { page ->
134+
lastKnownSearchTarget = updateBrowseSearchTarget(lastKnownSearchTarget, page)
135+
}
136+
}
137+
122138
LaunchedEffect(Unit) {
123139
(context as? MainActivity)?.ready = true
124140
}
@@ -128,3 +144,41 @@ data object BrowseTab : Tab {
128144
internal fun shouldShowNovelSourcesTab(uiState: LightNovelPluginUiState): Boolean {
129145
return uiState is LightNovelPluginUiState.Ready
130146
}
147+
148+
internal enum class BrowseSearchTarget {
149+
ANIME,
150+
MANGA,
151+
UNKNOWN,
152+
}
153+
154+
private const val ANIME_SOURCES_PAGE = 0
155+
private const val MANGA_SOURCES_PAGE = 1
156+
private const val ANIME_EXTENSIONS_PAGE = 2
157+
private const val MANGA_EXTENSIONS_PAGE = 3
158+
private const val ANIME_MIGRATION_PAGE = 4
159+
private const val MANGA_MIGRATION_PAGE = 5
160+
161+
internal fun browseSearchTargetForPage(page: Int): BrowseSearchTarget {
162+
return when (page) {
163+
ANIME_SOURCES_PAGE, ANIME_EXTENSIONS_PAGE, ANIME_MIGRATION_PAGE -> BrowseSearchTarget.ANIME
164+
MANGA_SOURCES_PAGE, MANGA_EXTENSIONS_PAGE, MANGA_MIGRATION_PAGE -> BrowseSearchTarget.MANGA
165+
else -> BrowseSearchTarget.UNKNOWN
166+
}
167+
}
168+
169+
internal fun updateBrowseSearchTarget(
170+
lastKnownSearchTarget: BrowseSearchTarget,
171+
page: Int,
172+
): BrowseSearchTarget {
173+
return when (val pageTarget = browseSearchTargetForPage(page)) {
174+
BrowseSearchTarget.UNKNOWN -> lastKnownSearchTarget
175+
else -> pageTarget
176+
}
177+
}
178+
179+
internal fun resolveBrowseReselectTarget(lastKnownSearchTarget: BrowseSearchTarget): BrowseSearchTarget {
180+
return when (lastKnownSearchTarget) {
181+
BrowseSearchTarget.UNKNOWN -> BrowseSearchTarget.ANIME
182+
else -> lastKnownSearchTarget
183+
}
184+
}

app/src/test/java/eu/kanade/tachiyomi/ui/browse/BrowseTabTest.kt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.ui.browse
22

33
import eu.kanade.tachiyomi.feature.novel.IncompatibleReason
44
import eu.kanade.tachiyomi.feature.novel.LightNovelPluginUiState
5+
import org.junit.jupiter.api.Assertions.assertEquals
56
import org.junit.jupiter.api.Assertions.assertFalse
67
import org.junit.jupiter.api.Assertions.assertTrue
78
import org.junit.jupiter.api.Test
@@ -31,4 +32,39 @@ class BrowseTabTest {
3132
),
3233
)
3334
}
35+
36+
@Test
37+
fun `anime pages map to anime target`() {
38+
assertEquals(BrowseSearchTarget.ANIME, browseSearchTargetForPage(0))
39+
assertEquals(BrowseSearchTarget.ANIME, browseSearchTargetForPage(2))
40+
assertEquals(BrowseSearchTarget.ANIME, browseSearchTargetForPage(4))
41+
}
42+
43+
@Test
44+
fun `manga pages map to manga target`() {
45+
assertEquals(BrowseSearchTarget.MANGA, browseSearchTargetForPage(1))
46+
assertEquals(BrowseSearchTarget.MANGA, browseSearchTargetForPage(3))
47+
assertEquals(BrowseSearchTarget.MANGA, browseSearchTargetForPage(5))
48+
}
49+
50+
@Test
51+
fun `unknown pages keep target unchanged for novel and absent states`() {
52+
assertEquals(
53+
BrowseSearchTarget.MANGA,
54+
updateBrowseSearchTarget(BrowseSearchTarget.MANGA, 6),
55+
)
56+
assertEquals(
57+
BrowseSearchTarget.ANIME,
58+
updateBrowseSearchTarget(BrowseSearchTarget.ANIME, 6),
59+
)
60+
assertEquals(
61+
BrowseSearchTarget.ANIME,
62+
updateBrowseSearchTarget(BrowseSearchTarget.ANIME, 999),
63+
)
64+
}
65+
66+
@Test
67+
fun `unknown reselect target defaults to anime`() {
68+
assertEquals(BrowseSearchTarget.ANIME, resolveBrowseReselectTarget(BrowseSearchTarget.UNKNOWN))
69+
}
3470
}

0 commit comments

Comments
 (0)