diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/Huami2021Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/Huami2021Support.java index 1d90e43f9..6e1578781 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/Huami2021Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/Huami2021Support.java @@ -106,6 +106,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.concurrent.TimeUnit; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.database.DBHelper; @@ -875,6 +876,18 @@ public abstract class Huami2021Support extends HuamiSupport { return this; } + @Override + public byte[] getTimeBytes(final Calendar calendar, final TimeUnit precision) { + final byte[] bytes = BLETypeConversions.shortCalendarToRawBytes(calendar); + + if (precision != TimeUnit.MINUTES && precision != TimeUnit.SECONDS) { + throw new IllegalArgumentException("Unsupported precision, only MINUTES and SECONDS are supported"); + } + final byte seconds = precision == TimeUnit.SECONDS ? fromUint8(calendar.get(Calendar.SECOND)) : 0; + final byte tz = BLETypeConversions.mapTimeZone(calendar, BLETypeConversions.TZ_FLAG_INCLUDE_DST_IN_TZ); + return BLETypeConversions.join(bytes, new byte[]{seconds, tz}); + } + @Override public Huami2021Support setCurrentTimeWithService(TransactionBuilder builder) { // It seems that the format sent to the Current Time characteristic changed in newer devices diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/AbstractFetchOperation.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/AbstractFetchOperation.java index 18b2e1379..2fe6c55ed 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/AbstractFetchOperation.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/AbstractFetchOperation.java @@ -162,10 +162,11 @@ public abstract class AbstractFetchOperation extends AbstractHuamiOperation { protected void startFetching(TransactionBuilder builder, byte fetchType, GregorianCalendar sinceWhen) { final String taskName = StringUtils.ensureNotNull(builder.getTaskName()); + final boolean isHuami2021 = getSupport() instanceof Huami2021Support; byte[] fetchBytes = BLETypeConversions.join(new byte[]{ HuamiService.COMMAND_ACTIVITY_DATA_START_DATE, fetchType}, - getSupport().getTimeBytes(sinceWhen, TimeUnit.MINUTES)); + getSupport().getTimeBytes(sinceWhen, isHuami2021 ? TimeUnit.SECONDS : TimeUnit.MINUTES)); builder.add(new AbstractGattListenerWriteAction(getQueue(), characteristicFetch, fetchBytes) { @Override protected boolean onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { @@ -175,7 +176,7 @@ public abstract class AbstractFetchOperation extends AbstractHuamiOperation { if (ArrayUtils.equals(value, HuamiService.RESPONSE_ACTIVITY_DATA_START_DATE_SUCCESS, 0)) { handleActivityMetadata(value); - if (expectedDataLength == 0 && getSupport() instanceof Huami2021Support) { + if (expectedDataLength == 0 && isHuami2021) { // Nothing to receive, if we try to fetch data it will fail sendAck2021(true); } else {