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 59c456ce0..e7d3a601c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivitySummaryEntries.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivitySummaryEntries.java @@ -16,6 +16,11 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.model; +import java.util.LinkedHashMap; +import java.util.Map; + +import nodomain.freeyourgadget.gadgetbridge.R; + public class ActivitySummaryEntries { public static final String STATUS = "status"; public static final String TYPE = "watchface_dialog_widget_type"; // TODO: change this? @@ -180,4 +185,16 @@ public class ActivitySummaryEntries { * FIXME: We should have a cleaner way of doing this. */ public static final String INTERNAL_HAS_GPS = "internal_hasGps"; + + public static final Map HR_ZONES = new LinkedHashMap() {{ + put(HR_ZONE_NA, 0); + put(HR_ZONE_WARM_UP, R.color.hr_zone_warm_up_color); + put(HR_ZONE_EASY, R.color.hr_zone_easy_color); + put(HR_ZONE_FAT_BURN, R.color.hr_zone_easy_color); + put(HR_ZONE_AEROBIC, R.color.hr_zone_aerobic_color); + put(HR_ZONE_ANAEROBIC, R.color.hr_zone_threshold_color); + put(HR_ZONE_THRESHOLD, R.color.hr_zone_threshold_color); + put(HR_ZONE_EXTREME, R.color.hr_zone_maximum_color); + put(HR_ZONE_MAXIMUM, R.color.hr_zone_maximum_color); + }}; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/activity/impl/WorkoutSummaryParser.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/activity/impl/WorkoutSummaryParser.java index eb1df128e..cdb0132cc 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/activity/impl/WorkoutSummaryParser.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/activity/impl/WorkoutSummaryParser.java @@ -364,21 +364,21 @@ public class WorkoutSummaryParser extends XiaomiActivityParser implements Activi builder.addUnknown(24); builder.addByte("configuredSets", UNIT_NONE); builder.addUnknown(13); - builder.addInt("startTime2", UNIT_SECONDS); - builder.addInt("endTime2", UNIT_SECONDS); - builder.addInt("goal", UNIT_NONE); // TODO match against goalType - builder.addInt("duration2", UNIT_SECONDS); - builder.addInt("intervalTime", UNIT_SECONDS); - builder.addUnknown(56); - builder.addInt("hrZoneExtreme2", UNIT_SECONDS); - builder.addInt("hrZoneAnaerobic2", UNIT_SECONDS); - builder.addInt("hrZoneAerobic2", UNIT_SECONDS); - builder.addInt("hrZoneFatBurn2", UNIT_SECONDS); - builder.addInt("hrZoneWarmUp2", UNIT_SECONDS); - builder.addUnknown(16); - builder.addShort("vitality_gain", UNIT_NONE); - builder.addShort("training_load2", UNIT_NONE); - builder.addShort("recovery_time2", UNIT_HOURS); + //builder.addInt("startTime2", UNIT_SECONDS); + //builder.addInt("endTime2", UNIT_SECONDS); + //builder.addInt("goal", UNIT_NONE); // TODO match against goalType + //builder.addInt("duration2", UNIT_SECONDS); + //builder.addInt("intervalTime", UNIT_SECONDS); + //builder.addUnknown(56); + //builder.addInt("hrZoneExtreme2", UNIT_SECONDS); + //builder.addInt("hrZoneAnaerobic2", UNIT_SECONDS); + //builder.addInt("hrZoneAerobic2", UNIT_SECONDS); + //builder.addInt("hrZoneFatBurn2", UNIT_SECONDS); + //builder.addInt("hrZoneWarmUp2", UNIT_SECONDS); + //builder.addUnknown(16); + //builder.addShort("vitality_gain", UNIT_NONE); + //builder.addShort("training_load2", UNIT_NONE); + //builder.addShort("recovery_time2", UNIT_HOURS); return builder.build(); } @@ -422,7 +422,7 @@ public class WorkoutSummaryParser extends XiaomiActivityParser implements Activi builder.addInt(HR_ZONE_AEROBIC, UNIT_SECONDS); builder.addInt(HR_ZONE_FAT_BURN, UNIT_SECONDS); builder.addInt(HR_ZONE_WARM_UP, UNIT_SECONDS); - builder.addInt("configured_time_goal", UNIT_SECONDS); + builder.addInt("configuredTimeGoal", UNIT_SECONDS); return builder.build(); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/activity/impl/XiaomiSimpleActivityParser.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/activity/impl/XiaomiSimpleActivityParser.java index cabcf0d6f..bc82a3575 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/activity/impl/XiaomiSimpleActivityParser.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/activity/impl/XiaomiSimpleActivityParser.java @@ -19,6 +19,7 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.xiaomi.activity.imp import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.SWIM_STYLE; import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.TIME_END; import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.TIME_START; +import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_SECONDS; import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_UNIX_EPOCH_SECONDS; import org.slf4j.Logger; @@ -27,11 +28,17 @@ import org.slf4j.LoggerFactory; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; +import nodomain.freeyourgadget.gadgetbridge.GBApplication; +import nodomain.freeyourgadget.gadgetbridge.activities.workouts.entries.ActivitySummaryProgressEntry; import nodomain.freeyourgadget.gadgetbridge.entities.BaseActivitySummary; import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind; import nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryData; +import nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries; import nodomain.freeyourgadget.gadgetbridge.util.GB; public class XiaomiSimpleActivityParser { @@ -55,6 +62,8 @@ public class XiaomiSimpleActivityParser { LOG.debug("Header: {}", GB.hexdump(header)); + final Map hrZones = new HashMap<>(5); + for (int i = 0; i < dataEntries.size(); i++) { final XiaomiSimpleDataEntry dataEntry = dataEntries.get(i); @@ -217,11 +226,38 @@ public class XiaomiSimpleActivityParser { default: summary.setActivityKind(ActivityKind.UNKNOWN.getCode()); } + } else if (ActivitySummaryEntries.HR_ZONES.containsKey(dataEntry.getKey())) { + // Save the HR zones so we can add them later in order + hrZones.put(dataEntry.getKey(), value); } else { summaryData.add(dataEntry.getKey(), value.floatValue(), dataEntry.getUnit()); } } + if (!hrZones.isEmpty()) { + final int totalTime = hrZones.values().stream().mapToInt(Number::intValue).sum(); + if (totalTime != 0) { + for (Map.Entry zone : ActivitySummaryEntries.HR_ZONES.entrySet()) { + final String zoneKey = zone.getKey(); + if (!hrZones.containsKey(zoneKey)) { + continue; + } + final int zoneColor = zone.getValue(); + final int zoneTime = Objects.requireNonNull(hrZones.get(zoneKey)).intValue(); + + summaryData.add( + zoneKey, + new ActivitySummaryProgressEntry( + zoneTime, + UNIT_SECONDS, + ((100 * zoneTime) / totalTime), + zoneColor != 0 ? GBApplication.getContext().getResources().getColor(zoneColor) : 0 + ) + ); + } + } + } + summary.setSummaryData(summaryData.toString()); }