fix: handle deleted channels in ChannelSet DataStore

adds `removeSettings` method to delete channels with `Role.DISABLED`
master
andrekir 2023-05-06 08:08:17 -03:00
rodzic feed8262ea
commit 41d0315b63
2 zmienionych plików z 26 dodań i 24 usunięć

Wyświetl plik

@ -7,7 +7,7 @@ import com.geeksville.mesh.ChannelProtos
import com.geeksville.mesh.ConfigProtos
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.firstOrNull
import java.io.IOException
import javax.inject.Inject
@ -40,14 +40,23 @@ class ChannelSetRepository @Inject constructor(
}
}
suspend fun addSettings(channel: ChannelProtos.Channel) {
/**
* Updates the ChannelSettings list with the provided channel and returns the index of the
* admin channel after the update (if not found, returns 0).
*/
suspend fun updateChannelSettings(channel: ChannelProtos.Channel): Int {
channelSetStore.updateData { preference ->
if (preference.settingsCount > channel.index) {
preference.toBuilder().setSettings(channel.index, channel.settings).build()
if (channel.role == ChannelProtos.Channel.Role.DISABLED) {
preference.toBuilder().removeSettings(channel.index).build()
} else {
preference.toBuilder().setSettings(channel.index, channel.settings).build()
}
} else {
preference.toBuilder().addSettings(channel.settings).build()
preference.toBuilder().addSettings(channel.index, channel.settings).build()
}
}
return getAdminChannel()
}
suspend fun addAllSettings(channelSet: ChannelSet) {
@ -62,6 +71,13 @@ class ChannelSetRepository @Inject constructor(
}
}
suspend fun fetchInitialChannelSet() = channelSetStore.data.first()
/**
* Returns the index of the admin channel (or 0 if not found).
*/
private suspend fun getAdminChannel(): Int = fetchInitialChannelSet()?.settingsList
?.indexOfFirst { it.name.lowercase() == "admin" }
?.coerceAtLeast(0) ?: 0
suspend fun fetchInitialChannelSet() = channelSetStore.data.firstOrNull()
}

Wyświetl plik

@ -963,11 +963,8 @@ class MeshService : Service(), Logging {
}
}
private fun addChannelSettings(ch: ChannelProtos.Channel) {
if (ch.index == 0 || ch.settings.name.lowercase() == "admin") adminChannelIndex = ch.index
serviceScope.handledLaunch {
channelSetRepository.addSettings(ch)
}
private fun updateChannelSettings(ch: ChannelProtos.Channel) = serviceScope.handledLaunch {
adminChannelIndex = channelSetRepository.updateChannelSettings(ch)
}
private fun currentSecond() = (System.currentTimeMillis() / 1000).toInt()
@ -1207,7 +1204,7 @@ class MeshService : Service(), Logging {
ch.toString()
)
insertMeshLog(packetToSave)
if (ch.role != ChannelProtos.Channel.Role.DISABLED) addChannelSettings(ch)
if (ch.role != ChannelProtos.Channel.Role.DISABLED) updateChannelSettings(ch)
}
/**
@ -1407,13 +1404,6 @@ class MeshService : Service(), Logging {
}.forEach(::requestConfig)
}
private fun setChannel(ch: ChannelProtos.Channel) {
if (ch.index == 0 || ch.settings.name.lowercase() == "admin") adminChannelIndex = ch.index
sendToRadio(newMeshPacketTo(myNodeNum).buildAdminPacket(wantResponse = true) {
setChannel = ch
})
}
/**
* Start the modern (REV2) API configuration flow
*/
@ -1725,17 +1715,13 @@ class MeshService : Service(), Logging {
}
override fun setChannel(payload: ByteArray?) = toRemoteExceptions {
with(ChannelProtos.Channel.parseFrom(payload)) {
if (index == 0 || settings.name.lowercase() == "admin") adminChannelIndex = index
}
setRemoteChannel(myNodeNum, payload)
}
override fun setRemoteChannel(destNum: Int, payload: ByteArray?) = toRemoteExceptions {
val channel = ChannelProtos.Channel.parseFrom(payload)
sendToRadio(newMeshPacketTo(destNum).buildAdminPacket(wantResponse = true) {
setChannel = channel
})
sendToRadio(newMeshPacketTo(destNum).buildAdminPacket { setChannel = channel })
if (destNum == myNodeNum) updateChannelSettings(channel) // Update our local copy
}
override fun getRemoteChannel(id: Int, destNum: Int, index: Int) = toRemoteExceptions {