From 620a9a3841fffabacb78ae5e447b0c365439f45a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Tue, 29 Jul 2025 23:56:36 +0100 Subject: [PATCH] Zepp OS: Add activity type for indoor walking --- .../zeppos/ZeppOsActivitySummaryParser.java | 5 ++-- .../model/ActivitySummaryEntries.java | 2 ++ .../huami/zeppos/ZeppOsActivityType.java | 1 + .../ZeppOsActivitySummaryParserTest.java | 27 +++++++++++++++++++ 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 app/src/test/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/zeppos/ZeppOsActivitySummaryParserTest.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/zeppos/ZeppOsActivitySummaryParser.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/zeppos/ZeppOsActivitySummaryParser.java index 8df5d0604d..ab4af18a03 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/zeppos/ZeppOsActivitySummaryParser.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/zeppos/ZeppOsActivitySummaryParser.java @@ -85,8 +85,8 @@ public class ZeppOsActivitySummaryParser extends HuamiActivitySummaryParser { } if (summaryProto.hasType()) { - final ZeppOsActivityType activityType = ZeppOsActivityType - .fromCode((byte) summaryProto.getType().getType()); + final byte typeCode = (byte) summaryProto.getType().getType(); + final ZeppOsActivityType activityType = ZeppOsActivityType.fromCode(typeCode); final ActivityKind activityKind; if (activityType != null) { @@ -94,6 +94,7 @@ public class ZeppOsActivitySummaryParser extends HuamiActivitySummaryParser { } else { LOG.warn("Unknown workout activity type code {}", String.format("0x%X", summaryProto.getType().getType())); activityKind = ActivityKind.UNKNOWN; + summaryData.add(ACTIVITY_TYPE_CODE, typeCode, UNIT_NONE); } summary.setActivityKind(activityKind.getCode()); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivitySummaryEntries.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivitySummaryEntries.java index 74abbe79a9..059ec4092e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivitySummaryEntries.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivitySummaryEntries.java @@ -25,6 +25,8 @@ public class ActivitySummaryEntries { public static final String STATUS = "status"; public static final String TYPE = "watchface_dialog_widget_type"; // TODO: change this? + public static final String ACTIVITY_TYPE_CODE = "activity_type_code"; + public static final String TIME_START = "startTime"; public static final String TIME_END = "endTime"; public static final String ACTIVE_SECONDS = "activeSeconds"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/ZeppOsActivityType.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/ZeppOsActivityType.java index e235d48767..43aa2a14c4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/ZeppOsActivityType.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/ZeppOsActivityType.java @@ -80,6 +80,7 @@ public enum ZeppOsActivityType { IndoorCycling(0x08, ActivityKind.INDOOR_CYCLING), IndoorFitness(0x18, ActivityKind.INDOOR_FITNESS), IndoorIceSkating(0x2d, ActivityKind.INDOOR_ICE_SKATING), + IndoorWalking(0x28, ActivityKind.INDOOR_WALKING), JaiAlai(0xab, ActivityKind.JAI_ALAI), JazzDance(0x71, ActivityKind.JAZZ_DANCE), Judo(0x62, ActivityKind.JUDO), diff --git a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/zeppos/ZeppOsActivitySummaryParserTest.java b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/zeppos/ZeppOsActivitySummaryParserTest.java new file mode 100644 index 0000000000..95ec051416 --- /dev/null +++ b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/zeppos/ZeppOsActivitySummaryParserTest.java @@ -0,0 +1,27 @@ +package nodomain.freeyourgadget.gadgetbridge.devices.huami.zeppos; + +import org.junit.Ignore; +import org.junit.Test; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Date; + +import nodomain.freeyourgadget.gadgetbridge.entities.BaseActivitySummary; +import nodomain.freeyourgadget.gadgetbridge.test.TestBase; + +public class ZeppOsActivitySummaryParserTest extends TestBase { + @Test + @Ignore("helper test for development, remove this while debugging") + public void localTest() throws IOException { + final byte[] data = Files.readAllBytes(Paths.get("/storage/activity.bin")); + + final BaseActivitySummary summary = new BaseActivitySummary(); + summary.setRawSummaryData(data); + summary.setStartTime(new Date()); + + final ZeppOsActivitySummaryParser parser = new ZeppOsActivitySummaryParser(getContext()); + parser.parseBinaryData(summary, summary.getStartTime(), true); + } +}