From 61e1e00d2ca7de44ff4e2da9f91ce4922a9be077 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Mon, 13 Apr 2026 08:12:11 -0300 Subject: [PATCH] Refactor navigation and UI components to use NavHostControllerWrapper Update login and account screens to utilize `NavHostControllerWrapper` instead of passing raw `NavController` instances. This change improves consistency across the navigation flow and ensures that UI actions, such as navigation and account setup, use the appropriate coroutine scopes and dispatchers. Changes: - LoginScreen: Replace `NavController` and `CoroutineScope` parameters with `NavHostControllerWrapper`; update navigation calls to use `Amber.instance.applicationIOScope` with `Dispatchers.Main` for thread safety. - AccountScreen: Update `AccountState.LoggedOff` to wrap the local `NavController` in `NavHostControllerWrapper`; remove unused `mainViewModel` parameter. - MainScreen: Update `MainPage`, `SignUpPage`, and `LoginPage` compositions to pass the wrapped controller. - MainActivity & SignerActivity: Remove unused `mainViewModel` argument when calling `AccountScreen`. --- .../greenart7c3/nostrsigner/MainActivity.kt | 1 - .../greenart7c3/nostrsigner/SignerActivity.kt | 1 - .../nostrsigner/ui/AccountScreen.kt | 4 +- .../greenart7c3/nostrsigner/ui/LoginScreen.kt | 45 ++++++++----------- .../greenart7c3/nostrsigner/ui/MainScreen.kt | 8 ++-- 5 files changed, 23 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/MainActivity.kt b/app/src/main/java/com/greenart7c3/nostrsigner/MainActivity.kt index cf309616..12a99d36 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/MainActivity.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/MainActivity.kt @@ -149,7 +149,6 @@ class MainActivity : AppCompatActivity() { intent = IntentWrapper(intent), packageName = packageName, appName = appName, - mainViewModel = mainViewModel, bunkerRequests = bunkerRequests.value, navController = NavHostControllerWrapper(navController), ) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/SignerActivity.kt b/app/src/main/java/com/greenart7c3/nostrsigner/SignerActivity.kt index 6ecc46e7..94e753d7 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/SignerActivity.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/SignerActivity.kt @@ -165,7 +165,6 @@ class SignerActivity : AppCompatActivity() { intent = IntentWrapper(intent), packageName = packageName, appName = appName, - mainViewModel = mainViewModel, bunkerRequests = bunkerRequests.value, navController = NavHostControllerWrapper(navController), isExternalRequest = true, diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/AccountScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/AccountScreen.kt index 7955e214..b9ff6b7c 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/AccountScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/AccountScreen.kt @@ -33,7 +33,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.navigation.compose.rememberNavController import com.greenart7c3.nostrsigner.Amber -import com.greenart7c3.nostrsigner.MainViewModel import com.greenart7c3.nostrsigner.R import com.greenart7c3.nostrsigner.models.AmberBunkerRequest import com.greenart7c3.nostrsigner.models.IntentResultType @@ -49,7 +48,6 @@ fun AccountScreen( intent: IntentWrapper, packageName: String?, appName: String?, - mainViewModel: MainViewModel, bunkerRequests: ImmutableList, navController: NavHostControllerWrapper, isExternalRequest: Boolean = false, @@ -68,7 +66,7 @@ fun AccountScreen( when (state) { is AccountState.LoggedOff -> { val newNavController = rememberNavController() - MainLoginPage(accountStateViewModel, newNavController) + MainLoginPage(accountStateViewModel, NavHostControllerWrapper(newNavController)) } is AccountState.LoggedIn -> { val intents by IntentUtils.intents.collectAsState(initial = persistentListOf()) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/LoginScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/LoginScreen.kt index 7938cfac..44630345 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/LoginScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/LoginScreen.kt @@ -100,8 +100,6 @@ import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import androidx.navigation.NavController -import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import com.greenart7c3.nostrsigner.Amber @@ -121,7 +119,6 @@ import com.vitorpamplona.quartz.nip06KeyDerivation.Bip39Mnemonics import com.vitorpamplona.quartz.nip06KeyDerivation.Nip06 import com.vitorpamplona.quartz.nip19Bech32.toNpub import com.vitorpamplona.quartz.utils.RandomInstance -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -130,8 +127,7 @@ import kotlinx.coroutines.launch @SuppressLint("ConfigurationScreenWidthHeight") @Composable fun MainPage( - scope: CoroutineScope, - navController: NavController, + navHostControllerWrapper: NavHostControllerWrapper, accountViewModel: AccountStateViewModel, ) { var isLoading by remember { mutableStateOf(false) } @@ -160,7 +156,7 @@ fun MainPage( Amber.instance.applicationIOScope.launch { if (hasAccounts) { Amber.instance.applicationIOScope.launch(Dispatchers.Main) { - navController.navigate(Route.Applications.route) { + navHostControllerWrapper.navController.navigate(Route.Applications.route) { popUpTo(0) } } @@ -294,8 +290,8 @@ fun MainPage( contentColor = Color(0xFF4C4C4C), textColor = MaterialTheme.colorScheme.primary, onClick = { - scope.launch { - navController.navigate("loginPage") + Amber.instance.applicationIOScope.launch(Dispatchers.Main) { + navHostControllerWrapper.navController.navigate("loginPage") } }, text = stringResource(R.string.add_a_key), @@ -303,8 +299,8 @@ fun MainPage( AmberButton( onClick = { - scope.launch { - navController.navigate("create") + Amber.instance.applicationIOScope.launch(Dispatchers.Main) { + navHostControllerWrapper.navController.navigate("create") } }, text = stringResource(R.string.generate_a_new_key), @@ -358,20 +354,17 @@ fun MainPage( @Composable fun MainLoginPage( accountViewModel: AccountStateViewModel, - navController: NavHostController, + navHostControllerWrapper: NavHostControllerWrapper, ) { - val scope = rememberCoroutineScope() - NavHost( - navController, + navHostControllerWrapper.navController, startDestination = "login", ) { composable( "login", content = { MainPage( - scope = scope, - navController = navController, + navHostControllerWrapper = navHostControllerWrapper, accountViewModel = accountViewModel, ) }, @@ -382,8 +375,7 @@ fun MainLoginPage( content = { SignUpPage( accountViewModel = accountViewModel, - scope = scope, - navController = navController, + navHostControllerWrapper = navHostControllerWrapper, onFinish = { Amber.instance.applicationIOScope.launch { Amber.instance.profileSubscription.updateFilter() @@ -399,7 +391,7 @@ fun MainLoginPage( content = { LoginPage( accountViewModel = accountViewModel, - navController = navController, + navHostControllerWrapper = navHostControllerWrapper, onFinish = {}, ) }, @@ -412,10 +404,10 @@ fun MainLoginPage( @Composable fun SignUpPage( accountViewModel: AccountStateViewModel, - scope: CoroutineScope, - navController: NavController, + navHostControllerWrapper: NavHostControllerWrapper, onFinish: () -> Unit, ) { + val scope = rememberCoroutineScope() var loading by remember { mutableStateOf(false) } val configuration = LocalConfiguration.current val screenWidthDp = configuration.screenWidthDp.dp @@ -468,8 +460,8 @@ fun SignUpPage( state.animateScrollToPage(state.currentPage - 1) } } else { - scope.launch { - navController.navigateUp() + Amber.instance.applicationIOScope.launch(Dispatchers.Main) { + navHostControllerWrapper.navController.navigateUp() } } }, @@ -490,6 +482,7 @@ fun SignUpPage( state = state, userScrollEnabled = false, ) { page -> + val scope = rememberCoroutineScope() when (page) { 0 -> { val scrollState = rememberScrollState() @@ -801,7 +794,7 @@ fun SignUpPage( @Composable fun LoginPage( accountViewModel: AccountStateViewModel, - navController: NavController, + navHostControllerWrapper: NavHostControllerWrapper, onFinish: () -> Unit, ) { var isLoading by remember { mutableStateOf(false) } @@ -861,7 +854,7 @@ fun LoginPage( } } else { scope.launch { - navController.navigateUp() + navHostControllerWrapper.navController.navigateUp() } } }, @@ -1174,7 +1167,7 @@ fun LoginPage( AmberButton( enabled = if (isMnemonicMode) { - mnemonicWords.all { it.isNotBlank() } + mnemonicWords.all { word -> word.isNotBlank() } } else { key.value.text.isNotBlank() && !(needsPassword.value && password.value.text.isBlank()) }, diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt index be9c5d0d..311b6f16 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt @@ -315,8 +315,7 @@ fun MainScreen( "login", content = { MainPage( - scope = scope, - navController = navController.navController, + navHostControllerWrapper = navController, accountViewModel = accountStateViewModel, ) }, @@ -327,8 +326,7 @@ fun MainScreen( content = { SignUpPage( accountViewModel = accountStateViewModel, - scope = scope, - navController = navController.navController, + navHostControllerWrapper = navController, onFinish = { Amber.instance.applicationIOScope.launch { Amber.instance.profileSubscription.updateFilter() @@ -347,7 +345,7 @@ fun MainScreen( content = { LoginPage( accountViewModel = accountStateViewModel, - navController = navController.navController, + navHostControllerWrapper = navController, onFinish = { navController.navController.navigate(Route.Applications.route) { popUpTo(0)