diff --git a/app/src/github/java/io/nekohasekai/sfa/vendor/ApkDownloader.kt b/app/src/github/java/io/nekohasekai/sfa/vendor/ApkDownloader.kt index d90e2c7..a0f6b4d 100644 --- a/app/src/github/java/io/nekohasekai/sfa/vendor/ApkDownloader.kt +++ b/app/src/github/java/io/nekohasekai/sfa/vendor/ApkDownloader.kt @@ -2,6 +2,7 @@ package io.nekohasekai.sfa.vendor import io.nekohasekai.libbox.HTTPResponseWriteToProgressHandler import io.nekohasekai.libbox.Libbox +import io.nekohasekai.libbox.writeToWithProgress import io.nekohasekai.sfa.Application import io.nekohasekai.sfa.update.UpdateState import io.nekohasekai.sfa.utils.HTTPClient diff --git a/app/src/main/java/io/nekohasekai/libbox/FDroidStubs.kt b/app/src/main/java/io/nekohasekai/libbox/FDroidStubs.kt new file mode 100644 index 0000000..988dad4 --- /dev/null +++ b/app/src/main/java/io/nekohasekai/libbox/FDroidStubs.kt @@ -0,0 +1,27 @@ +package io.nekohasekai.libbox + +class FDroidMirror( + val url: String, + val name: String, + val country: String, +) + +class FDroidMirrorIterator( + private val items: List, +) { + private var index = 0 + fun hasNext(): Boolean = index < items.size + fun next(): FDroidMirror = items[index++] +} + +class FDroidMirrorPingResult( + val url: String, + val latencyMs: Int, +) + +class FDroidUpdateResult( + val versionCode: Int, + val versionName: String, + val downloadURL: String, + val fileSize: Long, +) diff --git a/app/src/main/java/io/nekohasekai/libbox/HTTPResponseWriteToProgressHandler.kt b/app/src/main/java/io/nekohasekai/libbox/HTTPResponseWriteToProgressHandler.kt new file mode 100644 index 0000000..e4c6c23 --- /dev/null +++ b/app/src/main/java/io/nekohasekai/libbox/HTTPResponseWriteToProgressHandler.kt @@ -0,0 +1,5 @@ +package io.nekohasekai.libbox + +interface HTTPResponseWriteToProgressHandler { + fun update(progress: Long, total: Long) +} diff --git a/app/src/main/java/io/nekohasekai/libbox/LibboxStubs.kt b/app/src/main/java/io/nekohasekai/libbox/LibboxStubs.kt new file mode 100644 index 0000000..fd5278e --- /dev/null +++ b/app/src/main/java/io/nekohasekai/libbox/LibboxStubs.kt @@ -0,0 +1,34 @@ +package io.nekohasekai.libbox + +fun HTTPResponse.writeToWithProgress(path: String, handler: HTTPResponseWriteToProgressHandler) { + writeTo(path) +} + +fun ConnectionOwner.setAndroidPackageNames(names: StringIterator) { + if (names.hasNext()) { + androidPackageName = names.next() + } +} + +fun ProcessInfo.packageNames(): StringIterator? { + val name = packageName ?: return null + if (name.isEmpty()) return null + return object : StringIterator { + private var consumed = false + override fun len(): Int = 1 + override fun hasNext(): Boolean = !consumed + override fun next(): String { consumed = true; return name } + } +} + +fun getFDroidMirrors(): FDroidMirrorIterator { + return FDroidMirrorIterator(emptyList()) +} + +fun pingFDroidMirror(url: String): FDroidMirrorPingResult { + return FDroidMirrorPingResult(url, -1) +} + +fun checkFDroidUpdate(mirrorUrl: String, packageName: String, versionCode: Int, cachePath: String): FDroidUpdateResult? { + return null +} diff --git a/app/src/main/java/io/nekohasekai/libbox/NeighborUpdateListener.kt b/app/src/main/java/io/nekohasekai/libbox/NeighborUpdateListener.kt new file mode 100644 index 0000000..41c7261 --- /dev/null +++ b/app/src/main/java/io/nekohasekai/libbox/NeighborUpdateListener.kt @@ -0,0 +1,3 @@ +package io.nekohasekai.libbox + +interface NeighborUpdateListener diff --git a/app/src/main/java/io/nekohasekai/sfa/bg/PlatformInterfaceWrapper.kt b/app/src/main/java/io/nekohasekai/sfa/bg/PlatformInterfaceWrapper.kt index 7a0be3c..881cc06 100644 --- a/app/src/main/java/io/nekohasekai/sfa/bg/PlatformInterfaceWrapper.kt +++ b/app/src/main/java/io/nekohasekai/sfa/bg/PlatformInterfaceWrapper.kt @@ -16,6 +16,7 @@ import io.nekohasekai.libbox.PlatformInterface import io.nekohasekai.libbox.StringIterator import io.nekohasekai.libbox.TunOptions import io.nekohasekai.libbox.WIFIState +import io.nekohasekai.libbox.setAndroidPackageNames import io.nekohasekai.sfa.Application import java.net.Inet6Address import java.net.InetSocketAddress diff --git a/app/src/main/java/io/nekohasekai/sfa/bg/ProxyService.kt b/app/src/main/java/io/nekohasekai/sfa/bg/ProxyService.kt index 95972c9..c7c565d 100644 --- a/app/src/main/java/io/nekohasekai/sfa/bg/ProxyService.kt +++ b/app/src/main/java/io/nekohasekai/sfa/bg/ProxyService.kt @@ -15,12 +15,10 @@ class ProxyService : override fun onBind(intent: Intent) = service.onBind() override fun onDestroy() = service.onDestroy() - override fun closeNeighborMonitor(listener: NeighborUpdateListener?) { - + fun closeNeighborMonitor(listener: NeighborUpdateListener?) { } override fun sendNotification(notification: Notification) = service.sendNotification(notification) - override fun startNeighborMonitor(listener: NeighborUpdateListener?) { - + fun startNeighborMonitor(listener: NeighborUpdateListener?) { } } diff --git a/app/src/main/java/io/nekohasekai/sfa/bg/VPNService.kt b/app/src/main/java/io/nekohasekai/sfa/bg/VPNService.kt index cfb7534..f1b189e 100644 --- a/app/src/main/java/io/nekohasekai/sfa/bg/VPNService.kt +++ b/app/src/main/java/io/nekohasekai/sfa/bg/VPNService.kt @@ -52,7 +52,7 @@ class VPNService : protect(fd) } - override fun closeNeighborMonitor(listener: NeighborUpdateListener?) { + fun closeNeighborMonitor(listener: NeighborUpdateListener?) { } var systemProxyAvailable = false @@ -186,6 +186,6 @@ class VPNService : } override fun sendNotification(notification: Notification) = service.sendNotification(notification) - override fun startNeighborMonitor(listener: NeighborUpdateListener?) { + fun startNeighborMonitor(listener: NeighborUpdateListener?) { } } diff --git a/app/src/main/java/io/nekohasekai/sfa/compose/model/Connection.kt b/app/src/main/java/io/nekohasekai/sfa/compose/model/Connection.kt index ee5953a..daed4a2 100644 --- a/app/src/main/java/io/nekohasekai/sfa/compose/model/Connection.kt +++ b/app/src/main/java/io/nekohasekai/sfa/compose/model/Connection.kt @@ -1,6 +1,7 @@ package io.nekohasekai.sfa.compose.model import androidx.compose.runtime.Immutable +import io.nekohasekai.libbox.packageNames import io.nekohasekai.sfa.ktx.toList import io.nekohasekai.libbox.Connection as LibboxConnection import io.nekohasekai.libbox.ProcessInfo as LibboxProcessInfo diff --git a/app/src/main/java/io/nekohasekai/sfa/compose/screen/settings/AppSettingsScreen.kt b/app/src/main/java/io/nekohasekai/sfa/compose/screen/settings/AppSettingsScreen.kt index 9c94f63..83f33e1 100644 --- a/app/src/main/java/io/nekohasekai/sfa/compose/screen/settings/AppSettingsScreen.kt +++ b/app/src/main/java/io/nekohasekai/sfa/compose/screen/settings/AppSettingsScreen.kt @@ -84,6 +84,7 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.LifecycleEventEffect import androidx.navigation.NavController import io.nekohasekai.libbox.Libbox +import io.nekohasekai.libbox.getFDroidMirrors import io.nekohasekai.sfa.Application import io.nekohasekai.sfa.BuildConfig import io.nekohasekai.sfa.R @@ -838,7 +839,7 @@ fun AppSettingsScreen(navController: NavController) { supportingContent = { val mirrorUrl = Settings.fdroidMirrorUrl val mirrorName = remember(mirrorUrl) { - val iter = Libbox.getFDroidMirrors() + val iter = getFDroidMirrors() var name: String? = null while (iter.hasNext()) { val m = iter.next() diff --git a/app/src/main/java/io/nekohasekai/sfa/compose/screen/settings/FDroidMirrorScreen.kt b/app/src/main/java/io/nekohasekai/sfa/compose/screen/settings/FDroidMirrorScreen.kt index 1bce659..524eabf 100644 --- a/app/src/main/java/io/nekohasekai/sfa/compose/screen/settings/FDroidMirrorScreen.kt +++ b/app/src/main/java/io/nekohasekai/sfa/compose/screen/settings/FDroidMirrorScreen.kt @@ -52,6 +52,8 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.navigation.NavController import io.nekohasekai.libbox.Libbox +import io.nekohasekai.libbox.getFDroidMirrors +import io.nekohasekai.libbox.pingFDroidMirror import io.nekohasekai.sfa.R import io.nekohasekai.sfa.compose.topbar.OverrideTopBar import io.nekohasekai.sfa.database.Settings @@ -99,7 +101,7 @@ fun FDroidMirrorScreen(navController: NavController) { val builtinMirrors = remember { val mirrors = mutableListOf() - val iter = Libbox.getFDroidMirrors() + val iter = getFDroidMirrors() while (iter.hasNext()) { val m = iter.next() mirrors.add(MirrorEntry(url = m.url, name = m.name, country = m.country)) @@ -132,7 +134,7 @@ fun FDroidMirrorScreen(navController: NavController) { scope.launch { allMirrors.map { mirror -> async(Dispatchers.IO) { - val r = Libbox.pingFDroidMirror(mirror.url) + val r = pingFDroidMirror(mirror.url) withContext(Dispatchers.Main) { if (r.latencyMs < 0) { latencyErrors[r.url] = true diff --git a/app/src/main/java/io/nekohasekai/sfa/update/FDroidUpdateChecker.kt b/app/src/main/java/io/nekohasekai/sfa/update/FDroidUpdateChecker.kt index 98af76f..b068dca 100644 --- a/app/src/main/java/io/nekohasekai/sfa/update/FDroidUpdateChecker.kt +++ b/app/src/main/java/io/nekohasekai/sfa/update/FDroidUpdateChecker.kt @@ -1,7 +1,7 @@ package io.nekohasekai.sfa.update import android.content.Context -import io.nekohasekai.libbox.Libbox +import io.nekohasekai.libbox.checkFDroidUpdate as libboxCheckFDroidUpdate import io.nekohasekai.sfa.database.Settings fun checkFDroidUpdate(context: Context): UpdateInfo? { @@ -9,7 +9,7 @@ fun checkFDroidUpdate(context: Context): UpdateInfo? { @Suppress("DEPRECATION") val versionCode = context.packageManager.getPackageInfo(packageName, 0).versionCode - val result = Libbox.checkFDroidUpdate( + val result = libboxCheckFDroidUpdate( Settings.fdroidMirrorUrl, packageName, versionCode,