7581 Commits

Author SHA1 Message Date
LoveSy
ebfadcc457 Fix module install showing script help due to unescaped single quotes
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
2026-03-09 10:11:21 +08:00
LoveSy
93c6381b1d Add padding and center alignment to log empty state text
Made-with: Cursor
2026-03-08 00:53:30 +08:00
LoveSy
2db016a000 Add windowSoftInputMode adjustResize to MainActivity
Made-with: Cursor
2026-03-08 00:53:30 +08:00
LoveSy
e0c295afd6 Improve Core/App card alignment and exclude unused native lib
- 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
2026-03-08 00:53:30 +08:00
LoveSy
5fffab52dd Remove bottom action buttons from Log tabs, keep only TopAppBar actions
Made-with: Cursor
2026-03-08 00:53:30 +08:00
LoveSy
9f89a0827c Use tristate checkbox for denylist package toggle
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
2026-03-08 00:53:30 +08:00
LoveSy
8b852eaeff Replace Termux terminal libraries with custom read-only Kotlin implementation
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
2026-03-08 00:53:30 +08:00
LoveSy
05a3aa9aa3 Fix blank flash screen and crash when flashing module zips
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
2026-03-08 00:53:30 +08:00
LoveSy
72f235ddd4 Use MarkdownText for release notes in core install bottom sheet
Made-with: Cursor
2026-03-08 00:53:30 +08:00
LoveSy
5d28d461cd Remove watermark icon and background color from CoreCard
Made-with: Cursor
2026-03-08 00:53:30 +08:00
LoveSy
5ea6163708 Hide Modules and Superuser tabs when Magisk is not activated
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
2026-03-08 00:53:30 +08:00
LoveSy
0e958e77b3 Replace timeout dropdown with discrete slider in SU request dialog
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
2026-03-08 00:53:30 +08:00
LoveSy
34147561d1 Redesign SU request dialog and add SharedUID badge to title row
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
2026-03-08 00:53:30 +08:00
LoveSy
aa125c4277 Replace SU log action icon with themed badge
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
2026-03-08 00:53:30 +08:00
LoveSy
9cda6a7789 Display SharedUID as badge in superuser screens
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
2026-03-08 00:53:30 +08:00
LoveSy
86690d5c4c Simplify denylist isolated process handling with wildcard matching
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
2026-03-08 00:53:30 +08:00
LoveSy
f7ce935004 Redirect stdin to PTY for terminal size queries
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
2026-03-08 00:53:30 +08:00
LoveSy
53fe509f5d Remove redundant switch descriptions from superuser detail screen
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
2026-03-08 00:53:30 +08:00
LoveSy
fe1840600c Add terminal view for module flash/action screens with TTY support
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
2026-03-08 00:53:30 +08:00
LoveSy
2233203ec4 Bump Kotlin to 2.3.10 to fix release build
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
2026-03-08 00:53:30 +08:00
LoveSy
d99468d373 Redesign Home screen and improve SU request dialog
- Replace stacked Magisk/Manager cards with side-by-side Core/App cards
  featuring status-based colors, watermark icons, and update badges
- Add Status card showing Ramdisk, Zygisk, and DenyList states
- Restructure Support Us and Follow Us sections with SuperArrow and
  bottom sheets for donate links and developer social links
- Redesign NoticeCard with subtle tertiary container styling
- Move Hide/Restore app action from Settings to Home App card
- Use primary color for SU request Grant button
- Fix DevelopersCard crash caused by null selectedDev during sheet dismiss

Made-with: Cursor
2026-03-08 00:53:30 +08:00
LoveSy
443184676b Fix SU log and notification missing for first-time/denied requests
The native daemon skips app_log/app_notify callbacks when the stored
RootSettings defaults log=false and notify=false (first-time requests).
Handle logging and notification directly from SuRequestHandler.respond()
on the Java side so both grants and denials are always recorded.

Made-with: Cursor
2026-03-08 00:53:30 +08:00
LoveSy
ae6093a8c2 Add SU live-reload, status bar notifications, Monet theming, and UI improvements
- Add SuEvents shared flow for live-reloading Superuser and Log tabs
  when root decisions are made
- Add status bar notification option for SU grant/deny with auto-dismiss
- Add Monet/Material You theme support with instant theme switching
- Replace install page navigation with bottom sheet from Home screen
- Replace deprecated ProgressDialog with MiUIX loading dialog for
  app hide/restore
