Commit graph

10 commits

Author SHA1 Message Date
jima
56b875b9fc Web platform scaffold, applicationId change to com.roundingmobile.sshwb
ApplicationId changed from com.roundingmobile.sshworkbench to
com.roundingmobile.sshwb (Firebase auto-key blocked Play Console
registration). Namespace stays com.roundingmobile.sshworkbench.
Web platform in www/: Docker stack (nginx+Node.js+MariaDB), landing
page, login (OAuth+email/pw), dashboard (vault sync+session logs),
API routes, MariaDB schema.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 14:47:01 +02:00
jima
bda8967ab1 Key import validation, 20 themes, 10 fonts, settings redesign, cursor speed/blink, terminal type
Key Import:
- SSHKeyLoader validates imported keys, extracts real pubkey/fingerprint
- ZIP file support with password handling (zip4j)
- Import chooser dialog: ZIP or single file
- Results dialog: valid/encrypted/invalid sections

Theme & Font:
- 20 color themes (10 new: Ayu Dark, Catppuccin Mocha, Everforest Dark, etc.)
- 10 bundled monospace fonts (JetBrains Mono, Fira Mono, Hack, etc.)
- Combined ThemePickerSheet: color scheme combo, font combo, font size slider
- Live preview with scrollable terminal output, adapts to landscape
- Typeface support in TerminalRenderer/TerminalSurfaceView

Settings:
- Material 3 grouped card layout (7 sections)
- Cursor speed: Slow/Normal/Fast/Rapid with key repeat acceleration
- Cursor blink: 530ms toggle, 15s idle auto-stop
- Keep screen on wired to FLAG_KEEP_SCREEN_ON
- Removed Show session tab bar toggle (always visible)
- Font size stepper replaced slider in settings

Terminal:
- Per-connection terminal type (TERM env var) in Edit Connection
- DB migration v1→v2 for termType column
- configChanges prevents activity recreation on rotation

Fixes:
- Vault import hosted in-place (no popBackStack)
- Clickable radio/checkbox/switch rows (text tappable)
- Password rules shown above field in vault export
- Deploy script cleans all stale APKs
- Telnet uses per-connection termType

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 02:01:06 +02:00
jima
84e71b2517 Dev/prod split, local vault, Keys & Vault screen, FLAG_SECURE settings
- Dev flavor: .dev applicationId suffix (coexists with prod), yellow icon,
  all pro features via flavor ProFeaturesModule, no FLAG_SECURE
- Prod flavor: subscription-gated ProFeaturesModule, teal/gold icons
- FLAG_SECURE: three granular settings (Full App / Vault / Terminal),
  biometric-gated, all default OFF, replaces single toggle
- Keys & Vault screen: combines SSH Keys, Save Vault Locally, Export/Import
- Local vault (mode 0x03): device-bound backup with DeviceFingerprint,
  password-only, verified on import via ANDROID_ID + brand + model
- Free users see "Import Local Vault", pro users can import both types
- Connection list: kebab menu replaced with direct Settings gear icon
- singleTask launch mode fixes Home→icon returning to connection list
- QR scanner locked to portrait orientation
- Deploy script deletes older APK versions on duero before uploading
- Test scripts updated for .dev package name

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:35:08 +02:00
jima
21d96b71f0 QB Customizer: reorder/add/remove keys and app shortcuts, CQB/AQB independent
Two-tab Compose dialog (Keys + App Shortcuts) accessible from KB Settings →
Quick Bar tab → Customize, or AQB Settings → Customize. Pro-gated.
Keys tab: 29-key pool, up/down reorder, remove, add from available.
App Shortcuts tab: reorder/add/remove apps, expand to edit individual key
maps with label + action (hex bytes, escape sequences, or text macros).
Independent DataStore prefs for CQB and AQB configurations.
ADB test (06_qb_customizer.py) verifies full flow.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 23:56:15 +02:00
jima
256d059d51 QB app shortcuts, Canvas key icons, bounded scroll, alt buffer reflow fix
Quick Bar:
- App shortcuts button (W icon, far-left) opens two-level popup:
  vim/nano/tmux/scr/F1-12 → 3-column key map grid
- AppShortcutsPopupView: Canvas-based, direction-aware, tap-to-select
- PopupWindow replaced with DecorView overlay + onBackPressedDispatcher
  + layout listener for AKB close detection (one BACK closes both)
- W button toggles popup; toggle_mod actions keep popup open
- Canvas-drawn key icons (tab, backtab, arrows, pgup, pgdn) via labelIcon
- Bounded scroll mode (infiniteScroll=false default)
- CTRL, HOME, END, PGUP, PGDN added to QB scrollable keys
- Menu keys (vim/nano/tmux/screen) removed from scrollable area

Tab bar:
- + button replaced with kebab menu (New Session + KB/QB Settings)
- KB Settings label adapts to keyboard mode (CKB vs AKB)

Bug fixes:
- Alt buffer reflow: main screen content preserved during resize when
  vim/htop is active (was lost on navigate away + return)
