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

View file

@ -43,7 +43,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
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.more.settings.Preference
import eu.kanade.tachiyomi.ui.webview.WebViewActivity
@ -52,6 +52,7 @@ import exh.eh.EHentaiUpdateWorker
import exh.eh.EHentaiUpdateWorkerConstants
import exh.eh.EHentaiUpdaterStats
import exh.metadata.metadata.EHentaiSearchMetadata
import exh.source.EH_PACKAGE
import exh.ui.login.EhLoginActivity
import exh.util.nullIfBlank
import kotlinx.collections.immutable.persistentListOf
@ -139,6 +140,14 @@ object SettingsEhScreen : SearchableSettings {
ConfigureExhDialog(run = runConfigureDialog, onRunning = { runConfigureDialog = false })
return listOf(
// KMK -->
Preference.PreferenceGroup(
stringResource(MR.strings.source_settings),
preferenceItems = persistentListOf(
ehIncognitoMode(unsortedPreferences),
),
),
// KMK <--
Preference.PreferenceGroup(
stringResource(SYMR.strings.ehentai_prefs_account_settings),
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
fun getLoginPreference(
unsortedPreferences: UnsortedPreferences,
@ -275,14 +302,12 @@ object SettingsEhScreen : SearchableSettings {
subtitle = stringResource(SYMR.strings.watched_tags_summary),
enabled = exhentaiEnabled,
onClick = {
startActivity(
context,
context.startActivity(
WebViewActivity.newIntent(
context,
url = "https://exhentai.org/mytags",
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.tachiyomi.extension.ExtensionManager
import exh.source.EH_PACKAGE
import exh.source.isEhBasedSource
import tachiyomi.domain.source.model.StubSource
import tachiyomi.presentation.core.icons.FlagEmoji
import tachiyomi.source.local.isLocal
@ -80,8 +82,8 @@ private fun getMergedSourcesString(
fun Source.isLocalOrStub(): Boolean = isLocal() || this is StubSource
// KMK -->
fun Source.isIncognitoModeEnabled(): Boolean {
val extensionPackage = Injekt.get<ExtensionManager>().getExtensionPackage(id)
return extensionPackage in Injekt.get<SourcePreferences>().incognitoExtensions().get()
fun Source.isIncognitoModeEnabled(incognitoExtensions: Set<String>? = null): Boolean {
val extensionPackage = if (isEhBasedSource()) EH_PACKAGE else Injekt.get<ExtensionManager>().getExtensionPackage(id)
return extensionPackage in (incognitoExtensions ?: Injekt.get<SourcePreferences>().incognitoExtensions().get())
}
// KMK <--

View file

@ -36,6 +36,10 @@ class UnsortedPreferences(
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 imageQuality() = preferenceStore.getString("ehentai_quality", "auto")

View file

@ -6,6 +6,7 @@ const val LEWD_SOURCE_SERIES = 6900L
// KMK -->
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"
// KMK <--
const val NHENTAI_SOURCE_ID = 7309872737163460316L