From eeda14f424cd7445c1a4588cd076e4908a5490e8 Mon Sep 17 00:00:00 2001 From: darken Date: Mon, 7 Nov 2022 19:25:31 +0100 Subject: [PATCH] When in MonitorMode.AUTOMATIC and there is no mainDeviceAddress set, then just keep running while there is any connected headset device. --- .../monitor/core/worker/MonitorWorker.kt | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/eu/darken/capod/monitor/core/worker/MonitorWorker.kt b/app/src/main/java/eu/darken/capod/monitor/core/worker/MonitorWorker.kt index 12fc8e32..1c46de3f 100644 --- a/app/src/main/java/eu/darken/capod/monitor/core/worker/MonitorWorker.kt +++ b/app/src/main/java/eu/darken/capod/monitor/core/worker/MonitorWorker.kt @@ -1,6 +1,7 @@ package eu.darken.capod.monitor.core.worker import android.app.NotificationManager +import android.bluetooth.BluetoothDevice import android.content.Context import androidx.hilt.work.HiltWorker import androidx.work.CoroutineWorker @@ -114,21 +115,27 @@ class MonitorWorker @AssistedInject constructor( } .launchIn(workerScope) - generalSettings.monitorMode.flow - .flatMapLatest { monitorMode -> - val missingPermsFlow = permissionTool.missingPermissions.first() + permissionTool.missingPermissions + .flatMapLatest { missingPermsFlow -> if (missingPermsFlow.isNotEmpty()) { - log(TAG, WARN) { "Aborting, permissions are missing for $monitorMode: $missingPermsFlow" } + log(TAG, WARN) { "Aborting, permissions are missing: $missingPermsFlow" } workerScope.coroutineContext.cancelChildren() return@flatMapLatest emptyFlow() } - - bluetoothManager.connectedDevices().map { knownDevices -> - monitorMode to knownDevices + combine( + generalSettings.monitorMode.flow, + generalSettings.mainDeviceAddress.flow, + bluetoothManager.connectedDevices(), + ) { monitorMode, mainAddress, connectedDevices -> + listOf(monitorMode, mainAddress, connectedDevices) } } .setupCommonEventHandlers(TAG) { "MonitorMode" } - .flatMapLatest { (monitorMode, devices) -> + .flatMapLatest { arguments -> + val monitorMode = arguments[0] as MonitorMode + val mainAddress = arguments[1] as String? + val devices = arguments[2] as Collection + log(TAG) { "Monitor mode: $monitorMode" } when (monitorMode) { MonitorMode.MANUAL -> flow { @@ -137,15 +144,20 @@ class MonitorWorker @AssistedInject constructor( } MonitorMode.ALWAYS -> emptyFlow() MonitorMode.AUTOMATIC -> flow { - val mainAddress = generalSettings.mainDeviceAddress.value - if (devices.any { it.address == mainAddress }) { - log(TAG) { "MainDevice is connected ($mainAddress), aborting any timeout." } - } else { - log(TAG) { "No Pods are connected, canceling worker soon." } - delay(15 * 1000) - log(TAG) { "Canceling worker now, still no Pods connected." } + when { + mainAddress == null && devices.isNotEmpty() -> { + log(TAG, WARN) { "Main device address not set, staying alive while any is connected" } + } + devices.any { it.address == mainAddress } -> { + log(TAG) { "MainDevice is connected ($mainAddress), aborting any timeout." } + } + else -> { + log(TAG) { "No known Pods are connected, canceling worker soon." } + delay(15 * 1000) + log(TAG) { "Canceling worker now, still no Pods connected." } - workerScope.coroutineContext.cancelChildren() + workerScope.coroutineContext.cancelChildren() + } } } }