tauri-plugin-broadcast 0.4.0

Tauri plugin for broadcast
Documentation
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.")
    }
}