Skip to content

Commit 185fc2b

Browse files
committed
Fix WIFI state permission again
1 parent 4504447 commit 185fc2b

5 files changed

Lines changed: 69 additions & 38 deletions

File tree

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
1313
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
1414
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
15-
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
15+
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
1616

1717
<uses-permission
1818
android:name="android.permission.QUERY_ALL_PACKAGES"
@@ -144,7 +144,7 @@
144144
<service
145145
android:name=".bg.VPNService"
146146
android:exported="false"
147-
android:foregroundServiceType="specialUse|location"
147+
android:foregroundServiceType="specialUse"
148148
android:permission="android.permission.BIND_VPN_SERVICE">
149149
<intent-filter>
150150
<action android:name="android.net.VpnService" />
@@ -156,7 +156,7 @@
156156
<service
157157
android:name=".bg.ProxyService"
158158
android:exported="false"
159-
android:foregroundServiceType="specialUse|location">
159+
android:foregroundServiceType="specialUse">
160160
<property
161161
android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
162162
android:value="proxy" />

app/src/main/java/io/nekohasekai/sfa/bg/BoxService.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.content.BroadcastReceiver
55
import android.content.Context
66
import android.content.Intent
77
import android.content.IntentFilter
8+
import android.content.pm.PackageManager
89
import android.os.Build
910
import android.os.IBinder
1011
import android.os.ParcelFileDescriptor
@@ -169,6 +170,18 @@ class BoxService(
169170
}
170171

171172
newService.start()
173+
174+
if (newService.needWIFIState()) {
175+
if (ContextCompat.checkSelfPermission(
176+
service, android.Manifest.permission.ACCESS_BACKGROUND_LOCATION
177+
) != PackageManager.PERMISSION_GRANTED
178+
) {
179+
newService.close()
180+
stopAndAlert(Alert.RequestLocationPermission)
181+
return
182+
}
183+
}
184+
172185
boxService = newService
173186
commandServer?.setService(boxService)
174187
status.postValue(Status.Started)

app/src/main/java/io/nekohasekai/sfa/constant/Alert.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package io.nekohasekai.sfa.constant
33
enum class Alert {
44
RequestVPNPermission,
55
RequestNotificationPermission,
6+
RequestLocationPermission,
67
EmptyConfiguration,
78
StartCommandServer,
89
CreateService,

app/src/main/java/io/nekohasekai/sfa/ui/MainActivity.kt

Lines changed: 51 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import android.Manifest
44
import android.annotation.SuppressLint
55
import android.content.Context
66
import android.content.Intent
7-
import android.content.pm.PackageManager
7+
import android.net.Uri
88
import android.net.VpnService
99
import android.os.Bundle
10+
import android.os.Process
1011
import androidx.activity.result.contract.ActivityResultContract
1112
import androidx.activity.result.contract.ActivityResultContracts
12-
import androidx.core.app.ActivityCompat
1313
import androidx.core.content.ContextCompat
1414
import androidx.lifecycle.MutableLiveData
1515
import androidx.lifecycle.lifecycleScope
@@ -194,32 +194,6 @@ class MainActivity : AbstractActivity(), ServiceConnection.Callback {
194194
return
195195
}
196196

197-
// MIUI always return false for shouldShowRequestPermissionRationale
198-
if (!skipRequestLocation && ContextCompat.checkSelfPermission(
199-
this, Manifest.permission.ACCESS_FINE_LOCATION
200-
) != PackageManager.PERMISSION_GRANTED
201-
) {
202-
if (!ActivityCompat.shouldShowRequestPermissionRationale(
203-
this, Manifest.permission.ACCESS_FINE_LOCATION
204-
)
205-
) {
206-
MaterialAlertDialogBuilder(this)
207-
.setTitle(R.string.location_permission_title)
208-
.setMessage(R.string.location_permission_description)
209-
.setPositiveButton(R.string.ok) { _, _ ->
210-
locationPermissionLauncher.launch(
211-
arrayOf(
212-
Manifest.permission.ACCESS_COARSE_LOCATION,
213-
Manifest.permission.ACCESS_FINE_LOCATION,
214-
)
215-
)
216-
}
217-
.setCancelable(false)
218-
.show()
219-
return
220-
}
221-
}
222-
223197
lifecycleScope.launch(Dispatchers.IO) {
224198
if (Settings.rebuildServiceMode()) {
225199
reconnect()
@@ -246,12 +220,6 @@ class MainActivity : AbstractActivity(), ServiceConnection.Callback {
246220
}
247221
}
248222

249-
private val locationPermissionLauncher = registerForActivityResult(
250-
ActivityResultContracts.RequestMultiplePermissions()
251-
) {
252-
startService(true)
253-
}
254-
255223
private val prepareLauncher = registerForActivityResult(PrepareService()) {
256224
if (it) {
257225
startService()
@@ -290,6 +258,11 @@ class MainActivity : AbstractActivity(), ServiceConnection.Callback {
290258
}
291259

292260
override fun onServiceAlert(type: Alert, message: String?) {
261+
when (type) {
262+
Alert.RequestLocationPermission -> return requestLocationPermission()
263+
else -> {}
264+
}
265+
293266
val builder = MaterialAlertDialogBuilder(this)
294267
builder.setPositiveButton(R.string.ok, null)
295268
when (type) {
@@ -320,10 +293,54 @@ class MainActivity : AbstractActivity(), ServiceConnection.Callback {
320293
builder.setMessage(message)
321294

322295
}
296+
297+
else -> {}
323298
}
324299
builder.show()
325300
}
326301

302+
private fun requestLocationPermission() {
303+
MaterialAlertDialogBuilder(this)
304+
.setTitle(R.string.location_permission_title)
305+
.setMessage(R.string.location_permission_description)
306+
.setPositiveButton(R.string.ok) { _, _ ->
307+
openPermissionSettings()
308+
}
309+
.setCancelable(false)
310+
.show()
311+
}
312+
313+
private fun openPermissionSettings() {
314+
if (!getSystemProperty("ro.miui.ui.version.name").isNullOrBlank()) {
315+
val intent = Intent("miui.intent.action.APP_PERM_EDITOR")
316+
intent.putExtra("extra_package_uid", Process.myUid())
317+
intent.putExtra("extra_pkgname", packageName)
318+
try {
319+
startActivity(intent)
320+
return
321+
} catch (ignored: Exception) {
322+
}
323+
}
324+
325+
try {
326+
val intent = Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
327+
intent.data = Uri.parse("package:$packageName")
328+
startActivity(intent)
329+
} catch (e: Exception) {
330+
errorDialogBuilder(e).show()
331+
}
332+
}
333+
334+
@SuppressLint("PrivateApi")
335+
fun getSystemProperty(key: String?): String? {
336+
try {
337+
return Class.forName("android.os.SystemProperties").getMethod("get", String::class.java)
338+
.invoke(null, key) as String
339+
} catch (ignored: Exception) {
340+
}
341+
return null
342+
}
343+
327344
private var paused = false
328345
override fun onPause() {
329346
super.onPause()

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,6 @@
146146
<string name="other_methods">Other methods</string>
147147
<string name="action_start">Start</string>
148148
<string name="location_permission_title">Location permission</string>
149-
<string name="location_permission_description">sing-box uses the location permission to provide `wifi_ssid` and `wifi_bssid` routing rule entries, deny it if you don\'t need this feature.</string>
149+
<string name="location_permission_description">sing-box uses the **background location** permission to implement the `wifi_ssid` and `wifi_bssid` routing rule items that **you are using**.</string>
150150

151151
</resources>

0 commit comments

Comments
 (0)