From 769c8c70d3c9899666523ec4403ae1298fe2a494 Mon Sep 17 00:00:00 2001 From: umer0586 Date: Thu, 10 Oct 2024 22:43:02 +0500 Subject: [PATCH] New Feature Users can now select and deselect sensors from the list while streaming. This allows the app to send data from different sensors dynamically, without needing to stop and restart the stream." --- .../model/service/SensorStreamingService.kt | 7 +++++ .../model/streamer/SensorStreamer.kt | 27 ++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/github/umer0586/sensagram/model/service/SensorStreamingService.kt b/app/src/main/java/com/github/umer0586/sensagram/model/service/SensorStreamingService.kt index a621639..cefcac2 100644 --- a/app/src/main/java/com/github/umer0586/sensagram/model/service/SensorStreamingService.kt +++ b/app/src/main/java/com/github/umer0586/sensagram/model/service/SensorStreamingService.kt @@ -118,6 +118,13 @@ class SensorStreamingService : Service() { sensors = settingsRepository.selectedSensors.first().toSensors(applicationContext) ) + scope.launch { + + settingsRepository.selectedSensors.collect{ + sensorStreamer?.changeSensors(it.toSensors(applicationContext)) + } + } + sensorStreamer?.onStreamingStarted { info -> streamingStartedCallBack?.invoke(info) val notificationIntent = Intent(applicationContext, MainActivity::class.java) diff --git a/app/src/main/java/com/github/umer0586/sensagram/model/streamer/SensorStreamer.kt b/app/src/main/java/com/github/umer0586/sensagram/model/streamer/SensorStreamer.kt index 677ab11..6685bb4 100644 --- a/app/src/main/java/com/github/umer0586/sensagram/model/streamer/SensorStreamer.kt +++ b/app/src/main/java/com/github/umer0586/sensagram/model/streamer/SensorStreamer.kt @@ -45,7 +45,7 @@ class SensorStreamer( val address: String, val portNo: Int, val samplingRate : Int, - val sensors: List + private var sensors: List ) : SensorEventListener { @@ -122,6 +122,31 @@ class SensorStreamer( onError = callBack } + fun changeSensors(newSensors : List){ + + if(!isStreaming) + return + + sensors.forEach { + sensorManager.unregisterListener(this, it) + } + + newSensors.forEach{ + sensorManager.registerListener(this, it, samplingRate, handler) + } + + // Avoid declaring 'sensors' property as a mutable list and then doing 'sensors.clear()' followed by 'sensors.addAll(newSensors)'. + // This can throw a ConcurrentModificationException, leading to app crashes. + // The crash occurs because the list is being modified while it's being iterated over, + // which happens when the user frequently selects and deselects sensors from the list during streaming. + // + // One solution is to use an iterator, as explained here: https://stackoverflow.com/questions/50032000/how-to-avoid-concurrentmodificationexception-kotlin + // Alternatively, declaring 'sensors' as a 'var' and reassigning it (tested and works without crashes) is a simpler and effective fix. + + sensors = newSensors + + } + override fun onSensorChanged(sensorEvent: SensorEvent) { val sensorData = mutableMapOf()