Huawei: Batch inserting sleep data to database

This commit is contained in:
Martin.JM
2025-08-17 11:25:29 +02:00
parent 711e896c11
commit a79468f514
2 changed files with 38 additions and 22 deletions
@@ -51,6 +51,7 @@ import java.util.UUID;
import de.greenrobot.dao.query.DeleteQuery;
import de.greenrobot.dao.query.QueryBuilder;
import kotlin.Triple;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.SettingsActivity;
@@ -1758,31 +1759,39 @@ public class HuaweiSupportProvider {
responseManager.addHandler(request);
}
public void addSleepActivity(int timestamp_start, int timestamp_end, byte type, byte source) {
LOG.debug("Adding sleep activity between {} and {}", timestamp_start, timestamp_end);
/**
* Add sleep activities
* @param data List of triples with [timestamp_start, timestamp_end, type]
* @param source Source of the data
*/
public void addSleepActivities(List<Triple<Integer, Integer, Byte>> data, byte source) {
try (DBHandler db = GBApplication.acquireDB()) {
Long userId = DBHelper.getUser(db.getDaoSession()).getId();
Long deviceId = DBHelper.getDevice(gbDevice, db.getDaoSession()).getId();
HuaweiSampleProvider sampleProvider = new HuaweiSampleProvider(gbDevice, db.getDaoSession());
HuaweiActivitySample activitySample = new HuaweiActivitySample(
timestamp_start,
deviceId,
userId,
timestamp_end,
source,
type,
1,
ActivitySample.NOT_MEASURED,
ActivitySample.NOT_MEASURED,
ActivitySample.NOT_MEASURED,
ActivitySample.NOT_MEASURED,
ActivitySample.NOT_MEASURED
);
activitySample.setProvider(sampleProvider);
List<HuaweiActivitySample> samples = new ArrayList<>(data.size());
for (Triple<Integer, Integer, Byte> d : data) {
HuaweiActivitySample activitySample = new HuaweiActivitySample(
d.component1(),
deviceId,
userId,
d.component2(),
source,
d.component3(),
1,
ActivitySample.NOT_MEASURED,
ActivitySample.NOT_MEASURED,
ActivitySample.NOT_MEASURED,
ActivitySample.NOT_MEASURED,
ActivitySample.NOT_MEASURED
);
activitySample.setProvider(sampleProvider);
sampleProvider.addGBActivitySample(activitySample);
samples.add(activitySample);
}
sampleProvider.addGBActivitySamples(samples.toArray(new HuaweiActivitySample[0]));
} catch (Exception e) {
LOG.error("Failed to add sleep activity to database", e);
}
@@ -2921,8 +2930,10 @@ public class HuaweiSupportProvider {
syncState.stopActivitySync();
return;
}
List<Triple<Integer, Integer, Byte>> data = new ArrayList<>(results.length);
for (HuaweiTruSleepParser.TruSleepStatus status : results)
addSleepActivity(status.startTime, status.endTime, (byte) 0x06, (byte) 0x0a);
data.add(new Triple<>(status.startTime, status.endTime, (byte) 0x06));
addSleepActivities(data, (byte) 0x0a);
// HuaweiTruSleepParser.TruSleepData data = HuaweiTruSleepParser.parseData(sleepData);
// HuaweiTruSleepParser.analyze(this.provider, results, data);
@@ -19,8 +19,10 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import kotlin.Triple;
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket;
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.FitnessData;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider;
@@ -51,7 +53,6 @@ public class GetSleepDataRequest extends Request {
@Override
protected void processResponse() throws ResponseParseException {
// FitnessData.MessageData.SleepResponse response = FitnessData.MessageData.SleepResponse.fromTlv(receivedPacket.tlv);
if (!(receivedPacket instanceof FitnessData.MessageData.SleepResponse))
throw new ResponseTypeMismatchException(receivedPacket, FitnessData.MessageData.SleepResponse.class);
@@ -63,6 +64,8 @@ public class GetSleepDataRequest extends Request {
LOG.warn("Counts do not match");
}
List<Triple<Integer, Integer, Byte>> data = new ArrayList<>(response.containers.size());
for (FitnessData.MessageData.SleepResponse.SubContainer subContainer : response.containers) {
// TODO: it might make more sense to convert the timestamp in the FitnessData class
int[] timestampInts = new int[6];
@@ -85,9 +88,11 @@ public class GetSleepDataRequest extends Request {
(timestampInts[5]);
short duration = (short) (durationInt * 60);
this.supportProvider.addSleepActivity(timestamp, timestamp + duration, subContainer.type, FitnessData.MessageData.sleepId);
data.add(new Triple<>(timestamp, timestamp + duration, subContainer.type));
}
supportProvider.addSleepActivities(data, FitnessData.MessageData.sleepId);
if (count + 1 < maxCount) {
GetSleepDataRequest nextRequest = new GetSleepDataRequest(supportProvider, this.maxCount, (short) (this.count + 1));
nextRequest.setFinalizeReq(this.finalizeReq);