diff --git a/android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt b/android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt index 72c22cb..af2da43 100644 --- a/android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt +++ b/android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt @@ -30,19 +30,20 @@ class MainActivity: FlutterActivity() { private var installersChannel: MethodChannel? = null private val SHIZUKU_PERMISSION_REQUEST_CODE = (10..200).random() - private fun shizukuCheckPermission() { + private fun shizukuCheckPermission(result: Result) { try { if (Shizuku.isPreV11()) { // Unsupported - installersChannel!!.invokeMethod("resPermShizuku", mapOf("res" to -1)) + result.success(-1) } else if (Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) { - installersChannel!!.invokeMethod("resPermShizuku", mapOf("res" to 1)) + result.success(1) } else if (Shizuku.shouldShowRequestPermissionRationale()) { // Deny and don't ask again - installersChannel!!.invokeMethod("resPermShizuku", mapOf("res" to 0)) + result.success(0) } else { Shizuku.requestPermission(SHIZUKU_PERMISSION_REQUEST_CODE) + result.success(-2) } } catch (_: Exception) { // If shizuku not running - installersChannel!!.invokeMethod("resPermShizuku", mapOf("res" to -1)) + result.success(-1) } } @@ -150,8 +151,7 @@ class MainActivity: FlutterActivity() { installersChannel!!.setMethodCallHandler { call, result -> if (call.method == "checkPermissionShizuku") { - shizukuCheckPermission() - result.success(0) + shizukuCheckPermission(result) } else if (call.method == "checkPermissionRoot") { rootCheckPermission(result) } else if (call.method == "installWithShizuku") { diff --git a/lib/providers/installers_provider.dart b/lib/providers/installers_provider.dart index b8ecd2e..c42e1b0 100644 --- a/lib/providers/installers_provider.dart +++ b/lib/providers/installers_provider.dart @@ -7,7 +7,7 @@ class Installers { static int _resPermShizuku = -2; // not set static Future waitWhile(bool Function() test, - [Duration pollInterval = const Duration(milliseconds: 100)]) { + [Duration pollInterval = const Duration(milliseconds: 250)]) { var completer = Completer(); check() { if (test()) { @@ -31,10 +31,12 @@ class Installers { _channel.setMethodCallHandler(handleCalls); _callbacksApplied = true; } - await _channel.invokeMethod('checkPermissionShizuku'); - await waitWhile(() => _resPermShizuku == -2); - int res = _resPermShizuku; - _resPermShizuku = -2; + int res = await _channel.invokeMethod('checkPermissionShizuku'); + if(res == -2) { + await waitWhile(() => _resPermShizuku == -2); + res = _resPermShizuku; + _resPermShizuku = -2; + } return res; }