From c28b290f2454e5bbecd5a5fbd2456eb0f3d8d917 Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Thu, 20 Jun 2024 00:11:01 +0700 Subject: [PATCH] theme cover based for Reader --- .../kanade/tachiyomi/ui/manga/MangaScreen.kt | 8 +- .../tachiyomi/ui/manga/PaletteScreen.kt | 4 +- .../tachiyomi/ui/reader/ReaderActivity.kt | 80 +++++++++++++++++-- .../exh/ui/metadata/MetadataViewScreen.kt | 6 +- 4 files changed, 84 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt index 614705177..e0469d706 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt @@ -8,7 +8,6 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.animation.AnimatedContent import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.systemBarsPadding -import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -197,9 +196,10 @@ class MangaScreen( } } - if (uiPreferences.themeCoverBased().get()) { + val seedColor = seedColorState.value + if (uiPreferences.themeCoverBased().get() && seedColor != null) { DynamicMaterialTheme( - seedColor = seedColorState.value ?: MaterialTheme.colorScheme.primary, + seedColor = seedColor, useDarkTheme = isSystemInDarkTheme(), withAmoled = uiPreferences.themeDarkAmoled().get(), style = uiPreferences.themeCoverBasedStyle().get(), @@ -674,7 +674,7 @@ class MangaScreen( navigator: Navigator, manga: Manga, // KMK --> - seedColor: Color? = null, + seedColor: Color?, // KMK <-- ) { navigator.push(MetadataViewScreen(manga.id, manga.source, seedColor)) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/PaletteScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/PaletteScreen.kt index 6fa6bbc03..0fe93aa97 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/PaletteScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/PaletteScreen.kt @@ -69,9 +69,9 @@ class PaletteScreen( modifier = Modifier.padding(contentPadding), ) { ButtonsColor( - "accent & onPrimary", + "seedColor & onPrimary", seedColor, - "accent & contentColor", + "seedColor & contentColor", seedColor, MaterialTheme.colorScheme.onPrimary, ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index 9833475a3..0f5d11a99 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -6,7 +6,6 @@ import android.app.assist.AssistContent import android.content.Context import android.content.Intent import android.content.res.Configuration -import android.graphics.Bitmap import android.graphics.Color import android.graphics.ColorMatrix import android.graphics.ColorMatrixColorFilter @@ -21,18 +20,22 @@ import android.view.View.LAYER_TYPE_HARDWARE import android.view.WindowManager import android.widget.Toast import androidx.activity.viewModels +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.material3.AlertDialog import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Text import androidx.compose.material3.TextButton +import androidx.compose.material3.surfaceColorAtElevation +import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment +import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.unit.dp import androidx.core.graphics.ColorUtils @@ -48,9 +51,12 @@ import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView import com.google.android.material.elevation.SurfaceColors import com.google.android.material.transition.platform.MaterialContainerTransform import com.hippo.unifile.UniFile +import com.materialkolor.DynamicMaterialTheme +import com.materialkolor.dynamicColorScheme import dev.chrisbanes.insetter.applyInsetter import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.manga.model.readingMode +import eu.kanade.domain.ui.UiPreferences import eu.kanade.presentation.reader.ChapterListDialog import eu.kanade.presentation.reader.DisplayRefreshHost import eu.kanade.presentation.reader.OrientationSelectDialog @@ -119,6 +125,7 @@ import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.launchNonCancellable import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat +import tachiyomi.domain.manga.model.asMangaCover import tachiyomi.domain.source.service.SourceManager import tachiyomi.i18n.MR import tachiyomi.i18n.sy.SYMR @@ -127,6 +134,7 @@ import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.ByteArrayOutputStream import kotlin.time.Duration.Companion.seconds +import androidx.compose.ui.graphics.Color as ComposeColor class ReaderActivity : BaseActivity() { @@ -151,6 +159,13 @@ class ReaderActivity : BaseActivity() { private val readerPreferences = Injekt.get() private val preferences = Injekt.get() + // KMK --> + private val uiPreferences = Injekt.get() + private val themeCoverBased = uiPreferences.themeCoverBased().get() + private val themeDarkAmoled = uiPreferences.themeDarkAmoled().get() + private val themeCoverBasedStyle = uiPreferences.themeCoverBasedStyle().get() + // KMK <-- + lateinit var binding: ReaderActivityBinding val viewModel by viewModels() @@ -370,7 +385,12 @@ class ReaderActivity : BaseActivity() { * Initializes the reader menu. It sets up click listeners and the initial visibility. */ private fun initializeMenu() { - binding.pageNumber.setComposeContent { + // KMK --> + val seedColor = viewModel.manga?.asMangaCover()?.vibrantCoverColor?.let { ComposeColor(it) } + + @Composable + fun pageNumberContent() { + // KMK <-- val state by viewModel.state.collectAsState() val showPageNumber by viewModel.readerPreferences.showPageNumber().collectAsState() @@ -384,7 +404,25 @@ class ReaderActivity : BaseActivity() { } } - binding.dialogRoot.setComposeContent { + // KMK --> + binding.pageNumber.setComposeContent { + if (uiPreferences.themeCoverBased().get() && seedColor != null) { + DynamicMaterialTheme( + seedColor = seedColor, + useDarkTheme = isSystemInDarkTheme(), + withAmoled = themeDarkAmoled, + style = themeCoverBasedStyle, + animate = true, + content = { pageNumberContent() }, + ) + } else { + pageNumberContent() + } + } + + @Composable + fun dialogRootContent() { + // KMK <-- val state by viewModel.state.collectAsState() val settingsScreenModel = remember { ReaderSettingsScreenModel( @@ -396,7 +434,7 @@ class ReaderActivity : BaseActivity() { } if (!ifSourcesLoaded()) { - return@setComposeContent + return } val isHttpSource = viewModel.getSource() is HttpSource @@ -650,8 +688,40 @@ class ReaderActivity : BaseActivity() { } } + // KMK --> + binding.dialogRoot.setComposeContent { + if (themeCoverBased && seedColor != null) { + DynamicMaterialTheme( + seedColor = seedColor, + useDarkTheme = isSystemInDarkTheme(), + withAmoled = themeDarkAmoled, + style = themeCoverBasedStyle, + animate = true, + content = { dialogRootContent() }, + ) + } else { + dialogRootContent() + } + } + + val colorScheme = seedColor?.let { + dynamicColorScheme( + seedColor = seedColor, + isDark = isNightMode(), + isAmoled = themeDarkAmoled, + style = themeCoverBasedStyle, + ) + } + // KMK <-- + val toolbarColor = ColorUtils.setAlphaComponent( - SurfaceColors.SURFACE_2.getColor(this), + // KMK --> + if (themeCoverBased && colorScheme != null) { + colorScheme.surfaceColorAtElevation(3.dp).toArgb() + } else { + // KMK <-- + SurfaceColors.SURFACE_2.getColor(this) + }, if (isNightMode()) 230 else 242, // 90% dark 95% light ) window.statusBarColor = toolbarColor diff --git a/app/src/main/java/exh/ui/metadata/MetadataViewScreen.kt b/app/src/main/java/exh/ui/metadata/MetadataViewScreen.kt index ae11f7419..c170d7c7e 100644 --- a/app/src/main/java/exh/ui/metadata/MetadataViewScreen.kt +++ b/app/src/main/java/exh/ui/metadata/MetadataViewScreen.kt @@ -43,7 +43,7 @@ class MetadataViewScreen( private val mangaId: Long, private val sourceId: Long, // KMK --> - private val seedColor: Color? = null, + private val seedColor: Color?, // KMK <-- ) : Screen() { @@ -114,9 +114,9 @@ class MetadataViewScreen( // KMK --> val uiPreferences = remember { Injekt.get() } - if (uiPreferences.themeCoverBased().get()) { + if (uiPreferences.themeCoverBased().get() && seedColor != null) { DynamicMaterialTheme( - seedColor = seedColor ?: MaterialTheme.colorScheme.primary, + seedColor = seedColor, useDarkTheme = isSystemInDarkTheme(), withAmoled = uiPreferences.themeDarkAmoled().get(), style = uiPreferences.themeCoverBasedStyle().get(),