diff --git a/app/src/main/java/com/readrops/app/MainActivity.kt b/app/src/main/java/com/readrops/app/MainActivity.kt index 942a8d69..475d6cef 100644 --- a/app/src/main/java/com/readrops/app/MainActivity.kt +++ b/app/src/main/java/com/readrops/app/MainActivity.kt @@ -70,15 +70,21 @@ class MainActivity : ComponentActivity(), KoinComponent { val initialUseDarkTheme = runBlocking { useDarkTheme(preferences.theme.flow.first(), darkFlag) } + val initialColorScheme = runBlocking { + preferences.themeColorScheme.flow.first() + } setContent { KoinAndroidContext { val useDarkTheme by preferences.theme.flow .map { mode -> useDarkTheme(mode, darkFlag) } .collectAsState(initial = initialUseDarkTheme) + val themeColorScheme by preferences.themeColorScheme.flow + .collectAsState(initial = initialColorScheme) ReadropsTheme( - useDarkTheme = useDarkTheme + useDarkTheme = useDarkTheme, + themeColorScheme = themeColorScheme ) { enableEdgeToEdge( statusBarStyle = SystemBarStyle.auto( diff --git a/app/src/main/java/com/readrops/app/more/preferences/PreferencesScreen.kt b/app/src/main/java/com/readrops/app/more/preferences/PreferencesScreen.kt index fa7cdae0..181c5793 100644 --- a/app/src/main/java/com/readrops/app/more/preferences/PreferencesScreen.kt +++ b/app/src/main/java/com/readrops/app/more/preferences/PreferencesScreen.kt @@ -110,6 +110,18 @@ class PreferencesScreen : AndroidScreen() { onValueChange = {} ) + ListPreferenceWidget( + preference = loadedState.themeColorScheme.second, + selectedKey = loadedState.themeColorScheme.first, + entries = mapOf( + "readrops" to stringResource(id = R.string.theme_readrops), + "blackwhite" to stringResource(id = R.string.theme_blackwhite), + "material3" to stringResource(id = R.string.theme_material3), + ), + title = stringResource(id = R.string.theme_color_scheme), + onValueChange = {} + ) + ListPreferenceWidget( preference = loadedState.backgroundSyncPref.second, selectedKey = loadedState.backgroundSyncPref.first, diff --git a/app/src/main/java/com/readrops/app/more/preferences/PreferencesScreenModel.kt b/app/src/main/java/com/readrops/app/more/preferences/PreferencesScreenModel.kt index 195fc894..0afa5574 100644 --- a/app/src/main/java/com/readrops/app/more/preferences/PreferencesScreenModel.kt +++ b/app/src/main/java/com/readrops/app/more/preferences/PreferencesScreenModel.kt @@ -22,6 +22,7 @@ class PreferencesScreenModel( preferences: Preferences, dispatcher: CoroutineDispatcher = Dispatchers.IO ) : StateScreenModel(PreferencesScreenState.Loading) { + init { screenModelScope.launch(dispatcher) { with(preferences) { @@ -37,7 +38,8 @@ class PreferencesScreenModel( useCustomShareIntentTpl.flow, customShareIntentTpl.flow, swipeToLeft.flow, - swipeToRight.flow + swipeToRight.flow, + themeColorScheme.flow ) combine( @@ -56,6 +58,7 @@ class PreferencesScreenModel( customShareIntentTpl = (list[9] as String) to customShareIntentTpl, swipeToLeft = (list[10] as String) to swipeToLeft, swipeToRight = (list[11] as String) to swipeToRight, + themeColorScheme = (list[12] as String) to themeColorScheme, exampleItem = if (database.itemDao().count() > 0) { database.itemDao().selectFirst() } else { @@ -106,6 +109,7 @@ sealed class PreferencesScreenState { val customShareIntentTpl: PreferenceState, val swipeToLeft: PreferenceState, val swipeToRight: PreferenceState, + val themeColorScheme: PreferenceState, val exampleItem: Item, val showDialog: Boolean = false ) : PreferencesScreenState() diff --git a/app/src/main/java/com/readrops/app/util/Preferences.kt b/app/src/main/java/com/readrops/app/util/Preferences.kt index 29b560fc..eed720e8 100644 --- a/app/src/main/java/com/readrops/app/util/Preferences.kt +++ b/app/src/main/java/com/readrops/app/util/Preferences.kt @@ -32,6 +32,12 @@ class Preferences( default = "system" ) + val themeColorScheme = Preference( + dataStore = dataStore, + key = stringPreferencesKey("theme_color_scheme"), + default = "readrops" + ) + val backgroundSynchronization = Preference( dataStore = dataStore, key = stringPreferencesKey("synchro"), diff --git a/app/src/main/java/com/readrops/app/util/theme/BlackWhiteColor.kt b/app/src/main/java/com/readrops/app/util/theme/BlackWhiteColor.kt new file mode 100644 index 00000000..234c58f4 --- /dev/null +++ b/app/src/main/java/com/readrops/app/util/theme/BlackWhiteColor.kt @@ -0,0 +1,75 @@ +package com.readrops.app.util.theme + +import androidx.compose.ui.graphics.Color + +val primaryBlackWhiteLight = Color(0xFF000000) +val onPrimaryBlackWhiteLight = Color(0xFFFFFFFF) +val primaryContainerBlackWhiteLight = Color(0xFFE2E2E2) +val onPrimaryContainerBlackWhiteLight = Color(0xFF848484) +val secondaryBlackWhiteLight = Color(0xFF464647) +val onSecondaryBlackWhiteLight = Color(0xFFFFFFFF) +val secondaryContainerBlackWhiteLight = Color(0xFF000000) +val onSecondaryContainerBlackWhiteLight = Color(0xFFD9D8D7) +val tertiaryBlackWhiteLight = Color(0xFF000000) +val onTertiaryBlackWhiteLight = Color(0xFFFFFFFF) +val tertiaryContainerBlackWhiteLight = Color(0xFF1B1B1B) +val onTertiaryContainerBlackWhiteLight = Color(0xFF848484) +val errorBlackWhiteLight = Color(0xFF464647) +val onErrorBlackWhiteLight = Color(0xFFFFFFFF) +val errorContainerBlackWhiteLight = Color(0xFF000000) +val onErrorContainerBlackWhiteLight = Color(0xFFD9D8D7) +val backgroundBlackWhiteLight = Color(0xFFFFFFFF) +val onBackgroundBlackWhiteLight = Color(0xFF1B1B1B) +val surfaceBlackWhiteLight = Color(0xFFFCF8F8) +val onSurfaceBlackWhiteLight = Color(0xFF1C1B1B) +val surfaceVariantBlackWhiteLight = Color(0xFFFFFFFF) +val onSurfaceVariantBlackWhiteLight = Color(0xFF444748) +val outlineBlackWhiteLight = Color(0xFF747878) +val outlineVariantBlackWhiteLight = Color(0xFFC4C7C8) +val scrimBlackWhiteLight = Color(0xFF000000) +val inverseSurfaceBlackWhiteLight = Color(0xFF313030) +val inverseOnSurfaceBlackWhiteLight = Color(0xFFE2E2E2) +val inversePrimaryBlackWhiteLight = Color(0xFFC6C6C6) +val surfaceDimBlackWhiteLight = Color(0xFFE2E2E2) +val surfaceBrightBlackWhiteLight = Color(0xFFFCF8F8) +val surfaceContainerLowestBlackWhiteLight = Color(0xFFFFFFFF) +val surfaceContainerLowBlackWhiteLight = Color(0xFFE2E2E2) +val surfaceContainerBlackWhiteLight = Color(0xFFFFFFFF) +val surfaceContainerHighBlackWhiteLight = Color(0xFFE2E2E2) +val surfaceContainerHighestBlackWhiteLight = Color(0xFFFFFFFF) + +val primaryBlackWhiteDark = Color(0xFFC6C6C6) +val onPrimaryBlackWhiteDark = Color(0xFF303030) +val primaryContainerBlackWhiteDark = Color(0xFF000000) +val onPrimaryContainerBlackWhiteDark = Color(0xFF969696) +val secondaryBlackWhiteDark = Color(0xFFC7C6C6) +val onSecondaryBlackWhiteDark = Color(0xFF303030) +val secondaryContainerBlackWhiteDark = Color(0xFF000000) +val onSecondaryContainerBlackWhiteDark = Color(0xFFD9D8D7) +val tertiaryBlackWhiteDark = Color(0xFFC6C6C6) +val onTertiaryBlackWhiteDark = Color(0xFF303030) +val tertiaryContainerBlackWhiteDark = Color(0xFF000000) +val onTertiaryContainerBlackWhiteDark = Color(0xFFFFFFFF) +val errorBlackWhiteDark = Color(0xFFC7C6C6) +val onErrorBlackWhiteDark = Color(0xFF303030) +val errorContainerBlackWhiteDark = Color(0xFF000000) +val onErrorContainerBlackWhiteDark = Color(0xFFD9D8D7) +val backgroundBlackWhiteDark = Color(0xFF000000) +val onBackgroundBlackWhiteDark = Color(0xFFE2E2E2) +val surfaceBlackWhiteDark = Color(0xFF000000) +val onSurfaceBlackWhiteDark = Color(0xFFE5E2E1) +val surfaceVariantBlackWhiteDark = Color(0xFF000000) +val onSurfaceVariantBlackWhiteDark = Color(0xFFC4C7C8) +val outlineBlackWhiteDark = Color(0xFF8E9192) +val outlineVariantBlackWhiteDark = Color(0xFF444748) +val scrimBlackWhiteDark = Color(0xFF000000) +val inverseSurfaceBlackWhiteDark = Color(0xFFE5E2E1) +val inverseOnSurfaceBlackWhiteDark = Color(0xFF313030) +val inversePrimaryBlackWhiteDark = Color(0xFF000000) +val surfaceDimBlackWhiteDark = Color(0xFF000000) +val surfaceBrightBlackWhiteDark = Color(0xFF000000) +val surfaceContainerLowestBlackWhiteDark = Color(0xFF0E0E0E) +val surfaceContainerLowBlackWhiteDark = Color(0xFF1C1B1B) +val surfaceContainerBlackWhiteDark = Color(0xFF000000) +val surfaceContainerHighBlackWhiteDark = Color(0xFF2A2A2A) +val surfaceContainerHighestBlackWhiteDark = Color(0xFF000000) diff --git a/app/src/main/java/com/readrops/app/util/theme/Theme.kt b/app/src/main/java/com/readrops/app/util/theme/Theme.kt index 1fa8a6bc..bf4c6c31 100644 --- a/app/src/main/java/com/readrops/app/util/theme/Theme.kt +++ b/app/src/main/java/com/readrops/app/util/theme/Theme.kt @@ -4,9 +4,11 @@ import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.MaterialTheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.ui.platform.LocalContext import androidx.compose.runtime.Composable - private val lightScheme = lightColorScheme( primary = primaryLight, onPrimary = onPrimaryLight, @@ -83,19 +85,115 @@ private val darkScheme = darkColorScheme( surfaceContainerHighest = surfaceContainerHighestDark, ) +private val BlackWhiteLightScheme = lightColorScheme( + primary = primaryBlackWhiteLight, + onPrimary = onPrimaryBlackWhiteLight, + primaryContainer = primaryContainerBlackWhiteLight, + onPrimaryContainer = onPrimaryContainerBlackWhiteLight, + secondary = secondaryBlackWhiteLight, + onSecondary = onSecondaryBlackWhiteLight, + secondaryContainer = secondaryContainerBlackWhiteLight, + onSecondaryContainer = onSecondaryContainerBlackWhiteLight, + tertiary = tertiaryBlackWhiteLight, + onTertiary = onTertiaryBlackWhiteLight, + tertiaryContainer = tertiaryContainerBlackWhiteLight, + onTertiaryContainer = onTertiaryContainerBlackWhiteLight, + error = errorBlackWhiteLight, + onError = onErrorBlackWhiteLight, + errorContainer = errorContainerBlackWhiteLight, + onErrorContainer = onErrorContainerBlackWhiteLight, + background = backgroundBlackWhiteLight, + onBackground = onBackgroundBlackWhiteLight, + surface = surfaceBlackWhiteLight, + onSurface = onSurfaceBlackWhiteLight, + surfaceVariant = surfaceVariantBlackWhiteLight, + onSurfaceVariant = onSurfaceVariantBlackWhiteLight, + outline = outlineBlackWhiteLight, + outlineVariant = outlineVariantBlackWhiteLight, + scrim = scrimBlackWhiteLight, + inverseSurface = inverseSurfaceBlackWhiteLight, + inverseOnSurface = inverseOnSurfaceBlackWhiteLight, + inversePrimary = inversePrimaryBlackWhiteLight, + surfaceDim = surfaceDimBlackWhiteLight, + surfaceBright = surfaceBrightBlackWhiteLight, + surfaceContainerLowest = surfaceContainerLowestBlackWhiteLight, + surfaceContainerLow = surfaceContainerLowBlackWhiteLight, + surfaceContainer = surfaceContainerBlackWhiteLight, + surfaceContainerHigh = surfaceContainerHighBlackWhiteLight, + surfaceContainerHighest = surfaceContainerHighestBlackWhiteLight, +) + +private val BlackWhiteDarkScheme = lightColorScheme( + primary = primaryBlackWhiteDark, + onPrimary = onPrimaryBlackWhiteDark, + primaryContainer = primaryContainerBlackWhiteDark, + onPrimaryContainer = onPrimaryContainerBlackWhiteDark, + secondary = secondaryBlackWhiteDark, + onSecondary = onSecondaryBlackWhiteDark, + secondaryContainer = secondaryContainerBlackWhiteDark, + onSecondaryContainer = onSecondaryContainerBlackWhiteDark, + tertiary = tertiaryBlackWhiteDark, + onTertiary = onTertiaryBlackWhiteDark, + tertiaryContainer = tertiaryContainerBlackWhiteDark, + onTertiaryContainer = onTertiaryContainerBlackWhiteDark, + error = errorBlackWhiteDark, + onError = onErrorBlackWhiteDark, + errorContainer = errorContainerBlackWhiteDark, + onErrorContainer = onErrorContainerBlackWhiteDark, + background = backgroundBlackWhiteDark, + onBackground = onBackgroundBlackWhiteDark, + surface = surfaceBlackWhiteDark, + onSurface = onSurfaceBlackWhiteDark, + surfaceVariant = surfaceVariantBlackWhiteDark, + onSurfaceVariant = onSurfaceVariantBlackWhiteDark, + outline = outlineBlackWhiteDark, + outlineVariant = outlineVariantBlackWhiteDark, + scrim = scrimBlackWhiteDark, + inverseSurface = inverseSurfaceBlackWhiteDark, + inverseOnSurface = inverseOnSurfaceBlackWhiteDark, + inversePrimary = inversePrimaryBlackWhiteDark, + surfaceDim = surfaceDimBlackWhiteDark, + surfaceBright = surfaceBrightBlackWhiteDark, + surfaceContainerLowest = surfaceContainerLowestBlackWhiteDark, + surfaceContainerLow = surfaceContainerLowBlackWhiteDark, + surfaceContainer = surfaceContainerBlackWhiteDark, + surfaceContainerHigh = surfaceContainerHighBlackWhiteDark, + surfaceContainerHighest = surfaceContainerHighestBlackWhiteDark, +) + @Composable fun ReadropsTheme( useDarkTheme: Boolean = isSystemInDarkTheme(), + themeColorScheme: String = "readrops", content: @Composable () -> Unit ) { - val colors = if (!useDarkTheme) { - lightScheme - } else { - darkScheme + + + val colors = when(themeColorScheme) { + "blackwhite" -> { + if (!useDarkTheme) { + BlackWhiteLightScheme + } else { + BlackWhiteDarkScheme + } + } + "material3" -> { + if (!useDarkTheme) { + dynamicLightColorScheme(LocalContext.current) + } else { + dynamicDarkColorScheme(LocalContext.current) + } + } else -> { + if (!useDarkTheme) { + lightScheme + } else { + darkScheme + } + } } MaterialTheme( colorScheme = colors, content = content ) -} \ No newline at end of file +} diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index fad8229d..7e4ad7cc 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -23,7 +23,11 @@ Neuer Feed Dunkel Hell - Farbschema + Thema + Farbschema + Readrops + BlackWhite + Material You Bild teilen Bild herunterladen Bildoptionen diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3af07529..102da2e8 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -72,6 +72,10 @@ Descargar imagen Compartir imagen Tema + Bandera + Readrops + Blanco y Negro + Material You 1 hora 6 horas Para que se muestren, las notificaciones necesitan que la sincronización en segundo plano esté activada. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index a84ae840..6af91240 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -67,6 +67,10 @@ Télécharger l\'image Partager l\'image Thème + Schéma de couleurs + Readrops + BlackWhite + Material You Clair Sombre Nouveau flux diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 300332fb..75edbf16 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -68,6 +68,10 @@ Unduh gambar Bagikan gambar Tema + Skema Warna + Readrops + BlackWhite + Material You Terang Gelap Feed baru @@ -91,4 +95,4 @@ Sinkronkan Navigator view Favorit - \ No newline at end of file + diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index e79816e2..acb601d2 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -25,6 +25,10 @@ Scuro Chiaro Tema + Combinazione di colori + Readrops + BlackWhite + Material You Condividi l\'immagine Scarica l\'immagine Opzioni dell\'immagine @@ -90,4 +94,4 @@ Aggiungi un flusso Impostazioni Aggiungi un flusso - \ No newline at end of file + diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index ba9d5cda..76e6b61b 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -6,6 +6,10 @@ Mørk Lys Drakt + Fargevalg + Readrops + BlackWhite + Material You Del bilde Last ned bilde Bildevalg @@ -91,4 +95,4 @@ Lisensiert GPLv3+ Ekstern nettleser OPML-import/-eksport - \ No newline at end of file + diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 1d0a76fb..7491c189 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1,25 +1,39 @@ Feed toevoegen + Menu openen + Over Verifiëren Het veld mag niet blanco zijn De url is ongeldig + Er is geen feed-url aangetroffen Er is een verbindingsfout opgetreden + van %1$s %1$s min. <1 min. Url openen + Feedmap Feednaam Feed bewerken + Resultaten ‘%1$s’ is toegevoegd + Bezig met bijwerken van ‘%1$s’… + Nog te lezen De app is uitgebracht onder de GPLv3-licentie + Ongelezen artikelen + Menu sluiten + Feed toevoegen Instellingen Feed-url Onbekende host + Map toevoegen 1 min. Map toevoegen + Map Annuleren Artikel delen Feed verwijderen? + Laden Geen map Fout tijdens verwerken van ‘%1$s’ Verbindingsfout tijdens ophalen van ‘%1$s’ @@ -47,6 +61,10 @@ Thema Licht Donker + Kleurenschema + Readrops + BlackWhite + Material You Opml-bestand importeren Opml-bestand exporteren Afbeeldingsopties diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 2bc2f7cd..e5a705e2 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -34,6 +34,10 @@ Baixar a imagem Compartilhar a imagem Tema + Esquema de cores + Readrops + BlackWhite + Material You Claro Escuro Novo Feed diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 27eb1fe6..83970747 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -71,6 +71,10 @@ Download image Share image Theme + Color Scheme + Readrops + BlackWhite + Material You Light Dark New feed