nightscout / nightscout/AndroidAPS

Can't connect to Omnipod DASH pods after Android 15 upgrade

Open
#3,471 351 comments 5 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

omnipod dash
Dominant language
Kotlin
Stars
1.2k
Forks
6.4k
Avg merge
2d 7h
Merged PRs (30d)
19

Description

Phone: Pixel 9 Pro
Android version: Android 15 (stable)
Version: 3.2.0.4 (Edit: Tried with latest dev as well [806a18f] same problem)

After upgrading to Android 15, the app can't communicate with Dash. After rebooting the phone, a single handshake works but nothing after. Similarly, I was able to pair a new pod under Android 15, but any connection after times out.

@AdrianLxM @avereha @bartsopers @vanelsberg could any of you take a look at this? Thank you!

03:54:15.548 [RxCachedThreadScheduler-63] D/AUTOMATION: [AutomationPlugin.processActions$automation_fullRelease():255]: processActions
03:54:15.552 [RxCachedThreadScheduler-63] D/AUTOMATION: [TriggerBg.shouldRun():62]: NOT ready for execution: Glucose is lesser than 3.8 MMOL
03:54:15.583 [RxCachedThreadScheduler-67] D/PUMPBTCOMM: [Connection.connectionState():171]: GATT connection state: 2
03:54:15.628 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 8
03:54:15.730 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 8
03:54:15.832 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 8
03:54:15.934 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 8
03:54:16.037 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 8
03:54:16.087 [RxCachedThreadScheduler-67] D/PUMPBTCOMM: [Connection.connectionState():171]: GATT connection state: 2
03:54:16.139 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 8
03:54:16.241 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 8
03:54:16.343 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 9
03:54:16.446 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 9
03:54:16.549 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 9
03:54:16.592 [RxCachedThreadScheduler-67] D/PUMPBTCOMM: [Connection.connectionState():171]: GATT connection state: 2
03:54:16.651 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 9
03:54:16.755 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 9
03:54:16.856 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 9
03:54:16.959 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 9
03:54:17.061 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 9
03:54:17.098 [RxCachedThreadScheduler-67] D/PUMPBTCOMM: [Connection.connectionState():171]: GATT connection state: 2
03:54:17.163 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 9
03:54:17.265 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 9
03:54:17.367 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 10
03:54:17.469 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 10
03:54:17.571 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 10
03:54:17.606 [RxCachedThreadScheduler-67] D/PUMPBTCOMM: [Connection.connectionState():171]: GATT connection state: 2
03:54:17.674 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 10
03:54:17.776 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 10
03:54:17.878 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 10
03:54:17.980 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 10
03:54:18.083 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 10
03:54:18.112 [RxCachedThreadScheduler-67] D/PUMPBTCOMM: [Connection.connectionState():171]: GATT connection state: 2
03:54:18.185 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 10
03:54:18.288 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 10
03:54:18.390 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 11
03:54:18.493 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 11
03:54:18.594 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 11
03:54:18.616 [RxCachedThreadScheduler-67] D/PUMPBTCOMM: [Connection.connectionState():171]: GATT connection state: 2
03:54:18.697 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 11
03:54:18.771 [binder:4453_F] D/PUMPBTCOMM: [BleCommCallbacks.onConnectionStateChange():38]: OnConnectionStateChange with status/state: 19/0
03:54:18.772 [binder:4453_F] I/PUMPBTCOMM: [Connection.onConnectionLost():209]: Lost connection with status: 19
03:54:18.799 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 11
03:54:18.902 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 11
03:54:19.007 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 11
03:54:19.110 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():102]: handshaking 11
03:54:19.119 [RxCachedThreadScheduler-67] D/PUMPBTCOMM: [Connection.disconnect():129]: Disconnecting closeGatt=false
03:54:19.124 [binder:4453_F] D/PUMPBTCOMM: [Connection.disconnect():129]: Disconnecting closeGatt=true
03:54:19.124 [RxCachedThreadScheduler-67] W/PUMPBTCOMM: [OmnipodDashManagerImpl$observeConnectToPodWithStop$1$1.accept():122]: observeConnectToPodWithStop error=info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.comm.exceptions.ConnectException: stopConnecting called
03:54:19.125 [RxCachedThreadScheduler-67] D/PUMP: [OmnipodDashManagerImpl$ErrorInterceptor.accept():780]: Intercepted error in OmnipodDashManagerImpl: info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.comm.exceptions.ConnectException: stopConnecting called
03:54:19.126 [binder:4453_F] D/PUMPBTCOMM: [BleCommCallbacks.resetConnection():217]: Reset connection
03:54:19.126 [ConnectionThread] I/PUMPCOMM: [OmnipodDashPumpPlugin$connect$2.invoke():276]: connect error=java.lang.RuntimeException: info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.comm.exceptions.ConnectException: stopConnecting called
03:54:19.213 [Thread-1378] D/PUMPQUEUE: [QueueThread.run():114]: connect
03:54:19.214 [Thread-1378] I/PUMP: [OmnipodDashPumpPlugin.connect():255]: connect reason=Connection needed
03:54:19.219 [RxCachedThreadScheduler-70] D/PUMP: [OmnipodDashManagerImpl$PodEventInterceptor.accept():704]: Intercepted PodEvent in OmnipodDashManagerImpl: BluetoothConnecting
03:54:19.223 [RxCachedThreadScheduler-70] D/PUMPBTCOMM: [Connection.connectionState():171]: GATT connection state: 0
03:54:19.224 [RxCachedThreadScheduler-70] D/CORE: [Connection.connect():69]: Connecting connectionWaitCond=ConnectionWaitCondition(timeoutMs=null, stopConnection=java.util.concurrent.CountDownLatch@af28aee[Count = 1])
03:54:19.232 [RxCachedThreadScheduler-70] D/PUMPBTCOMM: [Connection.waitForConnection():145]: waitForConnection connectionWaitCond=ConnectionWaitCondition(timeoutMs=null, stopConnection=java.util.concurrent.CountDownLatch@af28aee[Count = 1])
03:54:19.287 [RxCachedThreadScheduler-63] D/AUTOMATION: [AutomationPlugin$onStart$11.accept():180]: Grabbed new BT event: EventBTChange[deviceAddress=AC:3B:96:37:EA:BB,deviceName=<null>,state=DISCONNECT]
03:54:19.290 [RxCachedThreadScheduler-63] D/AUTOMATION: [AutomationPlugin.processActions$automation_fullRelease():255]: processActions
[...]
07:09:13.225 [CommandQueueImplementationHandler] D/PUMPQUEUE: [CommandQueueImplementation.notifyAboutNewCommand$lambda$6():220]: Starting new thread
07:09:13.227 [RxCachedThreadScheduler-66] D/CORE: [UserEntryLoggerImpl$log$1.accept():60]: USER ENTRY: 10/16/24 07:09:13 TEMP_BASAL Loop  [UnitPerHour(value=4.7), Minute(value=30)]
07:09:13.230 [Thread-2559] D/PUMPQUEUE: [QueueThread.run():114]: connect
07:09:13.230 [Thread-2559] I/PUMP: [OmnipodDashPumpPlugin.connect():255]: connect reason=Connection needed
07:09:13.231 [RxCachedThreadScheduler-77] D/PUMP: [OmnipodDashManagerImpl$PodEventInterceptor.accept():704]: Intercepted PodEvent in OmnipodDashManagerImpl: BluetoothConnecting
07:09:13.233 [RxCachedThreadScheduler-77] D/PUMPBTCOMM: [Connection.connectionState():171]: GATT connection state: 2
07:09:13.233 [RxCachedThreadScheduler-77] D/CORE: [Connection.connect():69]: Connecting connectionWaitCond=ConnectionWaitCondition(timeoutMs=null, stopConnection=java.util.concurrent.CountDownLatch@413994e[Count = 1])
07:09:13.235 [RxCachedThreadScheduler-77] D/PUMPBTCOMM: [Connection.waitForConnection():145]: waitForConnection connectionWaitCond=ConnectionWaitCondition(timeoutMs=null, stopConnection=java.util.concurrent.CountDownLatch@413994e[Count = 1])
07:09:13.236 [binder:4453_2] D/PUMPBTCOMM: [BleCommCallbacks.onConnectionStateChange():38]: OnConnectionStateChange with status/state: 0/2
07:09:13.237 [RxCachedThreadScheduler-77] D/PUMPBTCOMM: [Connection.connectionState():171]: GATT connection state: 2
07:09:13.237 [RxCachedThreadScheduler-77] D/PUMPBTCOMM: [ServiceDiscoverer.discoverServices():28]: Discovering services
07:09:13.246 [DefaultDispatcher-worker-4] D/WORKER: [LoggingWorker$doWork$2.invokeSuspend():27]: Worker result SUCCESS for class app.aaps.workflow.UpdateWidgetWorker
07:09:13.247 [main] D/WIDGET: [Widget.onReceive():87]: onReceive WorkFlow
07:09:13.260 [DefaultDispatcher-worker-4] D/WORKER: [LoggingWorker$doWork$2.invokeSuspend():27]: Worker result SUCCESS for class app.aaps.workflow.PreparePredictionsWorker
07:09:13.278 [DefaultDispatcher-worker-4] D/WORKER: [LoggingWorker$doWork$2.invokeSuspend():27]: Worker result SUCCESS for class app.aaps.workflow.UpdateGraphWorker
07:09:13.424 [CompanionHandler] D/CORE: [Widget.updateTemporaryTarget():223]: Adjusted target. Profile: 99.0 APS: 93.0
07:09:13.427 [CompanionHandler] D/CONSTRAINTS: [ConstraintObject.set():28]: Setting value true -> false (Autosens disabled in preferences)[EN]
07:09:13.655 [binder:4453_2] D/PUMPBTCOMM: [BleCommCallbacks.onConnectionStateChange():38]: OnConnectionStateChange with status/state: 19/0
07:09:13.656 [binder:4453_2] I/PUMPBTCOMM: [Connection.onConnectionLost():209]: Lost connection with status: 19
07:09:13.741 [binder:4453_2] D/PUMPBTCOMM: [Connection.disconnect():129]: Disconnecting closeGatt=true
07:09:13.748 [binder:4453_2] D/PUMPBTCOMM: [BleCommCallbacks.resetConnection():217]: Reset connection
07:09:13.751 [RxCachedThreadScheduler-77] D/PUMPBTCOMM: [Connection.disconnect():129]: Disconnecting closeGatt=false
07:09:13.751 [RxCachedThreadScheduler-77] D/PUMPBTCOMM: [BleCommCallbacks.resetConnection():217]: Reset connection
07:09:13.753 [RxCachedThreadScheduler-77] W/PUMPBTCOMM: [OmnipodDashManagerImpl$observeConnectToPodWithStop$1$1.accept():122]: observeConnectToPodWithStop error=info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.comm.exceptions.ConnectException: stopConnecting called
07:09:13.753 [RxCachedThreadScheduler-77] D/PUMP: [OmnipodDashManagerImpl$ErrorInterceptor.accept():780]: Intercepted error in OmnipodDashManagerImpl: info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.comm.exceptions.ConnectException: stopConnecting called```

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with Connection.connectionState(), BleCommCallbacks.onConnectionStateChange(), ServiceDiscoverer.discoverServices(), and the OmnipodDashManagerImpl connection flow. Reproduce the Android 15 failure and investigate the repeated GATT status 19 disconnects during the handshake. Done means the app can reconnect to an existing DASH pod and communicate after the initial connection.

Written by the indexing model from the issue text.

Assessment

Tech stack
kotlin
Domain
mobile-dev
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.