diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/RouteCheckScreen.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/RouteCheckScreen.kt index 87dcaa3d9..743843022 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/RouteCheckScreen.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/RouteCheckScreen.kt @@ -124,10 +124,23 @@ fun RouteCheckScreen(onBack: () -> Unit, initialMode: RouteCheckMode = RouteChec var result by remember { mutableStateOf(null) } var recent by remember { mutableStateOf(prefs.getString(PREF_RECENT, "")!!.split('\n').filter { it.isNotBlank() }) } val rulesActive = remember { CharonVpnService.isUserspaceRoutingEnabled(context) } - val apps by produceState>(emptyList(), mode) { - if (mode == RouteCheckMode.APP && value.isEmpty()) + var apps by remember { mutableStateOf>(emptyList()) } + + /** The installed apps; loads them on first use, so a check never runs against a list that is still empty. */ + suspend fun loadApps(): List + { + if (apps.isEmpty()) { - value = withContext(Dispatchers.IO) { DirectApps.loadInstalledApps(context.packageManager, context.packageName) } + apps = withContext(Dispatchers.IO) { DirectApps.loadInstalledApps(context.packageManager, context.packageName) } + } + return apps + } + + LaunchedEffect(mode) + { + if (mode == RouteCheckMode.APP) + { + loadApps() } } @@ -150,7 +163,7 @@ fun RouteCheckScreen(onBack: () -> Unit, initialMode: RouteCheckMode = RouteChec { RouteCheckMode.SITE -> checkSite(context, manager, input, rulesActive) RouteCheckMode.IP -> checkIp(context, manager, input, rulesActive) - RouteCheckMode.APP -> apps.firstOrNull { it.packageName == input || it.label.equals(input, ignoreCase = true) } + RouteCheckMode.APP -> loadApps().firstOrNull { it.packageName == input || it.label.equals(input, ignoreCase = true) } ?.let { CheckResult.App(it) } ?: CheckResult.BadInput } if (result !is CheckResult.BadInput) @@ -173,10 +186,6 @@ fun RouteCheckScreen(onBack: () -> Unit, initialMode: RouteCheckMode = RouteChec { if (initialQuery.isNotBlank()) { - if (mode == RouteCheckMode.APP) - { - delay(300) - } run() } }