From d66de2f94f142c499fe69671414cee3c6b1db8c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Tue, 17 Oct 2023 21:25:16 +0100 Subject: [PATCH] Xiaomi: Fix activity file id encoding --- .../xiaomi/activity/XiaomiActivityFileId.java | 2 +- .../activity/XiaomiActivityFileIdTest.java | 48 +++++++++++++++---- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/activity/XiaomiActivityFileId.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/activity/XiaomiActivityFileId.java index 18321edda..ab327fef5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/activity/XiaomiActivityFileId.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/activity/XiaomiActivityFileId.java @@ -107,7 +107,7 @@ public class XiaomiActivityFileId { // bit 6 and 7 - 0 details, 1 summary final int detailType = flags & 3; - return new XiaomiActivityFileId(new Date(ts * 1000L), tz, version, type, subtype, detailType); + return new XiaomiActivityFileId(new Date(ts * 1000L), tz, type, subtype, detailType, version); } @NonNull diff --git a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/activity/XiaomiActivityFileIdTest.java b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/activity/XiaomiActivityFileIdTest.java index ca8d7e121..576974cda 100644 --- a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/activity/XiaomiActivityFileIdTest.java +++ b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/activity/XiaomiActivityFileIdTest.java @@ -16,18 +16,23 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.service.devices.xiaomi.activity; -import static org.junit.Assert.*; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; import org.junit.Test; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import nodomain.freeyourgadget.gadgetbridge.util.GB; public class XiaomiActivityFileIdTest { @Test public void testEncode() { - final byte[] bytes = GB.hexStringToByteArray("21F328650403A0"); + final byte[] expectedEncoding = GB.hexStringToByteArray("21F3286504008C"); final XiaomiActivityFileId xiaomiActivityFileId = new XiaomiActivityFileId( new Date(1697182497000L), 4, @@ -37,19 +42,42 @@ public class XiaomiActivityFileIdTest { 0 ); - assertArrayEquals(bytes, xiaomiActivityFileId.toBytes()); + assertArrayEquals(expectedEncoding, xiaomiActivityFileId.toBytes()); } @Test public void testDecode() { final byte[] bytes = GB.hexStringToByteArray("21F328650403A0"); - final XiaomiActivityFileId fileId = XiaomiActivityFileId.from(bytes); + final XiaomiActivityFileId expectedFileId = XiaomiActivityFileId.from(bytes); - assertEquals(1697182497000L, fileId.getTimestamp().getTime()); - assertEquals(4, fileId.getTimezone()); - assertEquals(3, fileId.getVersion()); - assertEquals(1, fileId.getType()); - assertEquals(8, fileId.getSubtype()); - assertEquals(0, fileId.getDetailType()); + assertEquals(1697182497000L, expectedFileId.getTimestamp().getTime()); + assertEquals(4, expectedFileId.getTimezone()); + assertEquals(3, expectedFileId.getVersion()); + assertEquals(1, expectedFileId.getType()); + assertEquals(8, expectedFileId.getSubtype()); + assertEquals(0, expectedFileId.getDetailType()); + } + + @Test + public void testDecodeEncode() { + final byte[] bytes = GB.hexStringToByteArray("21F328650403A021F3286504008C"); + + final ByteBuffer bufDecode = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN); + + final List fileIds = new ArrayList<>(); + + while (bufDecode.position() < bufDecode.limit()) { + final XiaomiActivityFileId fileId = XiaomiActivityFileId.from(bufDecode); + fileIds.add(fileId); + System.out.println(fileId); + } + + final ByteBuffer bufEncode = ByteBuffer.allocate(fileIds.size() * 7).order(ByteOrder.LITTLE_ENDIAN); + + for (final XiaomiActivityFileId fileId : fileIds) { + bufEncode.put(fileId.toBytes()); + } + + assertArrayEquals(bytes, bufEncode.array()); } }