diff --git a/app/release.keystore b/app/release.keystore index ab1a9fb2..acd2f0ec 100644 Binary files a/app/release.keystore and b/app/release.keystore differ diff --git a/app/src/main/java/io/nekohasekai/sfa/bg/BoxService.kt b/app/src/main/java/io/nekohasekai/sfa/bg/BoxService.kt index 36264e87..fadfad60 100644 --- a/app/src/main/java/io/nekohasekai/sfa/bg/BoxService.kt +++ b/app/src/main/java/io/nekohasekai/sfa/bg/BoxService.kt @@ -150,7 +150,6 @@ class BoxService( } DefaultNetworkMonitor.start() - Libbox.registerLocalDNSTransport(LocalResolver) Libbox.setMemoryLimit(!Settings.disableMemoryLimit) val newService = try { @@ -263,7 +262,6 @@ class BoxService( } commandServer?.setService(null) boxService = null - Libbox.registerLocalDNSTransport(null) DefaultNetworkMonitor.stop() commandServer?.apply { 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 a6c6fe0a..068a529c 100644 --- a/app/src/main/java/io/nekohasekai/sfa/bg/PlatformInterfaceWrapper.kt +++ b/app/src/main/java/io/nekohasekai/sfa/bg/PlatformInterfaceWrapper.kt @@ -10,6 +10,7 @@ import android.util.Log import androidx.annotation.RequiresApi import io.nekohasekai.libbox.InterfaceUpdateListener import io.nekohasekai.libbox.Libbox +import io.nekohasekai.libbox.LocalDNSTransport import io.nekohasekai.libbox.NetworkInterfaceIterator import io.nekohasekai.libbox.PlatformInterface import io.nekohasekai.libbox.StringIterator @@ -20,6 +21,9 @@ import java.net.Inet6Address import java.net.InetSocketAddress import java.net.InterfaceAddress import java.net.NetworkInterface +import java.security.KeyStore +import kotlin.io.encoding.Base64 +import kotlin.io.encoding.ExperimentalEncodingApi import io.nekohasekai.libbox.NetworkInterface as LibboxNetworkInterface interface PlatformInterfaceWrapper : PlatformInterface { @@ -169,6 +173,27 @@ interface PlatformInterfaceWrapper : PlatformInterface { return WIFIState(ssid, wifiInfo.bssid) } + override fun localDNSTransport(): LocalDNSTransport? { + return LocalResolver + } + + @OptIn(ExperimentalEncodingApi::class) + override fun systemCertificates(): StringIterator { + val certificates = mutableListOf() + val keyStore = KeyStore.getInstance("AndroidCAStore") + if (keyStore != null) { + keyStore.load(null, null); + val aliases = keyStore.aliases() + while (aliases.hasMoreElements()) { + val cert = keyStore.getCertificate(aliases.nextElement()) + certificates.add( + "-----BEGIN CERTIFICATE-----\n" + Base64.encode(cert.encoded) + "\n-----END CERTIFICATE-----" + ) + } + } + return StringArray(certificates.iterator()) + } + private class InterfaceArray(private val iterator: Iterator) : NetworkInterfaceIterator { diff --git a/app/src/main/java/io/nekohasekai/sfa/ui/main/DashboardFragment.kt b/app/src/main/java/io/nekohasekai/sfa/ui/main/DashboardFragment.kt index 1068f2d7..9a836791 100644 --- a/app/src/main/java/io/nekohasekai/sfa/ui/main/DashboardFragment.kt +++ b/app/src/main/java/io/nekohasekai/sfa/ui/main/DashboardFragment.kt @@ -138,9 +138,11 @@ class DashboardFragment : Fragment(R.layout.fragment_dashboard) { builder.setPositiveButton(R.string.ok) { _, _ -> loopShowDeprecatedNotes(notes) } - builder.setNeutralButton(R.string.service_error_deprecated_warning_documentation) { _, _ -> - requireContext().launchCustomTab(note.migrationLink) - loopShowDeprecatedNotes(notes) + if (!note.migrationLink.isNullOrBlank()) { + builder.setNeutralButton(R.string.service_error_deprecated_warning_documentation) { _, _ -> + requireContext().launchCustomTab(note.migrationLink) + loopShowDeprecatedNotes(notes) + } } builder.show() } diff --git a/version.properties b/version.properties index b056faa3..0f234088 100644 --- a/version.properties +++ b/version.properties @@ -1,3 +1,3 @@ -VERSION_CODE=478 -VERSION_NAME=1.11.3 -GO_VERSION=go1.23.5 +VERSION_CODE=484 +VERSION_NAME=1.12.0-alpha.11 +GO_VERSION=go1.24.0