Skip to content

Releases: nettrash/Scan.Android

v1.7.57

03 May 10:27

Choose a tag to compare

Scan for Android — 1.7.57

Six feature drops have landed since 1.1. This release rolls them all up: a richer scanner, a smarter generator, a History that travels with you, deep-link + share-sheet entry points, App Links, F-Droid metadata, and a camera that finally does pinch-to-zoom and centred-frame ROI. Every change ships in lockstep with iOS Scan 1.7 — same payloads, same labels, same behaviour.

Camera

  • Pinch-to-zoom in the live preview. Honours each phone's full zoom range, including telephoto and macro lenses on multi-cam devices. Pan drift during a pinch is locked out so the zoom factor stays clean.
  • Centred-frame scanning. Codes outside the central 78 % × 78 % region of the preview are ignored, matching the iOS reticle exactly. Eliminates accidental hits on neighbouring barcodes when scanning shelves or stacks of receipts.
  • Multi-code disambiguation. When the analyzer sees two or more codes in frame, numbered chips appear over each bounding rect. Tap one to commit; everything else (haptic, sound, save, continuous-scan) behaves identically to a single-code framing.
  • The reticle now tracks the largest detected rect rather than the first, giving you a clear primary anchor while the chooser stays visible.

New payload types

Two passes of new recognisers, ported one-for-one from iOS:

  • Magnet URIs — info-hash, display name, exact length, tracker list. "Open in torrent client" action.
  • Rich URLs — WhatsApp click-to-chat, Telegram, Apple Wallet .pkpass, App Store / Google Play, YouTube (incl. Shorts), Spotify, Apple Music. Per-kind smart-action labels.
  • Maps URLs (Google + Apple) re-classify to Geo when coordinates are extractable, so they get the same "Open in Maps" action as a geo: payload.
  • vCard 4.0 parses transparently.
  • More crypto chains — Ripple, Stellar, Cosmos, LNURL, Lightning Address. Schemes xrp, xrpl, ripple, stellar, web+stellar, cosmos.
  • Bare-address crypto detection — strings without a URI scheme classify as crypto when they match Bitcoin (legacy + bech32), Ethereum, XRP, Stellar, Cosmos, bolt11 invoices, or LNURL bech32.
  • GS1 Application Identifier — parens, Digital Link, and FNC1-separated forms. ~40 common AIs with friendly names; date AIs render YYYY-MM-DD. GTIN web-lookup action.
  • IATA Bar Coded Boarding Pass (BCBP) — full RP 1740c 60-char mandatory leg layout.
  • AAMVA driver's licence (PDF417) — every US state + Canadian province, full identity / dates / address fields. Auto-detects MM/DD/YYYY vs YYYY/MM/DD expiry encoding.

Wi-Fi, crypto tokens, digital identity, loyalty

  • Wi-Fi WPA3 (SAE) and Passpoint (HS20) join the existing OPEN/WEP/WPA-WPA2 cases. Passpoint payloads surface a "must be installed manually" caveat — there's no public Android API for programmatic provisioning either.
  • Stablecoin / token recognition. USDC, USDT, DAI on Ethereum (ERC-20). USDT, USDC on Tron (TRC-20). USDC, USDT on Solana (SPL). Unknown contracts surface as a generic ERC-20 / TRC-20 / SPL tag with the contract preserved.
  • Solana Pay SPL (solana:RECIPIENT?spl-token=MINT&amount=…) and full Tron support (tron: / tronlink:, plus 34-char base58 bare-address detection).
  • Digital identity payloads — DigiD, EUDI Wallet, OpenID4VC. Conservative detection rules and an orange security warning above the action button: "Identity flow — only continue if you started this login yourself." History uses a person icon for these.
  • Save as loyalty card. Product-code payloads now offer an outlined "Save as loyalty card" action with a merchant prompt. Saved as a favourited record so it pins to the top of History; searchable by merchant tag. Google Wallet's loyalty-pass API is deliberately not used — it requires server-side JWTs signed with a service account, which isn't viable for an offline app.

