Skip to content

ShellGuard TOTP v0.0.1.2

Choose a tag to compare

@github-actions github-actions released this 04 Sep 05:52
· 66 commits to main since this release

🦞 ShellGuard-TOTP β€” Release v0.0.1.2

Expandable Speed Dial FAB, Image QR Decoding Pipeline & Gallery Scanner

β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•—   β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•—     β–ˆβ–ˆβ•—              β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—   β–ˆβ–ˆβ•—   β–ˆβ–ˆβ•—   β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—    β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—     β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— 
β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•‘              β–ˆβ–ˆβ•”β•β•β•β•   β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—  β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—    β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—
β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—   β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•‘              β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ–ˆβ•—  β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•    β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘
β•šβ•β•β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•   β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•‘              β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—    β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘
β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—  β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•  β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•
β•šβ•β•β•β•β•β•β•β•šβ•β•  β•šβ•β•β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β•    β•šβ•β•β•β•β•β•   β•šβ•β•β•β•β•β•   β•šβ•β•  β•šβ•β•  β•šβ•β•   β•šβ•β•   β•šβ•β•β•β•β•β•
                                                  ~ **ClawStack Mobile StudiosΒ©β„’** ~

πŸš€ The Core Summary

Welcome to v0.0.1.2 (Build 8) of ShellGuard-TOTP! This release delivers Phase 10: Expandable Floating Actions Speed Dial (QR, Image & Manual), replacing static dual floating action buttons with an animated, fluid Speed Dial controller.

This update introduces high-throughput image QR decoding using Google ML Kit on Android Storage Access Framework (SAF) image streams, allowing users to scan and import 2FA secret QR codes directly from screenshots and photos in their gallery without needing a secondary camera.


πŸ’Ž Key Themes & Highlights

⚑ 1. Animated Speed Dial FAB (ExpandableSpeedDialFab.kt)

  • Fluid 45Β° Morphing Action: The main action button smoothly morphs from + (collapsed) to βœ• (expanded) with spring-backed physics.
  • Semi-Transparent Scrim: Dark alpha backdrop (SpeedDialScrim) provides immediate visual focus on the actions while dimming vault tokens underneath.
  • Outside Touch & Back-Handler Dismissal: Tapping anywhere on the scrim or pressing the Android system back button automatically collapses the menu cleanly.

πŸ–ΌοΈ 2. High-Throughput ML Kit Image QR Pipeline (ImageQrDecoder.kt)

  • Unified Image Vision Engine: Extracts and decodes QR codes from Android URI bitmap streams using Google ML Kit BarcodeScanning.getClient().
  • Shared Architecture: Deduplicates vision logic across the codebase by powering both the new dashboard Speed Dial "Scan image" action and the existing QrScannerScreen gallery fallback.
  • Instant Ingestion & Toast Feedback: Automatically verifies decoded otpauth:// URIs and adds them directly to the local vault with clear user feedback.

πŸ“± 3. Elevated Staggered Action Pills

  • Staggered Entrance Animation: Three action pills cascade outward with animated slide-up and fade transitions:
    1. [ πŸ“· Scan QR code ] β€” Launches the live CameraX preview scanner with targeting reticle.
    2. [ πŸ–ΌοΈ Scan image ] β€” Opens the native Android image gallery picker to decode screenshot QR codes.
    3. [ ✏️ Enter manually ] β€” Opens the manual secret entry form for custom Base32 keys, algorithms (SHA1/SHA256/SHA512), and periods.

πŸ”„ 4. One-Way Sync Efficiencies & Protected Mirroring

  • Conditional SQL Deletion Guard: Implemented TotpItemDao.deleteByIdIfLocal to atomically enforce local-only deletion at the database query level without requiring an extra pre-fetch read.
  • Client-Side Delta Optimization: TotpRepository.syncRemoteVault now compares remote timestamps against local snapshots, skipping expensive AES-GCM decryption for unchanged items while maintaining accurate pruning for server-deleted rows.
  • Pull-to-Refresh & ViewModel Protection: Added refreshRemoteVault and strict read-only guards on remote items in TotpViewModel.

πŸ§ͺ 5. Test Suite Oracle Alignment & Stability

  • 90/90 Passing Tests: Full test coverage across all unit and Robolectric suites, including 7 new tests in SpeedDialStateTest and ImageQrDecoderTest, plus 4 new tests in OneWaySyncAndReadOnlyProtectionTest.
  • Test Oracle Synchronization: Updated UI test selectors in LocalModeUnlockAndVaultTest (scan_qr_fab βž” speed_dial_fab) ensuring continuous verification alignment.

πŸ—οΈ Architectural Topology Map

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     πŸ“± [Grouped Vault Dashboard]                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  πŸ“± Local Vault (is_local_only = 1)                                β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚  ☁️ Synced from ShellGuard (is_local_only = 0, Read-Only)         β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                      β”‚                                  β”‚
β”‚                                      β–Ό                                  β”‚
β”‚         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”‚
β”‚         β”‚        SpeedDialState (BackHandler + Scrim)         β”‚         β”‚
β”‚         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β”‚
β”‚                                    β”‚                                    β”‚
β”‚         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”‚
β”‚         β”‚       ExpandableSpeedDialFab (+ βž” βœ• 45Β° Morph)      β”‚         β”‚
β”‚         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β”‚
β”‚                                    β”‚                                    β”‚
β”‚         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”‚
β”‚         β–Ό                          β–Ό                          β–Ό         β”‚
β”‚  [ πŸ“· Scan QR ]            [ πŸ–ΌοΈ Scan image ]         [ ✏️ Enter manual ]  β”‚
β”‚  (CameraX Scanner)       (SAF Image Picker)          (AddSecretScreen)  β”‚
β”‚                                    β”‚                                    β”‚
β”‚                                    β–Ό                                    β”‚
β”‚                         ImageQrDecoder (ML Kit)                         β”‚
β”‚                                    β”‚                                    β”‚
β”‚                                    β–Ό                                    β”‚
β”‚                        TotpViewModel.importScannedUri                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“¦ Changes by Layer

Component Files Description
Speed Dial UI ui/components/ExpandableSpeedDialFab.kt, ui/components/SpeedDialState.kt Animated FAB with 45Β° morph, dark dimming scrim, back-handler, and staggered action pills.
Vision & Image Pipeline scanner/ImageQrDecoder.kt, ui/screens/QrScannerScreen.kt Shared ML Kit barcode scanning pipeline on URI bitmap streams.
Dashboard Integration ui/screens/TotpListScreen.kt Replaced legacy dual FABs and ScannerFab with unified expandable speed dial and SAF gallery launcher.
One-Way Sync Hardening data/local/dao/TotpItemDao.kt, data/repository/TotpRepository.kt, ui/viewmodels/TotpViewModel.kt Fast delta comparison, conditional delete SQL, and pull-to-refresh integration.
Cleanups ui/components/ScannerFab.kt Removed dead component.
Test Suites SpeedDialStateTest.kt, ImageQrDecoderTest.kt, LocalModeUnlockAndVaultTest.kt, OneWaySyncAndReadOnlyProtectionTest.kt Full test coverage verifying interaction transitions, image decoding, sync protections, and updated UI test tags (90/90 passing).

πŸ“¦ Downloads & Artifacts

Asset Format Recommended For
shellguard-totp-v0.0.1.2.aab Android App Bundle Google Play Console internal test track
shellguard-totp-v0.0.1.2.apk Standalone Android Package Direct sideloading & offline verification

Engineered with precision by ClawStack Studios.