mirror of
https://github.com/aljazceru/Android-nRF-Toolbox.git
synced 2025-12-24 09:54:20 +01:00
Add data store to UART profile
This commit is contained in:
@@ -4,7 +4,7 @@ apply plugin: 'com.google.protobuf'
|
||||
|
||||
protobuf {
|
||||
protoc {
|
||||
artifact = "com.google.protobuf:protoc:3.14.0"
|
||||
artifact = 'com.google.protobuf:protoc:3.14.0:osx-x86_64'
|
||||
}
|
||||
|
||||
// Generates the java Protobuf-lite code for the Protobufs in this project. See
|
||||
|
||||
@@ -1,23 +1,25 @@
|
||||
package no.nordicsemi.android.uart.data
|
||||
|
||||
import androidx.datastore.core.CorruptionException
|
||||
import androidx.datastore.core.Serializer
|
||||
import no.nordicsemi.android.Macro
|
||||
import androidx.datastore.preferences.protobuf.InvalidProtocolBufferException
|
||||
import no.nordicsemi.android.MacroSettings
|
||||
import java.io.InputStream
|
||||
import java.io.OutputStream
|
||||
|
||||
object MacroSerializer : Serializer<Macro> {
|
||||
override val defaultValue: UARTMacro = Macro.getDefaultInstance()
|
||||
object MacroSerializer : Serializer<MacroSettings> {
|
||||
override val defaultValue: MacroSettings = MacroSettings.getDefaultInstance()
|
||||
|
||||
override suspend fun readFrom(input: InputStream): UARTMacro {
|
||||
override suspend fun readFrom(input: InputStream): MacroSettings {
|
||||
try {
|
||||
return Settings.parseFrom(input)
|
||||
return MacroSettings.parseFrom(input)
|
||||
} catch (exception: InvalidProtocolBufferException) {
|
||||
throw CorruptionException("Cannot read proto.", exception)
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun writeTo(
|
||||
t: UARTMacro,
|
||||
t: MacroSettings,
|
||||
output: OutputStream
|
||||
) = t.writeTo(output)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
package no.nordicsemi.android.uart.data
|
||||
|
||||
import android.content.Context
|
||||
import androidx.datastore.core.DataStore
|
||||
import androidx.datastore.dataStore
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import kotlinx.coroutines.flow.map
|
||||
import no.nordicsemi.android.Macro
|
||||
import no.nordicsemi.android.MacroSettings
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
||||
private const val MACRO_FILE = "macro.proto"
|
||||
|
||||
@Singleton
|
||||
internal class UARTPersistentDataSource @Inject constructor(
|
||||
@ApplicationContext
|
||||
private val context: Context
|
||||
) {
|
||||
private val Context.dataStore: DataStore<MacroSettings> by dataStore(fileName = MACRO_FILE, MacroSerializer)
|
||||
|
||||
val macros = context.dataStore.data.map {
|
||||
it.macrosList.map {
|
||||
UARTMacro(it.name, it.newLineType.toNewLineChar())
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun saveMacros(uartMacros: List<UARTMacro>) {
|
||||
context.dataStore.updateData { settings ->
|
||||
val macros = uartMacros.map { it.toMacro() }
|
||||
settings.toBuilder()
|
||||
.clearMacros()
|
||||
.addAllMacros(macros)
|
||||
.build()
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun addNewMacro(uartMacro: UARTMacro) {
|
||||
context.dataStore.updateData { settings ->
|
||||
settings.toBuilder()
|
||||
.addMacros(uartMacro.toMacro())
|
||||
.build()
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun deleteMacro(uartMacro: UARTMacro) {
|
||||
context.dataStore.updateData { settings ->
|
||||
val i = settings.macrosList.map { it.name }.indexOf(uartMacro.command)
|
||||
settings.toBuilder()
|
||||
.removeMacros(i)
|
||||
.build()
|
||||
}
|
||||
}
|
||||
|
||||
private fun UARTMacro.toMacro(): Macro {
|
||||
return Macro.newBuilder()
|
||||
.setName(command)
|
||||
.setNewLineType(newLineChar.toMacroNewLineType())
|
||||
.build()
|
||||
}
|
||||
|
||||
private fun NewLineChar.toMacroNewLineType(): Macro.NewLineType {
|
||||
return when (this) {
|
||||
NewLineChar.LF -> Macro.NewLineType.LF
|
||||
NewLineChar.CR_LF -> Macro.NewLineType.LF_CR
|
||||
NewLineChar.CR -> Macro.NewLineType.CR
|
||||
}
|
||||
}
|
||||
|
||||
private fun Macro.NewLineType.toNewLineChar(): NewLineChar {
|
||||
return when (this) {
|
||||
Macro.NewLineType.LF -> NewLineChar.LF
|
||||
Macro.NewLineType.LF_CR -> NewLineChar.CR_LF
|
||||
Macro.NewLineType.CR -> NewLineChar.CR
|
||||
Macro.NewLineType.UNRECOGNIZED -> throw IllegalArgumentException("Unrecognized NewLineChar.")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
package no.nordicsemi.android.uart.data
|
||||
|
||||
import android.content.Context
|
||||
import androidx.datastore.core.DataStore
|
||||
import androidx.datastore.dataStore
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import java.util.prefs.Preferences
|
||||
import javax.inject.Inject
|
||||
|
||||
private const val MACRO_FILE = "macro.proto"
|
||||
|
||||
internal class UARTSharedPrefDataSource @Inject constructor(
|
||||
@ApplicationContext
|
||||
context: Context
|
||||
) {
|
||||
// val Context.dataStore: DataStore<Preferences> by dataStore(fileName = MACRO_FILE, MacroSerializer)
|
||||
//
|
||||
// private val sp = context.getSharedPreferences(PREFS_FILE, Context.MODE_PRIVATE)
|
||||
//
|
||||
//// val macros:
|
||||
//
|
||||
// init {
|
||||
//
|
||||
// sp.edit()
|
||||
// }
|
||||
}
|
||||
@@ -3,10 +3,12 @@ package no.nordicsemi.android.uart.viewmodel
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.flow.*
|
||||
import kotlinx.coroutines.launch
|
||||
import no.nordicsemi.android.navigation.*
|
||||
import no.nordicsemi.android.uart.data.UARTMacro
|
||||
import no.nordicsemi.android.uart.data.UARTPersistentDataSource
|
||||
import no.nordicsemi.android.uart.data.UART_SERVICE_UUID
|
||||
import no.nordicsemi.android.uart.repository.UARTRepository
|
||||
import no.nordicsemi.android.uart.view.*
|
||||
@@ -18,7 +20,8 @@ import javax.inject.Inject
|
||||
@HiltViewModel
|
||||
internal class UARTViewModel @Inject constructor(
|
||||
private val repository: UARTRepository,
|
||||
private val navigationManager: NavigationManager
|
||||
private val navigationManager: NavigationManager,
|
||||
private val dataSource: UARTPersistentDataSource
|
||||
) : ViewModel() {
|
||||
|
||||
private val _state = MutableStateFlow(UARTViewState())
|
||||
@@ -34,6 +37,10 @@ internal class UARTViewModel @Inject constructor(
|
||||
repository.data.onEach {
|
||||
_state.value = _state.value.copy(uartManagerState = WorkingState(it))
|
||||
}.launchIn(viewModelScope)
|
||||
|
||||
dataSource.macros.onEach {
|
||||
_state.value = _state.value.copy(macros = it)
|
||||
}.launchIn(viewModelScope)
|
||||
}
|
||||
|
||||
private fun requestBluetoothDevice() {
|
||||
@@ -64,14 +71,15 @@ internal class UARTViewModel @Inject constructor(
|
||||
}
|
||||
|
||||
private fun addNewMacro(macro: UARTMacro) {
|
||||
_state.tryEmit(_state.value.copy(macros = _state.value.macros + macro))
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
dataSource.addNewMacro(macro)
|
||||
}
|
||||
}
|
||||
|
||||
private fun deleteMacro(macro: UARTMacro) {
|
||||
val macros = _state.value.macros.toMutableList().apply {
|
||||
remove(macro)
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
dataSource.deleteMacro(macro)
|
||||
}
|
||||
_state.tryEmit(_state.value.copy(macros = macros))
|
||||
}
|
||||
|
||||
private fun disconnect() {
|
||||
|
||||
@@ -14,5 +14,5 @@ message Macro {
|
||||
}
|
||||
|
||||
message MacroSettings {
|
||||
string macros = 1;
|
||||
repeated Macro macros = 1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user