theme cover based for Reader

This commit is contained in:
Cuong-Tran 2024-06-20 00:11:01 +07:00
parent fdefea9af2
commit c28b290f24
No known key found for this signature in database
GPG key ID: 733AA7624B9315C2
4 changed files with 84 additions and 14 deletions

View file

@ -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))

View file

@ -69,9 +69,9 @@ class PaletteScreen(
modifier = Modifier.padding(contentPadding),
) {
ButtonsColor(
"accent & onPrimary",
"seedColor & onPrimary",
seedColor,
"accent & contentColor",
"seedColor & contentColor",
seedColor,
MaterialTheme.colorScheme.onPrimary,
)

View file

@ -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<ReaderPreferences>()
private val preferences = Injekt.get<BasePreferences>()
// KMK -->
private val uiPreferences = Injekt.get<UiPreferences>()
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<ReaderViewModel>()
@ -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

View file

@ -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<UiPreferences>() }
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(),