Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
87f9854
docs(spec): Android mobile app v1 design
thangnm93 Jun 24, 2026
5636ef7
docs(plan): Android mobile app M1 implementation plan
thangnm93 Jun 24, 2026
0fbd630
build(android): add Android target via flutter create
thangnm93 Jun 24, 2026
44fcc1c
feat(mobile): add isMobilePlatform runtime detection
thangnm93 Jun 24, 2026
5ee4e10
feat(mobile): minimal mobile app shell with bottom nav
thangnm93 Jun 24, 2026
967a6c9
feat(mobile): branch main() to mobile app on Android
thangnm93 Jun 24, 2026
27dd87d
build(android): bump compileSdk to 36 for transitive plugins + ignore…
thangnm93 Jun 24, 2026
cf9889e
docs(plan): Android mobile app M2 implementation plan
thangnm93 Jun 25, 2026
5f250f6
feat(mobile): bootstrap providers + SSH wiring
thangnm93 Jun 25, 2026
62cd740
feat(mobile): hosts screen with search and connect
thangnm93 Jun 25, 2026
999bd8d
feat(mobile): minimal add-host form
thangnm93 Jun 25, 2026
1bfdb03
feat(mobile): sessions screen with terminal + status
thangnm93 Jun 25, 2026
d3d399b
feat(mobile): wire hosts + sessions into shell
thangnm93 Jun 25, 2026
59bec98
feat(mobile): accessory bar sticky-modifier controller
thangnm93 Jun 25, 2026
d1c5ea8
feat(mobile): accessory key bar wired to terminal
thangnm93 Jun 25, 2026
37bcac2
feat(mobile): pinch-to-zoom terminal font
thangnm93 Jun 25, 2026
5760365
docs(plan): Android mobile app M3 implementation plan
thangnm93 Jun 25, 2026
980df13
feat(mobile): add sync provider + service to bootstrap
thangnm93 Jun 25, 2026
151fbdf
feat(mobile): settings screen with cloud sync pull
thangnm93 Jun 25, 2026
97e9c29
feat(mobile): P2P transfer-code parser
thangnm93 Jun 25, 2026
5a47352
build(mobile): add mobile_scanner + camera permission
thangnm93 Jun 25, 2026
8357b4f
feat(mobile): P2P QR camera import
thangnm93 Jun 25, 2026
163a3ef
docs(plan): Android mobile app M4 implementation plan
thangnm93 Jun 25, 2026
ebb8d25
feat(mobile): add snippets + transfer service to bootstrap
thangnm93 Jun 25, 2026
acf8c68
feat(mobile): snippets sheet inserts into terminal
thangnm93 Jun 25, 2026
7adc3a8
feat(mobile): single-panel SFTP browser + download/upload
thangnm93 Jun 25, 2026
c868b5e
docs(plan): Android mobile app M5 implementation plan
thangnm93 Jun 25, 2026
1234517
build(mobile): add local_auth for app-lock
thangnm93 Jun 25, 2026
152d469
feat(mobile): biometric app-lock gate
thangnm93 Jun 25, 2026
0bef8e4
feat(mobile): app-lock toggle in settings
thangnm93 Jun 25, 2026
a6a876c
feat(mobile): TOFU host-key-mismatch dialog
thangnm93 Jun 25, 2026
c38cd6d
feat(mobile): terminal appearance settings + apply
thangnm93 Jun 25, 2026
dbd5933
build(android): release signing via key.properties (debug fallback)
thangnm93 Jun 25, 2026
76b9632
docs: sync README shipped features + note Android v1 (in development)…
thangnm93 Jun 25, 2026
c4e4503
fix(mobile): address code review — app-lock lifecycle, sync seed race…
thangnm93 Jun 25, 2026
09926b4
fix(mobile): app-lock falls open when device has no biometric/credent…
thangnm93 Jun 25, 2026
fad76cd
docs: mobile Termius-style UI redesign design spec
thangnm93 Jun 25, 2026
b542aff
docs: mobile Termius-style UI redesign implementation plan
thangnm93 Jun 25, 2026
fb4f37c
feat(mobile): add shared layout tokens
thangnm93 Jun 25, 2026
4ab1309
feat(mobile): add HostAvatar with seeded initials
thangnm93 Jun 25, 2026
2527327
feat(mobile): add StatusDot + connection-state mapping
thangnm93 Jun 25, 2026
a7b2e20
feat(mobile): add TagChip, SectionHeader, MobileCard
thangnm93 Jun 25, 2026
e02a025
feat(mobile): add HostCard row
thangnm93 Jun 25, 2026
0a2fc5c
feat(mobile): Termius-style hosts list with cards, tag filter, delete
thangnm93 Jun 25, 2026
e4ac464
feat(mobile): cursor-drag to arrow-key mapper
thangnm93 Jun 25, 2026
075878b
feat(mobile): accessory bar gains a side-panel button + $ key
thangnm93 Jun 25, 2026
8b9d46a
feat(mobile): terminal side panel (keys/snippets/history/themes)
thangnm93 Jun 25, 2026
5712311
feat(mobile): side panel, cursor-drag gestures, pill session tabs
thangnm93 Jun 25, 2026
e646fb0
feat(mobile): SFTP breadcrumb + typed file rows + human sizes
thangnm93 Jun 25, 2026
f1e907e
feat(mobile): sectioned settings with cards and headers
thangnm93 Jun 25, 2026
c0d77ae
feat(mobile): grouped add-host form
thangnm93 Jun 25, 2026
1c56482
fix(mobile): correct history ordering, prune pinch map, drop dead sni…
thangnm93 Jun 25, 2026
aaa40a3
feat(mobile): edit host via long-press menu (reuse add-host form)
thangnm93 Jun 26, 2026
2979eb4
feat(mobile): preserve certificate/agent auth when editing a host
thangnm93 Jun 26, 2026
611086e
docs: add mobile design-import redesign spec
thangnm93 Jun 26, 2026
416259f
docs: add mobile design-import implementation plan
thangnm93 Jun 26, 2026
f25a037
feat(mobile): amber theme, expanded tokens, bundled fonts
thangnm93 Jun 26, 2026
6db6ddf
feat(mobile): list primitives (card, group, settings row, latency bad…
thangnm93 Jun 26, 2026
b12f2dc
fix(mobile): update status-dot test, guard latency null, trim setting…
thangnm93 Jun 26, 2026
8554174
feat(mobile): redesigned host card + avatar
thangnm93 Jun 26, 2026
7fa75d3
feat(mobile): amber tab bar + 4-tab home shell
thangnm93 Jun 26, 2026
9db3c38
fix(mobile): re-wire TofuWatcher around home shell
thangnm93 Jun 26, 2026
6a2092f
feat(mobile): best-effort host reachability probe
thangnm93 Jun 26, 2026
16cfb67
feat(mobile): redesigned hosts screen with folder chips + latency
thangnm93 Jun 26, 2026
8631ae7
perf(mobile): flatten hosts list build to O(n)
thangnm93 Jun 26, 2026
e5d9d4b
feat(mobile): grouped new/edit host form
thangnm93 Jun 26, 2026
f0446ef
fix(mobile): correct app-lock pref key + wire Save & connect
thangnm93 Jun 26, 2026
848ce60
fix(mobile): return saved host id from _doSave for reliable connect
thangnm93 Jun 26, 2026
3e1459b
feat(mobile): keys screen with generate/import
thangnm93 Jun 26, 2026
ef24fe7
fix(mobile): prompt passphrase on key import, real SHA256 fingerprint
thangnm93 Jun 26, 2026
adb1a3f
feat(mobile): snippets screen with tap-to-run
thangnm93 Jun 26, 2026
a250bef
feat(mobile): grouped settings screen
thangnm93 Jun 26, 2026
cf6e3c7
fix(mobile): dedicated accessory-bar pref, fix sync-sheet spinner
thangnm93 Jun 26, 2026
e72c35f
fix(mobile): supply all tab-screen providers in shell tests
thangnm93 Jun 26, 2026
c47f020
test(mobile): update settings cloud-config save test for new sheet UI
thangnm93 Jun 26, 2026
eaae513
feat(mobile): terminal screen with session tabs + reskinned shortcut bar
thangnm93 Jun 26, 2026
0ac4812
fix(mobile): reskin accessory key bar to amber, status-driven header dot
thangnm93 Jun 26, 2026
ff1785a
feat(mobile): host->terminal navigation and session re-entry
thangnm93 Jun 26, 2026
c921dc4
fix(mobile): re-check sessions before pop, consistent session pick, l…
thangnm93 Jun 26, 2026
4f51caf
feat(mobile): redesigned SFTP files browser (contextual)
thangnm93 Jun 26, 2026
bd58f36
feat(mobile): wire port-forward, snippets, key-gen into bootstrap
thangnm93 Jun 26, 2026
7e283e1
test(mobile): assert bootstrap providers resolve from child context
thangnm93 Jun 26, 2026
b0c8357
feat(mobile): port forwarding screen with start/stop
thangnm93 Jun 26, 2026
1e55214
fix(mobile): remove coming-soon stubs, validate port-forward rule input
thangnm93 Jun 26, 2026
40a003a
feat(mobile): supabase sync + QR pairing screen
thangnm93 Jun 26, 2026
4db441d
fix(mobile): restore Supabase config entry in sync screen
thangnm93 Jun 26, 2026
301e6f6
fix(mobile): validate Supabase config before save
thangnm93 Jun 26, 2026
66c100e
polish(mobile): analyze clean, close minor test gaps, fidelity pass
thangnm93 Jun 26, 2026
203c88b
fix(mobile): wire KeyGenService in bootstrap, persist generated key p…
thangnm93 Jun 26, 2026
03dad5c
fix(mobile): folder filter chips use uniform large pill style
thangnm93 Jun 27, 2026
655a66b
fix(mobile): snippets category filter chips use uniform large pill
thangnm93 Jun 27, 2026
fbcf261
feat(mobile): add Android launcher icon (adaptive amber terminal glyp…
thangnm93 Jun 27, 2026
39f9018
fix(mobile): balance filter chips (min-width, centered Inter text)
thangnm93 Jun 27, 2026
204739a
chore: sync generated desktop plugin registrants
thangnm93 Jun 30, 2026
4aaad91
chore: keep leftover local debug probes + temp review diff (throwaway…
thangnm93 Jun 30, 2026
c86f12b
chore: drop throwaway debug probes + temp review diff, gitignore them
thangnm93 Jun 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ app/build

# Review/scratch artifacts
.tmp-review/
.review_diff_tmp.txt

# Throwaway local debug probes (self-labelled "delete after debugging")
app/integration_test/local_shell_probe_test.dart
app/integration_test/pty_probe_test.dart

# Dart package build artifacts (packages/ subdirectories only)
packages/*/.dart_tool/
Expand Down
26 changes: 20 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,17 +78,22 @@ sudo dpkg -r yourssh

### Terminal & Connectivity
- **In-app RDP client** — connect to Windows, xrdp, and any RDP-compatible server directly from a tab alongside your SSH sessions; supports NLA, TLS, and auto security modes; optional SSH tunnel via a saved jump host; server-certificate TOFU with pre-auth pin enforcement (a changed certificate aborts before your credentials are sent); **fullscreen mode** with an mstsc-style hover bar at the top edge; full keyboard and mouse support (including Ctrl+Alt+Del); bidirectional clipboard; RDP tabs excluded from terminal-only features (recording, split view, input bar, snippets)
- **In-app VNC client** — connect to Linux VNC servers (TigerVNC, x11vnc, TightVNC) as first-class tabs too; RFB with None / VNC-password auth, framebuffer rendering, full mouse + keyboard, bidirectional clipboard, server-driven auto-resize, optional SSH tunnel through a saved jump host, and the same fullscreen hover-bar UX as RDP
- **Multi-tab SSH sessions** with named tabs, per-tab connection state, distro icons (detected via `/etc/os-release`), and middle-click to close
- **Terminal sharing (multiplayer)** — share a live SSH session with a session code; guests join via the Command Palette and watch or interact in real time; built on Supabase Realtime
- **Split terminal view** — horizontal/vertical pane splitting within a session
- **Search-in-scrollback (Cmd/Ctrl+F)** — regex-powered search across the full terminal buffer; highlights all matches, navigate with Enter / Shift+Enter
- **Copy & paste that just works** — `Ctrl+C` copies when text is selected and stays SIGINT otherwise (Windows Terminal behavior); `Cmd+C/V` on macOS, `Ctrl(+Shift)+V` to paste, right-click Copy/Paste/Select All menu, and middle-click paste
- **Shell integration (bash/zsh)** — injected OSC 7/133 prompt hooks surface the working directory on the session tab, a per-command status gutter (green = ok, red = failed), jump-to-prompt (Cmd/Ctrl+↑/↓), and cwd-aware path completion in the input bar; auto-on with per-host / global opt-out; the setup script is delivered invisibly (never echoed into your terminal or recordings)
- **Port forwarding** — local, remote, and dynamic SOCKS5 tunnels with start/stop per rule, auto-start on launch, live connection counters, auto-reconnect with backoff when the SSH link drops (no terminal tab required — tunnels dial the host with stored credentials), and a right-click menu to duplicate rules
- **Jump host / bastion proxy** — connect to internal servers via a bastion host; select any saved host as the jump hop in the host detail panel
- **Jump host / bastion proxy (multi-hop)** — connect to internal servers through one or more bastions (bastion → bastion → target); a Termius-style visual Connection Chain editor in the host panel adds/removes hops, with per-hop host-key verification and loop protection
- **Outbound connection proxy** — per-host HTTP CONNECT or SOCKS5 proxy for SSH connections on restricted networks, with optional username/password auth; composes with the multi-hop jump chain (the proxy password stays in secure storage, never in synced data)
- **SSH agent forwarding** — per-host toggle (like `ssh -A`) to hop between servers with the keys on your local machine; serves your system agent, falling back to app-Keychain keys when no agent is running — private keys never leave your machine; a status line in the host panel and a per-session key icon show whether forwarding is ready, active, on Keychain fallback, or refused by the server
- **Local shell** — spawn native macOS/Windows/Linux shell alongside SSH sessions
- **Local shell** — spawn a native macOS/Windows/Linux shell as a first-class tab alongside SSH sessions, and pick which shell to run (PowerShell, cmd, PowerShell 7, Git Bash, WSL distros on Windows; `$SHELL` / `/etc/shells` / custom executables elsewhere)
- **Keyword highlighting** — user-defined regex rules tint matching terminal output; ships with Error/Warning/Fail defaults (red/yellow/cyan); toggle, rule list, add/edit dialog, and per-rule color picker in Settings → Terminal and the terminal config side panel
- **OSC 52 clipboard** — remote apps (tmux, vim) can copy to your local system clipboard via the OSC 52 escape sequence; write-only and per-host opt-in for safety
- **Scrollback paging & Reset Terminal** — Shift+PageUp / Shift+PageDown page through scrollback, and a right-click **Reset Terminal** recovers a session stuck in the alternate screen after a TUI crashed (the local equivalent of `reset`)
- **Session templates (per-host presets)** — per-host working directory, environment variables (delivered invisibly via the shell-integration handshake), a startup snippet, and per-host terminal theme / font / size / TERM / tmux overrides
- **xterm-256color** terminal emulation with full PTY support

### File Management
Expand All @@ -102,6 +107,7 @@ sudo dpkg -r yourssh

### Credentials & Security
- **4 auth methods**: password, SSH private key, SSH certificate (CA-signed), SSH agent (`SSH_AUTH_SOCK` on macOS/Linux; `\\.\pipe\openssh-ssh-agent` on Windows 10+)
- **In-app SSH key generation** — generate Ed25519 / RSA-4096 / ECDSA-P256 keys from the Keychain screen (optional passphrase), then copy the public key or push it to a host with a built-in `ssh-copy-id`-style deploy dialog
- **OS-level secure storage**: credentials encrypted in macOS Keychain / Windows Credential Manager via `flutter_secure_storage`
- **Known hosts verification**: interactive fingerprint trust dialog on first connect; persistent known-hosts database
- **Zero-knowledge cloud sync**: host configs encrypted client-side (AES-256-GCM) with a 12-character sync code that never leaves your devices — the Supabase anon key alone cannot decrypt anything
Expand All @@ -118,8 +124,11 @@ sudo dpkg -r yourssh
- **Dashboard grid & list view** — switch between host cards and a compact list, with persistent sorting (name, creation date, or hostname)
- **Broadcast mode** — send the same input to multiple sessions at once
- **Code editor** — edit remote files inline with a Monaco-powered editor
- **Session recording** — record terminal output to Asciinema v2 (`.cast`) files; per-host auto-record setting; manual start/stop from the toolbar; Recording Library with in-app playback (play/pause, speed control 0.5×–5×)
- **Session recording** — record terminal output to Asciinema v2 (`.cast`) files; per-host auto-record setting; manual start/stop from the toolbar; Recording Library with in-app playback (play/pause, speed control 0.5×–5×); secrets are redacted before being written to the file (global + per-host opt-out)
- **Notification bell** — a bell in the top tab bar collects in-app notifications (new release available with a one-click Update button, sessions that dropped unexpectedly) behind an unread badge; opening the panel marks them read, items can be dismissed individually or cleared all at once
- **Internal audit log** — a local, searchable SQLite trail of connect / disconnect / exec / input events with per-caller source tagging and secret redaction before write; filter by host / type / time, with CSV / JSON export and configurable retention
- **Network discovery** — scan the local network for SSH/RDP hosts (mDNS + TCP port scan) and add them with one tap, without typing an IP
- **Import from anywhere** — bulk-import hosts from SSH config, JSON, CSV, PuTTY, MobaXterm, SecureCRT, Ansible inventory, WinSCP, Termius, or `ssh://` URIs; import known hosts from `~/.ssh/known_hosts`

### Design
- Dark-only interface with a cohesive green-accent palette
Expand All @@ -129,7 +138,8 @@ sudo dpkg -r yourssh
- Minimum window size enforced (800×600); fully resizable

### DevOps & Developer Tools
- **Containers (Docker / Kubernetes)** — list running containers (`docker ps`) and pods (`kubectl get pods`) on the active SSH session, then **Exec** into any of them in a new terminal tab; namespace filter + all-namespaces toggle for Kubernetes, and an install/permission hint when the runtime is missing
- **Containers (Docker / Compose / Kubernetes)** — dedicated tabs on the Containers screen. **Docker**: live `docker ps -a` list with per-container Start / Stop / Restart, one-click **Exec** into a new tab, and a follow-mode log viewer. **Compose**: stack discovery (`docker compose ls` + filesystem sweep), per-stack Up / Down, and per-service Start / Stop with follow-mode logs. **Kubernetes**: context switcher, streamed `kubectl logs -f`, and 1-click port-forward; namespace filter + all-namespaces toggle
- **Server monitor** — per-host live dashboard (CPU / memory / disk / uptime / listening ports / firewall) in a draggable bottom sheet, polled over SSH; auto-detects ufw / iptables / nftables
- **Network Tools** — ping, cURL, DNS lookup, traceroute, port scan, whois, netstat, disk usage, memory info, HTTP headers, SSL certificate inspection — all run on the active SSH session
- **Cloudflare Tunnel manager** — start/stop quick tunnels via `cloudflared` on the remote host; public URL displayed instantly
- **LAN Share** — serve any local file over HTTP for one-click download on the same network
Expand Down Expand Up @@ -539,6 +549,10 @@ Include a short description of **what** changed and **why**. Screenshots for UI
- [x] Multi-provider AI assistant (Claude, OpenAI, Gemini)
- [x] P2P host sync via QR code (LAN / Tailscale, AES-256-GCM encrypted)
- [x] **Script Engine** — disk-based JS plugins via QuickJS FFI; HookBus; SSH/SFTP/Storage/UI bridges; hot-reload; permission guard + circuit breaker; consent dialog, manager screen, console log viewer
- [x] **In-app RDP client** — Windows / xrdp desktops as tabs (NLA/TLS, TOFU pin enforcement, SSH tunnel, fullscreen)
- [x] **In-app VNC client** — Linux VNC servers (TigerVNC / x11vnc / TightVNC) as tabs
- [x] **Internal audit log** — local SQLite trail of connect/exec/input with secret redaction, filters, and CSV/JSON export
- [x] **Outbound connection proxy** — per-host HTTP CONNECT / SOCKS5 proxy for SSH on restricted networks

### ✅ Phase 1 — Quick wins

Expand All @@ -562,14 +576,14 @@ Include a short description of **what** changed and **why**. Screenshots for UI

### 🔜 Phase 4 — DevOps tooling

- [ ] **Docker / Kubernetes exec** — list containers/pods on the remote host and exec into them directly
- [x] **Docker / Compose / Kubernetes** — list containers, Compose stacks, and pods; Start/Stop/Restart, exec into a new tab, follow-mode logs, and K8s port-forward
- [ ] **Remote process manager** — `htop`-style process list with kill support
- [ ] **Log tail viewer** — real-time `tail -f` panel with regex filter and highlight

### 🔜 Phase 5 — Platform expansion

- [ ] **iOS / iPadOS target** (experimental)
- [ ] **Android target** (experimental)
- [ ] **Android target** — 🚧 *in development* (`feat/android-mobile-app`): mobile SSH client with multi-tab terminal + accessory key bar, hosts/keys, cloud + P2P QR host import, single-panel SFTP, snippets, biometric app-lock, and TOFU. Not yet released.

---

Expand Down
2 changes: 1 addition & 1 deletion app/.metadata
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ migration:
- platform: root
create_revision: 559ffa3f75e7402d65a8def9c28389a9b2e6fe42
base_revision: 559ffa3f75e7402d65a8def9c28389a9b2e6fe42
- platform: linux
- platform: android
create_revision: 559ffa3f75e7402d65a8def9c28389a9b2e6fe42
base_revision: 559ffa3f75e7402d65a8def9c28389a9b2e6fe42

Expand Down
15 changes: 15 additions & 0 deletions app/android/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
.cxx/
/build/

# Remember to never publicly share your keystore.
# See https://flutter.dev/to/reference-keystore
key.properties
**/*.keystore
**/*.jks
71 changes: 71 additions & 0 deletions app/android/app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import java.util.Properties
import java.io.FileInputStream

plugins {
id("com.android.application")
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id("dev.flutter.flutter-gradle-plugin")
}

// Release signing is driven by a gitignored `key.properties` (storeFile,
// storePassword, keyAlias, keyPassword). Absent it, release falls back to the
// debug keys so unsigned debug builds still work.
val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}

android {
namespace = "com.thangnm.yourssh"
// Transitive plugins (flutter_plugin_android_lifecycle via file_picker)
// require compiling against API 36; the Flutter default is still 34.
compileSdk = 36
ndkVersion = flutter.ndkVersion

compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}

defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.thangnm.yourssh"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
}

signingConfigs {
if (keystorePropertiesFile.exists()) {
create("release") {
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
storeFile = file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["storePassword"] as String
}
}
}

buildTypes {
release {
signingConfig = if (keystorePropertiesFile.exists())
signingConfigs.getByName("release")
else
signingConfigs.getByName("debug")
}
}
}

kotlin {
compilerOptions {
jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17
}
}

flutter {
source = "../.."
}
7 changes: 7 additions & 0 deletions app/android/app/src/debug/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
47 changes: 47 additions & 0 deletions app/android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Camera is used only to scan the desktop's P2P sync QR code. -->
<uses-permission android:name="android.permission.CAMERA"/>
<application
android:label="yourssh"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:taskAffinity=""
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
<!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility and
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.

In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
<queries>
<intent>
<action android:name="android.intent.action.PROCESS_TEXT"/>
<data android:mimeType="text/plain"/>
</intent>
</queries>
</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.thangnm.yourssh

import io.flutter.embedding.android.FlutterActivity

class MainActivity : FlutterActivity()
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions app/android/app/src/main/res/drawable-v21/launch_background.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />

<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions app/android/app/src/main/res/drawable/launch_background.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />

<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground>
<inset
android:drawable="@drawable/ic_launcher_foreground"
android:inset="16%" />
</foreground>
</adaptive-icon>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
18 changes: 18 additions & 0 deletions app/android/app/src/main/res/values-night/styles.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.

This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>
4 changes: 4 additions & 0 deletions app/android/app/src/main/res/values/colors.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#000000</color>
</resources>
Loading