diff --git a/app/src/main/java/com/hippo/ehviewer/Settings.kt b/app/src/main/java/com/hippo/ehviewer/Settings.kt index 4773db5a4..cd1598200 100755 --- a/app/src/main/java/com/hippo/ehviewer/Settings.kt +++ b/app/src/main/java/com/hippo/ehviewer/Settings.kt @@ -60,6 +60,7 @@ object Settings : DataStorePreferences(null) { var removeImageFiles by boolPref("include_pic", true) var needSignIn by boolPref("need_sign_in", true) var blackDarkTheme by boolPref("black_dark_theme", false).observed { updateWhenAmoledModeChanges() } + var harmonizeCategoryColor by boolPref("harmonize_category_color", true) var preloadThumbAggressively by boolPref("preload_thumb_aggressively", false) var downloadOriginImage by boolPref("download_origin_image", false) var thumbSizeDp by intPref("thumb_size_", 120) diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhUtils.kt b/app/src/main/java/com/hippo/ehviewer/client/EhUtils.kt index 74f8c4397..bbcfe3d44 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhUtils.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhUtils.kt @@ -126,12 +126,18 @@ object EhUtils { MISC -> BG_COLOR_MISC else -> BG_COLOR_UNKNOWN }.toInt() - return harmonizeWithRole(context, primary) + return if (Settings.harmonizeCategoryColor) { + harmonizeWithRole(context, primary) + } else { + primary + } } @Composable fun getCategoryColor(category: Int) = Color(getCategoryColor(LocalContext.current, category)) + val categoryTextColor = Color(0xffe6e0e9) + fun signOut() { EhCookieStore.signOut() Settings.avatar = null diff --git a/app/src/main/java/com/hippo/ehviewer/ui/main/GalleryInfo.kt b/app/src/main/java/com/hippo/ehviewer/ui/main/GalleryInfo.kt index 6c7a65f63..1e2559de0 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/main/GalleryInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/main/GalleryInfo.kt @@ -21,6 +21,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ProvideTextStyle import androidx.compose.material3.ShapeDefaults import androidx.compose.material3.Text +import androidx.compose.material3.contentColorFor import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.produceState @@ -28,12 +29,14 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.ConstraintLayout +import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.client.data.GalleryInfo.Companion.NOT_FAVORITED @@ -109,6 +112,7 @@ fun GalleryInfoListItem( start.linkTo(parent.start) bottom.linkTo(parent.bottom) }.clip(ShapeDefaults.Small).background(categoryColor).padding(vertical = 2.dp, horizontal = 8.dp), + color = if (Settings.harmonizeCategoryColor) Color.Unspecified else EhUtils.categoryTextColor, textAlign = TextAlign.Center, ) Row( @@ -198,10 +202,11 @@ fun GalleryInfoGridItem( modifier = Modifier.aspectRatio(aspect).fillMaxWidth(), contentScale = ContentScale.Crop, ) + val categoryColor = EhUtils.getCategoryColor(info.category) Badge( modifier = Modifier.align(Alignment.TopEnd).width(32.dp).height(24.dp), - containerColor = EhUtils.getCategoryColor(info.category), - contentColor = MaterialTheme.colorScheme.onSurface, + containerColor = categoryColor, + contentColor = if (Settings.harmonizeCategoryColor) contentColorFor(categoryColor) else EhUtils.categoryTextColor, ) { simpleLang?.let { Text(text = it.uppercase()) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt index 1ce5249d0..9e289902b 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt @@ -46,6 +46,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.LocalContext @@ -809,6 +810,7 @@ class DownloadsScene : Text( text = categoryText, modifier = Modifier.clip(ShapeDefaults.Small).background(categoryColor).padding(vertical = 2.dp, horizontal = 8.dp), + color = if (Settings.harmonizeCategoryColor) Color.Unspecified else EhUtils.categoryTextColor, textAlign = TextAlign.Center, style = MaterialTheme.typography.labelLarge, ) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/settings/EhScreen.kt b/app/src/main/java/com/hippo/ehviewer/ui/settings/EhScreen.kt index ddb040918..b29efdf84 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/settings/EhScreen.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/settings/EhScreen.kt @@ -224,6 +224,10 @@ fun EhScreen() { title = stringResource(id = R.string.black_dark_theme), value = Settings::blackDarkTheme, ) + SwitchPreference( + title = stringResource(id = R.string.harmonize_category_color), + value = Settings::harmonizeCategoryColor, + ) SimpleMenuPreferenceInt( title = stringResource(id = R.string.settings_eh_launch_page), entry = R.array.launch_page_entries, diff --git a/app/src/main/java/com/hippo/ehviewer/ui/tools/CircularLayout.kt b/app/src/main/java/com/hippo/ehviewer/ui/tools/CircularLayout.kt index 0e4ace78d..7ba9ede51 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/tools/CircularLayout.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/tools/CircularLayout.kt @@ -3,7 +3,6 @@ package com.hippo.ehviewer.ui.tools import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.layout.Layout -import androidx.compose.ui.unit.Dp import kotlin.math.PI import kotlin.math.cos import kotlin.math.roundToInt @@ -15,7 +14,6 @@ private const val QuarterCircle = PI / 2 @Composable fun CircularLayout( modifier: Modifier = Modifier, - radius: Dp, placeFirstItemInCenter: Boolean = false, content: @Composable () -> Unit, ) { @@ -23,7 +21,7 @@ fun CircularLayout( modifier = modifier, content = content, ) { measurables, constraints -> - val radiusPx = radius.toPx() + val radiusPx = constraints.maxWidth * 0.4 val itemConstraints = constraints.copy(minWidth = 0, minHeight = 0) val placeables = measurables.map { measurable -> measurable.measure(itemConstraints) } val outPlaceables = if (placeFirstItemInCenter) placeables.drop(1) else placeables diff --git a/app/src/main/java/com/hippo/ehviewer/ui/tools/Dialog.kt b/app/src/main/java/com/hippo/ehviewer/ui/tools/Dialog.kt index e5d6994d5..16a68913a 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/tools/Dialog.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/tools/Dialog.kt @@ -41,11 +41,11 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.DialogProperties import com.jamal.composeprefs3.ui.ifNotNullThen import kotlinx.coroutines.CancellableContinuation import kotlinx.coroutines.suspendCancellableCoroutine @@ -183,6 +183,7 @@ class DialogState { } AlertDialog( onDismissRequest = { cont.cancel() }, + properties = DialogProperties(usePlatformDefaultWidth = respectDefaultWidth), content = { Surface( modifier = with(Modifier) { if (!respectDefaultWidth) defaultMinSize(280.dp) else width(280.dp) }, @@ -248,12 +249,10 @@ class DialogState { @StringRes title: Int, @StringRes hint: Int, maxChar: Int, - adjustTextPosition: Boolean = true, ): Pair = showNoButton(false) { Column { Text(text = stringResource(id = title), modifier = Modifier.padding(horizontal = 16.dp).padding(top = 16.dp), style = MaterialTheme.typography.titleMedium) CircularLayout( - radius = 112.dp, modifier = Modifier.fillMaxWidth().aspectRatio(1F), placeFirstItemInCenter = true, ) { @@ -261,8 +260,7 @@ class DialogState { TextField( value = note, onValueChange = { note = it }, - modifier = Modifier.width(128.dp), - textStyle = TextStyle(fontFamily = FontFamily.Monospace), + modifier = Modifier.fillMaxWidth(0.45F).aspectRatio(1F), label = { Text(text = stringResource(id = hint)) }, trailingIcon = { if (note.isNotEmpty()) { @@ -278,7 +276,6 @@ class DialogState { textAlign = TextAlign.End, ) }, - maxLines = 6, shape = ShapeDefaults.ExtraSmall, colors = TextFieldDefaults.colors( focusedIndicatorColor = Color.Transparent, @@ -287,16 +284,18 @@ class DialogState { ) items.forEachIndexed { index, (icon, text) -> Column( - modifier = Modifier.clip(IconWithTextCorner).clickable { dismissWith(index to note) }, + modifier = Modifier.clip(IconWithTextCorner).clickable { dismissWith(index to note) } + .fillMaxWidth(0.2F), horizontalAlignment = Alignment.CenterHorizontally, ) { - if (index == 0 && adjustTextPosition) { - Text(text = text, style = MaterialTheme.typography.bodySmall) - Icon(imageVector = icon, contentDescription = null, tint = AlertDialogDefaults.iconContentColor) - } else { - Icon(imageVector = icon, contentDescription = null, tint = AlertDialogDefaults.iconContentColor) - Text(text = text, style = MaterialTheme.typography.bodySmall) - } + Icon(imageVector = icon, contentDescription = null, tint = AlertDialogDefaults.iconContentColor) + Text( + text = text, + textAlign = TextAlign.Center, + overflow = TextOverflow.Ellipsis, + maxLines = 2, + style = MaterialTheme.typography.bodySmall, + ) } } } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 09c1937f7..3aa78d6d3 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -419,7 +419,7 @@ 默认收藏夹 启用此项将无法添加收藏备注 让我选择 - 备注 + 收藏备注 收藏夹 需要登录 @@ -476,6 +476,7 @@ 下载服务 收藏画廊 纯黑深色主题 + 类别颜色适配动态配色 使用持续集成(CI)构建频道更新 过滤 全部 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ec57d15ac..689582d85 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -477,7 +477,7 @@ Default favorites collection You won\'t be able to add favorite notes if you enable this Let me select - Note + Favorite Note Collections Signing in is required @@ -541,6 +541,7 @@ Download Service Favorite Black dark theme + Harmonize category color for Dynamic Color Filter All Start all (reversed)