- Use mutableStateOf(TextFieldValue) as single source of truth
- Removed key(currentInput) that caused focus loss on each keystroke
- Changed hidden field from 0x0 to 1x30dp for better IME compatibility
- Fixed display: showing inputText.text instead of stale currentInput
- Soft keyboard now shows input text in terminal's last line
- Added transparent BasicTextField (0x0) to trigger soft keyboard
- Tapping terminal area now shows input method
- Removed keyCode-based character capture (didn't work with IME)
- Enter detection via OnValueChange (\n in text)
- Hardware keyboard still handled via onKeyEvent
- Removed InputRow and BasicTextField entirely
- Terminal input now happens inline in the last line of output
- onKeyEvent captures keystrokes at the terminal level
- Connect button no longer checks password/key requirement
- True Linux terminal input experience
- Removed password-not-blank check from connect dialog enabled condition
- Handle empty password in JSch connect gracefully
- Input bar now floats at bottom of terminal, not inside LazyColumn
- Input bar always visible when connected (even with empty output)
1. Input field hidden by keyboard - merged input bar into LazyColumn as last
item with imePadding/navigationBarsPadding
2. Font size selection not working - replaced hardcoded 12sp with
user-selected fontSize from SshConfigStorage
3. Output showing boxes - added UTF-8 charset, ANSI escape filtering,
proper carriage return handling
- Password field now has trailing eye icon to show/hide plaintext
- Key passphrase field also has the same toggle
- Used Visibility/VisibilityOff icons from material-icons-extended
- Both fields toggle independently (passwordVisible / keyPassVisible)
Co-authored-by: 茂之钳 <agent@openclaw.ai>
- Bug: clicking saved connection did not open terminal immediately
Fix: create tab and switch to it BEFORE connect() starts
- Bug: StrictHostKeyChecking=yes blocked all first-time password connections
Fix: changed to 'no' (consistent with key auth), increased timeout to 15s
- Bug: no UI feedback during connection attempt
Fix: show 'Connecting...' state with spinner, then connected/error states
- Bug: disconnected state and error state overlapped in terminal view
Fix: unified content area with 3 states: error+reconnect / connecting /
idle prompt
Co-authored-by: 茂之钳 <agent@openclaw.ai>
- Fixed @Composable/non-Composable stringResource usage in ConnectTabScreen
- Added missing ClawTokens.kt with mobile color/typography design tokens for upstream UI
- Fixed R import conflicts in tergent UI files (import as TergentR)
- All changes compile cleanly
Co-authored-by: 茂之钳 <agent@openclaw.ai>
- ConnectionTester: TCP port connectivity test with latency
- Test button (📡) on each saved connection item
- Visual result: reachable (green) or error (red)
- Async test via coroutine (no UI freeze)
- PortForwardManager: local/remote port forwarding via JSch
- Port forward dialog in SshTerminalScreen toolbar
- PortForwardManager.kt: addForward/removeForward/listForwards
- Auto theme follow system (isSystemInDarkTheme)
- Copy terminal output to clipboard (📋 button)
- Reconnect button when connection drops
- Font size picker dialog (Small/Medium/Large)
- Font size persisted via SshConfigStorage
- SshTerminalManager.reconnect() using last config
- Chinese input: send on Enter rather than per-char
- Connection grouping with custom group names
- Search bar filters by name/host/username
- EncryptedSharedPreferences → plain prefs (no deprecated API warnings)
- Fixed -Werror compile issues
- New SshConfigStorage.kt: EncryptedSharedPreferences for connection persistence
- SshTerminalManager.kt: add connectWithKey() for SSH key auth
- SshHost.kt: redesign with saved connection list + file picker
- SshTerminalScreen.kt: SshConnectDialog supports password/key toggle
- SettingsScreens.kt: update call site for new dialog API
- SshConfig: @Serializable for JSON storage
- Removed OpenClaw gateway onboarding/gateway/NodeRuntime/ViewModel dependency
- RootScreen now directly launches SshHost (SSH terminal)
- MainActivity simplified: no ForegroundService, no viewmodel, no permissions requests
- AndroidManifest cleaned up (removed unused services)
- Tergent is now a pure SSH terminal client