Skip to content

Commit 108f2f1

Browse files
committed
Persist and update lastPublishedDate to correctly handle deletions and updates of the latest measurement
1 parent 250cd80 commit 108f2f1

File tree

4 files changed

+62
-7
lines changed

4 files changed

+62
-7
lines changed

src/app/src/main/java/com/health/openscale/sync/core/model/MQTTViewModel.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ class MQTTViewModel(private val sharedPreferences: SharedPreferences) : ViewMode
3232
private val _mqttUseSsl = MutableLiveData<Boolean>(sharedPreferences.getBoolean("mqtt_use_ssl", true))
3333
private val _mqttUseDiscovery = MutableLiveData<Boolean>(sharedPreferences.getBoolean("mqtt_use_discovery", true))
3434

35+
private val _lastPublishedDate = MutableLiveData<Long>(sharedPreferences.getLong("last_published_date", 0L))
36+
3537
override fun getName(): String {
3638
return "MQTT"
3739
}
@@ -82,4 +84,11 @@ class MQTTViewModel(private val sharedPreferences: SharedPreferences) : ViewMode
8284
_mqttUseDiscovery.value = useDiscovery
8385
sharedPreferences.edit().putBoolean("mqtt_use_discovery", useDiscovery).apply()
8486
}
87+
88+
val lastPublishedDate: LiveData<Long> = _lastPublishedDate
89+
90+
fun setLastPublishedDate(date: Long) {
91+
_lastPublishedDate.value = date
92+
sharedPreferences.edit().putLong("last_published_date", date).apply()
93+
}
8594
}

src/app/src/main/java/com/health/openscale/sync/core/service/MQTTService.kt

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import com.health.openscale.sync.R
5151
import com.health.openscale.sync.core.datatypes.OpenScaleMeasurement
5252
import com.health.openscale.sync.core.model.MQTTViewModel
5353
import com.health.openscale.sync.core.model.ViewModelInterface
54+
import com.health.openscale.sync.core.service.SyncResult
5455
import com.health.openscale.sync.core.sync.MQTTSync
5556
import com.hivemq.client.mqtt.MqttClient
5657
import com.hivemq.client.mqtt.mqtt5.Mqtt5BlockingClient
@@ -123,31 +124,67 @@ class MQTTService(
123124

124125
override suspend fun sync(measurements: List<OpenScaleMeasurement>): SyncResult<Unit> {
125126
return ensureConnectedAndExecute("fullSync") {syncHandler ->
126-
syncHandler.fullSync(measurements)
127+
val result = syncHandler.fullSync(measurements)
128+
if (result is SyncResult.Success) {
129+
measurements.maxByOrNull { it.date }?.let { publishLastMeasurement(it) }
130+
}
131+
result
127132
}
128133
}
129134

130135
override suspend fun insert(measurement: OpenScaleMeasurement): SyncResult<Unit> {
131136
return ensureConnectedAndExecute("insert") { syncHandler ->
132-
syncHandler.insert(measurement)
137+
val result = syncHandler.insert(measurement)
138+
if (result is SyncResult.Success) {
139+
publishLastMeasurement(measurement)
140+
}
141+
result
133142
}
134143
}
135144

136145
override suspend fun delete(date: Date): SyncResult<Unit> {
137146
return ensureConnectedAndExecute("delete") { syncHandler ->
138-
syncHandler.delete(date)
147+
val result = syncHandler.delete(date)
148+
if (result is SyncResult.Success) {
149+
val lastDate = viewModel.lastPublishedDate.value
150+
if (lastDate != null && date.time >= lastDate) {
151+
publishLastMeasurement(null)
152+
}
153+
}
154+
result
139155
}
140156
}
141157

142158
override suspend fun clear(): SyncResult<Unit> {
143159
return ensureConnectedAndExecute("clear") { syncHandler ->
144-
syncHandler.clear()
160+
val result = syncHandler.clear()
161+
if (result is SyncResult.Success) {
162+
publishLastMeasurement(null)
163+
}
164+
result
145165
}
146166
}
147167

148168
override suspend fun update(measurement: OpenScaleMeasurement): SyncResult<Unit> {
149169
return ensureConnectedAndExecute("update") { syncHandler ->
150-
syncHandler.update(measurement)
170+
val result = syncHandler.update(measurement)
171+
if (result is SyncResult.Success) {
172+
publishLastMeasurement(measurement)
173+
}
174+
result
175+
}
176+
}
177+
178+
private fun publishLastMeasurement(measurement: OpenScaleMeasurement?) {
179+
if (measurement != null) {
180+
val lastDate = viewModel.lastPublishedDate.value
181+
if (lastDate == null || measurement.date.time >= lastDate) {
182+
mqttSync.publishLastMeasurement(measurement)
183+
viewModel.setLastPublishedDate(measurement.date.time)
184+
}
185+
} else {
186+
mqttSync.publishLastMeasurement(null)
187+
viewModel.setLastPublishedDate(0L)
151188
}
152189
}
153190

src/app/src/main/java/com/health/openscale/sync/core/sync/MQTTSync.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818
package com.health.openscale.sync.core.sync
1919

20+
import androidx.lifecycle.viewmodel.compose.viewModel
2021
import com.google.gson.GsonBuilder
2122
import com.google.gson.JsonParser
2223
import com.health.openscale.sync.BuildConfig
@@ -34,7 +35,7 @@ class MQTTSync(private val mqttClient: Mqtt5BlockingClient) : SyncInterface() {
3435
var failureCount = 0
3536

3637
measurements.sortedBy { measurements -> measurements.date.time }.forEach { measurement ->
37-
val syncResult = publishMeasurement(measurement, "openScaleSync/measurements/insert")
38+
val syncResult = publishMeasurement(measurement, "openScaleSync/measurements/all")
3839

3940
if (syncResult is SyncResult.Failure) {
4041
failureCount++
@@ -65,6 +66,14 @@ class MQTTSync(private val mqttClient: Mqtt5BlockingClient) : SyncInterface() {
6566
return publishMeasurement(measurement, "openScaleSync/measurements/update")
6667
}
6768

69+
fun publishLastMeasurement(measurement: OpenScaleMeasurement?): SyncResult<Unit> {
70+
return if (measurement != null) {
71+
publishMeasurement(measurement, "openScaleSync/measurements/last")
72+
} else {
73+
publishMessage(mapOf<String, Any>(), "openScaleSync/measurements/last")
74+
}
75+
}
76+
6877
fun publishHomeAssistantDiscovery(
6978
jsonPayloadString: String
7079
): SyncResult<Unit> {

src/app/src/main/res/raw/homeassistant_payload.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,5 @@
5656
"unique_id": "openscale_id"
5757
}
5858
},
59-
"state_topic": "openScaleSync/measurements/insert"
59+
"state_topic": "openScaleSync/measurements/last"
6060
}

0 commit comments

Comments
 (0)