- Move save log and reboot to top bar action buttons in flash/action screens
- Fix dialog button layout to use evenly distributed buttons with
  primary color on positive actions

Made-with: Cursor
2026-03-08 00:53:30 +08:00
LoveSy
9347077214 Remove legacy UI infrastructure and migrate dialogs to Compose
Replace the imperative MagiskDialog/DialogBuilder system with
Compose-idiomatic dialogs using miuix SuperDialog. Remove ViewEvent,
UIActivity, ViewModelHolder, and all old dialog classes. Migrate
ViewModels to expose dialog state via StateFlow instead of holding
Activity references. Remove LiveData from FlashViewModel and
ActionViewModel. Delete orphaned resources (XML menus, drawables,
styles). Provide LocalContentColor in MagiskTheme to fix dark theme
text visibility across all miuix components.

Made-with: Cursor
2026-03-04 16:34:16 +08:00
LoveSy
c672da6fe0 Add Compose reboot menu to Home and fix navigation icon padding
Replace the View-based RebootMenu with a native Compose
SuperListPopup in the Home top bar, with proper state tracking
for the safe mode toggle. Remove the now-unused RebootMenu.kt.

Also fix missing start padding on the SuperuserDetail back button
to match all other sub-screens.

Made-with: Cursor
2026-03-04 16:34:16 +08:00
LoveSy
241db98068 Add MiuixPopupHost to SuRequestActivity for dropdown rendering
SuperDropdown requires MiuixPopupHost in the Compose tree to render
its popup list. Without it the timeout selector was hidden behind the
dialog card or invisible outside the app.

Made-with: Cursor
2026-03-04 16:34:16 +08:00
LoveSy
f4afb0cbb2 Fix revoke dialog showing after navigating back from Superuser detail
The revoke click handler called onBack() immediately after triggering
the dialog event, causing the dialog to appear on the wrong screen.
Defer navigation to the onDeleted callback so the dialog stays on the
detail screen and back only happens after confirmation.

Made-with: Cursor
2026-03-04 16:34:16 +08:00
LoveSy
32fa843a93 Redesign Modules tab and polish various screens
- Replace "Install from storage" button with a FAB matching KernelSU
- Redesign module cards with expandable description, divider, and
  icon-based action/update/remove buttons
- Reorder nav bar: Modules, Superuser, Home, Logs, Settings
- Make suRestrict reactive in Superuser detail screen
- Add horizontal padding to log tab row
- Add checkbox left padding in DenyList
- Rename Superuser detail title to "Superuser Setting"
- Simplify revoke row to a clickable card with error-colored text

Made-with: Cursor
2026-03-04 16:34:16 +08:00
LoveSy
44fa814c50 Remove rikka layoutinflater and insets dependencies
These View-system utilities are no longer needed after the Compose
migration. Compose handles insets natively via WindowInsets APIs.

Made-with: Cursor
2026-03-04 16:34:16 +08:00
LoveSy
aebfdeff16 Add Superuser detail screen with policy row component
Redesign the Superuser list with a clickable card + vertical divider +
switch layout. Tapping the left area navigates to a new detail screen
showing app info, notification/logging switches, restricted root
capabilities toggle (when enabled globally), and a revoke action.

Made-with: Cursor
2026-03-04 16:34:16 +08:00
LoveSy
7f1abe8c2c Redesign SU log cards and add save/clear actions to Log tab
- Show app icon, grant/deny canvas icon (bottom-right), timestamp,
  UID/PID info, and always-visible details in SU log cards
- Un-bold Magisk log tag text
- Add save (download) and clear (delete) action buttons to Log TopAppBar

Made-with: Cursor
2026-03-04 16:34:16 +08:00
LoveSy
59fc23607d Add sort/filter popup menus to DenyList screen
Replace inline filter chips with LSPosed-style TopAppBar action icons:
sort (by name, package name, install time, update time with reverse
toggle) and filter (show system/OS apps with linked state). Search bar
is always visible. Process rows now use Checkbox instead of Switch.

Made-with: Cursor
2026-03-04 16:34:16 +08:00
LoveSy
99396e36eb Add padding between log tab row and list content
Made-with: Cursor
2026-03-04 16:34:16 +08:00
LoveSy
4326a8c8ef Fix dialogs being overlapped by floating navigation bar
Move MiuixPopupHost to a top-level Box in MainActivity so dialogs
render above all content including the floating nav bar. Disable
individual popup hosts in all 9 screen Scaffolds (popupHost = {})
to prevent duplicate rendering at a lower z-level.

