# Garmin Connect 5.27.3 — "Device registration failed. OTHER_FATAL" pairing D2 Bravo Titanium on Android 16
## Summary
Garmin Connect Mobile 5.27.3 cannot pair a D2 Bravo Titanium on Android 16, but the
**identical app build pairs the identical watch successfully on Android 15**. The
Bluetooth link is provably healthy: the app completes a full ~10 second GFDI exchange
with zero errors, then calls `BluetoothGatt.cancelOpen()` itself and displays
"Device registration failed. OTHER_FATAL".
The failure is fully deterministic — two independent attempts produced byte-identical
counts (40 GATT writes, 785 notifications).
## Controlled comparison (only one variable)
| | Works | Fails |
|---|---|---|
| Phone | Galaxy S21 | Galaxy S26+ (SM-S942B) |
| Android | 15 | **16 (SDK 36)** |
| One UI | — | 8.5 (`80500`) |
| Build | — | `BP4A.251205.006.S942BXXS4AZG5`, patch 2026-07-05 |
| Garmin Connect | 5.27.3 | 5.27.3 (same build) |
| Watch | D2 Bravo Titanium | same physical unit |
| Account | same | same |
Watch: part number `006-B2547-00`, unit ID `3928149476`, firmware 3.10 (latest).
## Evidence the Bluetooth layer is NOT at fault
From `adb logcat -b all` during a failed attempt:
```
02:28:08.494 ble_sec : btm_ble_set_encryption: sec_act=0x1 role_central=true
02:28:08.763 bt_bta_dm_sec: bta_dm_encrypt_cback: Encrypted:T,
peer:...:3f:73 transport:BT_TRANSPORT_LE status:BTM_SUCCESS
02:28:08.507 BluetoothGatt: discoverServices()
02:28:08.509 BluetoothGatt: onSearchComplete(..., 0)
02:28:08.858 BluetoothGatt: onConfigureMTU(..., 23, 0)
02:28:09.16 → 02:28:19.27 40x onWriteCharacteristic, ALL status=GATT_SUCCESS
785x BTA_GATTC_NOTIF_EVT (watch responding)
02:28:19.272 BluetoothGatt: cancelOpen() <-- APP initiates teardown
02:28:19.277 BluetoothGatt: close() / unregisterApp()
02:28:19.283 Toast: show: caller = xb0.c.y:14 <-- error shown to user
02:28:20.275 btm_acl: disconnect_acl ... reason:HCI_ERR_PEER_USER
comment:l2c_link_timeout All channels closed
```
- LE encryption succeeds (rules out legacy-pairing / LE Secure Connections rejection)
- Zero GATT errors, zero failed writes, zero timeouts
- The watch responds throughout (785 notification events)
- The **app**, not the stack, terminates the connection
## Ruled out by direct inspection
- **Permissions** — `BLUETOOTH_CONNECT`, `BLUETOOTH_SCAN`, `ACCESS_FINE/COARSE/BACKGROUND_LOCATION`,
`POST_NOTIFICATIONS`, `FOREGROUND_SERVICE_CONNECTED_DEVICE` all `granted=true`.
- **Background restrictions** — app standby bucket 5 (EXEMPTED), present on the doze whitelist.
- **Network** — no VPN, no private DNS, Wi-Fi validated; `connectapi.garmin.com`
resolves and responds in ~20 ms. No TLS/HTTP errors, no exceptions in logcat.
- **Account / device registration state** — the same unit registers and syncs
successfully to the same Garmin Connect account over USB via Garmin Express:
`upload-service/upload/wellness` → 201 "File processed",
`device-service/deviceservice/all-settings/fit/3928149476` → 200. Zero failed requests.
The device was also removed from the account and re-added; no change.
- **Device support in the app** — `assets/iq_devices.xml` and
`com/garmin/monkeybrains/devices/devices.xml` in the 5.27.3 APK both contain
`id="d2bravo_titanium" part_number="006-B2547-00"`.
- **CompanionDeviceManager state** — stale duplicate associations were cleared via
`cmd companiondevice disassociate`; the retry failed identically (same 40/785 counts).
- **Samsung Auto Blocker** — disabled for testing; no change.
- **Firmware** — updated 3.00 → 3.10 (latest) before testing; no change.
## Possibly relevant
`res/raw/device_ota_sw_versions.json` in the 5.27.3 APK lists 131 products including
`{"productNumber": 2262, "displayName": "D2 Bravo"}` but contains **no entry for the
D2 Bravo Titanium**. Unconfirmed whether this table participates in registration.
Also logged immediately before the failure, twice:
```
W JobInfo: Requested important-while-foreground flag for job52 is ignored and takes no effect
```
## Ask
Please identify why registration is rejected on Android 16 for a device that
registers successfully on Android 15 with the same app build, and that the backend
accepts over USB.
Full logcat captures from both attempts are available on request.