feat: update to alpha.17, typed mobile plugin IPC arguments (#676)

Co-authored-by: Amr Bashir <amr.bashir2015@gmail.com>
This commit is contained in:
Lucas Fernandes Nogueira
2023-10-29 16:06:44 -03:00
committed by GitHub
parent 76cfdc32b4
commit e438e0a62d
158 changed files with 1677 additions and 1658 deletions
@@ -11,11 +11,74 @@ import android.content.ClipDescription
import android.content.ClipboardManager
import android.content.Context
import app.tauri.annotation.Command
import app.tauri.annotation.InvokeArg
import app.tauri.annotation.TauriPlugin
import app.tauri.plugin.Invoke
import app.tauri.plugin.JSObject
import app.tauri.plugin.Plugin
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.core.JsonProcessingException
import com.fasterxml.jackson.databind.DeserializationContext
import com.fasterxml.jackson.databind.JsonDeserializer
import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.SerializerProvider
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
import com.fasterxml.jackson.databind.annotation.JsonSerialize
import com.fasterxml.jackson.databind.ser.std.StdSerializer
import java.io.IOException
@InvokeArg
@JsonDeserialize(using = WriteOptionsDeserializer::class)
sealed class WriteOptions {
@JsonDeserialize
class PlainText: WriteOptions() {
lateinit var text: String
var label: String? = null
}
}
@JsonSerialize(using = ReadClipDataSerializer::class)
sealed class ReadClipData {
class PlainText: ReadClipData() {
lateinit var text: String
}
}
internal class ReadClipDataSerializer @JvmOverloads constructor(t: Class<ReadClipData>? = null) :
StdSerializer<ReadClipData>(t) {
@Throws(IOException::class, JsonProcessingException::class)
override fun serialize(
value: ReadClipData, jgen: JsonGenerator, provider: SerializerProvider
) {
jgen.writeStartObject()
when (value) {
is ReadClipData.PlainText -> {
jgen.writeObjectFieldStart("plainText")
jgen.writeStringField("text", value.text)
jgen.writeEndObject()
}
else -> {}
}
jgen.writeEndObject()
}
}
internal class WriteOptionsDeserializer: JsonDeserializer<WriteOptions>() {
override fun deserialize(
jsonParser: JsonParser,
deserializationContext: DeserializationContext
): WriteOptions {
val node: JsonNode = jsonParser.codec.readTree(jsonParser)
node.get("plainText")?.let {
return jsonParser.codec.treeToValue(it, WriteOptions.PlainText::class.java)
} ?: run {
throw Error("unknown write options $node")
}
}
}
@TauriPlugin
class ClipboardPlugin(private val activity: Activity) : Plugin(activity) {
@@ -25,22 +88,14 @@ class ClipboardPlugin(private val activity: Activity) : Plugin(activity) {
@Command
@Suppress("MoveVariableDeclarationIntoWhen")
fun write(invoke: Invoke) {
val options = invoke.getObject("options")
if (options == null) {
invoke.reject("Missing `options` input")
return
}
val kind = invoke.getString("kind", "")
val args = invoke.parseArgs(WriteOptions::class.java)
val clipData = when (kind) {
"PlainText" -> {
val label = options.getString("label", "")
val text = options.getString("text", "")
ClipData.newPlainText(label, text)
val clipData = when (args) {
is WriteOptions.PlainText -> {
ClipData.newPlainText(args.label, args.text)
}
else -> {
invoke.reject("Unknown kind $kind")
invoke.reject("unimplemented clip data")
return
}
}
@@ -52,10 +107,12 @@ class ClipboardPlugin(private val activity: Activity) : Plugin(activity) {
@Command
fun read(invoke: Invoke) {
val (kind, options) = if (manager.hasPrimaryClip()) {
val data = if (manager.hasPrimaryClip()) {
if (manager.primaryClipDescription?.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN) == true) {
val item: ClipData.Item = manager.primaryClip!!.getItemAt(0)
Pair("PlainText", item.text)
val data = ReadClipData.PlainText()
data.text = item.text.toString()
data
} else {
// TODO
invoke.reject("Clipboard content reader not implemented")
@@ -66,9 +123,6 @@ class ClipboardPlugin(private val activity: Activity) : Plugin(activity) {
return
}
val response = JSObject()
response.put("kind", kind)
response.put("options", options)
invoke.resolve(response)
invoke.resolveObject(data)
}
}