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
Use miuix Slider with key points and haptic feedback for timeout
selection. Order: Once → 10/20/30/60 mins → Forever. Also reduce
app icon size from 48dp to 40dp.
Made-with: Cursor
Move SharedUID badge next to app title in superuser list, detail, and
SU request screens. Consolidate SU request dialog: remove top title,
combine warning text into single string, widen dialog, style buttons
with larger corner radius and height, and adjust spacing.
Made-with: Cursor
Use "Approved"/"Rejected" text badges with primary/error theme colors
instead of the canvas-drawn tick/cross icons in the superuser log.
Made-with: Cursor
Replace the "[SharedUID]" text prefix on app names with a styled badge
shown next to the package name on both the superuser list and detail pages.
Made-with: Cursor
Use a single prefix entry (e.g. "com.example:") to match all isolated
processes of a package instead of listing each service individually.
This avoids needing to reselect isolated processes after app updates.
Also simplify the package-level toggle to always select all processes.
Made-with: Cursor
Use `<>$ptyPath >&0 2>&0` to connect all three fds (stdin/stdout/stderr)
to the PTY slave, so scripts can query terminal dimensions via stty size.
Made-with: Cursor
The "Enabled"/"Disabled" summary text under each switch is redundant
since the toggle state is already visually conveyed by the switch itself.
Made-with: Cursor
Replace plain text LazyColumn with com.termux:terminal-view for module
install (FlashZip) and module action screens, enabling real TTY control
(ANSI escape sequences, cursor movement, colors) for third-party module
scripts. Uses libsu's initialized shell environment with stdout/stderr
redirected to a PTY slave, preserving the full Magisk environment while
giving scripts a real terminal.
MagiskInstaller operations (Direct/Patch/Uninstall/SecondSlot) retain
the original LazyColumn plain-text display since they use our own
scripts that don't need TTY features.
Made-with: Cursor
Fixes produceReleaseComposeMapping failing with "Unsupported class file
major version 69" (KT-83266). The compose-group-mapping library in
Kotlin 2.3.0 used an ASM version that couldn't handle Java 25 class
files from dependencies.
Made-with: Cursor