- Add InputType.TYPE_CLASS_TEXT so IME shows Send key on all keyboards
- Replace kotlinx.coroutines.MainScope() with external coroutineScope
to avoid lifecycle mismatch and potential scope cancellation
v1.2.9 removed setOnEditorActionListener, relying only on TextWatcher
detecting \n character. Many soft keyboards (especially Chinese IMEs)
send IME_ACTION_SEND/GO/DONE instead of inserting \n, so commands were
never sent.
This re-adds EditorInfo.IME_ACTION_SEND/GO/DONE handling alongside the
existing TextWatcher newline detection.
- 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