From 081af1664da85cdb233849c8babfc977259c6048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Sat, 7 Feb 2026 14:17:40 +0000 Subject: [PATCH] Zepp OS: Honor Catima barcode encoding if available --- .idea/dictionaries/t.xml | 1 + .../loyaltycards/LoyaltyCardsSettingsFragment.java | 7 +++++++ .../loyaltycards/CatimaContentProvider.java | 14 +++++++++++--- .../capabilities/loyaltycards/LoyaltyCard.java | 9 +++++++++ .../zeppos/services/ZeppOsLoyaltyCardService.java | 2 +- 5 files changed, 29 insertions(+), 4 deletions(-) diff --git a/.idea/dictionaries/t.xml b/.idea/dictionaries/t.xml index 0d84818c5f..6388a69ce2 100644 --- a/.idea/dictionaries/t.xml +++ b/.idea/dictionaries/t.xml @@ -28,6 +28,7 @@ btbr böhler carsten + catima chamorro codeberg colmi diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/loyaltycards/LoyaltyCardsSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/loyaltycards/LoyaltyCardsSettingsFragment.java index 33f0bbaa03..eaa4ea4a0b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/loyaltycards/LoyaltyCardsSettingsFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/loyaltycards/LoyaltyCardsSettingsFragment.java @@ -46,6 +46,7 @@ import androidx.preference.PreferenceCategory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -230,6 +231,12 @@ public class LoyaltyCardsSettingsFragment extends AbstractPreferenceFragment { } values.removeAll(toRemove); syncGroups.setSummary(TextUtils.join(", ", values)); + + syncGroups.setOnPreferenceChangeListener((preference, newValue) -> { + //noinspection unchecked + syncGroups.setSummary(TextUtils.join(", ", (Collection) newValue)); + return true; + }); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/capabilities/loyaltycards/CatimaContentProvider.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/capabilities/loyaltycards/CatimaContentProvider.java index a6b6da752d..6cc60aeb22 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/capabilities/loyaltycards/CatimaContentProvider.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/capabilities/loyaltycards/CatimaContentProvider.java @@ -25,6 +25,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.math.BigDecimal; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Currency; import java.util.Date; @@ -172,6 +174,9 @@ public class CatimaContentProvider { final int starred = cursor.getInt(cursor.getColumnIndexOrThrow(LoyaltyCardDbIds.STAR_STATUS)); final long lastUsed = cursor.getLong(cursor.getColumnIndexOrThrow(LoyaltyCardDbIds.LAST_USED)); final int archiveStatus = cursor.getInt(cursor.getColumnIndexOrThrow(LoyaltyCardDbIds.ARCHIVE_STATUS)); + // Barcode encoding since content provider version 1.1 + final int barcodeEncodingColumn = cursor.getColumnIndex(LoyaltyCardDbIds.BARCODE_ENCODING); + final String barcodeEncoding = barcodeEncodingColumn >= 0 ? cursor.getString(barcodeEncodingColumn) : StandardCharsets.ISO_8859_1.name(); int barcodeTypeColumn = cursor.getColumnIndexOrThrow(LoyaltyCardDbIds.BARCODE_TYPE); int balanceTypeColumn = cursor.getColumnIndexOrThrow(LoyaltyCardDbIds.BALANCE_TYPE); @@ -212,6 +217,7 @@ public class CatimaContentProvider { cardId, barcodeId, barcodeFormat, + barcodeEncoding, headerColor, starred != 0, archiveStatus != 0, @@ -221,7 +227,7 @@ public class CatimaContentProvider { /** * Copied from Catima, protect.card_locker.DBHelper.LoyaltyCardDbGroups. - * Commit: 8607e1c2 + * Commit: a5599dc */ public static class LoyaltyCardDbGroups { public static final String TABLE = "groups"; @@ -231,12 +237,13 @@ public class CatimaContentProvider { /** * Copied from Catima, protect.card_locker.DBHelper.LoyaltyCardDbIds. - * Commit: 8607e1c2 + * Commit: a5599dc */ public static class LoyaltyCardDbIds { public static final String TABLE = "cards"; public static final String ID = "_id"; public static final String STORE = "store"; + public static final String VALID_FROM = "validfrom"; public static final String EXPIRY = "expiry"; public static final String BALANCE = "balance"; public static final String BALANCE_TYPE = "balancetype"; @@ -246,6 +253,7 @@ public class CatimaContentProvider { public static final String CARD_ID = "cardid"; public static final String BARCODE_ID = "barcodeid"; public static final String BARCODE_TYPE = "barcodetype"; + public static final String BARCODE_ENCODING = "barcodeencoding"; public static final String STAR_STATUS = "starstatus"; public static final String LAST_USED = "lastused"; public static final String ZOOM_LEVEL = "zoomlevel"; @@ -254,7 +262,7 @@ public class CatimaContentProvider { /** * Copied from Catima, protect.card_locker.DBHelper.LoyaltyCardDbIdsGroups. - * Commit: 8607e1c2 + * Commit: a5599dc */ public static class LoyaltyCardDbIdsGroups { public static final String TABLE = "cardsGroups"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/capabilities/loyaltycards/LoyaltyCard.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/capabilities/loyaltycards/LoyaltyCard.java index 7e4d9659c9..005f35c293 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/capabilities/loyaltycards/LoyaltyCard.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/capabilities/loyaltycards/LoyaltyCard.java @@ -23,6 +23,7 @@ import org.apache.commons.lang3.builder.CompareToBuilder; import java.io.Serializable; import java.math.BigDecimal; +import java.nio.charset.Charset; import java.util.Currency; import java.util.Date; import java.util.Locale; @@ -46,6 +47,8 @@ public class LoyaltyCard implements Serializable, Comparable { @Nullable private final Integer color; + private final String barcodeEncoding; + private final boolean starred; private final boolean archived; private final long lastUsed; @@ -59,6 +62,7 @@ public class LoyaltyCard implements Serializable, Comparable { final String cardId, @Nullable final String barcodeId, @Nullable final BarcodeFormat barcodeFormat, + final String barcodeEncoding, @Nullable final Integer color, final boolean starred, final boolean archived, @@ -72,6 +76,7 @@ public class LoyaltyCard implements Serializable, Comparable { this.cardId = cardId; this.barcodeId = barcodeId; this.barcodeFormat = barcodeFormat; + this.barcodeEncoding = barcodeEncoding; this.color = color; this.starred = starred; this.archived = archived; @@ -116,6 +121,10 @@ public class LoyaltyCard implements Serializable, Comparable { return barcodeFormat; } + public Charset getBarcodeEncoding() { + return Charset.forName(barcodeEncoding); + } + @Nullable public Integer getColor() { return color; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/services/ZeppOsLoyaltyCardService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/services/ZeppOsLoyaltyCardService.java index 4c1e99bf9a..a39c24c0be 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/services/ZeppOsLoyaltyCardService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/services/ZeppOsLoyaltyCardService.java @@ -209,7 +209,7 @@ public class ZeppOsLoyaltyCardService extends AbstractZeppOsService { baos.write(0); if (card.getBarcodeId() != null) { - baos.write(card.getBarcodeId().getBytes(StandardCharsets.UTF_8)); + baos.write(card.getBarcodeId().getBytes(card.getBarcodeEncoding())); } else { baos.write(card.getCardId().getBytes(StandardCharsets.UTF_8)); }