Commit Graph
16149 Commits
Author SHA1 Message Date
Dominik Riebeling b3183c0f36 CMF Buds: Fix EQ / Ultra Bass settings
- Add missing handler
- Fix setting key mismatch
2026-05-03 22:02:56 +02:00
Dominik Riebeling 10f438aef7 CMF Buds: Enable EQ / Ultra Bass / low latency for Buds 2 Plus
- Update EQ preset values for Buds 2 Plus
- Enable for Buds 2 Plus
2026-05-03 22:02:56 +02:00
Dominik Riebeling 35434817b3 CMF Buds: Relax name check for Buds 2 Plus
After using Google Fast Pair the buds will have their bluetooth name suffixed
with some identification text, thus the exact match won't work anymore and they
get detected as generic headphones instead.
2026-05-03 19:59:44 +02:00
José RebeloandThomas Kuehne 1bc2f7e29f Garmin: encapuslate activity_send_waypoint in a ScrollView to support small screens
Co-authored-by: Thomas Kuehne <thomas.kuehne@gmx.li>
2026-05-03 16:25:15 +00:00
Thomas Kuehne d45bcd4db3 Garmin: add basic Send Waypoint activity
- available in device specific settings for supported gadgets
- supports pasting common text formats (e.g. 27°59′18″N 86°55′31″E)
- supports geo: URIs (e.g. geo:27.988333,86.925278,8848)
2026-05-03 16:11:55 +00:00
Thomas Kuehne c51a0535c9 add EXTRA_OPTIONS support to FwAppInstallerActivity and FileInstallerActivity
If present, the extra of type Bundle is passed on to as `options` argument to DeviceCoordinator.findInstallHandler and EventHandler.onInstallApp.
2026-05-03 16:11:49 +00:00
José Rebelo c40d3e63a8 CMF Buds 2a: Add equalizer and ultra bass 2026-05-03 16:44:35 +01:00
Thomas Kuehne 72dcc1db2c Garmin: experimental settings for wake / sleep times (#4331)
Experiment to support setting typical wake / sleep times for devices without realtime settings.

Settings / Developer options / Experimental settings
-> enable

Device specific setting / Experimental settings
-> wake time
-> sleep time
-> send
2026-05-02 21:27:55 +00:00
Thomas Kuehne e5bd136385 Garmin: add BUNDLE_EXTRA_INSTALL_TASK_NAME and BUNDLE_EXTRA_INSTALL_BYTES for onInstallApp 2026-05-02 21:27:31 +00:00
Jan64X 7e3fdc8806 Moondrop: Restrict ANC controls to Space Travel 2 only 2026-05-02 20:12:56 +02:00
José Rebelo 069277747c CMF Buds 2a: Add low latency mode 2026-05-02 19:09:11 +01:00
Dominik RiebelingandJosé Rebelo 24d1a40e39 CMF Buds: Fix ANC modes list update
- Fix the wrong flag being checked for some modes
- Remove unnecessary outer check that prevented the list update in some
  cases
2026-05-02 19:50:44 +02:00
Dominik RiebelingandJosé Rebelo aae925febb CMF Buds: Use better icons for device specific settings 2026-05-02 19:50:44 +02:00
Dominik RiebelingandJosé Rebelo b4bbd0c492 CMF Buds: Request firmware version on initializing 2026-05-02 19:50:44 +02:00
Dominik RiebelingandJosé Rebelo f23ec9e51f CMF Buds: Handle In-Ear detection change
When the In-Ear detection state changes on the device (via a 2nd
connected phone) handle the change indicated by the buds and update the
value accordingly.
2026-05-02 19:50:44 +02:00
Dominik RiebelingandJosé Rebelo c6125e351e CMF Buds: Handle ANC mode change on buds
When the buds change their audio / ANC mode (via buds touch, or a 2nd
connected phone) they send the current state using a different command.
Handle that so the state is updated properly.
2026-05-02 19:50:44 +02:00
Dominik RiebelingandJosé Rebelo 0cb14eb30d CMF Buds: Fix reading ANC status on newer buds
Newer buds send 6 bytes for ANC status instead of 3. Since the relevant
information is in the first 3 bytes and identical allow extra trailing
bytes when parsing.

Confirmed on the Buds 2 Plus. Likely also applies to Ear(a) (see #3994),
possibly other models as well.
2026-05-02 19:50:44 +02:00
Dominik RiebelingandJosé Rebelo aaf5b3011f CMF Buds: Support more ANC modes
Some Buds support additional ANC modes "medium" and "adaptive".
Add them to the available modes.

- Buds 2 Plus
- Ear(a) (see #3994)

Likely also applies to other models.
2026-05-02 19:50:44 +02:00
Dominik RiebelingandJosé Rebelo 5ba0f6bf71 CMF: Initial support for Buds 2 Plus 2026-05-02 19:50:44 +02:00
Jan64X f616c3159c Moondrop: Split ST2 into its own device coordinator and device type 2026-05-02 15:20:13 +02:00
Jan64X ce85474e0a Moondrop: add support for Moondrop Space Travel 2 and its audio curation modes (ANC) 2026-05-02 12:31:24 +02:00
Thomas Kuehne c6b13d07d3 Garmin: fix AntGadget.NameGadget for non-Garmin devices
For Garmin ANT devices the extended ANT device number and the filtered serial number result in the same name.
This link between ANT device number and serial number is not always true for non-Garmin devices.
2026-05-01 20:29:28 +00:00
José Rebelo 2b0f95ad76 Fix connection to device on gpx upload 2026-05-01 16:16:19 +01:00
José Rebelo 666252de1a Huawei Watch Ultimate 2: Initial support 2026-05-01 15:43:08 +01:00
José Rebelo 77773e29e0 Merge pull request 'Garmin: reduce overhead when importing FIT activities' (#6057)
Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/6057
2026-05-01 14:42:17 +02:00
José Rebelo 84600dc4c2 Garmin: add more AntGadget ID for Cycplus C3 2026-05-01 13:14:02 +01:00
Thomas Kuehne f1ecc71716 Garmin: re-use FitImporter to reduce memory pressure 2026-05-01 10:43:15 +00:00
Thomas Kuehne b8061337e2 Garmin: avoid reading the FIT file twice for auto GPX export 2026-05-01 10:43:10 +00:00
Thomas Kuehne c1d8eb58b9 Garmin: check if GPX export is enabled before generating the export ActivityTrack 2026-05-01 10:43:02 +00:00
José Rebelo e41f5e1f18 Merge pull request 'GPX: export track type' (#6055)
Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/6055
2026-04-30 23:07:03 +02:00
Thomas Kuehne c926cadbb8 GPX: export track type 2026-04-30 18:24:01 +00:00
Thomas Kuehne 188d6a8ce9 Garmin: add more FIT messages and fields 2026-04-30 16:56:45 +00:00
Thomas Kuehne c021f615e2 Garmin: add more AntGadget IDs 2026-04-30 16:50:08 +00:00
Thomas Kuehne 76884c5820 Garmin: add more GarminSport codes 2026-04-30 16:49:46 +00:00
Thomas Kuehne 2f072424f6 BLE: add new Bluetooth standard mapping to BleNamesResolver 2026-04-30 16:49:24 +00:00
Thomas Kuehne 5bf6032e75 Garmin: fix laps with speed 0.0 for isPaceActivity=true
FIT file for testing:
https://github.com/ThomasKuehne/FIT-test-files/blob/main/Activity/2018/Activity_20180324_005_000_Swimming_Fr935_ae9c05519ca8c802f33a8ffd90b15915.fit

``
Error saving specific samplesjava.lang.IllegalArgumentException: Infinity is not a valid double value as per JSON specification. To override this behavior, use GsonBuilder.serializeSpecialFloatingPointValues() method.
  at com.google.gson.Gson.checkValidFloatingPoint(Gson.java:508)
  at com.google.gson.Gson$1.write(Gson.java:470)
  at com.google.gson.Gson$1.write(Gson.java:453)
  at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.write(ReflectiveTypeAdapterFactory.java:251)
  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:491)
  at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
  at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:100)
  at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:64)
  at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.write(ReflectiveTypeAdapterFactory.java:251)
  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:491)
  at com.google.gson.TypeAdapter.toJsonTree(TypeAdapter.java:181)
  at com.google.gson.typeadapters.RuntimeTypeAdapterFactory$1.write(RuntimeTypeAdapterFactory.java:309)
  at com.google.gson.TypeAdapter$NullSafeTypeAdapter.write(TypeAdapter.java:304)
  at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
  at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:225)
  at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:161)
  at com.google.gson.Gson.toJson(Gson.java:943)
  at com.google.gson.Gson.toJson(Gson.java:898)
  at com.google.gson.Gson.toJson(Gson.java:847)
  at com.google.gson.Gson.toJson(Gson.java:824)
  at nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryData.toJson(ActivitySummaryData.java:189)
  at nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryData.toString(ActivitySummaryData.java:185)
  at nodomain.freeyourgadget.gadgetbridge.devices.garmin.GarminWorkoutParser.updateSummary(GarminWorkoutParser.java:1080)
  at nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitImporter.persistWorkout(FitImporter.java:687)
