diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/RecordData.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/RecordData.java index bc9c3735d7..f823f456bc 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/RecordData.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/RecordData.java @@ -174,7 +174,16 @@ public class RecordData { } public T getFieldByNumber(int number, final Class clazz) { - return safeCast(getFieldByNumber(number), clazz); + Object object = getFieldByNumber(number); + if (object == null) + return null; + + // when CIQ fields are used value arrays instead of single values are sometimes recorded + if (!clazz.isArray() && object.getClass().isArray() && 0 < Array.getLength(object)) { + object = Array.get(object, 0); + } + + return safeCast(object, clazz); } public T[] getArrayFieldByNumber(int number, final Class clazz) { @@ -215,6 +224,18 @@ public class RecordData { return clazz.cast(object); } + if(object instanceof Number number){ + // some older Garmin devices encoded e.g. + // [distance] and [enhanced_speed] as float instead of double + // [cadence] as float instead of integer + if(clazz.equals(Double.class)){ + return clazz.cast(number.doubleValue()); + } + if(clazz.equals(Integer.class)){ + return clazz.cast(number.intValue()); + } + } + LOG.error( "Unable to cast {} ({}) to {}, returning null - this is likely a bug. Record: {}", object,