From e3245d0610709783b60cb59d737dfdb36a0e756a Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Tue, 29 Oct 2024 21:15:14 +0600 Subject: [PATCH] Here lies "currentTab was used multiple times" Fixes #282 (cherry picked from commit 371c1432e218f6dcf129f05405dceb2cd351c647) # Conflicts: # CHANGELOG.md # app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseTab.kt # app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt --- .../presentation/components/TabbedScreen.kt | 11 +-- .../kanade/tachiyomi/ui/browse/BrowseTab.kt | 71 ++++++++++++------- .../kanade/tachiyomi/ui/history/HistoryTab.kt | 2 +- .../eu/kanade/tachiyomi/ui/home/HomeScreen.kt | 15 ++-- .../kanade/tachiyomi/ui/library/LibraryTab.kt | 2 +- .../eu/kanade/tachiyomi/ui/more/MoreTab.kt | 2 +- .../kanade/tachiyomi/ui/updates/UpdatesTab.kt | 2 +- 7 files changed, 60 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/components/TabbedScreen.kt b/app/src/main/java/eu/kanade/presentation/components/TabbedScreen.kt index efb1e2e04..31cacae13 100644 --- a/app/src/main/java/eu/kanade/presentation/components/TabbedScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/components/TabbedScreen.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.material3.MaterialTheme import androidx.compose.material3.PrimaryTabRow @@ -14,7 +15,6 @@ import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Tab import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment @@ -33,20 +33,13 @@ import tachiyomi.presentation.core.i18n.stringResource fun TabbedScreen( titleRes: StringResource, tabs: ImmutableList, - startIndex: Int? = null, + state: PagerState = rememberPagerState { tabs.size }, searchQuery: String? = null, onChangeSearchQuery: (String?) -> Unit = {}, ) { val scope = rememberCoroutineScope() - val state = rememberPagerState { tabs.size } val snackbarHostState = remember { SnackbarHostState() } - LaunchedEffect(startIndex) { - if (startIndex != null) { - state.scrollToPage(startIndex) - } - } - Scaffold( topBar = { val tab = tabs[state.currentPage] diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseTab.kt index 20c9e79d6..1e11005ea 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseTab.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.ui.browse import androidx.compose.animation.graphics.res.animatedVectorResource import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter import androidx.compose.animation.graphics.vector.AnimatedImageVector +import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -27,14 +28,16 @@ import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchScreen import eu.kanade.tachiyomi.ui.browse.source.sourcesTab import eu.kanade.tachiyomi.ui.main.MainActivity import kotlinx.collections.immutable.persistentListOf +import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.receiveAsFlow import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -data class BrowseTab( - private val toExtensions: Boolean = false, -) : Tab { +data object BrowseTab : Tab { override val options: TabOptions @Composable @@ -52,6 +55,12 @@ data class BrowseTab( navigator.push(GlobalSearchScreen()) } + private val switchToExtensionTabChannel = Channel(1, BufferOverflow.DROP_OLDEST) + + fun showExtension() { + switchToExtensionTabChannel.trySend(Unit) + } + @Composable override fun Content() { val context = LocalContext.current @@ -65,35 +74,43 @@ data class BrowseTab( val extensionsScreenModel = rememberScreenModel { ExtensionsScreenModel() } val extensionsState by extensionsScreenModel.state.collectAsState() + // SY --> + val tabs = if (hideFeedTab) { + persistentListOf( + sourcesTab(), + extensionsTab(extensionsScreenModel), + migrateSourceTab(), + ) + } else if (feedTabInFront) { + persistentListOf( + feedTab(), + sourcesTab(), + extensionsTab(extensionsScreenModel), + migrateSourceTab(), + ) + } else { + persistentListOf( + sourcesTab(), + feedTab(), + extensionsTab(extensionsScreenModel), + migrateSourceTab(), + ) + } + // SY <-- + + val state = rememberPagerState { tabs.size } + TabbedScreen( titleRes = MR.strings.browse, - // SY --> - tabs = if (hideFeedTab) { - persistentListOf( - sourcesTab(), - extensionsTab(extensionsScreenModel), - migrateSourceTab(), - ) - } else if (feedTabInFront) { - persistentListOf( - feedTab(), - sourcesTab(), - extensionsTab(extensionsScreenModel), - migrateSourceTab(), - ) - } else { - persistentListOf( - sourcesTab(), - feedTab(), - extensionsTab(extensionsScreenModel), - migrateSourceTab(), - ) - }, - startIndex = 2.takeIf { toExtensions }, - // SY <-- + tabs = tabs, + state = state, searchQuery = extensionsState.searchQuery, onChangeSearchQuery = extensionsScreenModel::search, ) + LaunchedEffect(Unit) { + switchToExtensionTabChannel.receiveAsFlow() + .collectLatest { state.scrollToPage(/* SY --> */2/* SY <-- */) } + } LaunchedEffect(Unit) { (context as? MainActivity)?.ready = true diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryTab.kt index f2118696c..e247ed273 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryTab.kt @@ -38,7 +38,7 @@ import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -object HistoryTab : Tab { +data object HistoryTab : Tab { private val snackbarHostState = SnackbarHostState() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt index b3841c5a9..a74a50287 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt @@ -73,11 +73,11 @@ object HomeScreen : Screen() { private const val TAB_FADE_DURATION = 200 private const val TAB_NAVIGATOR_KEY = "HomeTabs" - private val tabs = listOf( + private val TABS = listOf( LibraryTab, UpdatesTab, HistoryTab, - BrowseTab(), + BrowseTab, MoreTab, ) @@ -102,7 +102,7 @@ object HomeScreen : Screen() { startBar = { if (isTabletUi()) { NavigationRail { - tabs + TABS // SY --> .fastFilter { it.isEnabled() } // SY <-- @@ -123,7 +123,7 @@ object HomeScreen : Screen() { exit = shrinkVertically(), ) { NavigationBar { - tabs + TABS // SY --> .fastFilter { it.isEnabled() } // SY <-- @@ -179,7 +179,12 @@ object HomeScreen : Screen() { is Tab.Library -> LibraryTab Tab.Updates -> UpdatesTab Tab.History -> HistoryTab - is Tab.Browse -> BrowseTab(it.toExtensions) + is Tab.Browse -> { + if (it.toExtensions) { + BrowseTab.showExtension() + } + BrowseTab + } is Tab.More -> MoreTab } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt index 145494c30..90b3ae76b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt @@ -75,7 +75,7 @@ import tachiyomi.source.local.isLocal import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -object LibraryTab : Tab { +data object LibraryTab : Tab { override val options: TabOptions @Composable diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreTab.kt index d920c577d..e8435f772 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreTab.kt @@ -42,7 +42,7 @@ import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -object MoreTab : Tab { +data object MoreTab : Tab { override val options: TabOptions @Composable diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesTab.kt index 566d061d8..9b55f88d9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesTab.kt @@ -37,7 +37,7 @@ import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -object UpdatesTab : Tab { +data object UpdatesTab : Tab { override val options: TabOptions @Composable