From f8f93f7ecea3749796fec50a6efc1954c000b2e7 Mon Sep 17 00:00:00 2001 From: timklge <2026103+timklge@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:48:16 +0100 Subject: [PATCH] ref #11, ref #12: Make bright colors brighter (#18) * ref #11, ref #12: Make bright colors brighter * Fix color mapping, update version --- app/build.gradle.kts | 4 +- app/manifest.json | 6 +- .../karooreminder/KarooReminderExtension.kt | 14 ++-- .../karooreminder/screens/DetailScreen.kt | 11 ++- .../karooreminder/screens/MainScreen.kt | 14 ++-- .../timklge/karooreminder/screens/Reminder.kt | 73 +++++++++++-------- app/src/main/res/values/colors.xml | 12 +-- 7 files changed, 72 insertions(+), 62 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 516be44..462956e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -15,8 +15,8 @@ android { applicationId = "de.timklge.karooreminder" minSdk = 26 targetSdk = 34 - versionCode = 10 - versionName = "1.1.1" + versionCode = 11 + versionName = "1.1.2" } signingConfigs { diff --git a/app/manifest.json b/app/manifest.json index 839f363..4746837 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -3,9 +3,9 @@ "packageName": "de.timklge.karooreminder", "iconUrl": "https://github.com/timklge/karoo-reminder/releases/latest/download/karoo-reminder.png", "latestApkUrl": "https://github.com/timklge/karoo-reminder/releases/latest/download/app-release.apk", - "latestVersion": "1.1.1", - "latestVersionCode": 10, + "latestVersion": "1.1.2", + "latestVersionCode": 11, "developer": "timklge", "description": "Shows in-ride alerts after a given time interval, distance or HR / power / speed / cadence out of range", - "releaseNotes": "Added distance, HR / power out of range trigger types. Updated icon." + "releaseNotes": "Increased beep frequency to make sounds louder on K2, make colors brighter" } \ No newline at end of file diff --git a/app/src/main/kotlin/de/timklge/karooreminder/KarooReminderExtension.kt b/app/src/main/kotlin/de/timklge/karooreminder/KarooReminderExtension.kt index c471da5..9ee809a 100644 --- a/app/src/main/kotlin/de/timklge/karooreminder/KarooReminderExtension.kt +++ b/app/src/main/kotlin/de/timklge/karooreminder/KarooReminderExtension.kt @@ -65,7 +65,7 @@ enum class ReminderTrigger(val id: String, val label: String) { } } -class KarooReminderExtension : KarooExtension("karoo-reminder", "1.1.1") { +class KarooReminderExtension : KarooExtension("karoo-reminder", "1.1.2") { companion object { const val TAG = "karoo-reminder" @@ -172,8 +172,8 @@ class KarooReminderExtension : KarooExtension("karoo-reminder", "1.1.1") { title = reminder.name, autoDismissMs = if(reminder.isAutoDismiss) reminder.autoDismissSeconds * 1000L else null, icon = R.drawable.timer, - textColor = reminder.getTextColor(applicationContext), - backgroundColor = reminder.getResourceColor(applicationContext) + textColor = reminder.displayForegroundColor?.getTextColor() ?: R.color.black, + backgroundColor = reminder.displayForegroundColor?.colorRes ?: R.color.hRed ))) } } @@ -222,8 +222,8 @@ class KarooReminderExtension : KarooExtension("karoo-reminder", "1.1.1") { title = reminder.name, autoDismissMs = if(reminder.isAutoDismiss) reminder.autoDismissSeconds * 1000L else null, icon = R.drawable.timer, - textColor = reminder.getTextColor(applicationContext), - backgroundColor = reminder.getResourceColor(applicationContext) + textColor = reminder.displayForegroundColor?.getTextColor() ?: R.color.black, + backgroundColor = reminder.displayForegroundColor?.colorRes ?: R.color.hRed ))) } } @@ -300,8 +300,8 @@ class KarooReminderExtension : KarooExtension("karoo-reminder", "1.1.1") { title = reminder.name, autoDismissMs = if (reminder.isAutoDismiss) reminder.autoDismissSeconds * 1000L else null, icon = R.drawable.timer, - textColor = reminder.getTextColor(applicationContext), - backgroundColor = reminder.getResourceColor(applicationContext) + textColor = reminder.displayForegroundColor?.getTextColor() ?: R.color.black, + backgroundColor = reminder.displayForegroundColor?.colorRes ?: R.color.hRed ) ) ) diff --git a/app/src/main/kotlin/de/timklge/karooreminder/screens/DetailScreen.kt b/app/src/main/kotlin/de/timklge/karooreminder/screens/DetailScreen.kt index 01a7014..379c8f0 100644 --- a/app/src/main/kotlin/de/timklge/karooreminder/screens/DetailScreen.kt +++ b/app/src/main/kotlin/de/timklge/karooreminder/screens/DetailScreen.kt @@ -37,7 +37,6 @@ import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -77,7 +76,7 @@ fun DetailScreen(isCreating: Boolean, reminder: Reminder, onSubmit: (updatedRemi } var title by remember { mutableStateOf(reminder.name) } var text by remember { mutableStateOf(reminder.text) } - var selectedColor by remember { mutableIntStateOf(reminder.foregroundColor) } + var selectedColor by remember { mutableStateOf(reminder.displayForegroundColor) } val colorDialogState by remember { mutableStateOf(UseCaseState()) } var duration by remember { mutableStateOf(reminder.interval.toString()) } var isActive by remember { mutableStateOf(reminder.isActive) } @@ -92,7 +91,7 @@ fun DetailScreen(isCreating: Boolean, reminder: Reminder, onSubmit: (updatedRemi fun getUpdatedReminder(): Reminder = Reminder(reminder.id, title, duration.toIntOrNull() ?: 1, text = text, - foregroundColor = selectedColor, + displayForegroundColor = selectedColor, isActive = isActive, trigger = selectedTrigger, isAutoDismiss = autoDismiss, tone = selectedTone, autoDismissSeconds = autoDismissSeconds.toIntOrNull() ?: 15) @@ -161,8 +160,8 @@ fun DetailScreen(isCreating: Boolean, reminder: Reminder, onSubmit: (updatedRemi ColorDialog( state = colorDialogState, selection = ColorSelection( - selectedColor = SingleColor(selectedColor), - onSelectColor = { c -> selectedColor = c }, + selectedColor = SingleColor(colorRes = selectedColor?.colorRes), + onSelectColor = { c -> selectedColor = ReminderColor.getColor(ctx, c) }, ), config = ColorConfig( displayMode = ColorSelectionMode.TEMPLATE, @@ -190,7 +189,7 @@ fun DetailScreen(isCreating: Boolean, reminder: Reminder, onSubmit: (updatedRemi onClick = { colorDialogState.show() }) { - Surface(shape = CircleShape, color = Color(selectedColor), + Surface(shape = CircleShape, color = Color(ContextCompat.getColor(ctx, selectedColor?.colorRes ?: R.color.hRed)), modifier = Modifier .height(40.dp) .shadow(5.dp, CircleShape) diff --git a/app/src/main/kotlin/de/timklge/karooreminder/screens/MainScreen.kt b/app/src/main/kotlin/de/timklge/karooreminder/screens/MainScreen.kt index 0dd1186..ed9de66 100644 --- a/app/src/main/kotlin/de/timklge/karooreminder/screens/MainScreen.kt +++ b/app/src/main/kotlin/de/timklge/karooreminder/screens/MainScreen.kt @@ -44,7 +44,7 @@ import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp -import androidx.core.graphics.toColor +import androidx.core.content.ContextCompat import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.stringPreferencesKey import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -55,6 +55,7 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument import de.timklge.karooreminder.KarooReminderExtension +import de.timklge.karooreminder.R import de.timklge.karooreminder.dataStore import de.timklge.karooreminder.streamUserProfile import io.hammerhead.karooext.KarooSystemService @@ -89,6 +90,11 @@ fun ReminderAppNavHost(modifier: Modifier = Modifier, navController: NavHostCont val entries = Json.decodeFromString>( t[preferencesKey] ?: defaultReminders ) + entries.forEach { + if (it.displayForegroundColor == null){ + it.displayForegroundColor = ReminderColor.getColor(ctx, it.foregroundColor) + } + } reminders.addAll(entries) } catch(e: Throwable){ Log.e(KarooReminderExtension.TAG,"Failed to read preferences", e) @@ -107,8 +113,6 @@ fun ReminderAppNavHost(modifier: Modifier = Modifier, navController: NavHostCont val reminder = reminders.find { it.id == reminderId} val reminderIndex = reminders.indexOf(reminder) - val ctx = LocalContext.current - reminder?.let { r -> DetailScreen(false, r, { updatedReminder -> if (updatedReminder != null) { @@ -128,8 +132,6 @@ fun ReminderAppNavHost(modifier: Modifier = Modifier, navController: NavHostCont val nextReminderId = reminders.maxOfOrNull { it.id + 1 } ?: 0 val newReminder = Reminder(nextReminderId, "", 30, "") - val ctx = LocalContext.current - DetailScreen(true, newReminder, { updatedReminder -> updatedReminder?.let { r -> reminders.add(r) @@ -192,7 +194,7 @@ fun MainScreen(reminders: MutableList, onNavigateToReminder: (r: Remin Modifier .height(60.dp) .padding(5.dp), verticalAlignment = Alignment.CenterVertically) { - Surface(shape = CircleShape, color = Color(reminder.foregroundColor.toColor().toArgb()), + Surface(shape = CircleShape, color = Color(ContextCompat.getColor(ctx, reminder.displayForegroundColor?.colorRes ?: R.color.hRed)), modifier = Modifier .height(60.dp) .shadow(5.dp, CircleShape) diff --git a/app/src/main/kotlin/de/timklge/karooreminder/screens/Reminder.kt b/app/src/main/kotlin/de/timklge/karooreminder/screens/Reminder.kt index 2975285..2865a4b 100644 --- a/app/src/main/kotlin/de/timklge/karooreminder/screens/Reminder.kt +++ b/app/src/main/kotlin/de/timklge/karooreminder/screens/Reminder.kt @@ -1,6 +1,7 @@ package de.timklge.karooreminder.screens import android.content.Context +import androidx.annotation.ColorRes import androidx.core.content.ContextCompat import de.timklge.karooreminder.R import de.timklge.karooreminder.ReminderTrigger @@ -25,45 +26,53 @@ enum class ReminderBeepPattern(val displayName: String, val tones: List = emptySet()) { + DARK_RED(R.color.bRed, true), + DARK_PURPLE(R.color.bPurple, true), + DARK_YELLOW(R.color.bYellow, true), + DARK_GREEN(R.color.bGreen, true), + DARK_BLUE(R.color.bBlue, true), + DARK_CYAN(R.color.bCyan, true), - fun getTextColor(context: Context): Int { - return when(foregroundColor){ - ContextCompat.getColor(context, R.color.bRed), - ContextCompat.getColor(context, R.color.bPurple), - ContextCompat.getColor(context, R.color.bYellow), - ContextCompat.getColor(context, R.color.bGreen), - ContextCompat.getColor(context, R.color.bBlue), - ContextCompat.getColor(context, R.color.bCyan) -> R.color.white - else -> R.color.black - } + LIGHT_RED(R.color.hRed, false, setOf(android.graphics.Color.parseColor("#FF6060"))), + LIGHT_PURPLE(R.color.hPurple, false, setOf(android.graphics.Color.parseColor("#FF70FF"))), + LIGHT_YELLOW(R.color.hYellow, false, setOf(android.graphics.Color.parseColor("#FFFF60"))), + LIGHT_GREEN(R.color.hGreen, false, setOf(android.graphics.Color.parseColor("#50FF50"))), + LIGHT_BLUE(R.color.hBlue, false, setOf(android.graphics.Color.parseColor("#7070FF"))), + LIGHT_CYAN(R.color.hCyan, false, setOf(android.graphics.Color.parseColor("#60FFFF"))); + + @ColorRes + fun getTextColor(): Int { + return if(whiteFont) R.color.white else R.color.black } - fun getResourceColor(context: Context): Int { - return when(foregroundColor){ - ContextCompat.getColor(context, R.color.bRed) -> R.color.bRed - ContextCompat.getColor(context, R.color.bPurple) -> R.color.bPurple - ContextCompat.getColor(context, R.color.bYellow) -> R.color.bYellow - ContextCompat.getColor(context, R.color.bGreen) -> R.color.bGreen - ContextCompat.getColor(context, R.color.bBlue) -> R.color.bBlue - ContextCompat.getColor(context, R.color.bCyan) -> R.color.bCyan + companion object { + fun getColor(context: Context, color: Int): ReminderColor { + return entries.find { reminderColor -> + val mapFromColors = reminderColor.mapFromColors + ContextCompat.getColor(context, reminderColor.colorRes) - ContextCompat.getColor(context, R.color.hRed) -> R.color.hRed - ContextCompat.getColor(context, R.color.hPurple) -> R.color.hPurple - ContextCompat.getColor(context, R.color.hYellow) -> R.color.hYellow - ContextCompat.getColor(context, R.color.hGreen) -> R.color.hGreen - ContextCompat.getColor(context, R.color.hBlue) -> R.color.hBlue - ContextCompat.getColor(context, R.color.hCyan) -> R.color.hCyan - - else -> error("Unknown color") + mapFromColors.any { it == color } + } ?: error("Unknown color resource") } } } +@Serializable +class Reminder(val id: Int, var name: String, var interval: Int, var text: String, + var displayForegroundColor: ReminderColor? = null, + @Deprecated("Use displayForegroundColor instead") + var foregroundColor: Int = android.graphics.Color.parseColor("#FF6060"), + val isActive: Boolean = true, val isAutoDismiss: Boolean = true, + val tone: ReminderBeepPattern = ReminderBeepPattern.THREE_TONES_UP, + var trigger: ReminderTrigger = ReminderTrigger.ELAPSED_TIME, + val autoDismissSeconds: Int = 15) + val defaultReminders = Json.encodeToString(listOf(Reminder(0, "Drink", 30, "Take a sip!"))) \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 9360ad3..b12f50c 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -13,10 +13,10 @@ #707000 #007070 - #FF6060 - #50FF50 - #7070FF - #FF70FF - #FFFF60 - #60FFFF + #FF8080 + #FF80FF + #FFFF70 + #70FF70 + #A0A0FF + #90FFFF \ No newline at end of file