@@ -4,12 +4,12 @@ import android.Manifest
44import android.annotation.SuppressLint
55import android.content.Context
66import android.content.Intent
7- import android.content.pm.PackageManager
7+ import android.net.Uri
88import android.net.VpnService
99import android.os.Bundle
10+ import android.os.Process
1011import androidx.activity.result.contract.ActivityResultContract
1112import androidx.activity.result.contract.ActivityResultContracts
12- import androidx.core.app.ActivityCompat
1313import androidx.core.content.ContextCompat
1414import androidx.lifecycle.MutableLiveData
1515import 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()
0 commit comments