package com.plugin.broadcast
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.app.Activity
import app.tauri.annotation.Command
import app.tauri.annotation.InvokeArg
import app.tauri.annotation.TauriPlugin
import app.tauri.plugin.JSObject
import app.tauri.plugin.Plugin
import app.tauri.plugin.Invoke
import java.util.HashMap
@InvokeArg
class RegisterRequest{
var broadcastName: String? = null;
var eventName: String? = null;
}
@InvokeArg
class UnregisterRequest{
var broadcastName: String? = null;
}
@TauriPlugin
class BroadcastPlugin(private val activity: Activity): Plugin(activity) {
private val receivers = HashMap<String, BroadcastReceiver>()
@Command
fun register(invoke: Invoke) {
val args = invoke.parseArgs(RegisterRequest::class.java)
val broadcastName = args.broadcastName
val eventName = args.eventName
if (broadcastName == null || eventName == null) {
invoke.reject("broadcastName and eventName are required")
return
}
if (receivers.containsKey(broadcastName)) {
invoke.reject("Listener for broadcast '$broadcastName' already registered.")
return
}
val filter = IntentFilter(broadcastName)
val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val data = JSObject()
val bundle = intent.extras
if (bundle != null) {
for (key in bundle.keySet()) {
val value = bundle.get(key)
data.put(key, value.toString())
}
}
trigger(eventName, data)
}
}
activity.registerReceiver(receiver, filter)
receivers[broadcastName] = receiver
invoke.resolve()
}
@Command
fun unregister(invoke: Invoke) {
val args = invoke.parseArgs(UnregisterRequest::class.java)
val broadcastName = args.broadcastName
val receiver = receivers[broadcastName]
if (receiver != null) {
activity.unregisterReceiver(receiver)
receivers.remove(eventName)
invoke.resolve()
} else {
invoke.reject("Listener for broadcast '$broadcastName' not found.")
}
}
}