Made-with: Cursor
2026-03-04 16:34:16 +08:00
LoveSy
b9d60d3de1 Rewrite Magisk log tab with itemized parsed entries
Parse logcat-format lines into structured MagiskLogEntry objects with
timestamp, level, tag, PID/TID, and message. Display each entry as a
card with a colored log level badge, tag, timestamp, and expandable
message text instead of dumping raw text.

Made-with: Cursor
2026-03-04 16:34:16 +08:00
LoveSy
83b5f8757b Add collapsing TopAppBar on scroll and fix initial data loading
Connect nestedScroll to MiuixScrollBehavior in all screens so the
TopAppBar collapses when scrolling down, matching KernelSU/LSPosed.
Also call startLoading() via LaunchedEffect for AsyncLoadViewModels
so screens that depend on async data (Superuser, Modules, Log,
DenyList, Home) actually trigger their initial load.

Made-with: Cursor
2026-03-04 16:34:16 +08:00
LoveSy
2b8eb54dd4 Implement floating pill-shaped navigation bar
Replace the standard miuix NavigationBar with a custom floating
pill-shaped bar built from scratch. The miuix NavigationBar draws its
own background internally which defeats external clipping, so the
floating bar uses a Row with custom FloatingNavItem composables instead.
The bar has RoundedCornerShape(28dp), shadow elevation, 24dp horizontal
margin, and sits above the system gesture bar. Add bottom content
padding to all 5 main tab screens to account for the overlay.

Made-with: Cursor
2026-03-04 16:34:16 +08:00
LoveSy
69d8024ee7 Migrate MagiskDialog to Compose and remove kapt/data binding
Replace MagiskDialog from AppCompatDialog with data binding to a
Compose state holder rendered via miuix SuperDialog. Update
MarkDownDialog to use AndroidView-based Compose content. Remove kapt
plugin, data binding, ObservableHost, RvItemAdapter, DataBindingAdapters,
and all remaining XML layouts (dialog_magisk_base, item_list_single_line,
markdown_window_md2). Clean up dead version catalog entries and remove
UIActivity generic type parameter.

Made-with: Cursor
2026-03-04 16:34:16 +08:00
LoveSy
7c6c9ad591 Remove dead View-system code after Compose migration
Remove SafeArgs plugin, Fragment navigation dependencies, unused
View libraries (IndeterminateCheckBox, rikka.recyclerview,
SwipeRefreshLayout, Fragment-ktx). Delete dead classes:
MergeObservableList, DiffObservableList, ObservableRvItem, TextItem.
Delete unused resources: fragment animations, item_spinner.xml,
item_text.xml, empty navigation directory. Clean up dead binding
adapters and UIActivity.startAnimations().

Made-with: Cursor
2026-03-04 16:34:15 +08:00
LoveSy
4a6f2e8fb0 Migrate SuRequestActivity to Compose and clean up dead View code
Rewrite SuRequestActivity and SuRequestViewModel to use Compose state
and miuix components, preserving tapjack protection and security logic.
Extract rememberDrawablePainter to shared utility. Remove dead code:
BaseFragment, NavigationActivity, ShowUIEvent, FragmentExecutor, and
UIActivity.setContentView(). Fix bottom nav icons to use outlined
vector drawables instead of animated selectors.

Made-with: Cursor
2026-03-04 16:34:15 +08:00
LoveSy
79f378dadc Replace Fragment navigation with Navigation3 and Compose-based UI
- Add Navigation3, serialization, miuix-icons dependencies
- Create Routes.kt, Navigator.kt for type-safe navigation
- Add per-screen TopAppBar/SmallTopAppBar with miuix Scaffold
- Rewrite MainActivity: UIActivity + setContent + NavDisplay + HorizontalPager
- Create MainScreen with bottom NavigationBar and tab paging
- Delete all 9 Fragment files and XML navigation/layout/menu resources
- Remove NavigationEvent, replace with SharedFlow<Route> in BaseViewModel
- Update ViewModels to use navigateTo(Route) instead of NavDirections
- Extract FlashUtils.installIntent() for PendingIntent creation
- Add ObserveViewEvents/CollectNavEvents Compose helpers for event dispatch

