From c8cc70ca84e8ea6560fd63068d1a1971f8a59c69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joris=20Pelgr=C3=B6m?= Date: Fri, 17 Feb 2023 14:46:32 +0100 Subject: [PATCH] Multiserver NFC tag fixes (#3336) - Fix scanning tag not completing due to activity finishing early - Fire events to all servers from settings to match normal scanning --- .../companion/android/nfc/NfcViewModel.kt | 21 +++++++++++++------ .../android/nfc/TagReaderActivity.kt | 8 ++++--- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/homeassistant/companion/android/nfc/NfcViewModel.kt b/app/src/main/java/io/homeassistant/companion/android/nfc/NfcViewModel.kt index b07c0aee2..f4983da53 100644 --- a/app/src/main/java/io/homeassistant/companion/android/nfc/NfcViewModel.kt +++ b/app/src/main/java/io/homeassistant/companion/android/nfc/NfcViewModel.kt @@ -11,6 +11,8 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import io.homeassistant.companion.android.common.data.servers.ServerManager import io.homeassistant.companion.android.util.Navigator +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.launch @@ -109,13 +111,20 @@ class NfcViewModel @Inject constructor( fun fireNfcTagEvent() { viewModelScope.launch { nfcTagIdentifier?.let { - try { - serverManager.integrationRepository().scanTag( - hashMapOf("tag_id" to it) - ) + val results = serverManager.defaultServers.map { server -> + async { + try { + serverManager.integrationRepository(server.id).scanTag(hashMapOf("tag_id" to it)) + true + } catch (e: Exception) { + Log.e(TAG, "Unable to send tag to Home Assistant.", e) + false + } + } + } + if (results.awaitAll().any { it }) { _nfcResultSnackbar.emit(commonR.string.nfc_event_fired_success) - } catch (e: Exception) { - Log.e(TAG, "Unable to send tag to Home Assistant.", e) + } else { _nfcResultSnackbar.emit(commonR.string.nfc_event_fired_fail) } } ?: _nfcResultSnackbar.emit(commonR.string.nfc_event_fired_fail) diff --git a/app/src/main/java/io/homeassistant/companion/android/nfc/TagReaderActivity.kt b/app/src/main/java/io/homeassistant/companion/android/nfc/TagReaderActivity.kt index 266d9bc8c..bf48aa364 100644 --- a/app/src/main/java/io/homeassistant/companion/android/nfc/TagReaderActivity.kt +++ b/app/src/main/java/io/homeassistant/companion/android/nfc/TagReaderActivity.kt @@ -14,6 +14,8 @@ import io.homeassistant.companion.android.BaseActivity import io.homeassistant.companion.android.common.data.servers.ServerManager import io.homeassistant.companion.android.nfc.views.TagReaderView import io.homeassistant.companion.android.util.UrlHandler +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll import kotlinx.coroutines.launch import javax.inject.Inject import io.homeassistant.companion.android.common.R as commonR @@ -61,8 +63,8 @@ class TagReaderActivity : BaseActivity() { val nfcTagId = UrlHandler.splitNfcTagId(url) Log.d(TAG, "Tag ID: $nfcTagId") if (nfcTagId != null && serverManager.isRegistered()) { - serverManager.defaultServers.forEach { - lifecycleScope.launch { + serverManager.defaultServers.map { + lifecycleScope.async { try { serverManager.integrationRepository(it.id).scanTag(hashMapOf("tag_id" to nfcTagId)) Log.d(TAG, "Tag scanned to HA successfully") @@ -70,7 +72,7 @@ class TagReaderActivity : BaseActivity() { Log.e(TAG, "Tag not scanned to HA", e) } } - } + }.awaitAll() } else { showProcessingError(isNfcTag) }