From b9fb161fad0389e8bf6d48f0aadcc8ac5661d24b Mon Sep 17 00:00:00 2001 From: Gideon Zenz Date: Sat, 30 May 2026 17:53:56 +0200 Subject: [PATCH] Health Connect: Use dedicated query for GenericHeartRate first-sample lookup Replace client-side takeIf filter with a proper DB query using Timestamp.gt(after) so that the first valid sample is found even when the absolute oldest row has a non-positive timestamp. --- .../GenericHeartRateActivitySampleProvider.kt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/generic_hr/GenericHeartRateActivitySampleProvider.kt b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/generic_hr/GenericHeartRateActivitySampleProvider.kt index 8b498620e5..0e874ab52e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/generic_hr/GenericHeartRateActivitySampleProvider.kt +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/generic_hr/GenericHeartRateActivitySampleProvider.kt @@ -16,11 +16,13 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.devices.generic_hr +import nodomain.freeyourgadget.gadgetbridge.database.DBHelper import nodomain.freeyourgadget.gadgetbridge.devices.GenericHeartRateSampleProvider import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession import nodomain.freeyourgadget.gadgetbridge.entities.GenericActivitySample import nodomain.freeyourgadget.gadgetbridge.entities.GenericHeartRateSample +import nodomain.freeyourgadget.gadgetbridge.entities.GenericHeartRateSampleDao import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind @@ -89,7 +91,18 @@ open class GenericHeartRateActivitySampleProvider(device: GBDevice, session: Dao } override fun getFirstActivitySample(after: Int): GenericActivitySample? { - return getFirstActivitySample()?.takeIf { it.timestamp > after } + val afterMillis = after.toLong() * 1000 + val device = DBHelper.findDevice(heartRateProvider.device, heartRateProvider.session) ?: return null + val samples = heartRateProvider.sampleDao.queryBuilder() + .where( + GenericHeartRateSampleDao.Properties.Timestamp.gt(afterMillis), + GenericHeartRateSampleDao.Properties.DeviceId.eq(device.id) + ) + .orderAsc(GenericHeartRateSampleDao.Properties.Timestamp) + .limit(1) + .build() + .list() + return samples.firstOrNull()?.let { toGenericActivitySample(it) } } private fun toGenericActivitySample(hrSample: GenericHeartRateSample): GenericActivitySample {