Compare commits
2
Commits
ae06a58013
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0e35a794c9 | ||
|
|
5ffb5a2dbb |
No files matched your search
@@ -45,8 +45,8 @@ android {
|
|||||||
minSdk = 24
|
minSdk = 24
|
||||||
targetSdk = 36
|
targetSdk = 36
|
||||||
|
|
||||||
versionCode 168
|
versionCode 169
|
||||||
versionName "2.19.0"
|
versionName "2.19.1"
|
||||||
|
|
||||||
/* Base URL of the update storage, trailing slash included */
|
/* Base URL of the update storage, trailing slash included */
|
||||||
buildConfigField "String", "UPDATE_BASE_URL", "\"${updateBaseUrl}\""
|
buildConfigField "String", "UPDATE_BASE_URL", "\"${updateBaseUrl}\""
|
||||||
|
|||||||
+17
-8
@@ -124,10 +124,23 @@ fun RouteCheckScreen(onBack: () -> Unit, initialMode: RouteCheckMode = RouteChec
|
|||||||
var result by remember { mutableStateOf<CheckResult?>(null) }
|
var result by remember { mutableStateOf<CheckResult?>(null) }
|
||||||
var recent by remember { mutableStateOf(prefs.getString(PREF_RECENT, "")!!.split('\n').filter { it.isNotBlank() }) }
|
var recent by remember { mutableStateOf(prefs.getString(PREF_RECENT, "")!!.split('\n').filter { it.isNotBlank() }) }
|
||||||
val rulesActive = remember { CharonVpnService.isUserspaceRoutingEnabled(context) }
|
val rulesActive = remember { CharonVpnService.isUserspaceRoutingEnabled(context) }
|
||||||
val apps by produceState<List<InstalledApp>>(emptyList(), mode) {
|
var apps by remember { mutableStateOf<List<InstalledApp>>(emptyList()) }
|
||||||
if (mode == RouteCheckMode.APP && value.isEmpty())
|
|
||||||
|
/** The installed apps; loads them on first use, so a check never runs against a list that is still empty. */
|
||||||
|
suspend fun loadApps(): List<InstalledApp>
|
||||||
|
{
|
||||||
|
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.SITE -> checkSite(context, manager, input, rulesActive)
|
||||||
RouteCheckMode.IP -> checkIp(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
|
?.let { CheckResult.App(it) } ?: CheckResult.BadInput
|
||||||
}
|
}
|
||||||
if (result !is CheckResult.BadInput)
|
if (result !is CheckResult.BadInput)
|
||||||
@@ -173,10 +186,6 @@ fun RouteCheckScreen(onBack: () -> Unit, initialMode: RouteCheckMode = RouteChec
|
|||||||
{
|
{
|
||||||
if (initialQuery.isNotBlank())
|
if (initialQuery.isNotBlank())
|
||||||
{
|
{
|
||||||
if (mode == RouteCheckMode.APP)
|
|
||||||
{
|
|
||||||
delay(300)
|
|
||||||
}
|
|
||||||
run()
|
run()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# SHX VPN для Android
|
# SHX VPN для Android
|
||||||
|
|
||||||
Форк Android-клиента strongSwan (IKEv2/IPsec), пакет `one.shx.strongswan.ext`. Текущая версия — **2.19.0 (versionCode 168)**.
|
Форк Android-клиента strongSwan (IKEv2/IPsec), пакет `one.shx.strongswan.ext`. Текущая версия — **2.19.1 (versionCode 169)**.
|
||||||
Распространяется вне Google Play: APK и манифест обновлений лежат в приватном бакете S3, приложение обновляется само.
|
Распространяется вне Google Play: APK и манифест обновлений лежат в приватном бакете S3, приложение обновляется само.
|
||||||
|
|
||||||
- Дизайн: [design/README.md](design/README.md) — макет «Финал 2026» и соответствие артбордов коду.
|
- Дизайн: [design/README.md](design/README.md) — макет «Финал 2026» и соответствие артбордов коду.
|
||||||
|
|||||||
Reference in new issue
Block a user