lokinet-flutter-app/lokinet_lib/android/src/main/kotlin/io/oxen/lokinet_lib/LokinetLibPlugin.kt

97 lines
3.7 KiB
Kotlin

package io.oxen.lokinet_lib
import android.app.Activity.RESULT_OK
import android.content.Intent
import android.net.VpnService
import androidx.annotation.NonNull
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.embedding.engine.plugins.activity.ActivityAware
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.PluginRegistry
import network.loki.lokinet.LokinetDaemon
/** LokinetLibPlugin */
class LokinetLibPlugin : FlutterPlugin, MethodCallHandler, ActivityAware {
private lateinit var activityBinding: ActivityPluginBinding
/// The MethodChannel that will the communication between Flutter and native Android
///
/// This local reference serves to register the plugin with the Flutter Engine and unregister it
/// when the Flutter Engine is detached from the Activity
private lateinit var channel: MethodChannel
override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
System.loadLibrary("lokinet-android")
channel = MethodChannel(flutterPluginBinding.binaryMessenger, "lokinet_lib")
channel.setMethodCallHandler(this)
}
override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
channel.setMethodCallHandler(null)
}
override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: MethodChannel.Result) {
when (call.method) {
"prepare" -> {
val intent = VpnService.prepare(activityBinding.activity.applicationContext)
if (intent != null) {
var listener: PluginRegistry.ActivityResultListener? = null
listener = PluginRegistry.ActivityResultListener { req, res, _ ->
if (req == 0 && res == RESULT_OK) {
result.success(true)
} else {
result.success(false)
}
listener?.let { activityBinding.removeActivityResultListener(it) };
true
}
activityBinding.addActivityResultListener(listener)
activityBinding.activity.startActivityForResult(intent, 0)
} else {
// If intent is null, already prepared
result.success(true)
}
}
"prepared" -> {
val intent = VpnService.prepare(activityBinding.activity.applicationContext)
result.success(intent == null)
}
"connect" -> {
val intent = VpnService.prepare(activityBinding.activity.applicationContext)
if (intent != null) {
// Not prepared yet
result.success(false)
return
}
activityBinding.activity.applicationContext.startService(
Intent(
activityBinding.activity.applicationContext,
LokinetDaemon::class.java
)
)
result.success(true);
}
else -> result.notImplemented()
}
}
override fun onAttachedToActivity(binding: ActivityPluginBinding) {
activityBinding = binding
}
override fun onDetachedFromActivity() {}
override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
activityBinding = binding
}
override fun onDetachedFromActivityForConfigChanges() {}
}