mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2025-03-14 09:45:42 +00:00
android: export all theme colors (#2348)
This commit is contained in:
parent
00caeae914
commit
315d830357
4 changed files with 32 additions and 27 deletions
|
@ -153,6 +153,9 @@ data class ThemeOverrides (
|
|||
}
|
||||
}
|
||||
|
||||
@Serializable
|
||||
data class ThemeData (val colors: ThemeColors)
|
||||
|
||||
fun Modifier.themedBackground(baseTheme: DefaultTheme = CurrentColors.value.base, shape: Shape = RectangleShape): Modifier {
|
||||
return if (baseTheme == DefaultTheme.SIMPLEX) {
|
||||
this.background(brush = Brush.linearGradient(
|
||||
|
|
|
@ -44,15 +44,19 @@ object ThemeManager {
|
|||
return ActiveTheme(themeName, baseTheme.first, theme.colors.toColors(theme.base), theme.colors.toAppColors(theme.base))
|
||||
}
|
||||
|
||||
fun currentThemeOverrides(darkForSystemTheme: Boolean): ThemeOverrides {
|
||||
val themeName = appPrefs.currentTheme.get()!!
|
||||
val nonSystemThemeName = if (themeName != DefaultTheme.SYSTEM.name) {
|
||||
themeName
|
||||
} else {
|
||||
if (darkForSystemTheme) appPrefs.systemDarkTheme.get()!! else DefaultTheme.LIGHT.name
|
||||
}
|
||||
val overrides = appPrefs.themeOverrides.get().toMutableMap()
|
||||
return overrides[nonSystemThemeName] ?: ThemeOverrides(base = CurrentColors.value.base, colors = ThemeColors())
|
||||
fun currentThemeData(darkForSystemTheme: Boolean): ThemeData {
|
||||
val t = currentColors(darkForSystemTheme)
|
||||
return ThemeData(colors = ThemeColors(
|
||||
primary = t.colors.primary.toReadableHex(),
|
||||
primaryVariant = t.colors.primaryVariant.toReadableHex(),
|
||||
secondary = t.colors.secondary.toReadableHex(),
|
||||
secondaryVariant = t.colors.secondaryVariant.toReadableHex(),
|
||||
background = t.colors.background.toReadableHex(),
|
||||
surface = t.colors.surface.toReadableHex(),
|
||||
title = t.appColors.title.toReadableHex(),
|
||||
sentMessage = t.appColors.sentMessage.toReadableHex(),
|
||||
receivedMessage = t.appColors.receivedMessage.toReadableHex()
|
||||
))
|
||||
}
|
||||
|
||||
// colors, default theme enum, localized name of theme
|
||||
|
@ -124,12 +128,11 @@ object ThemeManager {
|
|||
CurrentColors.value = currentColors(!CurrentColors.value.colors.isLight)
|
||||
}
|
||||
|
||||
fun saveAndApplyThemeOverrides(theme: ThemeOverrides, darkForSystemTheme: Boolean) {
|
||||
fun saveAndApplyThemeData(name: String, theme: ThemeData, darkForSystemTheme: Boolean) {
|
||||
val overrides = appPrefs.themeOverrides.get().toMutableMap()
|
||||
val prevValue = overrides[theme.base.name] ?: ThemeOverrides(base = CurrentColors.value.base, colors = ThemeColors())
|
||||
overrides[theme.base.name] = prevValue.copy(colors = theme.colors)
|
||||
val prevValue = overrides[name] ?: ThemeOverrides(base = CurrentColors.value.base, colors = ThemeColors())
|
||||
overrides[name] = prevValue.copy(colors = theme.colors)
|
||||
appPrefs.themeOverrides.set(overrides)
|
||||
appPrefs.currentTheme.set(theme.base.name)
|
||||
CurrentColors.value = currentColors(!CurrentColors.value.colors.isLight)
|
||||
}
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@ import androidx.core.text.HtmlCompat
|
|||
import chat.simplex.app.*
|
||||
import chat.simplex.app.R
|
||||
import chat.simplex.app.model.*
|
||||
import chat.simplex.app.ui.theme.ThemeData
|
||||
import chat.simplex.app.ui.theme.ThemeOverrides
|
||||
import com.charleskorn.kaml.decodeFromStream
|
||||
import kotlinx.coroutines.*
|
||||
|
@ -390,10 +391,10 @@ fun getDrawableFromUri(uri: Uri, withAlertOnException: Boolean = true): Drawable
|
|||
}
|
||||
}
|
||||
|
||||
fun getThemeFromUri(uri: Uri, withAlertOnException: Boolean = true): ThemeOverrides? {
|
||||
fun getThemeFromUri(uri: Uri, withAlertOnException: Boolean = true): ThemeData? {
|
||||
SimplexApp.context.contentResolver.openInputStream(uri).use {
|
||||
runCatching {
|
||||
return yaml.decodeFromStream<ThemeOverrides>(it!!)
|
||||
return yaml.decodeFromStream<ThemeData>(it!!)
|
||||
}.onFailure {
|
||||
if (withAlertOnException) {
|
||||
AlertManager.shared.showAlertMsg(
|
||||
|
|
|
@ -236,24 +236,22 @@ fun CustomizeThemeView(editColor: (ThemeColor, Color) -> Unit) {
|
|||
}
|
||||
SectionSpacer()
|
||||
SectionView {
|
||||
if (currentTheme.base.hasChangedAnyColor(currentTheme.colors, currentTheme.appColors)) {
|
||||
val context = LocalContext.current
|
||||
val theme = remember { mutableStateOf(null as String?) }
|
||||
val exportThemeLauncher = rememberSaveThemeLauncher(context, theme)
|
||||
SectionItemView({
|
||||
val overrides = ThemeManager.currentThemeOverrides(isInDarkTheme)
|
||||
theme.value = yaml.encodeToString<ThemeOverrides>(overrides)
|
||||
exportThemeLauncher.launch("simplex.theme")
|
||||
}) {
|
||||
Text(generalGetString(R.string.export_theme), color = colors.primary)
|
||||
}
|
||||
val context = LocalContext.current
|
||||
val theme = remember { mutableStateOf(null as String?) }
|
||||
val exportThemeLauncher = rememberSaveThemeLauncher(context, theme)
|
||||
SectionItemView({
|
||||
val themeData = ThemeManager.currentThemeData(isInDarkTheme)
|
||||
theme.value = yaml.encodeToString<ThemeData>(themeData)
|
||||
exportThemeLauncher.launch("simplex.theme")
|
||||
}) {
|
||||
Text(generalGetString(R.string.export_theme), color = colors.primary)
|
||||
}
|
||||
|
||||
val importThemeLauncher = rememberGetContentLauncher { uri: Uri? ->
|
||||
if (uri != null) {
|
||||
val theme = getThemeFromUri(uri)
|
||||
if (theme != null) {
|
||||
ThemeManager.saveAndApplyThemeOverrides(theme, isInDarkTheme)
|
||||
ThemeManager.saveAndApplyThemeData(currentTheme.name, theme, isInDarkTheme)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue