feat(incognito): Add incognito mode for EH based sources (#901)

* Add incognito mode for eh based sources

(cherry picked from commit bdf848ebb721394ff1b7b7006e538f6f60056b76)

* simplify GetIncognitoState parameters and logic

---------

Co-authored-by: Cuong-Tran <cuongtran.tm@gmail.com>
This commit is contained in:
Jery 2025-05-11 14:21:48 +07:00 committed by Cuong-Tran
parent ee1418c7fc
commit a862bda9d5
No known key found for this signature in database
GPG key ID: 733AA7624B9315C2
5 changed files with 49 additions and 15 deletions

View file

@ -2,22 +2,23 @@ package eu.kanade.domain.source.interactor
import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.base.BasePreferences
import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.source.service.SourcePreferences
import eu.kanade.tachiyomi.extension.ExtensionManager import eu.kanade.tachiyomi.source.isIncognitoModeEnabled
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged
import tachiyomi.domain.source.service.SourceManager
class GetIncognitoState( class GetIncognitoState(
private val basePreferences: BasePreferences, private val basePreferences: BasePreferences,
private val sourcePreferences: SourcePreferences, private val sourcePreferences: SourcePreferences,
private val extensionManager: ExtensionManager, private val sourceManager: SourceManager,
) { ) {
fun await(sourceId: Long?): Boolean { fun await(sourceId: Long?): Boolean {
if (basePreferences.incognitoMode().get()) return true if (basePreferences.incognitoMode().get()) return true
if (sourceId == null) return false if (sourceId == null) return false
val extensionPackage = extensionManager.getExtensionPackage(sourceId) ?: return false // KMK -->
return sourceManager.get(sourceId)?.isIncognitoModeEnabled() == true
return extensionPackage in sourcePreferences.incognitoExtensions().get() // KMK <--
} }
fun subscribe(sourceId: Long?): Flow<Boolean> { fun subscribe(sourceId: Long?): Flow<Boolean> {
@ -26,9 +27,10 @@ class GetIncognitoState(
return combine( return combine(
basePreferences.incognitoMode().changes(), basePreferences.incognitoMode().changes(),
sourcePreferences.incognitoExtensions().changes(), sourcePreferences.incognitoExtensions().changes(),
extensionManager.getExtensionPackageAsFlow(sourceId), ) { incognito, incognitoExtensions ->
) { incognito, incognitoExtensions, extensionPackage -> // KMK -->
incognito || (extensionPackage in incognitoExtensions) incognito || sourceManager.get(sourceId)?.isIncognitoModeEnabled(incognitoExtensions) == true
// KMK <--
} }
.distinctUntilChanged() .distinctUntilChanged()
} }

View file

@ -43,7 +43,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogProperties
import androidx.core.content.ContextCompat.startActivity import eu.kanade.domain.source.interactor.ToggleIncognito
import eu.kanade.presentation.library.components.SyncFavoritesWarningDialog import eu.kanade.presentation.library.components.SyncFavoritesWarningDialog
import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.Preference
import eu.kanade.tachiyomi.ui.webview.WebViewActivity import eu.kanade.tachiyomi.ui.webview.WebViewActivity
@ -52,6 +52,7 @@ import exh.eh.EHentaiUpdateWorker
import exh.eh.EHentaiUpdateWorkerConstants import exh.eh.EHentaiUpdateWorkerConstants
import exh.eh.EHentaiUpdaterStats import exh.eh.EHentaiUpdaterStats
import exh.metadata.metadata.EHentaiSearchMetadata import exh.metadata.metadata.EHentaiSearchMetadata
import exh.source.EH_PACKAGE
import exh.ui.login.EhLoginActivity import exh.ui.login.EhLoginActivity
import exh.util.nullIfBlank import exh.util.nullIfBlank
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
@ -139,6 +140,14 @@ object SettingsEhScreen : SearchableSettings {
ConfigureExhDialog(run = runConfigureDialog, onRunning = { runConfigureDialog = false }) ConfigureExhDialog(run = runConfigureDialog, onRunning = { runConfigureDialog = false })
return listOf( return listOf(
// KMK -->
Preference.PreferenceGroup(
stringResource(MR.strings.source_settings),
preferenceItems = persistentListOf(
ehIncognitoMode(unsortedPreferences),
),
),
// KMK <--
Preference.PreferenceGroup( Preference.PreferenceGroup(
stringResource(SYMR.strings.ehentai_prefs_account_settings), stringResource(SYMR.strings.ehentai_prefs_account_settings),
preferenceItems = persistentListOf( preferenceItems = persistentListOf(
@ -180,6 +189,24 @@ object SettingsEhScreen : SearchableSettings {
) )
} }
// KMK -->
@Composable
fun ehIncognitoMode(
unsortedPreferences: UnsortedPreferences,
): Preference.PreferenceItem.SwitchPreference {
return Preference.PreferenceItem.SwitchPreference(
preference = unsortedPreferences.ehIncognitoMode(),
title = stringResource(MR.strings.pref_incognito_mode),
subtitle = stringResource(MR.strings.pref_incognito_mode_summary),
onValueChanged = { newVal ->
val toggleIncognito = Injekt.get<ToggleIncognito>()
toggleIncognito.await(EH_PACKAGE, newVal)
newVal
},
)
}
// KMK <--
@Composable @Composable
fun getLoginPreference( fun getLoginPreference(
unsortedPreferences: UnsortedPreferences, unsortedPreferences: UnsortedPreferences,
@ -275,14 +302,12 @@ object SettingsEhScreen : SearchableSettings {
subtitle = stringResource(SYMR.strings.watched_tags_summary), subtitle = stringResource(SYMR.strings.watched_tags_summary),
enabled = exhentaiEnabled, enabled = exhentaiEnabled,
onClick = { onClick = {
startActivity( context.startActivity(
context,
WebViewActivity.newIntent( WebViewActivity.newIntent(
context, context,
url = "https://exhentai.org/mytags", url = "https://exhentai.org/mytags",
title = context.stringResource(SYMR.strings.watched_tags_exh), title = context.stringResource(SYMR.strings.watched_tags_exh),
), ),
null,
) )
}, },
) )

View file

@ -2,6 +2,8 @@ package eu.kanade.tachiyomi.source
import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.source.service.SourcePreferences
import eu.kanade.tachiyomi.extension.ExtensionManager import eu.kanade.tachiyomi.extension.ExtensionManager
import exh.source.EH_PACKAGE
import exh.source.isEhBasedSource
import tachiyomi.domain.source.model.StubSource import tachiyomi.domain.source.model.StubSource
import tachiyomi.presentation.core.icons.FlagEmoji import tachiyomi.presentation.core.icons.FlagEmoji
import tachiyomi.source.local.isLocal import tachiyomi.source.local.isLocal
@ -80,8 +82,8 @@ private fun getMergedSourcesString(
fun Source.isLocalOrStub(): Boolean = isLocal() || this is StubSource fun Source.isLocalOrStub(): Boolean = isLocal() || this is StubSource
// KMK --> // KMK -->
fun Source.isIncognitoModeEnabled(): Boolean { fun Source.isIncognitoModeEnabled(incognitoExtensions: Set<String>? = null): Boolean {
val extensionPackage = Injekt.get<ExtensionManager>().getExtensionPackage(id) val extensionPackage = if (isEhBasedSource()) EH_PACKAGE else Injekt.get<ExtensionManager>().getExtensionPackage(id)
return extensionPackage in Injekt.get<SourcePreferences>().incognitoExtensions().get() return extensionPackage in (incognitoExtensions ?: Injekt.get<SourcePreferences>().incognitoExtensions().get())
} }
// KMK <-- // KMK <--

View file

@ -36,6 +36,10 @@ class UnsortedPreferences(
fun isHentaiEnabled() = preferenceStore.getBoolean("eh_is_hentai_enabled", false) fun isHentaiEnabled() = preferenceStore.getBoolean("eh_is_hentai_enabled", false)
// KMK -->
fun ehIncognitoMode() = preferenceStore.getBoolean("eh_incognito_mode", false)
// KMK <--
fun enableExhentai() = preferenceStore.getBoolean(Preference.privateKey("enable_exhentai"), false) fun enableExhentai() = preferenceStore.getBoolean(Preference.privateKey("enable_exhentai"), false)
fun imageQuality() = preferenceStore.getString("ehentai_quality", "auto") fun imageQuality() = preferenceStore.getString("ehentai_quality", "auto")

View file

@ -6,6 +6,7 @@ const val LEWD_SOURCE_SERIES = 6900L
// KMK --> // KMK -->
const val EH_SOURCE_ID = 1713178126840476467 // LEWD_SOURCE_SERIES + 1 const val EH_SOURCE_ID = 1713178126840476467 // LEWD_SOURCE_SERIES + 1
const val EXH_SOURCE_ID = 6225928719850211219 // LEWD_SOURCE_SERIES + 2 const val EXH_SOURCE_ID = 6225928719850211219 // LEWD_SOURCE_SERIES + 2
const val EH_PACKAGE = "eu.kanade.tachiyomi.extension.all.ehentai"
// KMK <-- // KMK <--
const val NHENTAI_SOURCE_ID = 7309872737163460316L const val NHENTAI_SOURCE_ID = 7309872737163460316L