From 7ff20acfc02ef3bdd171abf7a1b85df235492c1c Mon Sep 17 00:00:00 2001 From: darken Date: Wed, 26 Jan 2022 14:50:48 +0100 Subject: [PATCH] When bluetooth is disabled, stop emissions. --- .../capod/common/flow/FlowExtensions.kt | 2 +- .../main/ui/overview/OverviewFragmentVM.kt | 5 ++-- .../darken/capod/monitor/core/PodMonitor.kt | 26 ++++++++++++------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/eu/darken/capod/common/flow/FlowExtensions.kt b/app/src/main/java/eu/darken/capod/common/flow/FlowExtensions.kt index c6a1ff25..ead424ae 100644 --- a/app/src/main/java/eu/darken/capod/common/flow/FlowExtensions.kt +++ b/app/src/main/java/eu/darken/capod/common/flow/FlowExtensions.kt @@ -34,7 +34,7 @@ fun Flow.shareLatest( ) .filterNotNull() -fun Flow.replayingShare(scope: CoroutineScope) = this.shareIn( +fun Flow.replayingShare(scope: CoroutineScope) = this.shareIn( scope = scope, replay = 1, started = SharingStarted.WhileSubscribed(replayExpiration = Duration.ZERO) diff --git a/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewFragmentVM.kt b/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewFragmentVM.kt index dda0a21d..63ebe407 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewFragmentVM.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewFragmentVM.kt @@ -106,11 +106,10 @@ class OverviewFragmentVM @Inject constructor( debugSettings.isDebugModeEnabled.flow, generalSettings.showAll.flow, bluetoothManager.isBluetoothEnabled, - ) { _, permissions, pods, isDebugMode, showAll, isBluetoothEnabled -> + podMonitor.mainDevice, + ) { _, permissions, pods, isDebugMode, showAll, isBluetoothEnabled, mainPod -> val items = mutableListOf() - val mainPod = podMonitor.mainDevice.first() - permissions .map { perm -> PermissionCardVH.Item( diff --git a/app/src/main/java/eu/darken/capod/monitor/core/PodMonitor.kt b/app/src/main/java/eu/darken/capod/monitor/core/PodMonitor.kt index 5829aeb7..0e395088 100644 --- a/app/src/main/java/eu/darken/capod/monitor/core/PodMonitor.kt +++ b/app/src/main/java/eu/darken/capod/monitor/core/PodMonitor.kt @@ -35,18 +35,18 @@ class PodMonitor @Inject constructor( val devices: Flow> = bluetoothManager.isBluetoothEnabled .flatMapLatest { isBluetoothEnabled -> if (isBluetoothEnabled) { - generalSettings.scannerMode.flow + log(TAG) { "Bluetooth is enabled" } + generalSettings.scannerMode.flow.flatMapLatest { bleScanner.scan(scannerMode = it) } } else { log(TAG, WARN) { "Bluetooth is currently disabled" } - emptyFlow() + flowOf(null) } } - .flatMapLatest { bleScanner.scan(scannerMode = it) } .map { result -> // For each address we only want the newest result, upstream may batch data - result.groupBy { it.address } - .values - .map { sameAdrDevs -> + result?.groupBy { it.address } + ?.values + ?.map { sameAdrDevs -> val newest = sameAdrDevs.maxByOrNull { it.generatedAtNanos }!! sameAdrDevs.minus(newest).let { if (it.isNotEmpty()) log(TAG, VERBOSE) { "Discarding stale results: $it" } @@ -55,12 +55,16 @@ class PodMonitor @Inject constructor( } } .map { scanResults -> - val newPods = scanResults - .mapNotNull { podFactory.createPod(it) } - val pods = mutableMapOf() cacheLock.withLock { + if (scanResults == null) { + log(TAG) { "Null result, Bluetooth is disabled." } + deviceCache.clear() + return@map emptyList() + } + + val newPods = scanResults.mapNotNull { podFactory.createPod(it) } val now = Instant.now() deviceCache.toList().forEach { (key, value) -> if (Duration.between(value.lastSeenAt, now) > Duration.ofSeconds(20)) { @@ -103,7 +107,9 @@ class PodMonitor @Inject constructor( .replayingShare(appScope) val mainDevice: Flow - get() = devices.map { it.determineMainDevice() } + get() = devices + .map { it.determineMainDevice() } + .replayingShare(appScope) private fun Collection.determineMainDevice(): PodDevice? = maxByOrNull { it.rssi }?.let filter@{ device ->