* ref #11, ref #12: Make bright colors brighter * Fix color mapping, update version
This commit is contained in:
parent
bf930ab375
commit
f8f93f7ece
@ -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 {
|
||||
|
||||
@ -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"
|
||||
}
|
||||
@ -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
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
class Reminder(val id: Int, var name: String, var interval: Int, var text: String,
|
||||
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){
|
||||
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),
|
||||
|
||||
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!")))
|
||||
@ -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>
|
||||
Loading…
x
Reference in New Issue
Block a user