ref #11, ref #12: Make bright colors brighter (#18)

* ref #11, ref #12: Make bright colors brighter

* Fix color mapping, update version
This commit is contained in:
timklge 2025-01-17 16:48:16 +01:00 committed by GitHub
parent bf930ab375
commit f8f93f7ece
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 72 additions and 62 deletions

View File

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

View File

@ -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"
}

View File

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

View File

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

View File

@ -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<MutableList<Reminder>>(
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<Reminder>, 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)

View File

@ -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<PlayBeep
)
}
/**
* Colors for reminders
*
* @param colorRes The color resource for the color
* @param whiteFont Whether the font should be white or black
* @param mapFromColors The colors that should be mapped to this color (only used for migration of old colors that were stored as integers)
*/
@Serializable
enum class ReminderColor(@ColorRes val colorRes: Int, val whiteFont: Boolean, val mapFromColors: Set<Int> = 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),
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
}
companion object {
fun getColor(context: Context, color: Int): ReminderColor {
return entries.find { reminderColor ->
val mapFromColors = reminderColor.mapFromColors + ContextCompat.getColor(context, reminderColor.colorRes)
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){
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
}
}
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
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")
}
}
}
val autoDismissSeconds: Int = 15)
val defaultReminders = Json.encodeToString(listOf(Reminder(0, "Drink", 30, "Take a sip!")))

View File

@ -13,10 +13,10 @@
<color name="bYellow">#707000</color>
<color name="bCyan">#007070</color>
<color name="hRed">#FF6060</color>
<color name="hGreen">#50FF50</color>
<color name="hBlue">#7070FF</color>
<color name="hPurple">#FF70FF</color>
<color name="hYellow">#FFFF60</color>
<color name="hCyan">#60FFFF</color>
<color name="hRed">#FF8080</color>
<color name="hPurple">#FF80FF</color>
<color name="hYellow">#FFFF70</color>
<color name="hGreen">#70FF70</color>
<color name="hBlue">#A0A0FF</color>
<color name="hCyan">#90FFFF</color>
</resources>