package de.timklge.karooreminder import android.content.Context import android.util.Log import de.timklge.karooreminder.KarooReminderExtension.Companion.TAG import de.timklge.karooreminder.screens.Reminder import de.timklge.karooreminder.screens.defaultReminders import de.timklge.karooreminder.screens.preferencesKey import io.hammerhead.karooext.KarooSystemService import io.hammerhead.karooext.models.OnStreamState import io.hammerhead.karooext.models.RideState import io.hammerhead.karooext.models.StreamState import io.hammerhead.karooext.models.UserProfile import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.trySendBlocking import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.map import kotlinx.serialization.json.Json fun KarooSystemService.streamDataFlow(dataTypeId: String): Flow { return callbackFlow { val listenerId = addConsumer(OnStreamState.StartStreaming(dataTypeId)) { event: OnStreamState -> trySendBlocking(event.state) } awaitClose { removeConsumer(listenerId) } } } fun KarooSystemService.streamRideState(): Flow { return callbackFlow { val listenerId = addConsumer { rideState: RideState -> trySendBlocking(rideState) } awaitClose { removeConsumer(listenerId) } } } fun KarooSystemService.streamUserProfile(): Flow { return callbackFlow { val listenerId = addConsumer { userProfile: UserProfile -> trySendBlocking(userProfile) } awaitClose { removeConsumer(listenerId) } } } fun Context.streamPreferences(): Flow> { return applicationContext.dataStore.data.map { remindersJson -> try { Json.decodeFromString>( remindersJson[preferencesKey] ?: defaultReminders ) } catch(e: Throwable){ Log.e(TAG,"Failed to read preferences", e) mutableListOf() } } }