From 531cfae821a2fd1ea57827ba3418a399b4d8d96d Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Wed, 11 Mar 2026 09:51:22 -0300 Subject: [PATCH 01/11] chore: remove in sheet parameters --- .../screens/scanner/CameraPermissionView.kt | 25 +++---------------- .../ui/screens/scanner/QrScanningScreen.kt | 14 +++-------- .../java/to/bitkit/ui/sheets/SendSheet.kt | 1 - 3 files changed, 6 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/scanner/CameraPermissionView.kt b/app/src/main/java/to/bitkit/ui/screens/scanner/CameraPermissionView.kt index 72a3c4937..d6cf1483c 100644 --- a/app/src/main/java/to/bitkit/ui/screens/scanner/CameraPermissionView.kt +++ b/app/src/main/java/to/bitkit/ui/screens/scanner/CameraPermissionView.kt @@ -5,14 +5,12 @@ import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.togetherWith -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.systemBarsPadding import androidx.compose.material3.Icon import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -32,7 +30,6 @@ import to.bitkit.ui.components.PrimaryButton import to.bitkit.ui.components.SecondaryButton import to.bitkit.ui.components.Title import to.bitkit.ui.components.VerticalSpacer -import to.bitkit.ui.scaffold.AppTopBar import to.bitkit.ui.scaffold.SheetTopBar import to.bitkit.ui.shared.util.gradientBackground import to.bitkit.ui.theme.AppThemeSurface @@ -62,7 +59,6 @@ fun CameraPermissionView( @Composable fun DeniedContent( shouldShowRationale: Boolean, - inSheet: Boolean = false, onClickOpenSettings: () -> Unit = {}, onClickRetry: () -> Unit = {}, onClickPaste: () -> Unit = {}, @@ -70,14 +66,10 @@ fun DeniedContent( ) { Column( modifier = Modifier - .then(if (inSheet) Modifier.gradientBackground() else Modifier.background(Colors.Black)) - .then(if (inSheet) Modifier.navigationBarsPadding() else Modifier.systemBarsPadding()) + .gradientBackground() + .navigationBarsPadding() ) { - if (!inSheet) { - AppTopBar(titleText = null, onBack) - } else { - SheetTopBar(titleText = null, onBack = onBack) - } + SheetTopBar(titleText = null, onBack = onBack) Column( verticalArrangement = Arrangement.Center, @@ -165,14 +157,3 @@ fun PreviewDenied() { DeniedContent(shouldShowRationale = true) } } - -@Preview(showSystemUi = true) -@Composable() -fun PreviewInSheet() { - AppThemeSurface { - DeniedContent( - shouldShowRationale = true, - inSheet = true, - ) - } -} diff --git a/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt b/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt index 84d7c76fd..ecef2c64c 100644 --- a/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt @@ -22,7 +22,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.systemBarsPadding import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon @@ -72,7 +71,6 @@ import to.bitkit.ui.components.SecondaryButton import to.bitkit.ui.components.TextInput import to.bitkit.ui.components.VerticalSpacer import to.bitkit.ui.scaffold.AppAlertDialog -import to.bitkit.ui.scaffold.AppTopBar import to.bitkit.ui.scaffold.SheetTopBar import to.bitkit.ui.shared.util.gradientBackground import to.bitkit.ui.theme.Colors @@ -89,7 +87,6 @@ private const val TAG = "QrScanningScreen" @Composable fun QrScanningScreen( navController: NavController, - inSheet: Boolean = false, onBack: () -> Unit = { navController.popBackStack() }, onScanSuccess: (String) -> Unit, ) { @@ -205,7 +202,6 @@ fun QrScanningScreen( deniedContent = { DeniedContent( shouldShowRationale = cameraPermissionState.status.shouldShowRationale, - inSheet = inSheet, onClickOpenSettings = { context.startActivityAppSettings() }, @@ -217,14 +213,10 @@ fun QrScanningScreen( grantedContent = { Column( modifier = Modifier - .then(if (inSheet) Modifier.gradientBackground() else Modifier) - .then(if (inSheet) Modifier.navigationBarsPadding() else Modifier.systemBarsPadding()) + .gradientBackground() + .navigationBarsPadding() ) { - if (inSheet) { - SheetTopBar(stringResource(R.string.other__qr_scan), onBack = onBack) - } else { - AppTopBar(stringResource(R.string.other__qr_scan), onBackClick = onBack) - } + SheetTopBar(stringResource(R.string.other__qr_scan), onBack = onBack) Content( previewView = previewView, diff --git a/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt b/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt index 5af5e4449..5aa411c76 100644 --- a/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt +++ b/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt @@ -134,7 +134,6 @@ fun SendSheet( composableWithDefaultTransitions { QrScanningScreen( navController = navController, - inSheet = true, ) { qrCode -> navController.popBackStack() appViewModel.onScanResult(data = qrCode) From c0213db00cb0d0f8683e24716d9d22dd2ff3226f Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Wed, 11 Mar 2026 10:20:36 -0300 Subject: [PATCH 02/11] feat: Implement QrScanningScreen.kt --- app/src/main/java/to/bitkit/ui/ContentView.kt | 45 +++++-------------- .../java/to/bitkit/ui/components/SheetHost.kt | 1 + .../ui/screens/scanner/QrScanningScreen.kt | 21 +-------- .../ui/screens/settings/ProbingToolScreen.kt | 9 +++- .../settings/advanced/ElectrumConfigScreen.kt | 7 ++- .../ui/settings/advanced/RgsServerScreen.kt | 7 ++- .../to/bitkit/ui/sheets/QrScanningSheet.kt | 23 ++++++++++ .../java/to/bitkit/ui/sheets/SendSheet.kt | 11 ++--- .../java/to/bitkit/viewmodels/AppViewModel.kt | 18 ++++++++ 9 files changed, 78 insertions(+), 64 deletions(-) create mode 100644 app/src/main/java/to/bitkit/ui/sheets/QrScanningSheet.kt diff --git a/app/src/main/java/to/bitkit/ui/ContentView.kt b/app/src/main/java/to/bitkit/ui/ContentView.kt index 4c5ca717b..acb236f0a 100644 --- a/app/src/main/java/to/bitkit/ui/ContentView.kt +++ b/app/src/main/java/to/bitkit/ui/ContentView.kt @@ -64,8 +64,7 @@ import to.bitkit.ui.screens.profile.CreateProfileScreen import to.bitkit.ui.screens.profile.ProfileIntroScreen import to.bitkit.ui.screens.recovery.RecoveryMnemonicScreen import to.bitkit.ui.screens.recovery.RecoveryModeScreen -import to.bitkit.ui.screens.scanner.QrScanningScreen -import to.bitkit.ui.screens.scanner.SCAN_REQUEST_KEY +import to.bitkit.ui.screens.scanner.SCAN_RESULT_KEY import to.bitkit.ui.screens.settings.DevSettingsScreen import to.bitkit.ui.screens.settings.FeeSettingsScreen import to.bitkit.ui.screens.settings.LdkDebugScreen @@ -173,10 +172,10 @@ import to.bitkit.ui.sheets.GiftSheet import to.bitkit.ui.sheets.HighBalanceWarningSheet import to.bitkit.ui.sheets.LnurlAuthSheet import to.bitkit.ui.sheets.PinSheet +import to.bitkit.ui.sheets.QrScanningSheet import to.bitkit.ui.sheets.QuickPayIntroSheet import to.bitkit.ui.sheets.SendSheet import to.bitkit.ui.sheets.UpdateSheet -import to.bitkit.ui.theme.TRANSITION_SHEET_MS import to.bitkit.ui.utils.AutoReadClipboardHandler import to.bitkit.ui.utils.RequestNotificationPermissions import to.bitkit.ui.utils.Transitions @@ -402,6 +401,7 @@ fun ContentView( ) is Sheet.Gift -> GiftSheet(sheet, appViewModel) + Sheet.QrScanner -> QrScanningSheet(appViewModel) is Sheet.TimedSheet -> { when (sheet.type) { TimedSheetType.APP_UPDATE -> { @@ -475,7 +475,7 @@ fun ContentView( TabBar( onSendClick = { appViewModel.showSheet(Sheet.Send()) }, onReceiveClick = { appViewModel.showSheet(Sheet.Receive) }, - onScanClick = { navController.navigateToScanner() }, + onScanClick = { appViewModel.showScannerSheet() }, modifier = Modifier.align(Alignment.BottomCenter) ) } @@ -542,7 +542,6 @@ private fun RootNavHost( cjitDetailSettings(navController) lightningConnections(navController) activityItem(activityListViewModel, navController) - qrScanner(appViewModel, navController) authCheck(navController) logs(navController) suggestions(navController) @@ -684,7 +683,7 @@ private fun RootNavHost( } composableWithDefaultTransitions { FundingAdvancedScreen( - onLnurl = { navController.navigateToScanner() }, + onLnurl = { appViewModel.showScannerSheet() }, onManual = { navController.navigate(Routes.ExternalNav) }, onBackClick = { navController.popBackStack() }, ) @@ -702,7 +701,12 @@ private fun RootNavHost( savedStateHandle = it.savedStateHandle, viewModel = viewModel, onNodeConnected = { navController.navigate(Routes.ExternalAmount) }, - onScanClick = { navController.navigateToScanner(isCalledForResult = true) }, + onScanClick = { + val entry = navController.currentBackStackEntry + appViewModel.showScannerSheet { result -> + entry?.savedStateHandle?.set(SCAN_RESULT_KEY, result) + } + }, onBackClick = { navController.popBackStack() }, ) } @@ -1211,23 +1215,6 @@ private fun NavGraphBuilder.activityItem( } } -private fun NavGraphBuilder.qrScanner( - appViewModel: AppViewModel, - navController: NavHostController, -) { - composableWithDefaultTransitions( - enterTransition = { Transitions.slideInVertically }, - popExitTransition = { Transitions.slideOutVertically }, - ) { - QrScanningScreen(navController = navController) { qrCode -> - appViewModel.onScanResult( - data = qrCode, - delayMs = TRANSITION_SHEET_MS, - ) - } - } -} - private fun NavGraphBuilder.authCheck( navController: NavHostController, ) { @@ -1628,13 +1615,6 @@ fun NavController.navigateToActivityExplore(id: String) = navigate( route = Routes.ActivityExplore(id), ) -fun NavController.navigateToScanner(isCalledForResult: Boolean = false) { - if (isCalledForResult) { - currentBackStackEntry?.savedStateHandle?.set(SCAN_REQUEST_KEY, true) - } - navigate(Routes.QrScanner) -} - fun NavController.navigateToLogDetail(fileName: String) = navigate( route = Routes.LogDetail(fileName), ) @@ -1877,9 +1857,6 @@ sealed interface Routes { @Serializable data class ActivityExplore(val id: String) : Routes - @Serializable - data object QrScanner : Routes - @Serializable data object BuyIntro : Routes diff --git a/app/src/main/java/to/bitkit/ui/components/SheetHost.kt b/app/src/main/java/to/bitkit/ui/components/SheetHost.kt index 3d99fe204..5aa0ab856 100644 --- a/app/src/main/java/to/bitkit/ui/components/SheetHost.kt +++ b/app/src/main/java/to/bitkit/ui/components/SheetHost.kt @@ -46,6 +46,7 @@ sealed interface Sheet { data object ForceTransfer : Sheet data class Gift(val code: String, val amount: ULong) : Sheet data object ConnectionClosed : Sheet + data object QrScanner : Sheet data class TimedSheet(val type: TimedSheetType) : Sheet } diff --git a/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt b/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt index ecef2c64c..960d492d7 100644 --- a/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt @@ -49,7 +49,6 @@ import androidx.compose.ui.viewinterop.AndroidView import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.compose.LocalLifecycleOwner -import androidx.navigation.NavController import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.rememberPermissionState import com.google.accompanist.permissions.shouldShowRationale @@ -58,7 +57,6 @@ import com.google.mlkit.vision.barcode.BarcodeScanning import com.google.mlkit.vision.barcode.common.Barcode import com.google.mlkit.vision.common.InputImage import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.delay import kotlinx.coroutines.withContext import to.bitkit.R import to.bitkit.env.Env @@ -78,7 +76,6 @@ import to.bitkit.utils.Logger import to.bitkit.viewmodels.AppViewModel import java.util.concurrent.Executors -const val SCAN_REQUEST_KEY = "SCAN_REQUEST" const val SCAN_RESULT_KEY = "SCAN_RESULT" private const val TAG = "QrScanningScreen" @@ -86,8 +83,7 @@ private const val TAG = "QrScanningScreen" @OptIn(ExperimentalPermissionsApi::class) @Composable fun QrScanningScreen( - navController: NavController, - onBack: () -> Unit = { navController.popBackStack() }, + onBack: () -> Unit, onScanSuccess: (String) -> Unit, ) { val app = appViewModel ?: return @@ -97,20 +93,7 @@ fun QrScanningScreen( // Handle scan result LaunchedEffect(scanResult) { scanResult?.let { qrCode -> - delay(100) // wait to prevent navigation result race conditions - - val prev = navController.previousBackStackEntry - val wasCalledForResult = prev?.savedStateHandle?.contains(SCAN_REQUEST_KEY) == true - if (wasCalledForResult) { - prev.savedStateHandle[SCAN_RESULT_KEY] = qrCode - onBack() - prev.savedStateHandle.remove(SCAN_REQUEST_KEY) - } else { - onBack() - onScanSuccess(qrCode) - } - - // Reset scan result to allow new scans + onScanSuccess(qrCode) setScanResult(null) } } diff --git a/app/src/main/java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt b/app/src/main/java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt index d3e2da661..313a9280d 100644 --- a/app/src/main/java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt @@ -32,6 +32,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavController import kotlinx.coroutines.flow.filterNotNull import to.bitkit.R +import to.bitkit.ui.appViewModel import to.bitkit.ui.components.ButtonSize import to.bitkit.ui.components.PrimaryButton import to.bitkit.ui.components.SecondaryButton @@ -40,7 +41,6 @@ import to.bitkit.ui.components.VerticalSpacer import to.bitkit.ui.components.settings.SectionFooter import to.bitkit.ui.components.settings.SectionHeader import to.bitkit.ui.components.settings.SettingsTextButtonRow -import to.bitkit.ui.navigateToScanner import to.bitkit.ui.scaffold.AppTopBar import to.bitkit.ui.scaffold.ScanNavIcon import to.bitkit.ui.scaffold.ScreenColumn @@ -58,6 +58,7 @@ fun ProbingToolScreen( viewModel: ProbingToolViewModel = hiltViewModel(), ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() + val app = appViewModel ?: return LaunchedEffect(savedStateHandle) { savedStateHandle.getStateFlow(SCAN_RESULT_KEY, null) @@ -71,7 +72,11 @@ fun ProbingToolScreen( ProbingToolContent( uiState = uiState, onBackClick = { navController.popBackStack() }, - onScanClick = { navController.navigateToScanner(isCalledForResult = true) }, + onScanClick = { + app.showScannerSheet { result -> + savedStateHandle[SCAN_RESULT_KEY] = result + } + }, onInvoiceChange = viewModel::updateInvoice, onAmountChange = viewModel::updateAmountSats, onPasteInvoice = viewModel::pasteInvoice, diff --git a/app/src/main/java/to/bitkit/ui/settings/advanced/ElectrumConfigScreen.kt b/app/src/main/java/to/bitkit/ui/settings/advanced/ElectrumConfigScreen.kt index 72531e42f..3fb9db9e2 100644 --- a/app/src/main/java/to/bitkit/ui/settings/advanced/ElectrumConfigScreen.kt +++ b/app/src/main/java/to/bitkit/ui/settings/advanced/ElectrumConfigScreen.kt @@ -42,7 +42,6 @@ import to.bitkit.ui.components.TextInput import to.bitkit.ui.components.VerticalSpacer import to.bitkit.ui.components.settings.SettingsButtonRow import to.bitkit.ui.components.settings.SettingsButtonValue -import to.bitkit.ui.navigateToScanner import to.bitkit.ui.scaffold.AppTopBar import to.bitkit.ui.scaffold.ScanNavIcon import to.bitkit.ui.scaffold.ScreenColumn @@ -97,7 +96,11 @@ fun ElectrumConfigScreen( Content( uiState = uiState, onBack = { navController.popBackStack() }, - onScan = { navController.navigateToScanner(isCalledForResult = true) }, + onScan = { + app.showScannerSheet { result -> + savedStateHandle[SCAN_RESULT_KEY] = result + } + }, onChangeHost = viewModel::setHost, onChangePort = viewModel::setPort, onChangeProtocol = viewModel::setProtocol, diff --git a/app/src/main/java/to/bitkit/ui/settings/advanced/RgsServerScreen.kt b/app/src/main/java/to/bitkit/ui/settings/advanced/RgsServerScreen.kt index cf74847db..ef428662e 100644 --- a/app/src/main/java/to/bitkit/ui/settings/advanced/RgsServerScreen.kt +++ b/app/src/main/java/to/bitkit/ui/settings/advanced/RgsServerScreen.kt @@ -35,7 +35,6 @@ import to.bitkit.ui.components.PrimaryButton import to.bitkit.ui.components.SecondaryButton import to.bitkit.ui.components.TextInput import to.bitkit.ui.components.VerticalSpacer -import to.bitkit.ui.navigateToScanner import to.bitkit.ui.scaffold.AppTopBar import to.bitkit.ui.scaffold.ScanNavIcon import to.bitkit.ui.scaffold.ScreenColumn @@ -88,7 +87,11 @@ fun RgsServerScreen( Content( uiState = uiState, onBack = { navController.popBackStack() }, - onScan = { navController.navigateToScanner(isCalledForResult = true) }, + onScan = { + app.showScannerSheet { result -> + savedStateHandle[SCAN_RESULT_KEY] = result + } + }, onChangeUrl = viewModel::setRgsUrl, onClickReset = viewModel::resetToDefault, onClickConnect = viewModel::onClickConnect, diff --git a/app/src/main/java/to/bitkit/ui/sheets/QrScanningSheet.kt b/app/src/main/java/to/bitkit/ui/sheets/QrScanningSheet.kt new file mode 100644 index 000000000..7476ca3cd --- /dev/null +++ b/app/src/main/java/to/bitkit/ui/sheets/QrScanningSheet.kt @@ -0,0 +1,23 @@ +package to.bitkit.ui.sheets + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import to.bitkit.ui.screens.scanner.QrScanningScreen +import to.bitkit.ui.shared.modifiers.sheetHeight +import to.bitkit.viewmodels.AppViewModel + +@Composable +fun QrScanningSheet(appViewModel: AppViewModel) { + Column( + modifier = Modifier + .fillMaxWidth() + .sheetHeight() + ) { + QrScanningScreen( + onBack = { appViewModel.hideSheet() }, + onScanSuccess = { appViewModel.onScannerSheetResult(it) }, + ) + } +} diff --git a/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt b/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt index 5aa411c76..02d3ecd1a 100644 --- a/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt +++ b/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt @@ -133,11 +133,12 @@ fun SendSheet( } composableWithDefaultTransitions { QrScanningScreen( - navController = navController, - ) { qrCode -> - navController.popBackStack() - appViewModel.onScanResult(data = qrCode) - } + onBack = { navController.popBackStack() }, + onScanSuccess = { qrCode -> + navController.popBackStack() + appViewModel.onScanResult(data = qrCode) + }, + ) } composableWithDefaultTransitions { val sendUiState by appViewModel.sendUiState.collectAsStateWithLifecycle() diff --git a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt index 2fdc4fc85..a2664354b 100644 --- a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt +++ b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt @@ -2097,6 +2097,24 @@ class AppViewModel @Inject constructor( // endregion // region Sheets + private var scanResultHandler: ((String) -> Unit)? = null + + fun showScannerSheet(onResult: ((String) -> Unit)? = null) { + scanResultHandler = onResult + showSheet(Sheet.QrScanner) + } + + fun onScannerSheetResult(data: String) { + val handler = scanResultHandler + scanResultHandler = null + hideSheet() + if (handler != null) { + handler(data) + } else { + onScanResult(data) + } + } + fun showSheet(sheetType: Sheet) { viewModelScope.launch { _currentSheet.value?.let { From a259b8b97906082f6f5bf90290f6154b4dcd64a2 Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Wed, 11 Mar 2026 10:44:06 -0300 Subject: [PATCH 03/11] feat: new camera overlay size --- .../java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt | 6 ++++-- .../bitkit/ui/screens/wallets/send/SendRecipientScreen.kt | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt b/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt index 960d492d7..7d073c03b 100644 --- a/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt @@ -78,6 +78,8 @@ import java.util.concurrent.Executors const val SCAN_RESULT_KEY = "SCAN_RESULT" +val CameraOverlayButtonSize = 40.dp + private const val TAG = "QrScanningScreen" @OptIn(ExperimentalPermissionsApi::class) @@ -272,7 +274,7 @@ private fun Content( .padding(16.dp) .clip(CircleShape) .background(Colors.White64) - .size(48.dp) + .size(CameraOverlayButtonSize) .align(Alignment.TopStart) ) { Icon( @@ -288,7 +290,7 @@ private fun Content( .padding(16.dp) .clip(CircleShape) .background(Colors.White64) - .size(48.dp) + .size(CameraOverlayButtonSize) .align(Alignment.TopEnd) ) { Icon( diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendRecipientScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendRecipientScreen.kt index c6837c539..04739567c 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendRecipientScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendRecipientScreen.kt @@ -69,6 +69,7 @@ import to.bitkit.ui.components.PrimaryButton import to.bitkit.ui.components.RectangleButton import to.bitkit.ui.components.VerticalSpacer import to.bitkit.ui.scaffold.SheetTopBar +import to.bitkit.ui.screens.scanner.CameraOverlayButtonSize import to.bitkit.ui.screens.scanner.QrCodeAnalyzer import to.bitkit.ui.shared.modifiers.sheetHeight import to.bitkit.ui.shared.util.gradientBackground @@ -372,7 +373,7 @@ private fun CameraPreviewWithControls( .padding(16.dp) .clip(CircleShape) .background(Colors.White64) - .size(48.dp) + .size(CameraOverlayButtonSize) .align(Alignment.TopStart) ) { Icon( @@ -397,7 +398,7 @@ private fun CameraPreviewWithControls( .padding(16.dp) .clip(CircleShape) .background(Colors.White64) - .size(48.dp) + .size(CameraOverlayButtonSize) .align(Alignment.TopEnd) ) { Icon( From 5be462c505a40aa40bdcacb448629690b262d08e Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Thu, 12 Mar 2026 09:07:17 -0300 Subject: [PATCH 04/11] chore: lint --- .../java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt b/app/src/main/java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt index 313a9280d..bd27148e2 100644 --- a/app/src/main/java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt @@ -63,8 +63,8 @@ fun ProbingToolScreen( LaunchedEffect(savedStateHandle) { savedStateHandle.getStateFlow(SCAN_RESULT_KEY, null) .filterNotNull() - .collect { scannedData -> - viewModel.updateInvoice(scannedData) + .collect { + viewModel.updateInvoice(it) savedStateHandle.remove(SCAN_RESULT_KEY) } } From a87d72cd8849557efbf46de73902d2e2c9b9c9d9 Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Thu, 12 Mar 2026 09:47:30 -0300 Subject: [PATCH 05/11] chore: lint --- .../java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt | 4 ++-- .../to/bitkit/ui/settings/advanced/ElectrumConfigScreen.kt | 4 ++-- .../java/to/bitkit/ui/settings/advanced/RgsServerScreen.kt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt b/app/src/main/java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt index bd27148e2..b76c8a317 100644 --- a/app/src/main/java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt @@ -73,8 +73,8 @@ fun ProbingToolScreen( uiState = uiState, onBackClick = { navController.popBackStack() }, onScanClick = { - app.showScannerSheet { result -> - savedStateHandle[SCAN_RESULT_KEY] = result + app.showScannerSheet { + savedStateHandle[SCAN_RESULT_KEY] = it } }, onInvoiceChange = viewModel::updateInvoice, diff --git a/app/src/main/java/to/bitkit/ui/settings/advanced/ElectrumConfigScreen.kt b/app/src/main/java/to/bitkit/ui/settings/advanced/ElectrumConfigScreen.kt index 3fb9db9e2..ae7892c0f 100644 --- a/app/src/main/java/to/bitkit/ui/settings/advanced/ElectrumConfigScreen.kt +++ b/app/src/main/java/to/bitkit/ui/settings/advanced/ElectrumConfigScreen.kt @@ -97,8 +97,8 @@ fun ElectrumConfigScreen( uiState = uiState, onBack = { navController.popBackStack() }, onScan = { - app.showScannerSheet { result -> - savedStateHandle[SCAN_RESULT_KEY] = result + app.showScannerSheet { + savedStateHandle[SCAN_RESULT_KEY] = it } }, onChangeHost = viewModel::setHost, diff --git a/app/src/main/java/to/bitkit/ui/settings/advanced/RgsServerScreen.kt b/app/src/main/java/to/bitkit/ui/settings/advanced/RgsServerScreen.kt index ef428662e..5c8decc7b 100644 --- a/app/src/main/java/to/bitkit/ui/settings/advanced/RgsServerScreen.kt +++ b/app/src/main/java/to/bitkit/ui/settings/advanced/RgsServerScreen.kt @@ -88,8 +88,8 @@ fun RgsServerScreen( uiState = uiState, onBack = { navController.popBackStack() }, onScan = { - app.showScannerSheet { result -> - savedStateHandle[SCAN_RESULT_KEY] = result + app.showScannerSheet { + savedStateHandle[SCAN_RESULT_KEY] = it } }, onChangeUrl = viewModel::setRgsUrl, From 9e7275b70c0a3f76a9ed0602de11ad95da8fcac2 Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Thu, 12 Mar 2026 09:50:17 -0300 Subject: [PATCH 06/11] chore: reset backstack on sheet dismiss --- app/src/main/java/to/bitkit/ui/ContentView.kt | 3 +-- app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/ContentView.kt b/app/src/main/java/to/bitkit/ui/ContentView.kt index acb236f0a..f09d8cb87 100644 --- a/app/src/main/java/to/bitkit/ui/ContentView.kt +++ b/app/src/main/java/to/bitkit/ui/ContentView.kt @@ -702,9 +702,8 @@ private fun RootNavHost( viewModel = viewModel, onNodeConnected = { navController.navigate(Routes.ExternalAmount) }, onScanClick = { - val entry = navController.currentBackStackEntry appViewModel.showScannerSheet { result -> - entry?.savedStateHandle?.set(SCAN_RESULT_KEY, result) + it.savedStateHandle[SCAN_RESULT_KEY] = result } }, onBackClick = { navController.popBackStack() }, diff --git a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt index a2664354b..7f921db4d 100644 --- a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt +++ b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt @@ -2126,6 +2126,7 @@ class AppViewModel @Inject constructor( } fun hideSheet() { + scanResultHandler = null when { currentSheet.value is Sheet.TimedSheet -> { // Only dismiss if manager still has a sheet (user initiated) From 7c4574d390047396410ffe0490b37080f3c67d25 Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Thu, 12 Mar 2026 14:06:28 -0300 Subject: [PATCH 07/11] chore: lint --- app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt b/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt index 02d3ecd1a..6397c904d 100644 --- a/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt +++ b/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt @@ -134,9 +134,9 @@ fun SendSheet( composableWithDefaultTransitions { QrScanningScreen( onBack = { navController.popBackStack() }, - onScanSuccess = { qrCode -> + onScanSuccess = { navController.popBackStack() - appViewModel.onScanResult(data = qrCode) + appViewModel.onScanResult(data = it) }, ) } From ef08d6a407ff087859caa477b4a3758347cb61ed Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Thu, 12 Mar 2026 14:06:44 -0300 Subject: [PATCH 08/11] refactor: apply code guideline --- .../java/to/bitkit/ui/sheets/QrScanningSheet.kt | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/sheets/QrScanningSheet.kt b/app/src/main/java/to/bitkit/ui/sheets/QrScanningSheet.kt index 7476ca3cd..48d3e2aa4 100644 --- a/app/src/main/java/to/bitkit/ui/sheets/QrScanningSheet.kt +++ b/app/src/main/java/to/bitkit/ui/sheets/QrScanningSheet.kt @@ -10,14 +10,25 @@ import to.bitkit.viewmodels.AppViewModel @Composable fun QrScanningSheet(appViewModel: AppViewModel) { + Content( + onBack = { appViewModel.hideSheet() }, + onScanSuccess = { appViewModel.onScannerSheetResult(it) }, + ) +} + +@Composable +private fun Content( + onBack: () -> Unit, + onScanSuccess: (String) -> Unit, +) { Column( modifier = Modifier .fillMaxWidth() .sheetHeight() ) { QrScanningScreen( - onBack = { appViewModel.hideSheet() }, - onScanSuccess = { appViewModel.onScannerSheetResult(it) }, + onBack = onBack, + onScanSuccess = onScanSuccess, ) } } From 520bca074f28be918a6b9969efd1bbdfe1bea78b Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Fri, 13 Mar 2026 13:59:51 -0300 Subject: [PATCH 09/11] fix: remove unnecessary savedStateHandle --- app/src/main/java/to/bitkit/ui/ContentView.kt | 3 +-- .../ui/settings/advanced/ElectrumConfigScreen.kt | 16 +--------------- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/ContentView.kt b/app/src/main/java/to/bitkit/ui/ContentView.kt index 258d20536..95bad7640 100644 --- a/app/src/main/java/to/bitkit/ui/ContentView.kt +++ b/app/src/main/java/to/bitkit/ui/ContentView.kt @@ -178,7 +178,6 @@ import to.bitkit.ui.sheets.SendSheet import to.bitkit.ui.sheets.UpdateSheet import to.bitkit.ui.utils.AutoReadClipboardHandler import to.bitkit.ui.utils.RequestNotificationPermissions -import to.bitkit.ui.utils.Transitions import to.bitkit.ui.utils.composableWithDefaultTransitions import to.bitkit.ui.utils.navigationWithDefaultTransitions import to.bitkit.utils.Logger @@ -1008,7 +1007,7 @@ private fun NavGraphBuilder.advancedSettings(navController: NavHostController) { CoinSelectPreferenceScreen(navController) } composableWithDefaultTransitions { - ElectrumConfigScreen(it.savedStateHandle, navController) + ElectrumConfigScreen(navController) } composableWithDefaultTransitions { RgsServerScreen(it.savedStateHandle, navController) diff --git a/app/src/main/java/to/bitkit/ui/settings/advanced/ElectrumConfigScreen.kt b/app/src/main/java/to/bitkit/ui/settings/advanced/ElectrumConfigScreen.kt index ae7892c0f..1fb2e584f 100644 --- a/app/src/main/java/to/bitkit/ui/settings/advanced/ElectrumConfigScreen.kt +++ b/app/src/main/java/to/bitkit/ui/settings/advanced/ElectrumConfigScreen.kt @@ -24,10 +24,8 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel -import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavController -import kotlinx.coroutines.flow.filterNotNull import to.bitkit.R import to.bitkit.models.ElectrumProtocol import to.bitkit.models.ElectrumServerPeer @@ -45,13 +43,11 @@ import to.bitkit.ui.components.settings.SettingsButtonValue import to.bitkit.ui.scaffold.AppTopBar import to.bitkit.ui.scaffold.ScanNavIcon import to.bitkit.ui.scaffold.ScreenColumn -import to.bitkit.ui.screens.scanner.SCAN_RESULT_KEY import to.bitkit.ui.theme.AppThemeSurface import to.bitkit.ui.theme.Colors @Composable fun ElectrumConfigScreen( - savedStateHandle: SavedStateHandle, navController: NavController, viewModel: ElectrumConfigViewModel = hiltViewModel(), ) { @@ -59,16 +55,6 @@ fun ElectrumConfigScreen( val app = appViewModel ?: return val context = LocalContext.current - // Handle result from Scanner - LaunchedEffect(savedStateHandle) { - savedStateHandle.getStateFlow(SCAN_RESULT_KEY, null) - .filterNotNull() - .collect { scannedData -> - viewModel.onScan(scannedData) - savedStateHandle.remove(SCAN_RESULT_KEY) - } - } - // Monitor connection results LaunchedEffect(uiState.connectionResult) { uiState.connectionResult?.let { result -> @@ -98,7 +84,7 @@ fun ElectrumConfigScreen( onBack = { navController.popBackStack() }, onScan = { app.showScannerSheet { - savedStateHandle[SCAN_RESULT_KEY] = it + viewModel.onScan(it) } }, onChangeHost = viewModel::setHost, From d18dd9fe0ebcadfcbd25a122ddacbeda633f6676 Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Fri, 13 Mar 2026 14:18:10 -0300 Subject: [PATCH 10/11] refactor: remove unnecessary savedStateHandle + SCAN_RESULT_KEY pattern --- app/src/main/java/to/bitkit/ui/ContentView.kt | 8 +++----- .../ui/screens/scanner/QrScanningScreen.kt | 2 -- .../ui/screens/settings/ProbingToolScreen.kt | 16 +--------------- .../external/ExternalConnectionScreen.kt | 14 -------------- .../ui/settings/advanced/RgsServerScreen.kt | 16 +--------------- 5 files changed, 5 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/ContentView.kt b/app/src/main/java/to/bitkit/ui/ContentView.kt index 95bad7640..74b54e5e0 100644 --- a/app/src/main/java/to/bitkit/ui/ContentView.kt +++ b/app/src/main/java/to/bitkit/ui/ContentView.kt @@ -64,7 +64,6 @@ import to.bitkit.ui.screens.profile.CreateProfileScreen import to.bitkit.ui.screens.profile.ProfileIntroScreen import to.bitkit.ui.screens.recovery.RecoveryMnemonicScreen import to.bitkit.ui.screens.recovery.RecoveryModeScreen -import to.bitkit.ui.screens.scanner.SCAN_RESULT_KEY import to.bitkit.ui.screens.settings.DevSettingsScreen import to.bitkit.ui.screens.settings.FeeSettingsScreen import to.bitkit.ui.screens.settings.LdkDebugScreen @@ -697,12 +696,11 @@ private fun RootNavHost( ExternalConnectionScreen( route = route, - savedStateHandle = it.savedStateHandle, viewModel = viewModel, onNodeConnected = { navController.navigate(Routes.ExternalAmount) }, onScanClick = { appViewModel.showScannerSheet { result -> - it.savedStateHandle[SCAN_RESULT_KEY] = result + viewModel.parseNodeUri(result) } }, onBackClick = { navController.popBackStack() }, @@ -882,7 +880,7 @@ private fun NavGraphBuilder.settings( VssDebugScreen(navController) } composableWithDefaultTransitions { - ProbingToolScreen(it.savedStateHandle, navController) + ProbingToolScreen(navController) } composableWithDefaultTransitions { FeeSettingsScreen(navController) @@ -1010,7 +1008,7 @@ private fun NavGraphBuilder.advancedSettings(navController: NavHostController) { ElectrumConfigScreen(navController) } composableWithDefaultTransitions { - RgsServerScreen(it.savedStateHandle, navController) + RgsServerScreen(navController) } composableWithDefaultTransitions { AddressTypePreferenceScreen(navController) diff --git a/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt b/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt index 7d073c03b..10e4143ae 100644 --- a/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt @@ -76,8 +76,6 @@ import to.bitkit.utils.Logger import to.bitkit.viewmodels.AppViewModel import java.util.concurrent.Executors -const val SCAN_RESULT_KEY = "SCAN_RESULT" - val CameraOverlayButtonSize = 40.dp private const val TAG = "QrScanningScreen" diff --git a/app/src/main/java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt b/app/src/main/java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt index b76c8a317..0be52d4f0 100644 --- a/app/src/main/java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/settings/ProbingToolScreen.kt @@ -16,7 +16,6 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -27,10 +26,8 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel -import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavController -import kotlinx.coroutines.flow.filterNotNull import to.bitkit.R import to.bitkit.ui.appViewModel import to.bitkit.ui.components.ButtonSize @@ -44,7 +41,6 @@ import to.bitkit.ui.components.settings.SettingsTextButtonRow import to.bitkit.ui.scaffold.AppTopBar import to.bitkit.ui.scaffold.ScanNavIcon import to.bitkit.ui.scaffold.ScreenColumn -import to.bitkit.ui.screens.scanner.SCAN_RESULT_KEY import to.bitkit.ui.theme.AppThemeSurface import to.bitkit.ui.theme.Colors import to.bitkit.viewmodels.ProbeResult @@ -53,28 +49,18 @@ import to.bitkit.viewmodels.ProbingToolViewModel @Composable fun ProbingToolScreen( - savedStateHandle: SavedStateHandle, navController: NavController, viewModel: ProbingToolViewModel = hiltViewModel(), ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() val app = appViewModel ?: return - LaunchedEffect(savedStateHandle) { - savedStateHandle.getStateFlow(SCAN_RESULT_KEY, null) - .filterNotNull() - .collect { - viewModel.updateInvoice(it) - savedStateHandle.remove(SCAN_RESULT_KEY) - } - } - ProbingToolContent( uiState = uiState, onBackClick = { navController.popBackStack() }, onScanClick = { app.showScannerSheet { - savedStateHandle[SCAN_RESULT_KEY] = it + viewModel.updateInvoice(it) } }, onInvoiceChange = viewModel::updateInvoice, diff --git a/app/src/main/java/to/bitkit/ui/screens/transfer/external/ExternalConnectionScreen.kt b/app/src/main/java/to/bitkit/ui/screens/transfer/external/ExternalConnectionScreen.kt index 2fe68d868..2b040071f 100644 --- a/app/src/main/java/to/bitkit/ui/screens/transfer/external/ExternalConnectionScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/transfer/external/ExternalConnectionScreen.kt @@ -31,8 +31,6 @@ import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.lifecycle.SavedStateHandle -import kotlinx.coroutines.flow.filterNotNull import org.lightningdevkit.ldknode.PeerDetails import to.bitkit.R import to.bitkit.ext.getClipboardText @@ -50,7 +48,6 @@ import to.bitkit.ui.components.TextInput import to.bitkit.ui.scaffold.AppTopBar import to.bitkit.ui.scaffold.DrawerNavIcon import to.bitkit.ui.scaffold.ScreenColumn -import to.bitkit.ui.screens.scanner.SCAN_RESULT_KEY import to.bitkit.ui.screens.transfer.external.ExternalNodeContract.SideEffect import to.bitkit.ui.theme.AppThemeSurface import to.bitkit.ui.theme.Colors @@ -59,7 +56,6 @@ import to.bitkit.ui.utils.withAccent @Composable fun ExternalConnectionScreen( route: Routes.ExternalConnection, - savedStateHandle: SavedStateHandle, viewModel: ExternalNodeViewModel, onNodeConnected: () -> Unit, onScanClick: () -> Unit, @@ -75,16 +71,6 @@ fun ExternalConnectionScreen( } } - // Handle result from scanner opened from this screen - LaunchedEffect(savedStateHandle) { - savedStateHandle.getStateFlow(SCAN_RESULT_KEY, null) - .filterNotNull() - .collect { scannedData -> - viewModel.parseNodeUri(scannedData) - savedStateHandle.remove(SCAN_RESULT_KEY) - } - } - LaunchedEffect(viewModel, onNodeConnected) { viewModel.effects.collect { when (it) { diff --git a/app/src/main/java/to/bitkit/ui/settings/advanced/RgsServerScreen.kt b/app/src/main/java/to/bitkit/ui/settings/advanced/RgsServerScreen.kt index 5c8decc7b..c6685c6dc 100644 --- a/app/src/main/java/to/bitkit/ui/settings/advanced/RgsServerScreen.kt +++ b/app/src/main/java/to/bitkit/ui/settings/advanced/RgsServerScreen.kt @@ -21,10 +21,8 @@ import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel -import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavController -import kotlinx.coroutines.flow.filterNotNull import to.bitkit.R import to.bitkit.models.Toast import to.bitkit.ui.appViewModel @@ -38,13 +36,11 @@ import to.bitkit.ui.components.VerticalSpacer import to.bitkit.ui.scaffold.AppTopBar import to.bitkit.ui.scaffold.ScanNavIcon import to.bitkit.ui.scaffold.ScreenColumn -import to.bitkit.ui.screens.scanner.SCAN_RESULT_KEY import to.bitkit.ui.theme.AppThemeSurface import to.bitkit.ui.theme.Colors @Composable fun RgsServerScreen( - savedStateHandle: SavedStateHandle, navController: NavController, viewModel: RgsServerViewModel = hiltViewModel(), ) { @@ -52,16 +48,6 @@ fun RgsServerScreen( val app = appViewModel ?: return val context = LocalContext.current - // Handle result from Scanner - LaunchedEffect(savedStateHandle) { - savedStateHandle.getStateFlow(SCAN_RESULT_KEY, null) - .filterNotNull() - .collect { scannedData -> - viewModel.onScan(scannedData) - savedStateHandle.remove(SCAN_RESULT_KEY) - } - } - // Monitor connection results LaunchedEffect(uiState.connectionResult) { uiState.connectionResult?.let { result -> @@ -89,7 +75,7 @@ fun RgsServerScreen( onBack = { navController.popBackStack() }, onScan = { app.showScannerSheet { - savedStateHandle[SCAN_RESULT_KEY] = it + viewModel.onScan(it) } }, onChangeUrl = viewModel::setRgsUrl, From 4a150b8085aae4a62006e359691247d99cd1b5f1 Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Fri, 13 Mar 2026 15:04:21 -0300 Subject: [PATCH 11/11] chore: lint --- app/src/main/java/to/bitkit/ui/ContentView.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/ContentView.kt b/app/src/main/java/to/bitkit/ui/ContentView.kt index 74b54e5e0..dd32db01e 100644 --- a/app/src/main/java/to/bitkit/ui/ContentView.kt +++ b/app/src/main/java/to/bitkit/ui/ContentView.kt @@ -699,8 +699,8 @@ private fun RootNavHost( viewModel = viewModel, onNodeConnected = { navController.navigate(Routes.ExternalAmount) }, onScanClick = { - appViewModel.showScannerSheet { result -> - viewModel.parseNodeUri(result) + appViewModel.showScannerSheet { + viewModel.parseNodeUri(it) } }, onBackClick = { navController.popBackStack() },