From eb3bdfa4151ad68e670a16a43688edd7705af1b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Sat, 18 Nov 2023 14:40:56 +0800 Subject: [PATCH] Add read WIFI state support --- app/src/main/AndroidManifest.xml | 3 +++ .../java/io/nekohasekai/sfa/Application.kt | 2 ++ .../sfa/bg/PlatformInterfaceWrapper.kt | 10 ++++++++ .../io/nekohasekai/sfa/ui/MainActivity.kt | 24 +++++++++++++++++++ build.gradle | 4 ++-- 5 files changed, 41 insertions(+), 2 deletions(-) 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