Reduce logic duplication in build.py and app/buildSrc. The ground truth
is always build.py, so dump all information into a file so the gradle
projects are always in sync with the rest of the project.
The command passed to busybox `script -c '...'` contained embedded
single quotes (from echo and file path), breaking the outer quoting.
Escape them with the standard POSIX `'\''` technique before wrapping.
Made-with: Cursor
- Use Box with weight(1f) for card content so text gets full width
- Pin Install/Reinstall button to bottom with fixed height for alignment
- Exclude libandroidx.graphics.path.so from APK (Java fallback exists)
Made-with: Cursor
Bump miuix to 0.8.6 and migrate Checkbox to the new ToggleableState
API. The package-level checkbox now shows indeterminate state when
only some processes are selected.
Made-with: Cursor
Fork and heavily simplify terminal-emulator/terminal-view from Termux into
a self-contained Kotlin terminal package. Remove all library-style abstractions
(TerminalOutput, TerminalSessionClient, Logger) and dead code (mouse events,
paste, key input) since the terminal is read-only. The emulator creates a PTY
via busybox script for proper escape sequence support. The UI is a pure Compose
Canvas with scroll support, replacing the old AndroidView-based approach.
Made-with: Cursor
FlashScreen's useTerminal was a plain getter on flashAction, which was
only set in LaunchedEffect (after first composition). Since it wasn't
a Compose State, no recomposition occurred, leaving the screen stuck on
an empty LazyColumn. The unreachable TerminalComposeView meant
onEmulatorReady was never called, hanging the coroutine and eventually
crashing the process.
Pass the action from the route key directly to FlashScreen so it can
pick the correct UI path on the very first composition.
Made-with: Cursor
Filter out disabled tabs from the pager and navigation bar instead
of showing them as greyed-out, preventing swipe access to unavailable
screens.
Made-with: Cursor