update example

pull/536/head
Lucas Nogueira 2 years ago
parent 0c407140f5
commit ad8338e7ad
No known key found for this signature in database
GPG Key ID: FFEA6C72E73482F1

@ -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",

@ -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",

@ -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"

@ -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

@ -1,7 +1,4 @@
package com.tauri.api
import app.tauri.plugin.PluginManager
class MainActivity : TauriActivity() {
var pluginManager: PluginManager = PluginManager(this)
}

@ -12,5 +12,9 @@
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:backgroundDimEnabled">false</item>
</style>
</resources>

@ -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();

@ -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 @@
</aside>
<main
class="flex-1 bg-primary dark:bg-darkPrimary transition-transform transition-colors-250 grid grid-rows-[2fr_auto]"
class:transparent={isMobile}
>
<div class="px-5 overflow-hidden grid grid-rows-[auto_1fr]">
<h1>{selected.label}</h1>

@ -39,3 +39,7 @@ code.code-block {
transform: translateX(var(--translate-x));
}
}
.transparent {
background-color: transparent;
}

@ -0,0 +1,128 @@
<script>
import { scan } from "tauri-plugin-barcode-scanner-api";
export let onMessage;
let scanning = false;
let windowed = true;
function startScan() {
scanning = true;
scan({ windowed })
.then((res) => {
scanning = false;
onMessage(res);
})
.catch((error) => {
scanning = false;
onMessage(error);
});
}
</script>
<div class="full-height">
<div class:invisible={scanning}>
<div>
<input type="checkbox" id="scanner-windowed" bind:checked={windowed} />
<label for="scanner-windowed">Windowed</label>
</div>
<button class="btn" type="button" on:click={startScan}>Scan</button>
</div>
<div class="scanning full-height" class:invisible={!scanning}>
<div class="scanner-background">
<!-- this background simulates the camera view -->
</div>
<div class="container full-height">
<div class="barcode-scanner--area--container">
<div class="relative">
<p>Aim your camera at a QR code</p>
</div>
<div class="square surround-cover">
<div class="barcode-scanner--area--outer surround-cover">
<div class="barcode-scanner--area--inner" />
</div>
</div>
</div>
</div>
</div>
</div>
<style>
.invisible {
display: none;
}
.full-height {
height: 100%;
}
p {
color: #fff;
font-family: sans-serif;
text-align: center;
font-weight: 600;
}
.container {
width: 100%;
height: 100%;
overflow: hidden;
}
.container {
display: flex;
}
.relative {
position: relative;
z-index: 1;
}
.square {
width: 100%;
position: relative;
overflow: hidden;
transition: 0.3s;
}
.square:after {
content: "";
top: 0;
display: block;
padding-bottom: 100%;
}
.square > div {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
.surround-cover {
box-shadow: 0 0 0 99999px rgba(0, 0, 0, 0.5);
}
.barcode-scanner--area--container {
width: 80%;
max-width: min(500px, 80vh);
margin: auto;
}
.barcode-scanner--area--outer {
display: flex;
border-radius: 1em;
}
.barcode-scanner--area--inner {
width: 100%;
margin: 1rem;
border: 2px solid #fff;
box-shadow: 0px 0px 2px 1px rgb(0 0 0 / 0.5),
inset 0px 0px 2px 1px rgb(0 0 0 / 0.5);
border-radius: 1rem;
}
.scanner-background {
background: linear-gradient(45deg, #673ab7, transparent);
background-position: 45% 50%;
background-size: cover;
background-repeat: no-repeat;
}
</style>

@ -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))

@ -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<void> {
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<Scanned> {
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<void> {
return await invoke("plugin:barcodeScanner|cancel");
}
/**
* Get permission state.
*/
export async function checkPermissions(): Promise<PermissionState> {
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<PermissionState> {
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<void> {
return await invoke("plugin:barcodeScanner|open_app_settings");
}

@ -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

Loading…
Cancel
Save