tauri-plugin-broadcast 0.4.1

Android intent broadcast plugin for Tauri V2
Documentation
package com.plugin.broadcast

import android.app.Activity
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Build
import android.util.Log
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 app.tauri.plugin.Channel

@InvokeArg
class RegisterArgs {
  var action: String? = null
  var handler: Channel? = null
}

@InvokeArg
class UnregisterArgs {
  var action: String? = null
}

@TauriPlugin
class BroadcastPlugin(private val activity: Activity): Plugin(activity) {
    private val receivers = mutableMapOf<String, BroadcastReceiver>()
    private val TAG = "TauriBroadcast"

    @Command
    fun register(invoke: Invoke) {
        val args = invoke.parseArgs(RegisterArgs::class.java)
        val action = args.action ?: return invoke.reject("Action is required")
        val handler = args.handler ?: return invoke.reject("Handler is required")
        
        Log.i(TAG, "正在注册 Action: $action")
        
        receivers[action]?.let {
            try { activity.unregisterReceiver(it) } catch (e: Exception) {}
        }

        val receiver = object : BroadcastReceiver() {
            override fun onReceive(context: Context?, intent: Intent?) {
                intent?.let {
                    Log.i(TAG, "收到广播 Action: ${it.action}")
                    val event = JSObject()
                    event.put("action", it.action)
                    
                    val extras = JSObject()
                    it.extras?.let { bundle ->
                        for (key in bundle.keySet()) {
                            val value = bundle.get(key)
                            extras.put(key, value)
                        }
                    }
                    event.put("extras", extras)
                    
                    // 通过 Channel 发送给前端
                    handler.send(event)
                }
            }
        }

        val filter = IntentFilter(action)
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                activity.registerReceiver(receiver, filter, Context.RECEIVER_EXPORTED)
            } else {
                activity.registerReceiver(receiver, filter)
            }
            receivers[action] = receiver
            Log.i(TAG, "注册成功: $action")
            invoke.resolve()
        } catch (e: Exception) {
            Log.e(TAG, "注册失败: ${e.message}")
            invoke.reject("注册失败: ${e.message}")
        }
    }

    @Command
    fun unregister(invoke: Invoke) {
        val args = invoke.parseArgs(UnregisterArgs::class.java)
        val action = args.action ?: return invoke.reject("Action is required")
        
        receivers[action]?.let {
            activity.unregisterReceiver(it)
            receivers.remove(action)
            Log.i(TAG, "已注销: $action")
        }
        invoke.resolve()
    }

    override fun onDestroy() {
        for (receiver in receivers.values) {
            try { activity.unregisterReceiver(receiver) } catch (e: Exception) {}
        }
        receivers.clear()
        super.onDestroy()
    }
}