- 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Config.Value.DEFAULT_CHANNEL is -1, which is out of bounds for the
SuperDropdown items list. Coerce to valid range on initialization.
Made-with: Cursor
Replace the Settings screen's data-binding XML layouts and RecyclerView
item system with a declarative Compose UI using miuix components:
SuperSwitch for toggles, SuperDropdown for selectors, SuperArrow for
navigation items, and SuperDialog for text input dialogs.
SettingsViewModel now exposes DenyList state via StateFlow and provides
action methods instead of the old Handler/BaseSettingsItem pattern.
Remove BaseSettingsItem.kt, SettingsItems.kt, and all associated XML
layouts (fragment_settings_md2, item_settings, item_settings_section,
dialog_settings_app_name, dialog_settings_download_path,
dialog_settings_update_channel).
Made-with: Cursor
Replace the Home screen's data-binding XML layouts with a Compose UI
using miuix components. HomeViewModel now uses StateFlow instead of
@Bindable/ObservableHost for UI state. HomeFragment hosts the new
HomeScreen composable via ComposeView.
Remove old XML layouts (fragment_home_md2, include_home_magisk,
include_home_manager, item_developer, item_icon_link) and the
DeveloperItem RvItem class that are no longer needed.
Made-with: Cursor
Hi there, appreciate you and your work.
Proposing a small change to the A/B device update instructions, based on your changes within the Magisk app which made those instructions outdated/ invalid.
Specifically, after installing Magisk to the new slot, apparently Magisk then instructs to go back to the system update and hit restart now, instead of the prior instructions which remain on this website of rebooting within the Magisk app. I just did testing, and rebooting within the Magisk app does not result in slot switch, which must be why you noe instruct to go back to system update for the restart now.
Just thought I'd update the instructions for anyone who might be confused.
Thx!
* Use major number check to filter out device-mapper devices while preserving virtio-blk compatibility.
* Introduce `klogdump` partition support for Smartisan devices as a valid preinit target.
- Old behavior: Switching to a non-zero UID was implicitly interpreted as a request to drop capabilities, thereby preventing subsequent reacquisition via `su`.
- New behavior: Switching to a non-zero UID now requires the `--drop-cap` argument to explicitly prevent the reacquisition of capabilities.