``
2026-04-29 18:22:53 +00:00
José Rebelo f0afd29d4a Merge pull request 'Garmin: fix test failures due to updated NativeFITMessage' (#6045)
Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/6045
2026-04-29 13:54:48 +02:00
Roker2 103642692f Add mote TG clients support 2026-04-29 13:42:53 +02:00
Thomas Kuehne d999213277 Garmin: fix test failures due to updated NativeFITMessage 2026-04-28 20:05:49 +00:00
joserebelo d307859b69 Fix build 2026-04-27 00:35:11 +02:00
José Rebelo c1aee648a0 Fix build when git is not installed 2026-04-26 20:00:13 +01:00
José Rebelo 89b7a19ba0 Huawei Band 11: Add model and resolution for watchface install (#6037) 2026-04-26 14:51:52 +01:00
José Rebelo 5dcc6591d6 Merge pull request 'Fix .FIT file decoding' (#6038)
Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/6038
2026-04-26 15:03:09 +02:00
liberodarkandJosé Rebelo 79763f0228 Add Huawei Watch GT Runner 2 2026-04-26 14:56:34 +02:00
Thomas Kuehne 5dbd72f82a Garmin: fix .FIT file summary creation when calculation results in infinity
Example pace calculation when speed is exactly 0.0 m/s.

``
Error saving specific samplesjava.lang.IllegalArgumentException: Infinity is not a valid double value as per JSON specification. To override this behavior, use GsonBuilder.serializeSpecialFloatingPointValues() method.
	at com.google.gson.Gson.checkValidFloatingPoint(Gson.java:508)
	at com.google.gson.Gson$1.write(Gson.java:470)
	at com.google.gson.Gson$1.write(Gson.java:453)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.write(ReflectiveTypeAdapterFactory.java:251)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:491)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:100)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:64)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.write(ReflectiveTypeAdapterFactory.java:251)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:491)
	at com.google.gson.TypeAdapter.toJsonTree(TypeAdapter.java:181)
	at com.google.gson.typeadapters.RuntimeTypeAdapterFactory$1.write(RuntimeTypeAdapterFactory.java:309)
	at com.google.gson.TypeAdapter$NullSafeTypeAdapter.write(TypeAdapter.java:304)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:225)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:161)
	at com.google.gson.Gson.toJson(Gson.java:943)
	at com.google.gson.Gson.toJson(Gson.java:898)
	at com.google.gson.Gson.toJson(Gson.java:847)
	at com.google.gson.Gson.toJson(Gson.java:824)
	at nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryData.toJson(ActivitySummaryData.java:195)
	at nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryData.toString(ActivitySummaryData.java:191)
	at nodomain.freeyourgadget.gadgetbridge.devices.garmin.GarminWorkoutParser.updateSummary(GarminWorkoutParser.java:1079)
