diff --git a/app/src/main/java/eu/darken/capod/reaction/autoconnect/AutoConnect.kt b/app/src/main/java/eu/darken/capod/reaction/autoconnect/AutoConnect.kt index 5a1beb2f..bf3016ff 100644 --- a/app/src/main/java/eu/darken/capod/reaction/autoconnect/AutoConnect.kt +++ b/app/src/main/java/eu/darken/capod/reaction/autoconnect/AutoConnect.kt @@ -1,6 +1,8 @@ package eu.darken.capod.reaction.autoconnect import eu.darken.capod.common.bluetooth.BluetoothManager2 +import eu.darken.capod.common.debug.logging.Logging.Priority.VERBOSE +import eu.darken.capod.common.debug.logging.Logging.Priority.WARN import eu.darken.capod.common.debug.logging.log import eu.darken.capod.common.debug.logging.logTag import eu.darken.capod.common.flow.setupCommonEventHandlers @@ -22,29 +24,36 @@ class AutoConnect @Inject constructor( ) { fun monitor(): Flow = reactionSettings.autoConnect.flow - .flatMapLatest { if (it) podMonitor.mainDevice else emptyFlow() } - .filterNotNull() - .distinctUntilChanged() - .map { podDevice -> - log(TAG) { "mainPodDevice is $podDevice" } + .flatMapLatest { isAutoConnectEnabled -> + if (isAutoConnectEnabled) { + combine( + bluetoothManager.connectedDevices().distinctUntilChanged(), + podMonitor.mainDevice.filterNotNull().distinctUntilChangedBy { it.rawDataHex }, + ) { connectedDevices, mainDevice -> + connectedDevices to mainDevice + } + } else { + emptyFlow() + } + } + .map { (connectedDevices, mainDevice) -> + log(TAG, VERBOSE) { "mainPodDevice is $mainDevice" } val mainDeviceAddr = generalSettings.mainDeviceAddress.value if (mainDeviceAddr.isNullOrEmpty()) { - log(TAG) { "mainDeviceAddress is null" } + log(TAG, WARN) { "mainDeviceAddress is null" } return@map - } else { - log(TAG) { "mainDeviceAddress is $mainDeviceAddr" } } val bondedDevice = bluetoothManager.bondedDevices().firstOrNull { it.address == mainDeviceAddr } if (bondedDevice == null) { - log(TAG) { "No bonded device matches $mainDeviceAddr" } + log(TAG, WARN) { "No bonded device matches $mainDeviceAddr" } return@map } else { - log(TAG) { "Found target device: $bondedDevice" } + log(TAG, VERBOSE) { "Found target device: $bondedDevice" } } - val isAlreadyConnected = bluetoothManager.connectedDevices().first().any { + val isAlreadyConnected = connectedDevices.any { it.address == bondedDevice.address } @@ -57,12 +66,12 @@ class AutoConnect @Inject constructor( log(TAG) { "Checking condition $condition" } val conditionFulfilled = when (condition) { AutoConnectCondition.WHEN_SEEN -> true - AutoConnectCondition.CASE_OPEN -> when (podDevice) { - is DualApplePods -> podDevice.caseLidState == DualApplePods.LidState.OPEN + AutoConnectCondition.CASE_OPEN -> when (mainDevice) { + is DualApplePods -> mainDevice.caseLidState == DualApplePods.LidState.OPEN else -> true } - AutoConnectCondition.IN_EAR -> when (podDevice) { - is HasEarDetection -> podDevice.isBeingWorn + AutoConnectCondition.IN_EAR -> when (mainDevice) { + is HasEarDetection -> mainDevice.isBeingWorn else -> true } } diff --git a/app/src/main/java/eu/darken/capod/reaction/popup/PopUpReaction.kt b/app/src/main/java/eu/darken/capod/reaction/popup/PopUpReaction.kt index 91b8e11b..acb5b471 100644 --- a/app/src/main/java/eu/darken/capod/reaction/popup/PopUpReaction.kt +++ b/app/src/main/java/eu/darken/capod/reaction/popup/PopUpReaction.kt @@ -11,10 +11,7 @@ import eu.darken.capod.pods.core.PodDevice import eu.darken.capod.pods.core.apple.DualApplePods import eu.darken.capod.reaction.popup.ui.PopUpNotification import eu.darken.capod.reaction.settings.ReactionSettings -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.emptyFlow -import kotlinx.coroutines.flow.flatMapLatest -import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.* import javax.inject.Inject import javax.inject.Singleton @@ -26,7 +23,13 @@ class PopUpReaction @Inject constructor( ) { fun monitor(): Flow = reactionSettings.showPopUpOnCaseOpen.flow - .flatMapLatest { if (it) podMonitor.mainDevice else emptyFlow() } + .flatMapLatest { isEnabled -> + if (isEnabled) { + podMonitor.mainDevice.distinctUntilChangedBy { it?.rawDataHex } + } else { + emptyFlow() + } + } .withPrevious() .setupCommonEventHandlers(TAG) { "monitor" } .map { (previous, current) ->