From 30d7375c6d2c96eeb7483d94ae64499f2a57f136 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sylwester=20Zieli=C5=84ski?= Date: Tue, 22 Mar 2022 15:25:31 +0100 Subject: [PATCH] Store last selected configuration for UART profile --- .../uart/data/ConfigurationDataSource.kt | 36 +++++++++++++++++++ .../android/uart/repository/UARTRepository.kt | 9 ++++- .../android/uart/viewmodel/UARTViewModel.kt | 15 +++++++- 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 profile_uart/src/main/java/no/nordicsemi/android/uart/data/ConfigurationDataSource.kt diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/data/ConfigurationDataSource.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/data/ConfigurationDataSource.kt new file mode 100644 index 00000000..2f684459 --- /dev/null +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/data/ConfigurationDataSource.kt @@ -0,0 +1,36 @@ +package no.nordicsemi.android.uart.data + +import android.content.Context +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.stringPreferencesKey +import androidx.datastore.preferences.preferencesDataStore +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.flow.map +import javax.inject.Inject +import javax.inject.Singleton + +private const val FILE = "UART_CONFIGURATION" +private const val LAST_CONFIGURATION_KEY = "LAST_CONFIGURATION" + +@Singleton +internal class ConfigurationDataSource @Inject constructor( + @ApplicationContext + private val context: Context +) { + + private val Context.dataStore: DataStore by preferencesDataStore(name = FILE) + + private val LAST_CONFIGURATION = stringPreferencesKey(LAST_CONFIGURATION_KEY) + + val lastConfigurationName = context.dataStore.data.map { + it[LAST_CONFIGURATION] + } + + suspend fun saveConfigurationName(name: String) { + context.dataStore.edit { + it[LAST_CONFIGURATION] = name + } + } +} diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTRepository.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTRepository.kt index 8b7ed703..b453f858 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTRepository.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTRepository.kt @@ -17,10 +17,11 @@ import javax.inject.Inject import javax.inject.Singleton @Singleton -class UARTRepository @Inject constructor( +class UARTRepository @Inject internal constructor( @ApplicationContext private val context: Context, private val serviceManager: ServiceManager, + private val configurationDataSource: ConfigurationDataSource ) { private var manager: UARTManager? = null @@ -30,6 +31,8 @@ class UARTRepository @Inject constructor( val isRunning = data.map { it.isRunning() } val hasBeenDisconnected = data.map { it.hasBeenDisconnected() } + val lastConfigurationName = configurationDataSource.lastConfigurationName + fun launch(device: BluetoothDevice) { serviceManager.startService(UARTService::class.java, device) } @@ -57,6 +60,10 @@ class UARTRepository @Inject constructor( manager?.clearItems() } + suspend fun saveConfigurationName(name: String) { + configurationDataSource.saveConfigurationName(name) + } + private suspend fun UARTManager.start(device: BluetoothDevice) { try { connect(device) diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/viewmodel/UARTViewModel.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/viewmodel/UARTViewModel.kt index ef7e2d6b..2901ffa5 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/viewmodel/UARTViewModel.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/viewmodel/UARTViewModel.kt @@ -42,6 +42,12 @@ internal class UARTViewModel @Inject constructor( dataSource.getConfigurations().onEach { _state.value = _state.value.copy(configurations = it) }.launchIn(viewModelScope) + + repository.lastConfigurationName.onEach { + it?.let { + _state.value = _state.value.copy(selectedConfigurationName = it) + } + }.launchIn(viewModelScope) } private fun requestBluetoothDevice() { @@ -88,6 +94,7 @@ internal class UARTViewModel @Inject constructor( dataSource.saveConfiguration(UARTConfiguration(null, event.name)) _state.value = _state.value.copy(selectedConfigurationName = event.name) } + saveLastConfigurationName(event.name) } private fun onEditMacro(event: OnEditMacro) { @@ -99,7 +106,13 @@ internal class UARTViewModel @Inject constructor( } private fun onConfigurationSelected(event: OnConfigurationSelected) { - _state.value = _state.value.copy(selectedConfigurationName = event.configuration.name) + saveLastConfigurationName(event.configuration.name) + } + + private fun saveLastConfigurationName(name: String) { + viewModelScope.launch { + repository.saveConfigurationName(name) + } } private fun addNewMacro(macro: UARTMacro) {