Tags: abhay-byte/nativecode
Tags
feat(terminal): debian proot runtime + xfce chroot installer
Adds a Debian proot runtime alongside the existing Alpine one:
* core/runtime/Distro enum (Alpine | Debian) parameterises EmbeddedRuntime
so the same screen works for both. The Alpine rootfs is still bundled in
assets; the Debian one is downloaded on first use by setup_debian_proot.sh
(~25 MB from debuerreotype/dist-arm64v8/trixie/minimal/rootfs.tar.xz).
* ShellSession auto-spawns '/bin/sh -c "exec su - flux"' for Debian so
the terminal opens as the 'flux' user (uid 1000). setup_debian_proot.sh
creates that user with passwd -d (empty password) and NOPASSWD sudo.
* assets/scripts/embedded/setup_debian_proot.sh — single-shot installer
that downloads, extracts, bind-mounts, and bootstraps the chroot via the
app's own proot + libtalloc. Idempotent: re-runs are no-ops.
* assets/scripts/chroot/setup_xfce_chroot.sh — focused XFCE4 installer
for the Termux-based Debian 13 chroot (apt install xfce4 + goodies,
user tweaks, generates /data/local/tmp/start_xfce_chroot.sh and stop_…).
* setup_alpine_embedded.sh now uses 'apk add --no-cache --force-overwrite'
to suppress the binutils/gcc hardlink-rename warnings on proot bind mounts.
* New 'Debian GNU/Linux' card on the home screen; tapping it opens the
terminal screen with distro=Debian. Mirrors the Alpine card layout.
fix(terminal): unique LazyColumn key — was crashing on duplicate lines
items(output, key = { it.hashCode() }) collided as soon as two
terminal lines had the same text (e.g. a duplicated prompt). Compose
threw IllegalArgumentException('Key was already used') and the app
got kicked to the launcher mid-setup. Switched to itemsIndexed with
the list index as the key — guaranteed unique.
Crash trace from d30a1726 (logcat):
FATAL EXCEPTION: main
java.lang.IllegalArgumentException: Key "108068241" was already
used. If you are using LazyColumn/Row please make sure you
provide a unique key for each item.
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState
.subcompose
fix(terminal): IME padding — keyboard no longer covers the input row windowSoftInputMode was unset (defaulting to adjustUnspecified/pan), so the soft keyboard floated over the TextField and obscured the bottom of the terminal. Add: AndroidManifest: android:windowSoftInputMode="adjustResize" EmbeddedRuntimeScreen Column: .imePadding() Verified on Y5WWBMJVOZSK4HU8: keyboard is up, $ prompt + send button remain visible above the IME, terminal output reflows above them.