package com.plugin.broadcast
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 android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.util.Log
@InvokeArg
class RegisterArgs {
var broadcastName: String? = null
var eventName: String? = null
}
@InvokeArg
class UnregisterArgs {
var broadcastName: String? = null
}
@TauriPlugin
class BroadcastPlugin(private val activity: Activity): Plugin(activity) {
private val receivers = mutableMapOf<String, BroadcastReceiver>()
@Command
fun register(invoke: Invoke) {
val args = invoke.parseArgs(RegisterArgs::class.java)
val broadcastName = args.broadcastName
val eventName = args.eventName
if (broadcastName == null || eventName == null) {
invoke.reject("broadcastName or eventName is null")
return
}
if (receivers.containsKey(broadcastName)) {
invoke.reject("broadcastName is registered")
return
}
val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action == broadcastName) {
val ret = JSObject()
intent.extras?.let { bundle ->
for (key in bundle.keySet()) {
when (val value = bundle.get(key)) {
is String, is Int, is Long, is Boolean, is Double, is Float -> {
ret.put(key, value)
}
else -> {
ret.put(key, value?.toString() ?: "null")
}
}
}
}
Log.i("BroadcastPlugin", "onReceive: $broadcastName, $eventName, $ret")
trigger(eventName, ret)
}
}
}
receivers[broadcastName] = receiver
activity.registerReceiver(receiver, IntentFilter(broadcastName))
invoke.resolve()
}
@Command
fun unregister(invoke: Invoke) {
val args = invoke.parseArgs(UnregisterArgs::class.java)
val broadcastName = args.broadcastName ?: null
if (broadcastName == null) {
invoke.reject("broadcastName is null")
return
}
if (!receivers.containsKey(broadcastName)) {
invoke.reject("broadcastName is not registered")
return
}
val receiver = receivers.remove(broadcastName)
activity.unregisterReceiver(receiver)
invoke.resolve()
}
// 注销所有广播接收器
@Command
fun unregisterAll(invoke: Invoke) {
cleanupReceivers()
invoke.resolve()
}
private fun cleanupReceivers() {
receivers.forEach { (broadcastName, receiver) ->
try {
activity.unregisterReceiver(receiver)
} catch (e: Exception) {
// This logging is good
Log.e("BroadcastPlugin", "Error unregistering receiver for $broadcastName", e)
}
}
receivers.clear()
Log.i("BroadcastPlugin", "All broadcast receivers have been cleaned up.")
}
}