Generator

  • Foreground / background colour pickers — full HSV picker (saturation/value square, hue strip, hex field, presets). Material 3 doesn't ship one, so we wrote it.
  • QR error-correction picker alongside the colour controls. Forced to HIGH whenever a logo is set.
  • Logo embedding. Photo-Picker → centred composite at ~22 % of the canvas with a white rounded-rect punch behind the logo. Punch stays white regardless of the chosen background colour, to keep the finder pattern legible.
  • SVG and PDF export. SVG is run-length-encoded per row (~5× smaller than per-module). PDF uses native vector output (PdfDocument). Both share via FileProvider and an ACTION_SEND chooser with the right MIME type.
  • WCAG contrast warning appears in the Style block when the foreground / background contrast drops below 3:1 — same algorithm as iOS, so the warning fires on the same colour pairs cross-platform.

Settings, History, feedback

  • New Settings tab with three toggles: Haptic on scan (default ON), Sound on scan (default OFF, uses ToneGenerator on STREAM_NOTIFICATION so the user's ringer / DnD policy still applies), Continuous scanning (default OFF).
  • Continuous mode auto-saves recognised codes and surfaces them in a green banner across the top of the preview instead of popping the result sheet. Tap the banner to open the sheet for the most recent scan. Image-import path is unchanged.
  • History favourites. Star a row to pin it. Sort is (is_favourite DESC, timestamp DESC), mirroring the iOS Core Data sort exactly. Toolbar filter chip toggles "favourites only".
  • CSV export of History — UTF-8 / CRLF / RFC 4180, same column schema as iOS, shared via FileProvider with per-Intent grants.
  • What's-New sheet appears on first launch after an upgrade. Stored ack is per-versionName; if the user installs a newer build before opening, the stored ack silently catches up so the sheet shows for the version it was actually written for.
  • Test feedback button in Settings fires haptic + sound at once for tuning.
  • Room schema migrated v1 → v2 (is_favorite column added). No fallbackToDestructiveMigration — a Play upgrade silently nuking saved scans is strictly worse than crashing visibly.

Deep links, share sheet, App Links

  • Universal-style deep linkshttps://nettrash.me/scan/<base64url-payload> opens directly into a result sheet that re-uses the camera-path payload actions. Same URL shape and Base64URL rules as iOS, payloads round-trip cleanly between platforms.
  • Android App Links with autoVerify="true" claiming https://nettrash.me/scan/*. The verifier fetches assetlinks.json on install and on every versionName bump; the filter flips from "browsable" to "verified" only when every signing fingerprint validates.
  • Share-to-Scan. Scan now appears in the Android share sheet for image/* and application/pdf, single or multi-select. A bottom sheet renders the recognised codes; one-result inputs auto-drill into the detail.
  • PDF support. Every page rasterises at 2× density via PdfRenderer, runs through ML Kit, and aggregates with dedup on raw value. Mixed image+PDF batches handled. Per-entry failures are swallowed so one bad file doesn't poison the batch. Cloud-storage URIs that aren't seekable fall back to a cached copy.
  • Backup status surface in Settings — a Sync section that surfaces whether Auto Backup is declared and offers a button to deep-link into the OS-level toggle.

F-Droid

  • New metadata/me.nettrash.scan.yml build recipe — git source, subdir: Scan, version-tag driven, keystore.properties cleaned from the build env so F-Droid signs with their own key.
  • Fastlane metadata under fastlane/metadata/android/en-US/ mirrors play/listings/ so the same source can drive both stores.

Build / packaging

  • Default versionName in Scan/build.gradle.kts is now 1.7. versionCode continues to auto-increment from version.properties (this build = 57). Tag-driven CI builds still override (git tag v1.7.0versionName = "1.7.0").

v1.1.24

28 Apr 20:58

Choose a tag to compare

Full Changelog: v1.1...v1.1.24

v1.1

28 Apr 17:22

Choose a tag to compare