tauri-plugin-widgets 0.3.0

A Tauri plugin to interact with App Widgets on Android, iOS, and macOS (WidgetKit). On Windows/Linux a desktop-widget window approach is supported.
package git.s00d.widgets

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import org.json.JSONArray

class WidgetActionReceiver : BroadcastReceiver() {
    companion object {
        const val ACTION_WIDGET_ACTION = "git.s00d.widgets.WIDGET_ACTION"
        const val EXTRA_ACTION_NAME = "action_name"
        const val EXTRA_GROUP = "group"
        const val PENDING_KEY = "__widget_pending_actions__"
    }

    override fun onReceive(context: Context, intent: Intent) {
        val actionName = intent.getStringExtra(EXTRA_ACTION_NAME) ?: return
        val groupRaw = intent.getStringExtra(EXTRA_GROUP) ?: return
        val group = WidgetSanitizer.sanitizeGroup(groupRaw, context.packageName)
        val payload = intent.getStringExtra(WidgetBridgePlugin.EXTRA_EVENT_PAYLOAD)

        val plugin = WidgetBridgePlugin.pluginInstance
        if (plugin != null) {
            plugin.emitWidgetAction(actionName, payload)
            return
        }

        val prefs = context.getSharedPreferences(group, Context.MODE_PRIVATE)
        val existing = prefs.getString(PENDING_KEY, "[]") ?: "[]"
        val arr = try { JSONArray(existing) } catch (_: Exception) { JSONArray() }
        if (payload != null) {
            val obj = org.json.JSONObject()
            obj.put("action", actionName)
            obj.put("payload", payload)
            arr.put(obj)
        } else {
            arr.put(actionName)
        }
        prefs.edit().putString(PENDING_KEY, arr.toString()).apply()
    }
}