From 9d1f5f48ec251485767c76f823fc2ec864a75d84 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Mon, 25 Aug 2025 06:58:50 -0500 Subject: [PATCH] fix(contact-import): streamline shared contact handling (#2828) Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com> --- app/src/main/AndroidManifest.xml | 3 ++- .../java/com/geeksville/mesh/model/UIState.kt | 2 +- .../mesh/ui/sharing/ContactSharing.kt | 18 ++++++++---------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7ca4e26eb..ff12dd53e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -166,10 +166,11 @@ - diff --git a/app/src/main/java/com/geeksville/mesh/model/UIState.kt b/app/src/main/java/com/geeksville/mesh/model/UIState.kt index 010d0b233..488be641b 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -630,7 +630,7 @@ constructor( get() = _sharedContactRequested.asStateFlow() fun setSharedContactRequested(sharedContact: AdminProtos.SharedContact?) { - viewModelScope.launch { _sharedContactRequested.value = sharedContact } + _sharedContactRequested.value = sharedContact } fun addSharedContact(sharedContact: AdminProtos.SharedContact) = diff --git a/app/src/main/java/com/geeksville/mesh/ui/sharing/ContactSharing.kt b/app/src/main/java/com/geeksville/mesh/ui/sharing/ContactSharing.kt index 6bf9308a5..4191eb649 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/sharing/ContactSharing.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/sharing/ContactSharing.kt @@ -89,7 +89,7 @@ fun AddContactFAB( model: UIViewModel = hiltViewModel(), onSharedContactImport: (AdminProtos.SharedContact) -> Unit = {}, ) { - val contactToImport: AdminProtos.SharedContact? by model.sharedContactRequested.collectAsStateWithLifecycle(null) + val scannedContact: AdminProtos.SharedContact? by model.sharedContactRequested.collectAsStateWithLifecycle(null) val barcodeLauncher = rememberLauncherForActivityResult(ScanContract()) { result -> @@ -108,8 +108,8 @@ fun AddContactFAB( } } - if (contactToImport != null) { - val nodeNum = contactToImport?.nodeNum + scannedContact?.let { contactToImport -> + val nodeNum = scannedContact?.nodeNum val nodes by model.unfilteredNodeList.collectAsState() val node = nodes.find { it.num == nodeNum } SimpleAlertDialog( @@ -118,16 +118,16 @@ fun AddContactFAB( Column { if (node != null) { Text(text = stringResource(R.string.import_known_shared_contact_text)) - if (node.user.publicKey.size() > 0 && node.user.publicKey != contactToImport?.user?.publicKey) { + if (node.user.publicKey.size() > 0 && node.user.publicKey != contactToImport.user?.publicKey) { Text( text = stringResource(R.string.public_key_changed), color = MaterialTheme.colorScheme.error, ) } HorizontalDivider() - Text(text = compareUsers(node.user, contactToImport!!.user)) + Text(text = compareUsers(node.user, contactToImport.user)) } else { - Text(text = userFieldsToString(contactToImport!!.user)) + Text(text = userFieldsToString(contactToImport.user)) } } }, @@ -135,7 +135,7 @@ fun AddContactFAB( onDismiss = { model.setSharedContactRequested(null) }, confirmText = stringResource(R.string.import_label), onConfirm = { - onSharedContactImport(contactToImport!!) + onSharedContactImport(contactToImport) model.setSharedContactRequested(null) }, ) @@ -155,9 +155,7 @@ fun AddContactFAB( LaunchedEffect(cameraPermissionState.status) { if (cameraPermissionState.status.isGranted) { - // If permission was granted as a result of a request, and not initially, - // we might want to trigger the scan. However, simple auto-triggering on grant - // might not always be desired UX. For now, rely on user re-click if needed. + zxingScan() } }