PROBLEM: setelah konek SSH, prompt tidak keluar & keyboard tidak muncul.
FIX (input):
- TerminalView: implementasi InputConnection (BaseInputConnection) jadi soft
keyboard bisa muncul; onCheckIsTextEditor=true; commitText/key events
diteruskan ke SSH session (onKeyInput). Handle hardware keyboard: Ctrl+letter
-> ascii control, Enter/panah/PgUp/PgDn/Home/End/Esc/Tab/Del.
- TerminalController.attach(): hubungkan view.onKeyInput -> engine.write()
- TerminalActivity: requestFocus() + showKeyboard() saat 'Terhubung'.
FIX (render — bug ditemukan via unit test baru):
- TerminalModel.write('\n') kini reset cursorCol=0 (LF berperilaku seperti
LF+CR). Sebelumnya LF tidak reset kolom sehingga baris lanjutan ditulis di
posisi salah & scroll ganda terjadi.
- TerminalModel.scrollUp() tidak lagi mengubah cursorRow (pemanggil yang atur).
- Tambah 8+ unit test (TerminalParserTest): prompt shell, CRLF, truecolor SGR,
erase, scroll, multiline. Semua 10 lulus.
verified: gradle :app:testDebugUnitTest BUILD SUCCESSFUL (10 tests, 0 fail);
gradle :app:assembleDebug BUILD SUCCESSFUL.
SSH Mobile Client — Android
A proper, interactive SSH client for Android, built natively in Kotlin. Designed like Termux-style terminals so vim, nano, htop, tmux, top, ssh, and other interactive CLIs work correctly over a real PTY.
Status: ter-build & terverifikasi. Pada 2026-08-30 proyek ini berhasil dikompilasi penuh (Gradle
assembleDebug) dan diproduksi APK (11 MB). Repo berisi project Kotlin/AndroidStudio lengkap — tinggal buka di Android Studio atau build via CLI.
✨ Fitur (versi 1.0)
| Area | Dukungan |
|---|---|
| SSH 2.x | sshj 0.38 (SSH-2), handshake modern (RSA/ECDSA/ED25519) |
| PTY interaktif | xterm-256color PTY, shell interaktif penuh |
| ANSI warna | 16 + 256 + TrueColor (24-bit) SGR — parser ditulis sendiri |
| Font custom | ukuran font diatur (pinch-to-zoom 14–60px), monospace |
| Tema terminal | 6 tema built-in (Hijau, Tango, Solarized×2, Gruvbox, Material) + Dark UI |
| Keyboard khusus | Baris Ctrl/Alt/Esc/Tab/panah/PgUp/PgDn/Del |
| Copy/paste & seleksi | Seleksi teks → salin ke clipboard, tempel ke sesi |
| Autentikasi | Password / private key (+passphrase) |
| Profil server | Simpan banyak profil (nama, host, port, user, tema, ukuran font) |
| Kredensial aman | EncryptedSharedPreferences (Tink/GCM) — semua tersimpan terenkripsi |
| Reconnect & keep-alive | Reconnect otomatis dengan backoff + keep-alive SSH (60s) |
| Orientasi | Portrait & landscape — PTY di-resize otomatis mengikuti layout |
Backlog: SFTP browser, host-key pinning (known_hosts), manajemen key dari file, toggle Dark/Light saat runtime.
🏗️ Arsitektur
app/src/main/java/com/kosbarokah/sshclient/
├── data/
│ ├── ServerProfile.kt # model profil + ThemePreset (16-warna & tema)
│ └── SecureStore.kt # simpan profil + kredensial terenkripsi
├── ssh/
│ └── SshEngine.kt # koneksi SSH (sshj), PTY, auth, reconnect, keep-alive
├── terminal/
│ ├── TerminalModel.kt # buffer layar + scrollback + sel (warna/atribut)
│ ├── TerminalParser.kt # parser ANSI/VT100 (16/256/TrueColor, cursor, clear)
│ ├── TerminalView.kt # View custom: render, seleksi, copy, pinch-zoom
│ ├── TerminalScheme.kt # data skema warna (palette + bg/fg/cursor)
│ └── TerminalController.kt # perekat: parser ↔ SSH ↔ View
├── keyboard/
│ └── KeySequences.kt # byte sequence key khusus (Esc, panah, Ctrl, dst)
└── ui/
├── ConnectActivity.kt # daftar profil ter-simpan
├── ProfileEditorActivity.kt # tambah/edit/delete profil + kredensial
└── TerminalActivity.kt # layar terminal + toolbar + key bar
🚀 Cara Membangun (Android Studio)
- Buka folder ini di Android Studio (Flutter? Tidak — ini native Kotlin/Gradle).
- Pastikan SDK
android-34& build-tools34.0.0terinstal (Android Studio akan menawarkan secara otomatis). - Sync Gradle — semua dependensi (sshj, security-crypto, Material, coroutines) diambil dari Maven Central / Google.
- Run di emulator atau perangkat Android (minSdk 26 / Android 8.0+).
Bisa juga via command-line (tanpa Android Studio):
# Prasyarat di mesin pengembang:
# - JDK 17
# - Android SDK command-line tools (platform android-34, build-tools 34.0.0)
# - Gradle 8.9 (atau buka di Android Studio yang membawa Gradle sendiri)
export ANDROID_HOME=/path/to/Sdk # sesuaikan dengan lokasi SDK-mu
gradle :app:assembleDebug # hasil: app/build/outputs/apk/debug/app-debug.apk
Catatan: tidak ada
gradlewwrapper di proyek ini; gunakan Gradle yang terinstal (8.9) atau buka via Android Studio (yang menyediakan Gradle sendiri).
🧪 Verifikasi Build
Pada 2026-08-30 yang lalu, hasil build di jalur produksi:
gradle :app:assembleDebug→ BUILD SUCCESSFUL, APK 11 MB diproduksigradle :app:lintDebug→ 0 error (hanya warning versi dependency yang tidak wajib di-upgrade)- Struktur lengkap: 13 file Kotlin, 10 resource XML,
AndroidManifest.xml, Gradle config
Catatan: terminal emulator diimplementasikan sendiri (tanpa library pihak ketiga) supaya build bersih & dependable.
TerminalParsermenangani subset ANSI yang cukup untuk vim/nano/htop/tmux/top: SGR warna (16/256/TrueColor), cursor movement/clear, scrollback, dan OSC (ignored body). Karena tidak ada emulator Android di lingkungan build ini, verifikasi dibatasi pada compile + resource + lint; uji runtime tetap perlu di perangkat/emulator.
🔐 Keamanan
- Semua profil & kredensial disimpan lewat
EncryptedSharedPreferences(master key AES256-GCM dari Android Keystore, nilai dienkripsi AES256-GCM). - Private key & passphrase tidak pernah diserialisasi sebagai teks polos ke disk.
- Host key verifier v1 bersifat "terima semua" dengan catatan TODO untuk pinning known_hosts di rilis berikut (terbilang di backlog).
🖥️ Skenario Penggunaan
- SSH ke server/cantor untuk akses shell jarak jauh.
- Menjalankan editor terkesan:
vim,nano,htop,tmux,ssh,kubectl. - Warna penuh untuk
ls -la --color,bat,lsd,fzf,grep --color. - Simpan beberapa profil server untuk akses satu-ketukan.
📄 Lisensi
Kode contoh internal — untuk digunakan oleh project Kos Barokah.