diff --git a/app/src/main/kotlin/de/timklge/karoopowerbar/Extensions.kt b/app/src/main/kotlin/de/timklge/karoopowerbar/Extensions.kt index 1f2f373..53d68f0 100644 --- a/app/src/main/kotlin/de/timklge/karoopowerbar/Extensions.kt +++ b/app/src/main/kotlin/de/timklge/karoopowerbar/Extensions.kt @@ -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()) diff --git a/app/src/main/kotlin/de/timklge/karoopowerbar/ForegroundService.kt b/app/src/main/kotlin/de/timklge/karoopowerbar/ForegroundService.kt index f6f6b4f..629effa 100644 --- a/app/src/main/kotlin/de/timklge/karoopowerbar/ForegroundService.kt +++ b/app/src/main/kotlin/de/timklge/karoopowerbar/ForegroundService.kt @@ -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() diff --git a/app/src/main/kotlin/de/timklge/karoopowerbar/KarooPowerbarExtension.kt b/app/src/main/kotlin/de/timklge/karoopowerbar/KarooPowerbarExtension.kt index 9e77adc..c629298 100644 --- a/app/src/main/kotlin/de/timklge/karoopowerbar/KarooPowerbarExtension.kt +++ b/app/src/main/kotlin/de/timklge/karoopowerbar/KarooPowerbarExtension.kt @@ -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") } } } diff --git a/app/src/main/kotlin/de/timklge/karoopowerbar/Window.kt b/app/src/main/kotlin/de/timklge/karoopowerbar/Window.kt index 4e6caa6..9ead8ec 100644 --- a/app/src/main/kotlin/de/timklge/karoopowerbar/Window.kt +++ b/app/src/main/kotlin/de/timklge/karoopowerbar/Window.kt @@ -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) diff --git a/app/src/main/kotlin/de/timklge/karoopowerbar/screens/MainScreen.kt b/app/src/main/kotlin/de/timklge/karoopowerbar/screens/MainScreen.kt index fa92ca2..e746ab9 100644 --- a/app/src/main/kotlin/de/timklge/karoopowerbar/screens/MainScreen.kt +++ b/app/src/main/kotlin/de/timklge/karoopowerbar/screens/MainScreen.kt @@ -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)