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)
+ }
}