- Quick-connect: no saved connection lookup for connectionId=0, tab
  label shows user@host instead of saved connection nickname
- ADB broadcast: enter fires independently from text

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 18:53:54 +02:00
jima
2417b442f1 Add __pycache__ to .gitignore, remove cached .pyc files
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 15:00:43 +02:00
jima
2a87fb58d1 100% Compose migration, AQB/CQB separation, password prompt, ADB test framework
Compose migration (4 files, 2059 lines of View code → Compose):
- ThemePickerDialog: Compose Canvas preview, LazyColumn theme list
- TerminalDialogs: 6 dead dialogs deleted, 2 migrated (hostKey, authPrompt)
  with TerminalDialogRequest sealed interface on MainViewModel for
  imperative→declarative bridge. Added PasswordDialog for no-stored-pw case.
- SnippetDialogs: full-screen Compose dialog with LazyColumn, search,
  inline create form, context menu
- KeyboardSettingsDialog: TabRow, Slider, Canvas preview, color picker.
  Data classes extracted to KeyboardModels.kt

AQB/CQB separation:
- Independent Quick Bar preferences for AKB vs CKB modes
- Settings UI mode-aware: CKB shows full keyboard dialog, AKB shows QB-only
- AQB positions filtered (no above/below keyboard)
- New docs: KEYBOARD.md, GLOSSARY.md (TV, AKB, CKB, AQB, CQB)

Password prompt:
- TerminalService prompts for password when no stored auth (SSHAuth.None)
- Compose PasswordDialog with remember checkbox
- clearPassword ADB broadcast for test cleanup

ADB test framework (Python):
- test.py runner with menu, --all, single test modes
- AI visual verification via claude -p reading screenshots
- 5 tests, 52 checks: connect, htop, vim, password prompt, multi-session
- Timestamped results with manifest.json for cross-run comparison

Coding conventions updated: 100% Compose mandated, no programmatic Views.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 15:00:35 +02:00
jima
9e5c3100e2 Session stability, logging, disconnect notifications, save output, pinch-zoom in mouse mode
- Fix foreground service lifecycle: keep service alive while disconnected sessions exist,
  preventing Android from killing sessions when app is backgrounded during WiFi drops
- Fix cleanupDisconnectedSession: keep sessions in _activeSessions map so UI shows
  disconnect bar and tab indicator instead of silently removing them
- FileLogger: append mode (persists across app opens), fallback to app-private dir,
  ZIP export with .bin recordings, comprehensive trace logging across all components
- SessionNotifier: batched disconnect notifications (5s window), auto-cancel on reconnect,
  smart handling of partial reconnects (5 disconnect, 3 reconnect → shows 2 remaining)
- Save Output: export scrollback + screen to Download/<alias>_<timestamp>.txt
- Disconnect bar: styled pill buttons, timestamps on all disconnect/reconnect messages
- Session tab bar: red accent + dark red background for disconnected tabs
- In-app snackbar: brief "Duero disconnected" alert when session drops while in app
- Pinch-zoom in mouse mode: scale detector fed before mouse intercept, multi-finger
  gestures bypass mouse reporting so htop/vim resize works
- Snippet manager: duplicate action, list refreshes after edit/delete/duplicate
- Notify on disconnect setting (default on), build timestamp on connection list
- Deploy script fix, SessionRecorder rolling reset at 1MB

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 15:13:15 +02:00
jima
70ab307294 Pinch-to-zoom fixes, telnet tab color, SFTP simplify, render reliability
Zoom: defer commit to ACTION_UP so ScaleGestureDetector min-span restarts
don't interrupt continuous zoom-out. Suppress tap after pinch to prevent
AKB appearing on finger lift. Thread-safe font metrics (@Volatile).

Tabs: telnet sessions show violet accent, detect session type (SSH/Telnet/
Local) via TabType enum. Connection list now sorts by last-used (call
updateLastConnected on connect).

SFTP: simplify large download confirmation (inline threshold check),
AndroidViewModel for string resource access, proper error on null stream.

Render: consume dirty after lockCanvas, re-request on lockCanvas failure,
extra render after zoom settle. Default font size 10sp. Dismiss soft
keyboard when navigating to NavHost. Paste preview color matches keyboard
hint (#888888).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 09:42:15 +02:00
jima
e8361e7712 ADB functional test pass: 22 passed, 2 bugs fixed, test script added
Full ADB test pass on Zebra TC21 covering app launch, SSH connection,
terminal I/O, key sequences, session lifecycle, alternate screen (vim,
htop), scrollback, keepalive, rapid input, keyboard sequences, security
log redaction, app lifecycle, and foreground notification.

Bugs fixed in prior commits:
- FileLogger not writing to file on startup (8faa3c0)
- Double PTY resize sent to SSH server (7c8cdd2)

Added scripts/adb_functional_test.sh — reusable test suite with
pass/fail/skip tracking and manual step prompts. Un-ignored scripts/*.sh
in .gitignore so deployment and test scripts are tracked.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 00:32:06 +01:00