diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 91b99a7..ae4c0d9 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,6 +9,9 @@
+
+
+
()!! }
val notificationManager by lazy { application.getSystemService()!! }
+ val wifiManager by lazy { application.getSystemService()!! }
}
}
\ No newline at end of file
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 e502370..fd13a46 100644
--- a/app/src/main/java/io/nekohasekai/sfa/bg/PlatformInterfaceWrapper.kt
+++ b/app/src/main/java/io/nekohasekai/sfa/bg/PlatformInterfaceWrapper.kt
@@ -9,6 +9,7 @@ import io.nekohasekai.libbox.NetworkInterfaceIterator
import io.nekohasekai.libbox.PlatformInterface
import io.nekohasekai.libbox.StringIterator
import io.nekohasekai.libbox.TunOptions
+import io.nekohasekai.libbox.WIFIState
import io.nekohasekai.sfa.Application
import java.net.Inet6Address
import java.net.InetSocketAddress
@@ -101,6 +102,15 @@ interface PlatformInterfaceWrapper : PlatformInterface {
override fun clearDNSCache() {
}
+ override fun readWIFIState(): WIFIState? {
+ val wifiInfo = Application.wifiManager.connectionInfo ?: return null
+ var ssid = wifiInfo.ssid
+ if (ssid.startsWith("\"") && ssid.endsWith("\"")) {
+ ssid = ssid.substring(1, ssid.length - 1)
+ }
+ return WIFIState(ssid, wifiInfo.bssid)
+ }
+
private class InterfaceArray(private val iterator: Enumeration) :
NetworkInterfaceIterator {
diff --git a/app/src/main/java/io/nekohasekai/sfa/ui/MainActivity.kt b/app/src/main/java/io/nekohasekai/sfa/ui/MainActivity.kt
index b07a2d0..fe222b3 100644
--- a/app/src/main/java/io/nekohasekai/sfa/ui/MainActivity.kt
+++ b/app/src/main/java/io/nekohasekai/sfa/ui/MainActivity.kt
@@ -4,10 +4,12 @@ import android.Manifest
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
+import android.content.pm.PackageManager
import android.net.VpnService
import android.os.Bundle
import androidx.activity.result.contract.ActivityResultContract
import androidx.activity.result.contract.ActivityResultContracts
+import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.lifecycleScope
@@ -187,6 +189,22 @@ class MainActivity : AbstractActivity(), ServiceConnection.Callback {
notificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
return
}
+
+ if (ContextCompat.checkSelfPermission(
+ this, Manifest.permission.ACCESS_FINE_LOCATION
+ ) != PackageManager.PERMISSION_GRANTED
+ ) {
+ if (!ActivityCompat.shouldShowRequestPermissionRationale(
+ this, Manifest.permission.ACCESS_FINE_LOCATION
+ )
+ ) {
+ fineLocationPermissionLauncher.launch(
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+ }
+ }
+
+
lifecycleScope.launch(Dispatchers.IO) {
if (Settings.rebuildServiceMode()) {
reconnect()
@@ -213,6 +231,12 @@ class MainActivity : AbstractActivity(), ServiceConnection.Callback {
}
}
+ private val fineLocationPermissionLauncher = registerForActivityResult(
+ ActivityResultContracts.RequestPermission()
+ ) {
+ startService()
+ }
+
private val prepareLauncher = registerForActivityResult(PrepareService()) {
if (it) {
startService()
diff --git a/build.gradle b/build.gradle
index f0a00f6..475d771 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,8 +6,8 @@ buildscript {
}
plugins {
- id 'com.android.application' version '8.1.3' apply false
- id 'com.android.library' version '8.1.3' apply false
+ id 'com.android.application' version '8.1.4' apply false
+ id 'com.android.library' version '8.1.4' apply false
id 'org.jetbrains.kotlin.android' version '1.9.0' apply false
id 'com.google.devtools.ksp' version '1.9.0-1.0.12' apply false
id 'com.github.triplet.play' version '3.8.4' apply false