From 037d488dee091730c8c01d9d09affcaa2386a463 Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Mon, 20 Feb 2023 08:09:30 -0800 Subject: [PATCH] feat(mobile): add `command` member to Invoke class (#6323) --- .../src/main/java/app/tauri/plugin/Invoke.kt | 1 + .../java/app/tauri/plugin/PluginHandle.kt | 6 +++--- .../java/app/tauri/plugin/PluginManager.kt | 18 ++++++++--------- .../mobile/ios-api/Sources/Tauri/Invoke.swift | 8 +++++--- .../mobile/ios-api/Sources/Tauri/Tauri.swift | 20 +++++++++---------- 5 files changed, 28 insertions(+), 25 deletions(-) diff --git a/core/tauri/mobile/android/src/main/java/app/tauri/plugin/Invoke.kt b/core/tauri/mobile/android/src/main/java/app/tauri/plugin/Invoke.kt index 2902a7c94..1d237bd2e 100644 --- a/core/tauri/mobile/android/src/main/java/app/tauri/plugin/Invoke.kt +++ b/core/tauri/mobile/android/src/main/java/app/tauri/plugin/Invoke.kt @@ -8,6 +8,7 @@ import app.tauri.Logger class Invoke( val id: Long, + val command: String, private val sendResponse: (success: PluginResult?, error: PluginResult?) -> Unit, val data: JSObject) { diff --git a/core/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginHandle.kt b/core/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginHandle.kt index 00fb29383..36dd3fb73 100644 --- a/core/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginHandle.kt +++ b/core/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginHandle.kt @@ -123,9 +123,9 @@ class PluginHandle(private val manager: PluginManager, val name: String, private InvalidPluginMethodException::class, IllegalAccessException::class ) - fun invoke(methodName: String, invoke: Invoke) { - val methodMeta = pluginMethods[methodName] - ?: throw InvalidPluginMethodException("No method " + methodName + " found for plugin " + instance.javaClass.name) + fun invoke(invoke: Invoke) { + val methodMeta = pluginMethods[invoke.command] + ?: throw InvalidPluginMethodException("No command " + invoke.command + " found for plugin " + instance.javaClass.name) methodMeta.method.invoke(instance, invoke) } diff --git a/core/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt b/core/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt index 62be10bad..4b75693e7 100644 --- a/core/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt +++ b/core/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt @@ -78,8 +78,8 @@ class PluginManager(val activity: AppCompatActivity) { } @JniMethod - fun postIpcMessage(webView: WebView, pluginId: String, methodName: String, data: JSObject, callback: Long, error: Long) { - val invoke = Invoke(callback, { successResult, errorResult -> + fun postIpcMessage(webView: WebView, pluginId: String, command: String, data: JSObject, callback: Long, error: Long) { + val invoke = Invoke(callback, command, { successResult, errorResult -> val (fn, result) = if (errorResult == null) Pair(callback, successResult) else Pair( error, errorResult @@ -87,22 +87,22 @@ class PluginManager(val activity: AppCompatActivity) { webView.evaluateJavascript("window['_$fn']($result)", null) }, data) - dispatchPluginMessage(invoke, pluginId, methodName) + dispatchPluginMessage(invoke, pluginId) } @JniMethod - fun runPluginMethod(id: Int, pluginId: String, methodName: String, data: JSObject) { - val invoke = Invoke(id.toLong(), { successResult, errorResult -> + fun runPluginMethod(id: Int, pluginId: String, command: String, data: JSObject) { + val invoke = Invoke(id.toLong(), command, { successResult, errorResult -> handlePluginResponse(id, successResult?.toString(), errorResult?.toString()) }, data) - dispatchPluginMessage(invoke, pluginId, methodName) + dispatchPluginMessage(invoke, pluginId) } - private fun dispatchPluginMessage(invoke: Invoke, pluginId: String, methodName: String) { + private fun dispatchPluginMessage(invoke: Invoke, pluginId: String) { Logger.verbose( Logger.tags("Plugin"), - "Tauri plugin: pluginId: $pluginId, methodName: $methodName" + "Tauri plugin: pluginId: $pluginId, command: $invoke.command" ) try { @@ -110,7 +110,7 @@ class PluginManager(val activity: AppCompatActivity) { if (plugin == null) { invoke.reject("Plugin $pluginId not initialized") } else { - plugins[pluginId]?.invoke(methodName, invoke) + plugins[pluginId]?.invoke(invoke) } } catch (e: Exception) { invoke.reject(e.toString()) diff --git a/core/tauri/mobile/ios-api/Sources/Tauri/Invoke.swift b/core/tauri/mobile/ios-api/Sources/Tauri/Invoke.swift index 3a82ce115..b6b864bf9 100644 --- a/core/tauri/mobile/ios-api/Sources/Tauri/Invoke.swift +++ b/core/tauri/mobile/ios-api/Sources/Tauri/Invoke.swift @@ -14,12 +14,14 @@ import UIKit return ISO8601DateFormatter() }() - var sendResponse: (JsonValue?, JsonValue?) -> Void + public var command: String public var data: JSObject + var sendResponse: (JsonValue?, JsonValue?) -> Void - public init(sendResponse: @escaping (JsonValue?, JsonValue?) -> Void, data: JSObject?) { - self.sendResponse = sendResponse + public init(command: String, sendResponse: @escaping (JsonValue?, JsonValue?) -> Void, data: JSObject?) { + self.command = command self.data = data ?? [:] + self.sendResponse = sendResponse } public func resolve() { diff --git a/core/tauri/mobile/ios-api/Sources/Tauri/Tauri.swift b/core/tauri/mobile/ios-api/Sources/Tauri/Tauri.swift index 9c9342c83..c209069bb 100644 --- a/core/tauri/mobile/ios-api/Sources/Tauri/Tauri.swift +++ b/core/tauri/mobile/ios-api/Sources/Tauri/Tauri.swift @@ -55,10 +55,10 @@ public class PluginManager { plugins[name] = handle } - func invoke(name: String, methodName: String, invoke: Invoke) { + func invoke(name: String, invoke: Invoke) { if let plugin = plugins[name] { ipcDispatchQueue.async { - let selectorWithThrows = Selector(("\(methodName):error:")) + let selectorWithThrows = Selector(("\(invoke.command):error:")) if plugin.instance.responds(to: selectorWithThrows) { var error: NSError? = nil withUnsafeMutablePointer(to: &error) { @@ -70,11 +70,11 @@ public class PluginManager { let _ = toRust(error) // TODO app is crashing without this memory leak (when an error is thrown) } } else { - let selector = Selector(("\(methodName):")) + let selector = Selector(("\(invoke.command):")) if plugin.instance.responds(to: selector) { plugin.instance.perform(selector, with: invoke) } else { - invoke.reject("No method \(methodName) found for plugin \(name)") + invoke.reject("No command \(invoke.command) found for plugin \(name)") } } } @@ -105,8 +105,8 @@ func onWebviewCreated(webview: WKWebView, viewController: UIViewController) { } @_cdecl("post_ipc_message") -func postIpcMessage(webview: WKWebView, name: UnsafePointer, methodName: UnsafePointer, data: NSDictionary, callback: UInt, error: UInt) { - let invoke = Invoke(sendResponse: { (successResult: JsonValue?, errorResult: JsonValue?) -> Void in +func postIpcMessage(webview: WKWebView, name: UnsafePointer, command: UnsafePointer, data: NSDictionary, callback: UInt, error: UInt) { + let invoke = Invoke(command: command.pointee.to_string(), sendResponse: { (successResult: JsonValue?, errorResult: JsonValue?) -> Void in let (fn, payload) = errorResult == nil ? (callback, successResult) : (error, errorResult) var payloadJson: String do { @@ -116,18 +116,18 @@ func postIpcMessage(webview: WKWebView, name: UnsafePointer, methodNam } webview.evaluateJavaScript("window['_\(fn)'](\(payloadJson))") }, data: JSTypes.coerceDictionaryToJSObject(data, formattingDatesAsStrings: true)) - PluginManager.shared.invoke(name: name.pointee.to_string(), methodName: methodName.pointee.to_string(), invoke: invoke) + PluginManager.shared.invoke(name: name.pointee.to_string(), invoke: invoke) } @_cdecl("run_plugin_method") func runPluginMethod( id: Int, name: UnsafePointer, - methodName: UnsafePointer, + command: UnsafePointer, data: NSDictionary, callback: @escaping @convention(c) (Int, Bool, UnsafePointer?) -> Void ) { - let invoke = Invoke(sendResponse: { (successResult: JsonValue?, errorResult: JsonValue?) -> Void in + let invoke = Invoke(command: command.pointee.to_string(), sendResponse: { (successResult: JsonValue?, errorResult: JsonValue?) -> Void in let (success, payload) = errorResult == nil ? (true, successResult) : (false, errorResult) var payloadJson: String = "" do { @@ -137,5 +137,5 @@ func runPluginMethod( } callback(id, success, payloadJson.cString(using: String.Encoding.utf8)) }, data: JSTypes.coerceDictionaryToJSObject(data, formattingDatesAsStrings: true)) - PluginManager.shared.invoke(name: name.pointee.to_string(), methodName: methodName.pointee.to_string(), invoke: invoke) + PluginManager.shared.invoke(name: name.pointee.to_string(), invoke: invoke) }