``
2026-04-26 09:43:51 +00:00
Thomas Kuehne b7bdea78b0 Garmin: fix .FIT file decoding for STRAVA generated files
example files for testing:
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2020/Activity_20201211_002_Cycling_Strava_f0e4ebdad26738b169400fb35fb4b31e.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2022/Activity_20221014_002_Cycling_Strava_456175fbfb40fb170c3aff7ba8769290.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2023/Activity_20230123_002_Cycling_Strava_316afc56c074e3027f91d51c8c491ba5.fit
2026-04-26 09:43:46 +00:00
Thomas Kuehne bf5fde297d Garmin: fix .FIT file decoding for COROS generated files
example files for testing:
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2021/Activity_20210630_001_Running_COROS-PACE-2_9677fe59cdc4684a89189dad1c288bb4.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2021/Activity_20210830_001_Running_COROS-APEX-46mm_11bb1b1e1c61bfed8bdd8ff0623391c5.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2023/Activity_20230626_043_Windsurfing_COROS-VERTIX_ff49a5a499ee66c4229038c547e32c8e.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2023/Activity_20230630_043_Windsurfing_COROS-VERTIX-2_d41760a0235a9b8037273b7651c4f532.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2023/Activity_20230821_043_Windsurfing_COROS-APEX-Pro_6d750dd6c2190bc6a0d89c441e708656.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2023/Activity_20231117_001_Running_COROS-PACE-3_badb78c49b7aef7b5e112f28da83604c.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2024/Activity_20240107_017_Hiking_COROS-APEX-2-Pro_0a7a9b95b09df66ffa48ea97bb27209d.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2025/Activity_20251119_002_008_Cycling_Mountain_COROS-DURA_4e04b1f1bad2e57127e9a2affd4cd7d0.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2025/Activity_20250722_001_Running_COROS-PACE-Pro_13d6d1e2a93a1ed855a068145ae80110.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2025/Activity_20250801_001_003_Running_Trail_COROS-Wearables_99901ef8f988756d25ac3afbbb1222eb.fit
2026-04-26 09:43:39 +00:00
Thomas Kuehne b8e1337b49 Garmin: fix Failed to get string resource by name for numeric device ID
FIT file for testing:
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2026/Activity_20260118_002_009_Cycling_Downhill_EdgeMtb_1da0225a17673383029e744960ba3a56.fit
2026-04-26 09:25:34 +00:00
José Rebelo 19660a69ab CMF Buds 2a: Initial support 2026-04-26 10:00:38 +01:00
Thomas Kuehne 16b29bd09d Garmin: fix .FIT file decoding for older Garmin devices
example files for testing:
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2016/Activity_20161021_005_000_Swimming_Fr230_77e3563673fbc2b19a60a78b6f5f6f49.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2018/Activity_20180113_000_015_Elliptical_Fenix3Hr_51b4891a23b94b634b93c666e1417fea.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2024/Activity_20240708_015_014_Rowing_Indoor-Rowing_Fr735xt_e358d81585941c7ac1dc747987d711bc.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2025/Activity_20250128_011_000_Walking_Fr55_872d00f0d3b2a4251c86255dad477d93.fit
2026-04-26 07:58:35 +00:00