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


Architecture (evidence)

CamAPS FX uses the phone as the Bluetooth hub:

  1. App maintains a foreground service typed as connectedDevice.
  2. Manifest requires android.hardware.bluetooth_le (required=true).
  3. App holds both CGM and pump links; Auto mode needs both sensor glucose and pump command path.
  4. NFC permission is present for FreeStyle Libre 3 style touch / scan flows ("touch the sensor with the back of the phone").
  5. Dexcom G7 (192+) adds G7CoreService from 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):


Pump paths (evidence)

In-app pump family names and reconnect copy cover at least:

Common pump connection themes in strings:

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.

  1. Nearby devices (Bluetooth) allowed for CamAPS FX; reopen the app after granting.
  2. Battery optimization disabled / unrestricted for CamAPS FX (Auto mode pump cadence).
  3. Phone Bluetooth toggle off/on; if needed restart phone.
  4. Keep pump and sensor close; Auto mode text says it pauses when the pump is too far.
  5. Only one app paired to the pump; uninstall or unlink competing pump apps, then re-link in CamAPS.
  6. For Dexcom G7: unlink/uninstall Dexcom G7 app pairing before CamAPS owns the sensor.
  7. For Libre 3: use NFC touch as instructed; do not expect a sensor already started by another device to join.
  8. Prefer the correct store package for your region (EU …mmoll vs CA …mmoll.ca); do not mix sideloaded store ids over an existing install without clinic/support guidance.
  9. 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).