diff --git a/plugins/deep-link/android/src/main/WantedAndroidManifest.xml b/plugins/deep-link/android/src/main/WantedAndroidManifest.xml new file mode 100644 index 00000000..cd5ce2c9 --- /dev/null +++ b/plugins/deep-link/android/src/main/WantedAndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/deep-link/android/src/main/java/DeepLinkPlugin.kt b/plugins/deep-link/android/src/main/java/DeepLinkPlugin.kt new file mode 100644 index 00000000..b40d3f45 --- /dev/null +++ b/plugins/deep-link/android/src/main/java/DeepLinkPlugin.kt @@ -0,0 +1,61 @@ +// Copyright 2019-2023 Tauri Programme within The Commons Conservancy +// SPDX-License-Identifier: Apache-2.0 +// SPDX-License-Identifier: MIT + +package app.tauri.deep_link + +import android.app.Activity +import android.content.Intent +import android.webkit.WebView +import app.tauri.Logger +import app.tauri.annotation.Command +import app.tauri.annotation.TauriPlugin +import app.tauri.plugin.JSObject +import app.tauri.plugin.Plugin +import app.tauri.plugin.Invoke + +@TauriPlugin +class DeepLinkPlugin(private val activity: Activity): Plugin(activity) { + private val implementation = Example() + private var webView: WebView? = null + private var lastUrl: String? = null + + companion object { + var instance: DeepLinkPlugin? = null + } + + @Command + fun getLastLink(invoke: Invoke) { + val ret = JSObject() + ret.put("url", this.lastUrl ?: "") + invoke.resolve(ret) + } + + /* @Command + fun registerListenerRust(invoke: Invoke) { + val value = invoke.getString("value") ?: "" + val ret = JSObject() + ret.put("value", this.lastUrl ?: "none") + invoke.resolve(ret) + } */ + + override fun load(webView: WebView) { + instance = this + + if (intent.action == intent.ACTION_VIEW) { + // TODO: check if it makes sense to split up init url and last url + this.lastUrl = intent.action.toString() + intent.data.toString() + // TODO: Emit event - may not work here timing wise + } + + super.load(webView) + this.webView = webView + } + + override fun onNewIntent(intent: Intent) { + if (intent.action == intent.ACTION_VIEW) { + this.lastUrl = intent.data.toString() + // TODO: Emit event + } + } +} diff --git a/plugins/deep-link/android/src/main/java/ExamplePlugin.kt b/plugins/deep-link/android/src/main/java/ExamplePlugin.kt deleted file mode 100644 index df36085c..00000000 --- a/plugins/deep-link/android/src/main/java/ExamplePlugin.kt +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2019-2023 Tauri Programme within The Commons Conservancy -// SPDX-License-Identifier: Apache-2.0 -// SPDX-License-Identifier: MIT - -package app.tauri.deep_link - -import android.app.Activity -import app.tauri.annotation.Command -import app.tauri.annotation.TauriPlugin -import app.tauri.plugin.JSObject -import app.tauri.plugin.Plugin -import app.tauri.plugin.Invoke - -@TauriPlugin -class ExamplePlugin(private val activity: Activity): Plugin(activity) { - @Command - fun ping(invoke: Invoke) { - val value = invoke.getString("value") ?: "" - val ret = JSObject() - ret.put("value", value) - invoke.resolve(ret) - } -} diff --git a/plugins/deep-link/guest-js/index.ts b/plugins/deep-link/guest-js/index.ts index a0560385..84fc7967 100644 --- a/plugins/deep-link/guest-js/index.ts +++ b/plugins/deep-link/guest-js/index.ts @@ -1,3 +1,17 @@ // Copyright 2019-2023 Tauri Programme within The Commons Conservancy // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT + +declare global { + interface Window { + __TAURI_INVOKE__: (cmd: string, args?: unknown) => Promise; + } +} + +export async function getLastLink() { + await window.__TAURI_INVOKE__( + "plugin:deep-link|get_last_link" + ); +} + +// TODO: REGISTER EVENT LISTENER diff --git a/plugins/deep-link/rollup.config.mjs b/plugins/deep-link/rollup.config.mjs index 96840adc..6555e98b 100644 --- a/plugins/deep-link/rollup.config.mjs +++ b/plugins/deep-link/rollup.config.mjs @@ -1,6 +1,6 @@ import { readFileSync } from "fs"; -import { createConfig } from "../rollup.config.mjs"; +import { createConfig } from "../../shared/rollup.config.mjs"; export default createConfig({ input: "guest-js/index.ts", diff --git a/plugins/deep-link/src/api-iife.js b/plugins/deep-link/src/api-iife.js new file mode 100644 index 00000000..1731225f --- /dev/null +++ b/plugins/deep-link/src/api-iife.js @@ -0,0 +1 @@ +if("__TAURI__"in window){var __TAURI_DEEPLINK__=function(_){"use strict";return _.getLastLink=async function(){await window.__TAURI_INVOKE__("plugin:deep-link|get_last_link")},_}({});Object.defineProperty(window.__TAURI__,"deepLink",{value:__TAURI_DEEPLINK__})} diff --git a/plugins/deep-link/src/lib.rs b/plugins/deep-link/src/lib.rs index 951263ab..75a858fa 100644 --- a/plugins/deep-link/src/lib.rs +++ b/plugins/deep-link/src/lib.rs @@ -39,8 +39,7 @@ impl> crate::DeepLinkExt for T { /// Initializes the plugin. pub fn init() -> TauriPlugin { Builder::new("deep-link") - // TODO: api-iife.js - //.js_init_script(include_str!("api-iife.js").to_string()) + .js_init_script(include_str!("api-iife.js").to_string()) .invoke_handler(tauri::generate_handler![commands::execute]) .setup(|app, api| { #[cfg(mobile)] diff --git a/plugins/deep-link/src/mobile.rs b/plugins/deep-link/src/mobile.rs index 450118cc..ab890b4d 100644 --- a/plugins/deep-link/src/mobile.rs +++ b/plugins/deep-link/src/mobile.rs @@ -11,7 +11,7 @@ use tauri::{ use crate::models::*; #[cfg(target_os = "android")] -const PLUGIN_IDENTIFIER: &str = "{{ android_package_id }}"; +const PLUGIN_IDENTIFIER: &str = "app.tauri.deep_link"; #[cfg(target_os = "ios")] tauri::ios_plugin_binding!(init_plugin_deep_link); @@ -22,7 +22,7 @@ pub fn init( api: PluginApi, ) -> crate::Result> { #[cfg(target_os = "android")] - let handle = api.register_android_plugin(PLUGIN_IDENTIFIER, "ExamplePlugin")?; + let handle = api.register_android_plugin(PLUGIN_IDENTIFIER, "DeepLinkPlugin")?; #[cfg(target_os = "ios")] let handle = api.register_ios_plugin(init_plugin_deep_link)?; Ok(DeepLink(handle)) @@ -37,4 +37,12 @@ impl DeepLink { .run_mobile_plugin("ping", payload) .map_err(Into::into) } + + // TODO: URI instead of String? + /// Get the last saved URL that triggered the deep link. + pub fn get_last_link(&self) -> crate::Result> { + self.0 + .run_mobile_plugin("getLastLink", ()) + .map_err(Into::into) + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fde9937c..8493f336 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '6.1' settings: autoInstallPeers: true @@ -128,7 +128,7 @@ importers: version: 3.59.1 unocss: specifier: ^0.53.1 - version: 0.53.1(postcss@8.4.23)(rollup@3.25.1)(vite@4.3.9) + version: 0.53.1(postcss@8.4.23)(vite@4.3.9) vite: specifier: ^4.3.9 version: 4.3.9 @@ -183,6 +183,16 @@ importers: specifier: ^2.4.1 version: 2.4.1 + plugins/deep-link: + dependencies: + '@tauri-apps/api': + specifier: 2.0.0-alpha.5 + version: 2.0.0-alpha.5 + devDependencies: + tslib: + specifier: ^2.4.1 + version: 2.5.0 + plugins/dialog: dependencies: '@tauri-apps/api': @@ -951,6 +961,20 @@ packages: typescript: 5.1.3 dev: true + /@rollup/pluginutils@5.0.2: + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.0 + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + /@rollup/pluginutils@5.0.2(rollup@3.25.1): resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} @@ -1359,24 +1383,24 @@ packages: eslint-visitor-keys: 3.4.1 dev: true - /@unocss/astro@0.53.1(rollup@3.25.1)(vite@4.3.9): + /@unocss/astro@0.53.1(vite@4.3.9): resolution: {integrity: sha512-dvPH2buCL0qvWXFfQFUeB8kbbJsliN0ib2Am5/1r4XyOwCiCvfwc3UuQpsi0xJs/WO9QgIxLWxakxVj3DeAuAQ==} dependencies: '@unocss/core': 0.53.1 '@unocss/reset': 0.53.1 - '@unocss/vite': 0.53.1(rollup@3.25.1)(vite@4.3.9) + '@unocss/vite': 0.53.1(vite@4.3.9) transitivePeerDependencies: - rollup - vite dev: true - /@unocss/cli@0.53.1(rollup@3.25.1): + /@unocss/cli@0.53.1: resolution: {integrity: sha512-K2r8eBtwv1oQ6KcDLb3KyIDaApVle3zbckZmd7W402/IRIJSKScLjxWHtEJpnYEyuxD5MlQpfRZLZgmWWVMOsg==} engines: {node: '>=14'} hasBin: true dependencies: '@ampproject/remapping': 2.2.1 - '@rollup/pluginutils': 5.0.2(rollup@3.25.1) + '@rollup/pluginutils': 5.0.2 '@unocss/config': 0.53.1 '@unocss/core': 0.53.1 '@unocss/preset-uno': 0.53.1 @@ -1532,13 +1556,13 @@ packages: '@unocss/core': 0.53.1 dev: true - /@unocss/vite@0.53.1(rollup@3.25.1)(vite@4.3.9): + /@unocss/vite@0.53.1(vite@4.3.9): resolution: {integrity: sha512-/N/rjiFyj1ejK1ZQIv9N/NMsNE6i2/V8ISwYhbGxLpc3Sca4jeVjZPsx5cg5DN9Ddas2BRH3YhLhdh8rPUPzxQ==} peerDependencies: vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 dependencies: '@ampproject/remapping': 2.2.1 - '@rollup/pluginutils': 5.0.2(rollup@3.25.1) + '@rollup/pluginutils': 5.0.2 '@unocss/config': 0.53.1 '@unocss/core': 0.53.1 '@unocss/inspector': 0.53.1 @@ -4175,7 +4199,7 @@ packages: '@types/unist': 2.0.6 dev: true - /unocss@0.53.1(postcss@8.4.23)(rollup@3.25.1)(vite@4.3.9): + /unocss@0.53.1(postcss@8.4.23)(vite@4.3.9): resolution: {integrity: sha512-0lRblA8hX7VUu5dywbcStzm590Iz5ahSJGsMNKNH3+u9C7AfJcKT8epxjkIkJWQBNJLD5vsao4SuuhLWB7eMQQ==} engines: {node: '>=14'} peerDependencies: @@ -4184,8 +4208,8 @@ packages: '@unocss/webpack': optional: true dependencies: - '@unocss/astro': 0.53.1(rollup@3.25.1)(vite@4.3.9) - '@unocss/cli': 0.53.1(rollup@3.25.1) + '@unocss/astro': 0.53.1(vite@4.3.9) + '@unocss/cli': 0.53.1 '@unocss/core': 0.53.1 '@unocss/extractor-arbitrary-variants': 0.53.1 '@unocss/postcss': 0.53.1(postcss@8.4.23) @@ -4203,7 +4227,7 @@ packages: '@unocss/transformer-compile-class': 0.53.1 '@unocss/transformer-directives': 0.53.1 '@unocss/transformer-variant-group': 0.53.1 - '@unocss/vite': 0.53.1(rollup@3.25.1)(vite@4.3.9) + '@unocss/vite': 0.53.1(vite@4.3.9) transitivePeerDependencies: - postcss - rollup diff --git a/shared/tsconfig.json b/shared/tsconfig.json deleted file mode 100644 index 5098169a..00000000 --- a/shared/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "include": ["guest-js/*.ts"] -}