Commit Graph
15309 Commits
Author SHA1 Message Date
duhowandJosé Rebelo b8f5440a59 Anker: Add new device Soundcore Sport X20 (#5987)
This is an almost full implementation for [Anker](https://gadgetbridge.org/gadgets/headphones/anker/) [Soundcore Sport X20](https://www.soundcore.com/products/a3968-sport-x20-earbuds) earbuds.

Provides:

- Firmware version and serial number
- Display battery life when sent by earbuds
- ANC Settings
- Find Device
- Equalizer with Presets
- 3D Surrounding Sound
- Toggle "Touch Tone" (sound when button is pressed)
- Set the behavior of button actions
- Set Auto Power-Off Timer
- Enable discovery/pairing to add a second device to use the earbuds

Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/5987
2026-05-16 22:11:02 +02:00
José Rebelo c1d8fce4d3 Add setting to enable TRACE log level 2026-05-16 18:48:03 +01:00
José Rebelo 4761716bea Health Connect: Move per-sample logging to TRACE 2026-05-16 18:47:38 +01:00
José Rebelo d1f5531217 Prevent crash on devices without GPS 2026-05-16 18:09:57 +01:00
José Rebelo 37ad178dac Redmi Buds 6: Initial support 2026-05-16 17:54:51 +01:00
José Rebelo 5ffd6b6074 Set mimeType when sharing files 2026-05-15 23:09:10 +01:00
José Rebelo bb97a90909 GpxReceiver: Set mimeType to application/gpx+xml 2026-05-15 23:08:52 +01:00
Steffen Winter 5752a2bf96 Gradle: Migrate top-level build files to Kotlin DSL
Migrate the top-level build files to the new Kotlin DSL and use the new
pluginManagement block instead of the old buildscript.
2026-05-15 22:08:56 +02:00
Steffen WinterandJosé Rebelo d33ada370f Gradle: Migrate to version catalog 2026-05-15 22:02:12 +02:00
Davide GessaandJosé Rebelo 491f214611 Casio GBD200 device support (#6070)
In this pull request I separated the implementation of the GBD200 from the common implementation of GBX100 since during protocol reverse engineering (done here: github.com/dakk/casio-gshock-bt-proto/) I've found some discrepancies in the BLE protocol, and in my opinion it is better to separate since they are too different in many ways.
The flow works from initial pairing, connection, workout / step sync, configuration sync.

The following feature has been implemented and tested:
- [x] Watch connection and handshake
- [x] Config sync
- [x] Goal settings
- [x] Phone finder
- [x] Sport activity start and stop events
- [x] Sport activity sync with segment data
- [x] Step data sync
- [x] Notifications
- [x] Sport activity and OpenTracks
- [x] Alarm setting

Non Casio related edit:
- OpenTracksController.saveToGpx now handles empty activity (since gbd200 has no gps, and cannot handle gps data, running GBLocationService would be useless)

It should also address some of the following issues:
- https://codeberg.org/Freeyourgadget/Gadgetbridge/issues/5529
- https://codeberg.org/Freeyourgadget/Gadgetbridge/issues/2634
- https://codeberg.org/Freeyourgadget/Gadgetbridge/issues/2597
- https://codeberg.org/Freeyourgadget/Gadgetbridge/issues/5096
- https://codeberg.org/Freeyourgadget/Gadgetbridge/issues/3395
- https://codeberg.org/Freeyourgadget/Gadgetbridge/issues/2602
- https://codeberg.org/Freeyourgadget/Gadgetbridge/issues/4095
- https://codeberg.org/Freeyourgadget/Gadgetbridge/issues/4092
- (test all the GBD200 related issues https://codeberg.org/Freeyourgadget/Gadgetbridge/issues?state=open&type=all&labels=&milestone=0&project=0&assignee=0&poster=0&sort=relevance&q=GBD-200)

Todo:
- [x] Test for some day on my wrist

![image](/attachments/4e4fff71-bbff-43a9-8d0e-1c6fef9e6d67)
![image](/attachments/61eaefdd-b36f-4334-bd05-e999edc31570)
![image](/attachments/821ba2a2-0dd1-4cc0-9e46-8f7a21acbe5c)
![image](/attachments/532c7e6b-7fb4-4166-a8d6-d63ace16afd2)

Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/6070
2026-05-15 21:28:35 +02:00
José Rebelo 22859347f8 Redmi Watch Move: Initial support 2026-05-15 18:23:24 +01:00
José Rebelo 4ad2284d5f Merge pull request 'Pebble: Include battery read in pull-to-refresh update' (#6110)
Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/6110
2026-05-15 13:48:49 +02:00
Dany MestasandJosé Rebelo e0820f106f AlarmClockReceiver: populate spec so notifications render on Xiaomi
Previously sourceAppId, title, and body were left null and sourceName
was the literal "ALARMCLOCKRECEIVER", causing Xiaomi watches to drop
the alarm-fire notification (the watch falls back to Gadgetbridge's own
package id which is not on the app allowlist, and the spec has nothing
to display).

Plumb the captured clock-app package (com.android.deskclock or
com.google.android.deskclock) through sendAlarm so:
- sourceAppId carries the real clock package
- sourceName is the resolved application label (NotificationUtils.getApplicationLabel)
- title = "Alarm" (R.string.menuitem_alarm)
- body = current time formatted via DateFormat

Strict improvement for all device families; Huami/ZeppOs previously
also displayed the alarm with empty title/body.
2026-05-15 13:48:35 +02:00
MrYoranimo a16b90f6aa Xiaomi-protobuf: combine installed apps and watchface cache when reporting installed apps
Because the list of installed apps and the list of installed faces are
requested from Xiaomi devices separately, a race condition will occur if
the lists are not combined: when processing the AppInfo event, all
previously known installed apps are removed from the app manager cache, which
will cause either all apps or all faces to get forgotten.
2026-05-15 01:21:20 +02:00
José Rebelo d5643468b9 iGPSPORT: Update install notification progress 2026-05-14 23:49:03 +01:00
José Rebelo 81ab123c32 iGPSPORT: Improve upload progress 2026-05-14 23:46:29 +01:00
Benjamin Temple 12db34cf90 Pebble: Include battery read in pull-to-refresh update 2026-05-14 15:38:02 -07:00
José Rebelo cbd92ef6fe update changelog, bump version 2026-05-14 21:12:43 +01:00
Benjamin Temple 552547ec9e Pebble: Add support for pull to refresh for pebble health data
Only signalActivityDataFinish on error as datalog will invoke once health sync data finishes syncing
2026-05-13 23:24:41 -07:00
Vitaliy TominandJosé Rebelo 57154dff91 igpsport: Hide watchface tab 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo 179e04beb1 igpsport: Fix endless loop when there is no route files 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo 40401492fa igpsport: Handle null values in MusicSpec 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo 519b17647b igpsport: Add BSC300 2026-05-13 23:33:24 +02:00
Thomas KuehneandJosé Rebelo 85543cb4c6 igpsport: Rebase to current master 2026-05-13 23:33:24 +02:00
Michael PlattnerandJosé Rebelo b52e2312b2 feat: add activity fetching
- activate supportsDataFetching and recorded activities, to download fit files from device
- sync fit files, but do it only from the last sync time that we do not always sync all the fit files
2026-05-13 23:33:24 +02:00
Michael PlattnerandJosé Rebelo bad96e4f75 feat: add binavi air 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo 26e162ec68 igpsport: Rebase to current master
* Updated for new units preference logic
2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo ad1ff7250d igpsport: Split iGS630S to its own coordinator
* minor log fix
2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo 6255057772 igpsport: Removed all RuntimeException from igpsport and minor fixes 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo 5f9114c221 igpsport: Mark device names non-translatable 2026-05-13 23:33:24 +02:00
Thomas KuehneandJosé Rebelo 2d36bda559 igpsport: Update for current master rebase 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo 5216752665 igpsport: Use GarminWorkoutParser 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo d3103400fc igpsport: Add missing return after download data 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo 9a2b5a38ac igpsport: Use Garmin FitImporter and FitAsyncProcessor 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo 77f4a99ed5 igpsport: Remove unused loggers and commented code 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo 0046666f19 igpsport: update strings s/IGPSPORT/iGPSPORT/ 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo bab5311d7f igpsport: Copy FitAsyncProcessor from Garmin 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo 4f56b6569b igpsport: Copy Fitimporter from Garmin
* remove garmin specific samples like stress, hrv and sleep, use only standard fit records
2026-05-13 23:33:24 +02:00
Richard NauberandJosé Rebelo 78494a6877 igpsport: add BCS200S support 2026-05-13 23:33:24 +02:00
Richard NauberandJosé Rebelo 6461a226fc igpsport: explicitly set MTU before communicating
This is necessary for the BCS200S to work.
2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo dacf0471ef igpsport: Swithc to GarminTimeUtils time converting method, set device busy
* use garmin time epoch as it is used by all fit files
* use Locale.ROOT for filename generation
* set/unset device busy while downloading fit files
2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo d4c2068aa4 igpsport: Implement Music info for igs800 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo 0222175fb5 igpsport: Support media buttons (tested on iGS800) 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo faf0725951 igpsport: Fixes after rebase 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo f1004a663a igpsport: Fix file payload calculation and offsets for file data 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo 3e2ca93f49 igpsport: Fix iGS630s typo 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo c0bcee6ba7 igpsport: Add iGS800 2026-05-13 23:33:24 +02:00
Thomas KuehneandJosé Rebelo 014b180a30 igsport: rebase device code to master ad34fec706 2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo 39cf720fdd igpsport: Use custom time epoch for fit files times
* turns out cycling_data_msg has timestamps with custom epoch,
adding this epoch to get standard timestamp.
2026-05-13 23:33:24 +02:00
Vitaliy TominandJosé Rebelo 34581b8041 igpsport: Handle all routes files, update list on deletion 2026-05-13 23:33:24 +02:00