Improve shizuku error handling

This commit is contained in:
Maksim Karasev 2024-06-14 16:31:10 +03:00
parent c5f2aed736
commit fdd711eef4

View file

@ -108,15 +108,7 @@ class MainActivity : AppCompatActivity(), AddServerDialogFragment.NoticeDialogLi
Shizuku.requestPermission(1) Shizuku.requestPermission(1)
} }
} else { } else {
// if shizuku permission is granted, but WRITE_SECURE_SETTINGS is not, grant it grantPermissionWithShizuku()
try {
grantPermissionWithShizuku()
} catch (exception: Exception) {
Log.e("SHIZUKU", "onRequestPermissionResult: ", exception)
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://karasevm.github.io/PrivateDNSAndroid/"))
startActivity(browserIntent)
finish()
}
} }
} else { } else {
if (checkSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS) != PackageManager.PERMISSION_GRANTED) { if (checkSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS) != PackageManager.PERMISSION_GRANTED) {
@ -159,31 +151,48 @@ class MainActivity : AppCompatActivity(), AddServerDialogFragment.NoticeDialogLi
*/ */
private fun grantPermissionWithShizuku() { private fun grantPermissionWithShizuku() {
val packageName = "ru.karasevm.privatednstoggle" val packageName = "ru.karasevm.privatednstoggle"
if (Build.VERSION.SDK_INT >= 31) { runCatching {
HiddenApiBypass.addHiddenApiExemptions( if (Build.VERSION.SDK_INT >= 31) {
"Landroid/permission" HiddenApiBypass.addHiddenApiExemptions("Landroid/permission")
) val binder =
val binder = ShizukuBinderWrapper(SystemServiceHelper.getSystemService("permissionmgr"))
ShizukuBinderWrapper(SystemServiceHelper.getSystemService("permissionmgr")) val pm = IPermissionManager.Stub.asInterface(binder)
val pm = IPermissionManager.Stub.asInterface(binder) runCatching {
pm.grantRuntimePermission( pm.grantRuntimePermission(
packageName, packageName,
Manifest.permission.WRITE_SECURE_SETTINGS, Manifest.permission.WRITE_SECURE_SETTINGS,
0 0
) )
} else { }.onFailure { _ ->
val binder = ShizukuBinderWrapper(SystemServiceHelper.getSystemService("package")) if (Build.VERSION.SDK_INT >= 34) {
val pm = IPackageManager.Stub.asInterface(binder) pm.grantRuntimePermission(
pm.grantRuntimePermission( packageName,
packageName, Manifest.permission.WRITE_SECURE_SETTINGS,
Manifest.permission.WRITE_SECURE_SETTINGS, applicationContext.deviceId,
0 0
) )
} }
if (checkSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS) != PackageManager.PERMISSION_GRANTED) { }
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://karasevm.github.io/PrivateDNSAndroid/")) } else {
startActivity(browserIntent) val binder = ShizukuBinderWrapper(SystemServiceHelper.getSystemService("package"))
finish() val pm = IPackageManager.Stub.asInterface(binder)
pm.grantRuntimePermission(
packageName,
Manifest.permission.WRITE_SECURE_SETTINGS,
0
)
}
}.onFailure { e ->
Log.e("SHIZUKU", "onRequestPermissionResult: ", e)
}.also {
if (checkSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS) != PackageManager.PERMISSION_GRANTED) {
val browserIntent = Intent(
Intent.ACTION_VIEW,
Uri.parse("https://karasevm.github.io/PrivateDNSAndroid/")
)
startActivity(browserIntent)
finish()
}
} }
} }
@SuppressLint("PrivateApi") @SuppressLint("PrivateApi")
@ -191,15 +200,7 @@ class MainActivity : AppCompatActivity(), AddServerDialogFragment.NoticeDialogLi
val isGranted = grantResult == PackageManager.PERMISSION_GRANTED val isGranted = grantResult == PackageManager.PERMISSION_GRANTED
if (isGranted) { if (isGranted) {
try { grantPermissionWithShizuku()
grantPermissionWithShizuku()
} catch (exception: Exception) {
Log.e("SHIZUKU", "onRequestPermissionResult: ", exception)
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://karasevm.github.io/PrivateDNSAndroid/"))
startActivity(browserIntent)
finish()
}
} else if (checkSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS) != PackageManager.PERMISSION_GRANTED) { } else if (checkSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS) != PackageManager.PERMISSION_GRANTED) {
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://karasevm.github.io/PrivateDNSAndroid/")) val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://karasevm.github.io/PrivateDNSAndroid/"))
startActivity(browserIntent) startActivity(browserIntent)