From ad8338e7ad9340f8c3b5ee75c3b68d6bb88c3d03 Mon Sep 17 00:00:00 2001 From: Lucas Nogueira Date: Sat, 6 May 2023 01:14:55 -0300 Subject: [PATCH] update example --- examples/api/package.json | 1 + examples/api/src-tauri/Cargo.lock | 31 ++++- examples/api/src-tauri/Cargo.toml | 3 + .../api/src-tauri/gen/android/api/.gitignore | 7 +- .../main/java/com/tauri/api/MainActivity.kt | 3 - .../api/app/src/main/res/values/themes.xml | 4 + examples/api/src-tauri/src/lib.rs | 7 +- examples/api/src/App.svelte | 7 + examples/api/src/app.css | 4 + examples/api/src/views/Scanner.svelte | 128 ++++++++++++++++++ .../src/main/java/BarcodeScannerPlugin.kt | 36 +++-- plugins/barcode-scanner/guest-js/index.ts | 60 +++++--- pnpm-lock.yaml | 3 + 13 files changed, 250 insertions(+), 44 deletions(-) create mode 100644 examples/api/src/views/Scanner.svelte diff --git a/examples/api/package.json b/examples/api/package.json index 830146ce..d26a48f1 100644 --- a/examples/api/package.json +++ b/examples/api/package.json @@ -11,6 +11,7 @@ "@tauri-apps/api": "2.0.0-alpha.3", "@tauri-apps/cli": "2.0.0-alpha.8", "@zerodevx/svelte-json-view": "0.2.1", + "tauri-plugin-barcode-scanner-api": "0.0.0", "tauri-plugin-cli-api": "0.0.0", "tauri-plugin-clipboard-api": "0.0.0", "tauri-plugin-dialog-api": "0.0.0", diff --git a/examples/api/src-tauri/Cargo.lock b/examples/api/src-tauri/Cargo.lock index 3e52a758..415040ad 100644 --- a/examples/api/src-tauri/Cargo.lock +++ b/examples/api/src-tauri/Cargo.lock @@ -149,6 +149,7 @@ dependencies = [ "serde_json", "tauri", "tauri-build", + "tauri-plugin-barcode-scanner", "tauri-plugin-cli", "tauri-plugin-clipboard", "tauri-plugin-dialog", @@ -3459,7 +3460,7 @@ dependencies = [ [[package]] name = "tauri" version = "2.0.0-alpha.8" -source = "git+https://github.com/tauri-apps/tauri?branch=next#bb2a8ccf1356e59b98947d827d61e4e99533f2bc" +source = "git+https://github.com/tauri-apps/tauri?branch=next#256c30c72b737e49ced0d6a6483910dc779fc185" dependencies = [ "anyhow", "base64 0.21.0", @@ -3518,7 +3519,7 @@ dependencies = [ [[package]] name = "tauri-build" version = "2.0.0-alpha.4" -source = "git+https://github.com/tauri-apps/tauri?branch=next#bb2a8ccf1356e59b98947d827d61e4e99533f2bc" +source = "git+https://github.com/tauri-apps/tauri?branch=next#256c30c72b737e49ced0d6a6483910dc779fc185" dependencies = [ "anyhow", "cargo_toml", @@ -3539,7 +3540,7 @@ dependencies = [ [[package]] name = "tauri-codegen" version = "2.0.0-alpha.4" -source = "git+https://github.com/tauri-apps/tauri?branch=next#bb2a8ccf1356e59b98947d827d61e4e99533f2bc" +source = "git+https://github.com/tauri-apps/tauri?branch=next#256c30c72b737e49ced0d6a6483910dc779fc185" dependencies = [ "base64 0.21.0", "brotli", @@ -3564,7 +3565,7 @@ dependencies = [ [[package]] name = "tauri-macros" version = "2.0.0-alpha.4" -source = "git+https://github.com/tauri-apps/tauri?branch=next#bb2a8ccf1356e59b98947d827d61e4e99533f2bc" +source = "git+https://github.com/tauri-apps/tauri?branch=next#256c30c72b737e49ced0d6a6483910dc779fc185" dependencies = [ "heck 0.4.1", "proc-macro2", @@ -3574,6 +3575,18 @@ dependencies = [ "tauri-utils", ] +[[package]] +name = "tauri-plugin-barcode-scanner" +version = "0.0.0" +dependencies = [ + "log", + "serde", + "serde_json", + "tauri", + "tauri-build", + "thiserror", +] + [[package]] name = "tauri-plugin-cli" version = "0.0.0" @@ -3677,11 +3690,15 @@ version = "0.1.0" dependencies = [ "log", "notify-rust", + "rand 0.8.5", "serde", "serde_json", + "serde_repr", "tauri", "tauri-build", "thiserror", + "time", + "url", "win7-notifications", ] @@ -3704,7 +3721,7 @@ dependencies = [ [[package]] name = "tauri-runtime" version = "0.13.0-alpha.4" -source = "git+https://github.com/tauri-apps/tauri?branch=next#bb2a8ccf1356e59b98947d827d61e4e99533f2bc" +source = "git+https://github.com/tauri-apps/tauri?branch=next#256c30c72b737e49ced0d6a6483910dc779fc185" dependencies = [ "gtk", "http", @@ -3725,7 +3742,7 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" version = "0.13.0-alpha.4" -source = "git+https://github.com/tauri-apps/tauri?branch=next#bb2a8ccf1356e59b98947d827d61e4e99533f2bc" +source = "git+https://github.com/tauri-apps/tauri?branch=next#256c30c72b737e49ced0d6a6483910dc779fc185" dependencies = [ "cocoa", "gtk", @@ -3745,7 +3762,7 @@ dependencies = [ [[package]] name = "tauri-utils" version = "2.0.0-alpha.4" -source = "git+https://github.com/tauri-apps/tauri?branch=next#bb2a8ccf1356e59b98947d827d61e4e99533f2bc" +source = "git+https://github.com/tauri-apps/tauri?branch=next#256c30c72b737e49ced0d6a6483910dc779fc185" dependencies = [ "aes-gcm", "brotli", diff --git a/examples/api/src-tauri/Cargo.toml b/examples/api/src-tauri/Cargo.toml index 775067cd..3cfc0a77 100644 --- a/examples/api/src-tauri/Cargo.toml +++ b/examples/api/src-tauri/Cargo.toml @@ -45,6 +45,9 @@ features = [ tauri-plugin-cli = { path = "../../../plugins/cli" } tauri-plugin-global-shortcut = { path = "../../../plugins/global-shortcut" } +[target."cfg(any(target_os = \"android\", target_os = \"ios\"))".dependencies] +tauri-plugin-barcode-scanner = { path = "../../../plugins/barcode-scanner" } + [target."cfg(target_os = \"windows\")".dependencies] window-shadows = "0.2" diff --git a/examples/api/src-tauri/gen/android/api/.gitignore b/examples/api/src-tauri/gen/android/api/.gitignore index 6bb2f5ee..78823267 100644 --- a/examples/api/src-tauri/gen/android/api/.gitignore +++ b/examples/api/src-tauri/gen/android/api/.gitignore @@ -1,12 +1,7 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store build /captures diff --git a/examples/api/src-tauri/gen/android/api/app/src/main/java/com/tauri/api/MainActivity.kt b/examples/api/src-tauri/gen/android/api/app/src/main/java/com/tauri/api/MainActivity.kt index 46c4bc6e..c8d7f82b 100644 --- a/examples/api/src-tauri/gen/android/api/app/src/main/java/com/tauri/api/MainActivity.kt +++ b/examples/api/src-tauri/gen/android/api/app/src/main/java/com/tauri/api/MainActivity.kt @@ -1,7 +1,4 @@ package com.tauri.api -import app.tauri.plugin.PluginManager - class MainActivity : TauriActivity() { - var pluginManager: PluginManager = PluginManager(this) } diff --git a/examples/api/src-tauri/gen/android/api/app/src/main/res/values/themes.xml b/examples/api/src-tauri/gen/android/api/app/src/main/res/values/themes.xml index 0f71fd44..e7365622 100644 --- a/examples/api/src-tauri/gen/android/api/app/src/main/res/values/themes.xml +++ b/examples/api/src-tauri/gen/android/api/app/src/main/res/values/themes.xml @@ -12,5 +12,9 @@ ?attr/colorPrimaryVariant + true + @android:color/transparent + @null + false diff --git a/examples/api/src-tauri/src/lib.rs b/examples/api/src-tauri/src/lib.rs index ba75c55e..3695d12b 100644 --- a/examples/api/src-tauri/src/lib.rs +++ b/examples/api/src-tauri/src/lib.rs @@ -46,6 +46,11 @@ pub fn run() { .plugin(tauri_plugin_global_shortcut::Builder::new().build())?; } + #[cfg(mobile)] + { + app.handle().plugin(tauri_plugin_barcode_scanner::init())?; + } + let mut window_builder = WindowBuilder::new(app, "main", WindowUrl::default()); #[cfg(desktop)] { @@ -65,7 +70,7 @@ pub fn run() { .decorations(false); } - let window = window_builder.build().unwrap(); + let window = window_builder.build()?; #[cfg(debug_assertions)] window.open_devtools(); diff --git a/examples/api/src/App.svelte b/examples/api/src/App.svelte index b955ee61..2d93ba97 100644 --- a/examples/api/src/App.svelte +++ b/examples/api/src/App.svelte @@ -17,6 +17,7 @@ import Updater from './views/Updater.svelte' import Clipboard from './views/Clipboard.svelte' import WebRTC from './views/WebRTC.svelte' + import Scanner from './views/Scanner.svelte' import App from './views/App.svelte' import { onMount } from 'svelte' @@ -110,6 +111,11 @@ label: 'WebRTC', component: WebRTC, icon: 'i-ph-broadcast' + }, + isMobile && { + label: 'Scanner', + component: Scanner, + icon: 'i-ph-scan' } ] @@ -440,6 +446,7 @@

{selected.label}

diff --git a/examples/api/src/app.css b/examples/api/src/app.css index 77704c36..2cd1b6e6 100644 --- a/examples/api/src/app.css +++ b/examples/api/src/app.css @@ -39,3 +39,7 @@ code.code-block { transform: translateX(var(--translate-x)); } } + +.transparent { + background-color: transparent; +} diff --git a/examples/api/src/views/Scanner.svelte b/examples/api/src/views/Scanner.svelte new file mode 100644 index 00000000..f515ebde --- /dev/null +++ b/examples/api/src/views/Scanner.svelte @@ -0,0 +1,128 @@ + + +
+
+
+ + +
+ +
+
+
+ +
+
+
+
+

Aim your camera at a QR code

+
+
+
+
+
+
+
+
+
+
+ + diff --git a/plugins/barcode-scanner/android/src/main/java/BarcodeScannerPlugin.kt b/plugins/barcode-scanner/android/src/main/java/BarcodeScannerPlugin.kt index 0db12642..beac6a61 100644 --- a/plugins/barcode-scanner/android/src/main/java/BarcodeScannerPlugin.kt +++ b/plugins/barcode-scanner/android/src/main/java/BarcodeScannerPlugin.kt @@ -8,6 +8,8 @@ import android.content.Context.MODE_PRIVATE import android.content.Intent import android.content.SharedPreferences import android.content.pm.PackageManager +import android.graphics.Color +import android.graphics.drawable.Drawable import android.net.Uri import android.os.Build import android.os.VibrationEffect @@ -71,11 +73,13 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity), private var requestPermissionResponse: JSObject? = null private var cameraReady = false + private var windowed = false // declare a map constant for allowed barcode formats private val supportedFormats = supportedFormats() private var savedInvoke: Invoke? = null + private var webViewBackground: Drawable? = null override fun load(webView: WebView) { super.load(webView) @@ -105,10 +109,9 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity), .hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY) } - private fun setupCamera(cameraDirection: String) { + private fun setupCamera(cameraDirection: String, windowed: Boolean) { activity .runOnUiThread { - val previewView = PreviewView(activity) previewView.layoutParams = FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, @@ -127,6 +130,13 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity), parent.addView(previewView) parent.addView(graphicOverlay) + this.windowed = windowed + if (windowed) { + webView.bringToFront() + webViewBackground = webView.background + webView.setBackgroundColor(Color.TRANSPARENT) + } + val cameraProviderFuture = ProcessCameraProvider.getInstance(activity) cameraProviderFuture.addListener( { @@ -174,7 +184,6 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity), } private fun dismantleCamera() { - // opposite of setupCamera activity .runOnUiThread { if (cameraProvider != null) { @@ -207,14 +216,22 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity), return formats } - private fun prepareInternal(direction: String) { + private fun prepareInternal(direction: String, windowed: Boolean) { dismantleCamera() - setupCamera(direction) + setupCamera(direction, windowed) } private fun destroy() { dismantleCamera() savedInvoke = null + if (windowed) { + if (webViewBackground != null) { + webView.background = webViewBackground + webViewBackground = null + } else { + webView.setBackgroundColor(Color.WHITE) + } + } } @Suppress("DEPRECATION") @@ -260,7 +277,8 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity), scanner ?.process(inputImage) ?.addOnSuccessListener { barcodes -> - for (barcode in barcodes) { + if (barcodes.isNotEmpty()) { + val barcode = barcodes[0] val bounds = barcode.boundingBox val rawValue = barcode.rawValue ?: "" @@ -299,7 +317,7 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity), @Command fun prepare(invoke: Invoke) { - prepareInternal(invoke.getString("cameraDirection", "back")) + prepareInternal(invoke.getString("cameraDirection", "back"), invoke.getBoolean("windowed", false)) cameraReady = true invoke.resolve() } @@ -307,7 +325,6 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity), @Command fun cancel(invoke: Invoke) { savedInvoke?.reject("cancelled") - destroy() invoke.resolve() } @@ -319,7 +336,8 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity), throw Exception("No permission to use camera. Did you request it yet?") } else { if (!cameraReady) { - prepareInternal(invoke.getString("cameraDirection", "back")) + webViewBackground = null + prepareInternal(invoke.getString("cameraDirection", "back"), invoke.getBoolean("windowed", false)) } cameraReady = false configureCamera(getFormats(invoke)) diff --git a/plugins/barcode-scanner/guest-js/index.ts b/plugins/barcode-scanner/guest-js/index.ts index 8e119909..17fe7510 100644 --- a/plugins/barcode-scanner/guest-js/index.ts +++ b/plugins/barcode-scanner/guest-js/index.ts @@ -1,59 +1,83 @@ -import { invoke } from '@tauri-apps/api/tauri' +import { invoke } from "@tauri-apps/api/tauri"; -type PermissionState = 'granted' | 'denied' +type PermissionState = "granted" | "denied"; -type Format = 'QR_CODE' | 'UPC_A' | 'UPC_E' | 'EAN_8' | 'EAN_13' | 'CODE_39' | 'CODE_93' | 'CODE_128' | 'CODABAR' | 'ITF' | 'AZTEC' | 'DATA_MATRIX' | 'PDF_417' +type Format = + | "QR_CODE" + | "UPC_A" + | "UPC_E" + | "EAN_8" + | "EAN_13" + | "CODE_39" + | "CODE_93" + | "CODE_128" + | "CODABAR" + | "ITF" + | "AZTEC" + | "DATA_MATRIX" + | "PDF_417"; interface ScanOptions { - cameraDirection?: 'back' | 'front' - formats?: Format[] + cameraDirection?: "back" | "front"; + formats?: Format[]; + windowed?: boolean; } interface PrepareOptions { - cameraDirection?: 'back' | 'front' + cameraDirection?: "back" | "front"; + windowed?: boolean; +} + +interface Scanned { + content: string; + bounds: unknown; } /** * Prepare the camera before starting scanning. * This is optional, only use it if you need a small performance improvement when preparing a scan in advance. - * @param options + * @param options */ -export async function prepare(options?: PrepareOptions) { - invoke('plugin:barcodeScanner|prepare', { ...options }) +export async function prepare(options?: PrepareOptions): Promise { + return await invoke("plugin:barcodeScanner|prepare", { ...options }); } /** * Start scanning. - * @param options + * @param options */ -export async function scan(options?: ScanOptions) { - invoke('plugin:barcodeScanner|scan', { ...options }) +export async function scan(options?: ScanOptions): Promise { + return await invoke("plugin:barcodeScanner|scan", { ...options }); } /** * Cancel the current scan process. */ -export async function cancel() { - invoke('plugin:barcodeScanner|cancel') +export async function cancel(): Promise { + return await invoke("plugin:barcodeScanner|cancel"); } /** * Get permission state. */ export async function checkPermissions(): Promise { - return invoke<{ camera: PermissionState }>('plugin:barcodeScanner|check_permissions').then(r => r.camera) + return await invoke<{ camera: PermissionState }>( + "plugin:barcodeScanner|check_permissions" + ).then((r) => r.camera); } /** * Request permissions to use the camera. */ export async function requestPermissions(): Promise { - return invoke<{ camera: PermissionState }>('plugin:barcodeScanner|request_permissions').then(r => r.camera) + return await invoke<{ camera: PermissionState }>( + "plugin:barcodeScanner|request_permissions" + ).then((r) => r.camera); } /** * Open application settings. Useful if permission was denied and the user must manually enable it. */ -export async function openAppSettings() { - invoke('plugin:barcodeScanner|open_app_settings') +export async function openAppSettings(): Promise { + return await invoke("plugin:barcodeScanner|open_app_settings"); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 02d03f7c..b6d93a34 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -61,6 +61,9 @@ importers: '@zerodevx/svelte-json-view': specifier: 0.2.1 version: 0.2.1 + tauri-plugin-barcode-scanner-api: + specifier: 0.0.0 + version: link:../../plugins/barcode-scanner tauri-plugin-cli-api: specifier: 0.0.0 version: link:../../plugins/cli