diff --git a/app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt index e257834e8..2f6bc8865 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt @@ -4,6 +4,9 @@ import android.content.Intent import android.net.Uri import android.provider.Settings import android.util.DisplayMetrics +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.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -36,10 +39,8 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign @@ -374,7 +375,12 @@ private fun DetailsHeader( modifier = Modifier.padding(horizontal = MaterialTheme.padding.small), title = stringResource(MR.strings.pref_incognito_mode), subtitle = stringResource(MR.strings.pref_incognito_mode_extension_summary), - icon = ImageVector.vectorResource(R.drawable.ic_glasses_24dp), + // KMK --> + icon = rememberAnimatedVectorPainter( + AnimatedImageVector.animatedVectorResource(R.drawable.anim_incognito), + extIncognitoMode, + ), + // KMK <-- widget = { Row( verticalAlignment = Alignment.CenterVertically, diff --git a/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt b/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt index 0f453148d..ddd6e5b06 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt @@ -88,6 +88,7 @@ import eu.kanade.presentation.util.formatChapterNumber import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.getNameForMangaInfo +import eu.kanade.tachiyomi.source.isIncognitoModeEnabled import eu.kanade.tachiyomi.source.online.MetadataSource import eu.kanade.tachiyomi.source.online.all.EHentai import eu.kanade.tachiyomi.source.online.all.MangaDex @@ -621,6 +622,9 @@ private fun MangaScreenSmallImpl( manga = state.manga, sourceName = remember { state.source.getNameForMangaInfo(state.mergedData?.sources) }, isStubSource = remember { state.source is StubSource }, + // KMK --> + isSourceIncognito = remember { state.source.isIncognitoModeEnabled() }, + // KMK <-- onCoverClick = onCoverClicked, doSearch = onSearch, // KMK --> @@ -1075,6 +1079,9 @@ private fun MangaScreenLargeImpl( manga = state.manga, sourceName = remember { state.source.getNameForMangaInfo(state.mergedData?.sources) }, isStubSource = remember { state.source is StubSource }, + // KMK --> + isSourceIncognito = remember { state.source.isIncognitoModeEnabled() }, + // KMK <-- onCoverClick = onCoverClicked, doSearch = onSearch, // KMK --> diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt index 4b7b0e7eb..34a86db69 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt @@ -67,9 +67,11 @@ import androidx.compose.ui.draw.drawWithContent import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.Layout import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Constraints @@ -115,6 +117,9 @@ fun MangaInfoBox( manga: Manga, sourceName: String, isStubSource: Boolean, + // KMK --> + isSourceIncognito: Boolean, + // KMK <-- onCoverClick: () -> Unit, doSearch: (query: String, global: Boolean) -> Unit, modifier: Modifier = Modifier, @@ -177,6 +182,9 @@ fun MangaInfoBox( manga = manga, sourceName = sourceName, isStubSource = isStubSource, + // KMK --> + isSourceIncognito = isSourceIncognito, + // KMK <-- onCoverClick = onCoverClick, doSearch = doSearch, // KMK --> @@ -194,6 +202,9 @@ fun MangaInfoBox( manga = manga, sourceName = sourceName, isStubSource = isStubSource, + // KMK --> + isSourceIncognito = isSourceIncognito, + // KMK <-- onCoverClick = onCoverClick, doSearch = doSearch, // KMK --> @@ -469,6 +480,9 @@ private fun MangaAndSourceTitlesLarge( manga: Manga, sourceName: String, isStubSource: Boolean, + // KMK --> + isSourceIncognito: Boolean, + // KMK <-- onCoverClick: () -> Unit, doSearch: (query: String, global: Boolean) -> Unit, // KMK --> @@ -530,6 +544,9 @@ private fun MangaAndSourceTitlesLarge( status = manga.status, sourceName = sourceName, isStubSource = isStubSource, + // KMK --> + isSourceIncognito = isSourceIncognito, + // KMK <-- doSearch = doSearch, textAlign = TextAlign.Center, // KMK --> @@ -546,6 +563,9 @@ private fun MangaAndSourceTitlesSmall( manga: Manga, sourceName: String, isStubSource: Boolean, + // KMK --> + isSourceIncognito: Boolean, + // KMK <-- onCoverClick: () -> Unit, doSearch: (query: String, global: Boolean) -> Unit, // KMK --> @@ -619,6 +639,9 @@ private fun MangaAndSourceTitlesSmall( status = manga.status, sourceName = sourceName, isStubSource = isStubSource, + // KMK --> + isSourceIncognito = isSourceIncognito, + // KMK <-- doSearch = doSearch, // KMK --> librarySearch = librarySearch, @@ -638,6 +661,9 @@ private fun ColumnScope.MangaContentInfo( status: Long, sourceName: String, isStubSource: Boolean, + // KMK --> + isSourceIncognito: Boolean, + // KMK <-- doSearch: (query: String, global: Boolean) -> Unit, textAlign: TextAlign? = LocalTextStyle.current.textAlign, // KMK --> @@ -792,6 +818,19 @@ private fun ColumnScope.MangaContentInfo( overflow = TextOverflow.Ellipsis, maxLines = 1, ) + // KMK --> + if (isSourceIncognito) { + DotSeparatorText() + Icon( + painter = rememberVectorPainter(ImageVector.vectorResource(R.drawable.ic_glasses_with_hat_24dp)), + contentDescription = stringResource(MR.strings.pref_incognito_mode), + modifier = Modifier + .padding(end = 4.dp) + .size(16.dp), + tint = MaterialTheme.colorScheme.primary, + ) + } + // KMK <-- DotSeparatorText() if (isStubSource) { Icon( diff --git a/app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt b/app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt index 704b69a6f..830563a2f 100644 --- a/app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt @@ -1,5 +1,8 @@ package eu.kanade.presentation.more +import androidx.compose.animation.graphics.res.animatedVectorResource +import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter +import androidx.compose.animation.graphics.vector.AnimatedImageVector import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.HelpOutline import androidx.compose.material.icons.automirrored.outlined.Label @@ -15,9 +18,7 @@ import androidx.compose.material.icons.outlined.Storage import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.remember -import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.res.vectorResource import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget import eu.kanade.tachiyomi.R @@ -86,7 +87,12 @@ fun MoreScreen( SwitchPreferenceWidget( title = stringResource(MR.strings.pref_incognito_mode), subtitle = stringResource(MR.strings.pref_incognito_mode_summary), - icon = ImageVector.vectorResource(R.drawable.ic_glasses_24dp), + // KMK --> + icon = rememberAnimatedVectorPainter( + AnimatedImageVector.animatedVectorResource(R.drawable.anim_incognito), + incognitoMode, + ), + // KMK <-- checked = incognitoMode, onCheckedChanged = onIncognitoModeChange, ) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/widget/SwitchPreferenceWidget.kt b/app/src/main/java/eu/kanade/presentation/more/settings/widget/SwitchPreferenceWidget.kt index 598669c58..315c8c149 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/widget/SwitchPreferenceWidget.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/widget/SwitchPreferenceWidget.kt @@ -8,6 +8,7 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Switch import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.tooling.preview.PreviewLightDark import eu.kanade.presentation.theme.TachiyomiPreviewTheme @@ -17,7 +18,10 @@ fun SwitchPreferenceWidget( modifier: Modifier = Modifier, title: String, subtitle: CharSequence? = null, - icon: ImageVector? = null, + // KMK --> + /** Can be either [ImageVector] or [Painter] */ + icon: Any? = null, + // KMK <-- checked: Boolean = false, onCheckedChanged: (Boolean) -> Unit, ) { diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/widget/TextPreferenceWidget.kt b/app/src/main/java/eu/kanade/presentation/more/settings/widget/TextPreferenceWidget.kt index 1319decf6..f4ccb22d8 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/widget/TextPreferenceWidget.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/widget/TextPreferenceWidget.kt @@ -11,6 +11,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle @@ -25,7 +26,10 @@ fun TextPreferenceWidget( modifier: Modifier = Modifier, title: String? = null, subtitle: CharSequence? = null, - icon: ImageVector? = null, + // KMK --> + /** Can be either [ImageVector] or [Painter] */ + icon: Any? = null, + // KMK <-- iconTint: Color = MaterialTheme.colorScheme.primary, widget: @Composable (() -> Unit)? = null, onPreferenceClick: (() -> Unit)? = null, @@ -60,16 +64,22 @@ fun TextPreferenceWidget( } else { null }, - icon = if (icon != null) { - { + icon = { + if (icon != null && icon is ImageVector) { Icon( imageVector = icon, tint = iconTint, contentDescription = null, ) + // KMK --> + } else if (icon != null && icon is Painter) { + Icon( + painter = icon, + tint = iconTint, + contentDescription = null, + ) + // KMK <-- } - } else { - null }, onClick = onPreferenceClick, widget = widget, diff --git a/app/src/main/java/eu/kanade/tachiyomi/App.kt b/app/src/main/java/eu/kanade/tachiyomi/App.kt index 8a0be59ad..89d86cb12 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/App.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/App.kt @@ -164,7 +164,7 @@ class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.Factor ) { setContentTitle(stringResource(MR.strings.pref_incognito_mode)) setContentText(stringResource(MR.strings.notification_incognito_text)) - setSmallIcon(R.drawable.ic_glasses_24dp) + setSmallIcon(R.drawable.ic_glasses_with_hat_24dp) setColor(ContextCompat.getColor(applicationContext, R.color.ic_launcher)) setLargeIcon(BitmapFactory.decodeResource(applicationContext.resources, R.drawable.komikku)) setOngoing(true) 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 a3a012498..49c5f42b4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/SourceExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/SourceExtensions.kt @@ -1,6 +1,7 @@ package eu.kanade.tachiyomi.source import eu.kanade.domain.source.service.SourcePreferences +import eu.kanade.tachiyomi.extension.ExtensionManager import tachiyomi.domain.source.model.StubSource import tachiyomi.presentation.core.icons.FlagEmoji import tachiyomi.source.local.isLocal @@ -77,3 +78,10 @@ private fun getMergedSourcesString( // SY <-- fun Source.isLocalOrStub(): Boolean = isLocal() || this is StubSource + +// KMK --> +fun Source.isIncognitoModeEnabled(): Boolean { + val extensionPackage = Injekt.get().getExtensionPackage(id) + return extensionPackage in Injekt.get().incognitoExtensions().get() +} +// KMK <-- diff --git a/app/src/main/res/drawable/anim_incognito.xml b/app/src/main/res/drawable/anim_incognito.xml new file mode 100644 index 000000000..992a207f5 --- /dev/null +++ b/app/src/main/res/drawable/anim_incognito.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_glasses_with_hat_24dp.xml b/app/src/main/res/drawable/ic_glasses_with_hat_24dp.xml new file mode 100644 index 000000000..42a066ac0 --- /dev/null +++ b/app/src/main/res/drawable/ic_glasses_with_hat_24dp.xml @@ -0,0 +1,23 @@ + + + + + + + +