CamAPS FX: sensor ↔ app ↔ pump communication (189 to 194)
Investigation date: 20/10/2026
Focus: how CamAPS FX talks to CGM and pump, what the APK shows about reconnect/timeouts/permissions, and what changed across 189 → 192 → 193 → 194 that could relate to user-reported connection issues.
Companion comparison: 189 / 192 / 193 / 194 delta report.
Labeling rule used below
- Evidence: observed in manifest, permissions, services, package trees, or in-app strings.
- Speculation: plausible explanation for field reports; not proven by binary diff alone.
Architecture (evidence)
CamAPS FX uses the phone as the Bluetooth hub:
- App maintains a foreground service typed as
connectedDevice. - Manifest requires
android.hardware.bluetooth_le(required=true). - App holds both CGM and pump links; Auto mode needs both sensor glucose and pump command path.
- NFC permission is present for FreeStyle Libre 3 style touch / scan flows ("touch the sensor with the back of the phone").
- Dexcom G7 (192+) adds
G7CoreServicefrom Dexcom's core SDK inside the CamAPS process space.
[CGM: G6 BLE / G7 BLE / Libre 3 NFC+BLE] ←→ [Phone + CamAPS FX] ←→ [Pump: YpsoPump / Dana family BLE]
There is no evidence in these APKs of a separate wearable acting as the therapy hub. Wearable-related bits are Dexcom watch plumbing (WatchDataListener) and WEARABLE_INTERNAL permission from 192+, not a CamAPS watch controller.
Android 12+ Bluetooth permissions (evidence)
| Permission / flag | Role |
|---|---|
BLUETOOTH_SCAN + neverForLocation |
Scan nearby BLE devices without treating scan as location use |
BLUETOOTH_CONNECT |
Connect / GATT to bonded devices |
Legacy BLUETOOTH / BLUETOOTH_ADMIN maxSdkVersion=30 |
Pre-Android 12 path only |
Location perms maxSdkVersion=30 |
Older BLE scan path; not the primary Android 12+ API |
FOREGROUND_SERVICE_CONNECTED_DEVICE |
Keep connected-device work alive under modern FGS rules |
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS |
Reduce OEM battery killers breaking pump/CGM cadence |
In-app strings (English and Norwegian on EU builds) explicitly require Nearby devices permission to connect pump and CGM, and guide users through battery optimization exemption for timely pump control in Auto mode.
Evidence for users: if Nearby devices / Bluetooth is denied, or battery optimization is aggressive, the app's own copy says Auto mode / connections will fail until fixed.
Sensor paths (evidence)
| CGM | How the APK presents it |
|---|---|
| Dexcom G6 | BLE transmitter serial / sensor code; pairing; "connection lost" / "transmitter not found" strings |
| Dexcom G7 (192+) | 4-digit pairing code; Dexcom account login; G7CoreService; must not stay paired to the standalone Dexcom G7 app |
| FreeStyle Libre 3 / Plus | NFC touch to start/scan; package query for com.freestylelibre3.app.gb; temperature / already-in-use errors |
Shared troubleshooting strings (present across analyzed builds that include that CGM):
- Turn Bluetooth off/on on the phone
- Restart the phone (sometimes with a short wait)
- Restart the app
- Transmitter may already be connected to another device
- For G6/G7: remove pairing from the Dexcom brand app before CamAPS can own the link
Pump paths (evidence)
In-app pump family names and reconnect copy cover at least:
- YpsoPump (Bluetooth on pump must be enabled)
- DANA-i
- Dana Diabecare RS
- Dana Diabecare R
Common pump connection themes in strings:
- Unable to connect to Dana pump → toggle phone Bluetooth, then restart phone
- Pump unpaired → toggle Bluetooth / restart / re-pair
- Pump paired with another app or keys/password changed → re-link from CamAPS menu (only one app at a time)
- Enable extended bolus on pump for Auto mode
- Battery optimization exemption for regular pump control
- Distance: Auto mode pauses when pump is too far; resumes when link returns
Evidence: CamAPS expects exclusive pump pairing. Parallel DIY apps (or leftover pairings) are a first-class failure mode in the product strings themselves.
What changed across 189 → 194 that could affect connections
| Change | Builds | Evidence vs speculation |
|---|---|---|
| Dexcom G7 stack added | 189 → 192 | Evidence. New service + 51 dexcomg7 smali files. More BLE radio contention possible on the phone. |
| Liberty / denser app | 189 → 192 | Evidence of more code; speculation that heavier process raises OEM kill risk if battery rules are strict. |
| minSdk 33 | 189 → 192 | Evidence. Drops Android 12-only devices; forces Android 13+ BLE permission model. |
WEARABLE_INTERNAL + notification policy |
189 → 192 | Evidence of new permissions; weak direct link to pump drops. |
| targetSdk 36 | 192 → 193/194 | Evidence. Android 16 behavior targeting. Speculation: OEM Bluetooth / FGS stricter enforcement on some phones after OS updates. |
| PairIP removed | only 194 (EU) | Evidence of licensing stack removal. Speculation: unlikely primary cause of BLE GATT drops; more relevant to install/license startup. |
Package .ca vs EU |
193 vs others | Evidence. Different application id. Sideloading wrong store variant can break updates/data; not a BLE protocol change by itself. |
| G7 logout weight/TDD text | 193 CA + 194 | Evidence of UX copy only; not a radio change. |
BLE permission set / connectedDevice FGS |
stable 189 to 194 | Evidence of continuity. No APK sign of a rewritten transport between 192 and 194. |
Smali hit counts for BluetoothGatt / reconnect / GATT |
192≈193≈194 | Evidence of similar surface area (order-of-magnitude stable). Not a proof of identical timing constants (those may be obfuscated). |
Bottom line for "connections got worse after an update"
Evidence-based: the large radio/feature change is 189 → 192 (G7). Between 192 / 193 / 194 the APK shows OS targeting and PairIP packaging, not a new pump/CGM protocol family.
Speculation (label clearly): flaky links after moving to 193/194 on Android 15/16 phones are more likely phone Bluetooth stack + battery policy + dual-app pairing + distance, interacting with the same CamAPS hub design, than a deleted reconnect loop unique to 194.
Actionable checklist for users (from APK strings + permissions)
These steps are grounded in in-app guidance and declared permissions, not medical advice.
- Nearby devices (Bluetooth) allowed for CamAPS FX; reopen the app after granting.
- Battery optimization disabled / unrestricted for CamAPS FX (Auto mode pump cadence).
- Phone Bluetooth toggle off/on; if needed restart phone.
- Keep pump and sensor close; Auto mode text says it pauses when the pump is too far.
- Only one app paired to the pump; uninstall or unlink competing pump apps, then re-link in CamAPS.
- For Dexcom G7: unlink/uninstall Dexcom G7 app pairing before CamAPS owns the sensor.
- For Libre 3: use NFC touch as instructed; do not expect a sensor already started by another device to join.
- Prefer the correct store package for your region (EU
…mmollvs CA…mmoll.ca); do not mix sideloaded store ids over an existing install without clinic/support guidance. - On Android 13+, also check system App permissions if OS denied background connected-device work after an OS update.
Timeouts and reconnect internals
| Topic | Finding |
|---|---|
| Human-readable reconnect advice | Evidence in strings (toggle BT, restart, re-pair). |
| Exact millisecond GATT timeouts | Not extracted as clear constants in this pass (heavy obfuscation; many generic timeout hits in libraries). |
| Bonding / encryption failure copy | Evidence for Dana (encryption details / keys changed / password changed). |
| Automatic retry policy source code | Not fully mapped in this report; treat as unknown beyond string-level UX. |
Version matrix (connection-relevant)
| Item | 189 | 192 | 193 (CA) | 194 (EU) |
|---|---|---|---|---|
| BLE required | Yes | Yes | Yes | Yes |
| FGS connectedDevice | Yes | Yes | Yes | Yes |
| G7CoreService | No | Yes | Yes | Yes |
| PairIP present | Yes | Yes | Yes | No |
| targetSdk | 35 | 35 | 36 | 36 |
| Nearby devices UX strings | Yes | Yes | Yes (EN) | Yes (EN+NB) |
Artifacts
| Item | Path |
|---|---|
| Decompiles | D:\Users\USER\Temp\camaps-compare\{189,192,193,194}\decompile\ |
| Conn string values | ...\diff-189-192-193-194\*-string-values-conn.txt |
| Version comparison | APK-COMPARISON-189-192-193-194-REPORT.html |
Bottom line
Evidence: CamAPS FX is a phone-centric BLE (+ NFC for Libre) hub with a connected-device foreground service. Pump exclusivity, Nearby devices permission, and battery exemptions are first-class product requirements written into the APK.
Evidence: 192 introduced the heavy G7 radio stack. 193/194 mainly change targetSdk / store packaging / PairIP, not the declared communication model.
Speculation: if users see more drops on newest phones after 193/194, start with OS Bluetooth permissions, OEM battery behavior, and dual-app pairing before assuming CamDiab removed reconnect logic in 194 (this APK pass did not find that).