New device integration based on the EarFun Air Pro 4 implementation,
adapted to match the Free Pro 3 specifications:
- Qualcomm QCC3072, Bluetooth 5.3
- Codecs: SBC, AAC, aptX, aptX Adaptive (no LDAC, no LC3)
- 10-band equalizer
- Hybrid ANC (4 modes: ANC, wind noise, ambient, normal)
- 6-mic array with cVc 8.0
- Game mode (<55ms low latency)
- Multipoint (2 devices)
- 3 batteries (left, right, case)
- Touch gestures (single/double/triple/long press per earbud)
Differences from Air Pro 4:
- No LDAC codec, only aptX + aptX Adaptive
- No LE Audio / Advanced Audio Mode
- No in-ear detection setting
Detection: name "EarFun Free Pro 3", MAC prefix 70:5A:6F,
9 SDP UUIDs (includes 0000110c AVRCP Target, excludes Air Pro 4's
df21fe2c/180f/180a UUIDs).
Adds FIT file export for activity tracks, alongside the existing GPX export:
- **`FitExporter`** — builds a valid FIT activity (file_id / session / lap / record, plus length / split / set when present) from an `ActivityTrack` + `ActivitySummaryData`.
- **`AutoFitExporter`** + **`AutoExportFitSettingsActivity`** — opt-in auto-export on sync, mirroring the GPX auto-export setting (per-device or all-devices).
- **"Share FIT File"** action in the workout detail menu.
Export is fed device-agnostically: `GarminWorkoutParser` and the shared model (`ActivityTrack` / `ActivityPoint` / `ActivitySummaryEntries` / `ActivityKind`) carry laps, segments, per-length swim, splits/sets, running dynamics and HR zones.
The Garmin FIT codec (`messages`, `baseTypes`, `NativeFITMessage`, `RecordData`) is extended to encode them.
`AutoFitExporter.doExport(...)` is wired beside `AutoGpxExporter` in the Garmin, CMF, Huawei, BangleJS, Huami and Xiaomi activity paths; `FitImporter` also honours the FIT auto-export toggle.
## Testing
`:app:testMainlineDebugUnitTest` — FIT/export subset green:
- `FitExporterReadmeRoundTripTest` — round-trips the curated README sample **and** the full `Activity/<year>/` corpus for years ≥ 2015 from https://github.com/ThomasKuehne/FIT-test-files (3482 files): parse → export → re-parse, asserting GPS/altitude/HR/speed/cadence/distance/power/temp and session aggregates survive.
- `FitExporterPaceTest`, `BaseTypeEncodeRoundTripTest`, `GarminSportTest`, `GPXExporterTest`, `FitImporterTest`, `GpxRouteFileConverterTest`, `FitWeatherTest`.
Thanks a lot to @ThomasKuehne for the initial review
Co-authored-by: Dany Mestas <94061157+DanyPM@users.noreply.github.com>
Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/6268