Made-with: Cursor
2026-03-04 16:34:10 +08:00
LoveSy
1c67786f6c Remove Theme screen and related dead code
Theme selection is no longer needed with Compose theming. Remove
ThemeFragment, ThemeViewModel, DarkThemeDialog, TappableHeadlineItem,
and associated XML layouts. Remove theme navigation from Settings.

Made-with: Cursor
2026-03-03 12:57:47 +08:00
LoveSy
e1162e7fb7 Migrate Install screen to Jetpack Compose with miuix
Replace data binding and @Bindable properties with StateFlow<UiState>.
Implement InstallScreen composable with options card, method selection,
and release notes. Remove fragment_install_md2.xml layout.

Made-with: Cursor
2026-03-03 12:55:40 +08:00
LoveSy
9aa068e645 Migrate Action screen to Jetpack Compose with miuix
Replace Fragment data-binding UI with a Compose-based ActionScreen
sharing the same console output pattern as FlashScreen. ActionViewModel
now uses mutableStateListOf for console lines and StateFlow for state.
Remove old ConsoleItem (no longer used by either Flash or Action),
fragment_action_md2.xml, item_console_md2.xml, and stale nav reference.

Made-with: Cursor
2026-03-03 12:51:31 +08:00
LoveSy
d949a086f8 Migrate Flash screen to Jetpack Compose with miuix
Replace Fragment data-binding UI with a Compose-based FlashScreen
using LazyColumn for monospace console output with auto-scroll,
a save log TextButton, and miuix FloatingActionButton for reboot.
FlashViewModel now uses mutableStateListOf for console lines and
StateFlow for flash state. Back press blocking uses
OnBackPressedCallback instead of BaseFragment override.

Made-with: Cursor
2026-03-03 12:49:25 +08:00
LoveSy
eba4b0bc20 Migrate Modules screen to Jetpack Compose with miuix
Replace Fragment data-binding UI with a Compose-based ModuleScreen
using miuix Card, Switch, and TextButton components. ModuleViewModel
now uses StateFlow<UiState> and Compose-friendly ModuleItem with
mutableStateOf for enable/remove/update state. Each module card shows
name, version/author, description, enable toggle, and action/update/
remove buttons. Remove old ModuleRvItem, XML layouts, and stale
navigation reference.

Made-with: Cursor
2026-03-03 12:44:11 +08:00
LoveSy
69f148ae93 Migrate Superuser screen to Jetpack Compose with miuix
Replace Fragment data-binding UI with a Compose-based SuperuserScreen
using miuix Card, Switch, Slider, and TextButton components.
SuperuserViewModel now uses StateFlow<UiState> and Compose-friendly
PolicyItem with mutableStateOf for reactive updates.
Remove old PolicyRvItem, XML layouts, and stale navigation reference.

Made-with: Cursor
2026-03-03 12:37:47 +08:00
LoveSy
4ac623224f Migrate Log screen to Jetpack Compose with miuix
Replace the Fragment data-binding UI with a Compose-based LogScreen
using miuix TabRow for switching between SU Log and Magisk Log tabs.
LogViewModel now uses StateFlow instead of @Bindable properties.
Remove old XML layouts, LogRvItem, and SuLogRvItem. Also clean up
stale tools:layout references in navigation graph.

Made-with: Cursor
2026-03-03 12:21:36 +08:00
LoveSy
d100322e45 Migrate DenyList screen to Jetpack Compose with miuix
Replace the DenyList screen's data-binding XML layouts and RecyclerView
system with a Compose UI using LazyColumn, Card, Checkbox, and Switch.

DenyListViewModel now uses StateFlow with combine for reactive filtering
instead of the custom filterList/ObservableHost pattern. App and process
state is tracked via Compose mutableStateOf for efficient recomposition.

Remove DenyListRvItem.kt and all associated XML layouts (fragment_deny_md2,
item_hide_md2, item_hide_process_md2).

Made-with: Cursor
2026-03-03 12:15:10 +08:00
LoveSy
b107bf1727 Move Settings to bottom navigation bar
Add Settings as a fifth tab in the bottom nav bar instead of a toolbar
icon in the Home screen. Add a global nav action for the settings
destination and remove the old Home-to-Settings fragment action.

Made-with: Cursor
2026-03-03 12:00:41 +08:00