* 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"
|
applicationId = "de.timklge.karooreminder"
|
||||||
minSdk = 26
|
minSdk = 26
|
||||||
targetSdk = 34
|
targetSdk = 34
|
||||||
versionCode = 10
|
versionCode = 11
|
||||||
versionName = "1.1.1"
|
versionName = "1.1.2"
|
||||||
}
|
}
|
||||||
|
|
||||||
signingConfigs {
|
signingConfigs {
|
||||||
|
|||||||
@ -3,9 +3,9 @@
|
|||||||
"packageName": "de.timklge.karooreminder",
|
"packageName": "de.timklge.karooreminder",
|
||||||
"iconUrl": "https://github.com/timklge/karoo-reminder/releases/latest/download/karoo-reminder.png",
|
"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",
|
"latestApkUrl": "https://github.com/timklge/karoo-reminder/releases/latest/download/app-release.apk",
|
||||||
"latestVersion": "1.1.1",
|
"latestVersion": "1.1.2",
|
||||||
"latestVersionCode": 10,
|
"latestVersionCode": 11,
|
||||||
"developer": "timklge",
|
"developer": "timklge",
|
||||||
"description": "Shows in-ride alerts after a given time interval, distance or HR / power / speed / cadence out of range",
|
"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 {
|
companion object {
|
||||||
const val TAG = "karoo-reminder"
|
const val TAG = "karoo-reminder"
|
||||||
@ -172,8 +172,8 @@ class KarooReminderExtension : KarooExtension("karoo-reminder", "1.1.1") {
|
|||||||
title = reminder.name,
|
title = reminder.name,
|
||||||
autoDismissMs = if(reminder.isAutoDismiss) reminder.autoDismissSeconds * 1000L else null,
|
autoDismissMs = if(reminder.isAutoDismiss) reminder.autoDismissSeconds * 1000L else null,
|
||||||
icon = R.drawable.timer,
|
icon = R.drawable.timer,
|
||||||
textColor = reminder.getTextColor(applicationContext),
|
textColor = reminder.displayForegroundColor?.getTextColor() ?: R.color.black,
|
||||||
backgroundColor = reminder.getResourceColor(applicationContext)
|
backgroundColor = reminder.displayForegroundColor?.colorRes ?: R.color.hRed
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -222,8 +222,8 @@ class KarooReminderExtension : KarooExtension("karoo-reminder", "1.1.1") {
|
|||||||
title = reminder.name,
|
title = reminder.name,
|
||||||
autoDismissMs = if(reminder.isAutoDismiss) reminder.autoDismissSeconds * 1000L else null,
|
autoDismissMs = if(reminder.isAutoDismiss) reminder.autoDismissSeconds * 1000L else null,
|
||||||
icon = R.drawable.timer,
|
icon = R.drawable.timer,
|
||||||
textColor = reminder.getTextColor(applicationContext),
|
textColor = reminder.displayForegroundColor?.getTextColor() ?: R.color.black,
|
||||||
backgroundColor = reminder.getResourceColor(applicationContext)
|
backgroundColor = reminder.displayForegroundColor?.colorRes ?: R.color.hRed
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -300,8 +300,8 @@ class KarooReminderExtension : KarooExtension("karoo-reminder", "1.1.1") {
|
|||||||
title = reminder.name,
|
title = reminder.name,
|
||||||
autoDismissMs = if (reminder.isAutoDismiss) reminder.autoDismissSeconds * 1000L else null,
|
autoDismissMs = if (reminder.isAutoDismiss) reminder.autoDismissSeconds * 1000L else null,
|
||||||
icon = R.drawable.timer,
|
icon = R.drawable.timer,
|
||||||
textColor = reminder.getTextColor(applicationContext),
|
textColor = reminder.displayForegroundColor?.getTextColor() ?: R.color.black,
|
||||||
backgroundColor = reminder.getResourceColor(applicationContext)
|
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.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableIntStateOf
|
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.setValue
|
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 title by remember { mutableStateOf(reminder.name) }
|
||||||
var text by remember { mutableStateOf(reminder.text) }
|
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()) }
|
val colorDialogState by remember { mutableStateOf(UseCaseState()) }
|
||||||
var duration by remember { mutableStateOf(reminder.interval.toString()) }
|
var duration by remember { mutableStateOf(reminder.interval.toString()) }
|
||||||
var isActive by remember { mutableStateOf(reminder.isActive) }
|
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,
|
fun getUpdatedReminder(): Reminder = Reminder(reminder.id, title, duration.toIntOrNull() ?: 1,
|
||||||
text = text,
|
text = text,
|
||||||
foregroundColor = selectedColor,
|
displayForegroundColor = selectedColor,
|
||||||
isActive = isActive,
|
isActive = isActive,
|
||||||
trigger = selectedTrigger,
|
trigger = selectedTrigger,
|
||||||
isAutoDismiss = autoDismiss, tone = selectedTone, autoDismissSeconds = autoDismissSeconds.toIntOrNull() ?: 15)
|
isAutoDismiss = autoDismiss, tone = selectedTone, autoDismissSeconds = autoDismissSeconds.toIntOrNull() ?: 15)
|
||||||
@ -161,8 +160,8 @@ fun DetailScreen(isCreating: Boolean, reminder: Reminder, onSubmit: (updatedRemi
|
|||||||
ColorDialog(
|
ColorDialog(
|
||||||
state = colorDialogState,
|
state = colorDialogState,
|
||||||
selection = ColorSelection(
|
selection = ColorSelection(
|
||||||
selectedColor = SingleColor(selectedColor),
|
selectedColor = SingleColor(colorRes = selectedColor?.colorRes),
|
||||||
onSelectColor = { c -> selectedColor = c },
|
onSelectColor = { c -> selectedColor = ReminderColor.getColor(ctx, c) },
|
||||||
),
|
),
|
||||||
config = ColorConfig(
|
config = ColorConfig(
|
||||||
displayMode = ColorSelectionMode.TEMPLATE,
|
displayMode = ColorSelectionMode.TEMPLATE,
|
||||||
@ -190,7 +189,7 @@ fun DetailScreen(isCreating: Boolean, reminder: Reminder, onSubmit: (updatedRemi
|
|||||||
onClick = {
|
onClick = {
|
||||||
colorDialogState.show()
|
colorDialogState.show()
|
||||||
}) {
|
}) {
|
||||||
Surface(shape = CircleShape, color = Color(selectedColor),
|
Surface(shape = CircleShape, color = Color(ContextCompat.getColor(ctx, selectedColor?.colorRes ?: R.color.hRed)),
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.height(40.dp)
|
.height(40.dp)
|
||||||
.shadow(5.dp, CircleShape)
|
.shadow(5.dp, CircleShape)
|
||||||
|
|||||||
@ -44,7 +44,7 @@ import androidx.compose.ui.draw.shadow
|
|||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.unit.dp
|
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.edit
|
||||||
import androidx.datastore.preferences.core.stringPreferencesKey
|
import androidx.datastore.preferences.core.stringPreferencesKey
|
||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
@ -55,6 +55,7 @@ import androidx.navigation.compose.composable
|
|||||||
import androidx.navigation.compose.rememberNavController
|
import androidx.navigation.compose.rememberNavController
|
||||||
import androidx.navigation.navArgument
|
import androidx.navigation.navArgument
|
||||||
import de.timklge.karooreminder.KarooReminderExtension
|
import de.timklge.karooreminder.KarooReminderExtension
|
||||||
|
import de.timklge.karooreminder.R
|
||||||
import de.timklge.karooreminder.dataStore
|
import de.timklge.karooreminder.dataStore
|
||||||
import de.timklge.karooreminder.streamUserProfile
|
import de.timklge.karooreminder.streamUserProfile
|
||||||
import io.hammerhead.karooext.KarooSystemService
|
import io.hammerhead.karooext.KarooSystemService
|
||||||
@ -89,6 +90,11 @@ fun ReminderAppNavHost(modifier: Modifier = Modifier, navController: NavHostCont
|
|||||||
val entries = Json.decodeFromString<MutableList<Reminder>>(
|
val entries = Json.decodeFromString<MutableList<Reminder>>(
|
||||||
t[preferencesKey] ?: defaultReminders
|
t[preferencesKey] ?: defaultReminders
|
||||||
)
|
)
|
||||||
|
entries.forEach {
|
||||||
|
if (it.displayForegroundColor == null){
|
||||||
|
it.displayForegroundColor = ReminderColor.getColor(ctx, it.foregroundColor)
|
||||||
|
}
|
||||||
|
}
|
||||||
reminders.addAll(entries)
|
reminders.addAll(entries)
|
||||||
} catch(e: Throwable){
|
} catch(e: Throwable){
|
||||||
Log.e(KarooReminderExtension.TAG,"Failed to read preferences", e)
|
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 reminder = reminders.find { it.id == reminderId}
|
||||||
val reminderIndex = reminders.indexOf(reminder)
|
val reminderIndex = reminders.indexOf(reminder)
|
||||||
|
|
||||||
val ctx = LocalContext.current
|
|
||||||
|
|
||||||
reminder?.let { r ->
|
reminder?.let { r ->
|
||||||
DetailScreen(false, r, { updatedReminder ->
|
DetailScreen(false, r, { updatedReminder ->
|
||||||
if (updatedReminder != null) {
|
if (updatedReminder != null) {
|
||||||
@ -128,8 +132,6 @@ fun ReminderAppNavHost(modifier: Modifier = Modifier, navController: NavHostCont
|
|||||||
val nextReminderId = reminders.maxOfOrNull { it.id + 1 } ?: 0
|
val nextReminderId = reminders.maxOfOrNull { it.id + 1 } ?: 0
|
||||||
val newReminder = Reminder(nextReminderId, "", 30, "")
|
val newReminder = Reminder(nextReminderId, "", 30, "")
|
||||||
|
|
||||||
val ctx = LocalContext.current
|
|
||||||
|
|
||||||
DetailScreen(true, newReminder, { updatedReminder ->
|
DetailScreen(true, newReminder, { updatedReminder ->
|
||||||
updatedReminder?.let { r ->
|
updatedReminder?.let { r ->
|
||||||
reminders.add(r)
|
reminders.add(r)
|
||||||
@ -192,7 +194,7 @@ fun MainScreen(reminders: MutableList<Reminder>, onNavigateToReminder: (r: Remin
|
|||||||
Modifier
|
Modifier
|
||||||
.height(60.dp)
|
.height(60.dp)
|
||||||
.padding(5.dp), verticalAlignment = Alignment.CenterVertically) {
|
.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
|
modifier = Modifier
|
||||||
.height(60.dp)
|
.height(60.dp)
|
||||||
.shadow(5.dp, CircleShape)
|
.shadow(5.dp, CircleShape)
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package de.timklge.karooreminder.screens
|
package de.timklge.karooreminder.screens
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import androidx.annotation.ColorRes
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import de.timklge.karooreminder.R
|
import de.timklge.karooreminder.R
|
||||||
import de.timklge.karooreminder.ReminderTrigger
|
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
|
@Serializable
|
||||||
class Reminder(val id: Int, var name: String, var interval: Int, var text: String,
|
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"),
|
var foregroundColor: Int = android.graphics.Color.parseColor("#FF6060"),
|
||||||
val isActive: Boolean = true, val isAutoDismiss: Boolean = true,
|
val isActive: Boolean = true, val isAutoDismiss: Boolean = true,
|
||||||
val tone: ReminderBeepPattern = ReminderBeepPattern.THREE_TONES_UP,
|
val tone: ReminderBeepPattern = ReminderBeepPattern.THREE_TONES_UP,
|
||||||
var trigger: ReminderTrigger = ReminderTrigger.ELAPSED_TIME,
|
var trigger: ReminderTrigger = ReminderTrigger.ELAPSED_TIME,
|
||||||
val autoDismissSeconds: Int = 15){
|
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 defaultReminders = Json.encodeToString(listOf(Reminder(0, "Drink", 30, "Take a sip!")))
|
val defaultReminders = Json.encodeToString(listOf(Reminder(0, "Drink", 30, "Take a sip!")))
|
||||||
@ -13,10 +13,10 @@
|
|||||||
<color name="bYellow">#707000</color>
|
<color name="bYellow">#707000</color>
|
||||||
<color name="bCyan">#007070</color>
|
<color name="bCyan">#007070</color>
|
||||||
|
|
||||||
<color name="hRed">#FF6060</color>
|
<color name="hRed">#FF8080</color>
|
||||||
<color name="hGreen">#50FF50</color>
|
<color name="hPurple">#FF80FF</color>
|
||||||
<color name="hBlue">#7070FF</color>
|
<color name="hYellow">#FFFF70</color>
|
||||||
<color name="hPurple">#FF70FF</color>
|
<color name="hGreen">#70FF70</color>
|
||||||
<color name="hYellow">#FFFF60</color>
|
<color name="hBlue">#A0A0FF</color>
|
||||||
<color name="hCyan">#60FFFF</color>
|
<color name="hCyan">#90FFFF</color>
|
||||||
</resources>
|
</resources>
|
||||||
Loading…
x
Reference in New Issue
Block a user