Add option to only show bars while riding

This commit is contained in:
Tim Kluge 2024-12-08 18:08:23 +01:00
parent dbaac0cec0
commit 792577ba69
5 changed files with 42 additions and 11 deletions

View File

@ -28,6 +28,7 @@ val settingsKey = stringPreferencesKey("settings")
data class PowerbarSettings(
val source: SelectedSource = SelectedSource.POWER,
val topBarSource: SelectedSource = SelectedSource.NONE,
val onlyShowWhileRiding: Boolean = true
){
companion object {
val defaultSettings = Json.encodeToString(PowerbarSettings())

View File

@ -7,13 +7,20 @@ import android.app.Service
import android.content.Context
import android.content.Intent
import android.os.IBinder
import android.util.Log
import androidx.core.app.NotificationCompat
import de.timklge.karoopowerbar.KarooPowerbarExtension.Companion.TAG
import de.timklge.karoopowerbar.screens.SelectedSource
import io.hammerhead.karooext.KarooSystemService
import io.hammerhead.karooext.models.RideState
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch
data class StreamState(val settings: PowerbarSettings, val showBars: Boolean)
class ForegroundService : Service() {
override fun onBind(intent: Intent?): IBinder {
throw UnsupportedOperationException("Not yet implemented")
@ -26,12 +33,26 @@ class ForegroundService : Service() {
setupForeground()
CoroutineScope(Dispatchers.IO).launch {
applicationContext.streamSettings()
.collectLatest { settings ->
val karooSystemService = KarooSystemService(applicationContext)
karooSystemService.connect { connected ->
Log.i(TAG, "Karoo system service connected: $connected")
}
val rideStateFlow = karooSystemService.streamRideState()
applicationContext
.streamSettings()
.combine(rideStateFlow) { settings, rideState ->
val showBars = if (settings.onlyShowWhileRiding){
rideState is RideState.Recording
} else {
true
}
StreamState(settings, showBars)
}.collectLatest { (settings, showBars) ->
windows.forEach { it.close() }
windows.clear()
if (settings.source != SelectedSource.NONE) {
if (settings.source != SelectedSource.NONE && showBars) {
Window(this@ForegroundService, PowerbarLocation.BOTTOM).apply {
selectedSource = settings.source
windows.add(this)
@ -39,7 +60,7 @@ class ForegroundService : Service() {
}
}
if (settings.topBarSource != SelectedSource.NONE){
if (settings.topBarSource != SelectedSource.NONE && showBars){
Window(this@ForegroundService, PowerbarLocation.TOP).apply {
selectedSource = settings.topBarSource
open()

View File

@ -31,9 +31,7 @@ class KarooPowerbarExtension : KarooExtension("karoo-powerbar", "1.0.1") {
serviceJob = CoroutineScope(Dispatchers.IO).launch {
karooSystem.connect { connected ->
if (connected) {
Log.i(TAG, "Connected")
}
Log.i(TAG, "Karoo system service connected: $connected")
}
}
}

View File

@ -12,6 +12,7 @@ import android.view.View
import android.view.ViewGroup
import android.view.WindowInsets
import android.view.WindowManager
import de.timklge.karoopowerbar.KarooPowerbarExtension.Companion.TAG
import de.timklge.karoopowerbar.screens.SelectedSource
import io.hammerhead.karooext.KarooSystemService
import io.hammerhead.karooext.models.DataType
@ -98,9 +99,7 @@ class Window(
suspend fun open() {
serviceJob = CoroutineScope(Dispatchers.Default).launch {
karooSystem.connect { connected ->
if (connected) {
Log.i(KarooPowerbarExtension.TAG, "Connected")
}
Log.i(TAG, "Karoo system service connected: $connected")
}
powerbar.progressColor = context.resources.getColor(R.color.zoneAerobic)

View File

@ -5,6 +5,7 @@ import android.provider.Settings
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
@ -22,6 +23,7 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FilledTonalButton
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
@ -31,6 +33,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
@ -66,12 +69,15 @@ fun MainScreen() {
var showAlerts by remember { mutableStateOf(false) }
var givenPermissions by remember { mutableStateOf(false) }
var onlyShowWhileRiding by remember { mutableStateOf(false) }
LaunchedEffect(Unit) {
givenPermissions = Settings.canDrawOverlays(ctx)
ctx.streamSettings().collect { settings ->
bottomSelectedSource = settings.source
topSelectedSource = settings.topBarSource
onlyShowWhileRiding = settings.onlyShowWhileRiding
}
}
@ -122,10 +128,16 @@ fun MainScreen() {
}
}
Row(verticalAlignment = Alignment.CenterVertically) {
Switch(checked = onlyShowWhileRiding, onCheckedChange = { onlyShowWhileRiding = it})
Spacer(modifier = Modifier.width(10.dp))
Text("Only show while riding")
}
FilledTonalButton(modifier = Modifier
.fillMaxWidth()
.height(50.dp), onClick = {
val newSettings = PowerbarSettings(source = bottomSelectedSource, topBarSource = topSelectedSource)
val newSettings = PowerbarSettings(source = bottomSelectedSource, topBarSource = topSelectedSource, onlyShowWhileRiding = onlyShowWhileRiding)
coroutineScope.launch {
saveSettings(ctx, newSettings)