diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index fb0c563..503cd67 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -66,6 +66,13 @@ android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> + 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 8fa95c1..7e68355 100644 --- a/android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt +++ b/android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt @@ -5,10 +5,51 @@ import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.Result import androidx.annotation.NonNull +import android.content.pm.PackageManager +import android.os.Bundle +import rikka.shizuku.Shizuku +import rikka.shizuku.Shizuku.OnBinderDeadListener +import rikka.shizuku.Shizuku.OnBinderReceivedListener +import rikka.shizuku.Shizuku.OnRequestPermissionResultListener import com.topjohnwu.superuser.Shell class MainActivity: FlutterActivity() { private val installersChannel = "installers" + private val SHIZUKU_PERMISSION_REQUEST_CODE = 839 // random num + private var shizukuBinderAlive = false + private var shizukuPermissionGranted = false + + private val shizukuBinderReceivedListener = OnBinderReceivedListener { + if(!Shizuku.isPreV11()) { // pre 11 unsupported + shizukuBinderAlive = true + } + } + + private val shizukuBinderDeadListener = OnBinderDeadListener { shizukuBinderAlive = false } + + private val shizukuRequestPermissionResultListener = OnRequestPermissionResultListener { + requestCode: Int, grantResult: Int -> + if(requestCode == SHIZUKU_PERMISSION_REQUEST_CODE) { + shizukuPermissionGranted = grantResult == PackageManager.PERMISSION_GRANTED + } + } + + private fun shizukuCheckPermission() { + if(Shizuku.isPreV11()) { + shizukuPermissionGranted = false + } else if (Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) { + shizukuPermissionGranted = true + } else if (Shizuku.shouldShowRequestPermissionRationale()) { // Deny and don't ask again + shizukuPermissionGranted = false + } else { + Shizuku.requestPermission(SHIZUKU_PERMISSION_REQUEST_CODE) + } + } + + private fun installWithShizuku(apkFilePath: String, result: Result) { + shizukuCheckPermission() + result.success(0) + } private fun installWithRoot(apkFilePath: String, result: Result) { Shell.sh("pm install -r -t " + apkFilePath).submit { out -> @@ -20,10 +61,6 @@ class MainActivity: FlutterActivity() { } } - private fun installWithShizuku(apkFilePath: String, result: Result) { - val a = 1 - } - override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, installersChannel).setMethodCallHandler { @@ -36,4 +73,18 @@ class MainActivity: FlutterActivity() { } } } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + Shizuku.addBinderReceivedListener(shizukuBinderReceivedListener) + Shizuku.addBinderDeadListener(shizukuBinderDeadListener) + Shizuku.addRequestPermissionResultListener(shizukuRequestPermissionResultListener) + } + + override fun onDestroy() { + super.onDestroy() + Shizuku.removeBinderReceivedListener(shizukuBinderReceivedListener) + Shizuku.removeBinderDeadListener(shizukuBinderDeadListener) + Shizuku.removeRequestPermissionResultListener(shizukuRequestPermissionResultListener) + } }