From 615c9fa259648ff4b9638a092b0add8466bc87b5 Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Sun, 11 May 2025 16:07:36 +0700 Subject: [PATCH] feat(incognito): add incognito mode for local sources (#903) --- .../browse/components/BrowseSourceToolbar.kt | 34 +++++-------------- .../tachiyomi/source/SourceExtensions.kt | 7 +++- .../source/browse/BrowseSourceScreenModel.kt | 3 ++ .../source/feed/SourceFeedScreenModel.kt | 3 ++ .../commonMain/kotlin/exh/source/SourceIds.kt | 1 + 5 files changed, 22 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt index 71f32a9a5..abaef3457 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt @@ -2,7 +2,6 @@ package eu.kanade.presentation.browse.components import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ViewList -import androidx.compose.material.icons.automirrored.outlined.Help import androidx.compose.material.icons.filled.ViewModule import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarScrollBehavior @@ -17,9 +16,7 @@ import eu.kanade.presentation.components.AppBarTitle import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.components.RadioMenuItem import eu.kanade.presentation.components.SearchToolbar -import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.Source -import exh.source.anyIs import kotlinx.collections.immutable.persistentListOf import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.i18n.MR @@ -51,7 +48,6 @@ fun BrowseSourceToolbar( // Avoid capturing unstable source in actions lambda val title = source?.name val isLocalSource = source is LocalSource - val isConfigurableSource = source?.anyIs() == true var selectingDisplayMode by remember { mutableStateOf(false) } @@ -81,33 +77,21 @@ fun BrowseSourceToolbar( } // KMK --> add(bulkSelectionButton(isRunning, toggleSelectionMode)) + add( + AppBar.OverflowAction( + title = stringResource(MR.strings.pref_incognito_mode), + onClick = onToggleIncognito, + ), + ) // KMK <-- if (isLocalSource) { - if (isConfigurableSource && displayMode != null) { - add( - AppBar.OverflowAction( - title = stringResource(MR.strings.label_help), - onClick = onHelpClick, - ), - ) - } else { - add( - AppBar.Action( - title = stringResource(MR.strings.label_help), - icon = Icons.AutoMirrored.Outlined.Help, - onClick = onHelpClick, - ), - ) - } - } else { - // KMK --> add( AppBar.OverflowAction( - title = stringResource(MR.strings.pref_incognito_mode), - onClick = onToggleIncognito, + title = stringResource(MR.strings.label_help), + onClick = onHelpClick, ), ) - // KMK <-- + } else { add( AppBar.OverflowAction( title = stringResource(MR.strings.action_web_view), diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/SourceExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/source/SourceExtensions.kt index 01915d5ea..30e2a822d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/SourceExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/SourceExtensions.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.source import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.extension.ExtensionManager import exh.source.EH_PACKAGE +import exh.source.LOCAL_SOURCE_PACKAGE import exh.source.isEhBasedSource import tachiyomi.domain.source.model.StubSource import tachiyomi.presentation.core.icons.FlagEmoji @@ -83,7 +84,11 @@ fun Source.isLocalOrStub(): Boolean = isLocal() || this is StubSource // KMK --> fun Source.isIncognitoModeEnabled(incognitoExtensions: Set? = null): Boolean { - val extensionPackage = if (isEhBasedSource()) EH_PACKAGE else Injekt.get().getExtensionPackage(id) + val extensionPackage = when { + isLocal() -> LOCAL_SOURCE_PACKAGE + isEhBasedSource() -> EH_PACKAGE + else -> Injekt.get().getExtensionPackage(id) + } return extensionPackage in (incognitoExtensions ?: Injekt.get().incognitoExtensions().get()) } // KMK <-- diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt index 9caf28f9c..32176b79b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt @@ -33,6 +33,7 @@ import eu.kanade.tachiyomi.source.online.all.MangaDex import eu.kanade.tachiyomi.util.removeCovers import exh.metadata.metadata.RaisedSearchMetadata import exh.source.EH_PACKAGE +import exh.source.LOCAL_SOURCE_PACKAGE import exh.source.getMainSource import exh.source.isEhBasedSource import kotlinx.collections.immutable.ImmutableList @@ -81,6 +82,7 @@ import tachiyomi.domain.source.model.StubSource import tachiyomi.domain.source.repository.SourcePagingSource import tachiyomi.domain.source.service.SourceManager import tachiyomi.i18n.sy.SYMR +import tachiyomi.source.local.isLocal import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import xyz.nulldev.ts.api.http.serializer.FilterSerializer @@ -215,6 +217,7 @@ open class BrowseSourceScreenModel( fun toggleIncognitoMode() { val packageName = when { source is StubSource -> null + source.isLocal() -> LOCAL_SOURCE_PACKAGE source.isEhBasedSource() -> EH_PACKAGE else -> extensionManager.getExtensionPackage(sourceId) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/feed/SourceFeedScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/feed/SourceFeedScreenModel.kt index 16d457442..6da0c0bdb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/feed/SourceFeedScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/feed/SourceFeedScreenModel.kt @@ -22,6 +22,7 @@ import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.online.all.MangaDex import eu.kanade.tachiyomi.ui.browse.feed.MaxFeedItems import exh.source.EH_PACKAGE +import exh.source.LOCAL_SOURCE_PACKAGE import exh.source.getMainSource import exh.source.isEhBasedSource import exh.source.mangaDexSourceIds @@ -60,6 +61,7 @@ import tachiyomi.domain.source.model.StubSource import tachiyomi.domain.source.service.SourceManager import tachiyomi.i18n.kmk.KMR import tachiyomi.i18n.sy.SYMR +import tachiyomi.source.local.isLocal import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import xyz.nulldev.ts.api.http.serializer.FilterSerializer @@ -141,6 +143,7 @@ open class SourceFeedScreenModel( fun toggleIncognitoMode() { val packageName = when { source is StubSource -> null + source.isLocal() -> LOCAL_SOURCE_PACKAGE source.isEhBasedSource() -> EH_PACKAGE else -> extensionManager.getExtensionPackage(sourceId) } diff --git a/source-api/src/commonMain/kotlin/exh/source/SourceIds.kt b/source-api/src/commonMain/kotlin/exh/source/SourceIds.kt index 537411ebc..1f840be08 100644 --- a/source-api/src/commonMain/kotlin/exh/source/SourceIds.kt +++ b/source-api/src/commonMain/kotlin/exh/source/SourceIds.kt @@ -7,6 +7,7 @@ const val LEWD_SOURCE_SERIES = 6900L const val EH_SOURCE_ID = 1713178126840476467 // LEWD_SOURCE_SERIES + 1 const val EXH_SOURCE_ID = 6225928719850211219 // LEWD_SOURCE_SERIES + 2 const val EH_PACKAGE = "eu.kanade.tachiyomi.extension.all.ehentai" +const val LOCAL_SOURCE_PACKAGE = "tachiyomi.source.local" // KMK <-- const val NHENTAI_SOURCE_ID = 7309872737163460316L