Wrap the HTTP response stream in setup_ndk with a ProgressStream reader
to display a dynamic terminal progress bar showing percentage and
transferred megabytes during download and decompression.
Updates are throttled to at most 10 Hz and suppressed in non-interactive
environments.
Assisted-by: Gemini 3.8 Flash
Unify FlashScreen to render TerminalScreen unconditionally for all
installation and flashing actions instead of branching on FLASH_ZIP
with a LazyColumn fallback:
- FlashScreen: Remove LazyColumn, scrollbar, and the unused action
parameter, displaying TerminalScreen inside the scaffold body.
- FlashViewModel: Forward MagiskInstaller output directly to the
terminal emulator via appendLineOnMain and remove consoleItems.
Await emulatorReady before starting flashing operations.
- FlashViewModel: Preserve transcriptText saving for FLASH_ZIP while
saving logItems (stdout and stderr) for MagiskInstaller actions.
- MainActivity: Drop action parameter from FlashScreen invocation.
Assisted-by: Gemini 3.8 Flash
Setting setFinishOnTouchOutside(false) at the Activity window level was
insufficient because SuRequestScreen hosts MagiskDialog (AlertDialog),
which defaults to dismissOnClickOutside = true. Tapping outside the
dialog triggered onDismissRequest and finished the activity.
Add dismissOnClickOutside and dismissOnBackPress parameters to
MagiskDialog (defaulting to true), and set dismissOnClickOutside = false
for SuRequestScreen to prevent accidental dismissal while keeping back
button dismissal intact.
Assisted-by: Gemini 3.8 Flash
- Invert offsetRatio accurately in LazyListState adapter using
maxOffset so scroll fraction maps 1:1 to list items and avoids jumping
upon drag release.
- Allow dragging anywhere along the track and consume pointer events on
PointerEventPass.Initial to prevent underlying views from stealing
touch input.
- Use MutatePriority.PreventUserInput to avoid drag cancellation from
inner scroll modifiers.
- Immediately snap alpha animation to 1.0 upon touch down for instant
visual feedback.
Assisted-by: Gemini 3.8 Flash
Resolve shadow and elevation clipping issues across the apk module:
- DenyListScreen: Remove redundant Modifier.clip from DenyAppCard so
elevation drop shadows can render outside the card.
- DenyListScreen & HomeScreen: Add an 8dp horizontal offset to dropdown
menus to prevent popup drop shadows clipping at the screen edge.
- SuperuserScreen, LogScreen, DenyListScreen, ModuleScreen: Move
horizontal padding from Modifier.padding to LazyColumn contentPadding
so item shadows have breathing room within the scroll container.
- ModuleScreen & MainScreen: Hoist floating action button to root
Scaffold to prevent FAB being sliced during HorizontalPager swipe
transitions.
- Dialog: Apply full systemBars insets and uniform 24dp padding to
MagiskDialog to prevent dialog shadow clipping against screen edges.
Assisted-by: Gemini 3.8 Flash
Resolve touch target and ripple effect area discrepancies across the
apk module:
- ModuleScreen: Use Card(onClick) to ensure ripple indications are
clipped to the card's 20.dp rounded corners.
- SettingsComponents: Make trailing Switch passive and apply
Modifier.toggleable on ListItem to eliminate nested ripples and
conflicting hitboxes.
- DenyListScreen: Use Modifier.toggleable on ProcessRow with a passive
Checkbox to prevent 48dp touch targets overflowing the 32dp row.
- HomeScreen: Increase developer link button spacing to 8.dp to prevent
overlapping 48x48dp touch targets.
- Scrollbar: Only consume pointer events when the scrollbar is visible
and touch hits the thumb, allowing underlying controls to receive
touches unimpeded.
Assisted-by: Gemini 3.8 Flash
- Standardize card shapes to 20.dp across all home screen cards
- Add M3 leading icons, 16.dp shape, and divider to reboot dropdown menu
- Convert support donation buttons to Material 3 FilledTonalButton
- Group App card hide/restore button and reinstall button with proper
accessibility content description
- Update section headers to labelLarge SemiBold matching Settings
Assisted-by: Gemini 3.8 Flash
- Replace popup DropdownMenu in SettingsDropdown with standard
Material 3 single-choice RadioButton dialog.
- Standardize screen horizontal margins to 16dp and increase spacing
between preference sections.
- Insert outlineVariant HorizontalDividers between items inside
each section card.
- Apply RoundedCornerShape(12.dp) to OutlinedTextFields in Settings
text dialogs.
Assisted-by: Gemini 3.8 Flash
Refactor SuLogCard to use Material 3 ListItem with an internal
HorizontalDivider for detail rows. Modernize MagiskLogCard to use
Card(onClick) and standardize horizontal margins to 16.dp across both
log tabs.
Replace hardcoded sp font sizes with MaterialTheme.typography tokens
(labelSmall and bodySmall) using monospace font families to ensure
consistent font scaling.
Assisted-by: Gemini 3.8 Flash
Refactor PolicyCard to use Material 3 ListItem within a Card container,
removing the artificial VerticalDivider and bespoke click bounds.
In SuperuserDetailScreen:
- Standardize Card corner radiuses to 20.dp
- Add subtle HorizontalDivider between switch items
- Modernize RevokeButton to use filledTonalButtonColors with standard
ButtonDefaults.shape and ButtonWithIconContentPadding
Assisted-by: Gemini 3.8 Flash
Compose Material 3 TopAppBar already applies standard insets internally
for navigation and action icons. Remove redundant manual start/end
paddings across detail and main screens to ensure icons align flush with
the standard 16dp content margin.
Assisted-by: Gemini 3.8 Flash
- Replace Material 3 NavigationBar with ShortNavigationBar and
ShortNavigationBarItem for a more compact bottom bar.
- Set contentWindowInsets to zero on the root Scaffold so status bar
insets are passed down to child screens' TopAppBars.
- Consume innerPadding on HorizontalPager to prevent nested Scaffolds
from duplicating bottom system navigation insets.
Assisted-by: Gemini 3.8 Flash
- Remove android:windowIsFloating so SuRequestActivity is a full-screen
translucent activity rather than a floating window that dismisses on
touches outside during asynchronous initialization.
- Set setFinishOnTouchOutside(false) to prevent unwanted dismissals.
- Decouple the 1-second grant button delay from the countdown timer so
interacting with the timeout slider immediately does not leave the
grant button permanently disabled.
- Ensure an immediate DENY response is sent if the activity or
view model is destroyed before responding.
Assisted-by: Gemini 3.8 Flash
Replace the static, hardcoded light and dark ColorScheme tables with a
helper that dynamically generates Material 3 color schemes using
SchemeTonalSpot from Google Material Color Utilities.
The default light and dark themes are now generated from the Magisk
launcher icon accent color (#00AF9C) as seed.
Assisted-by: Gemini 3.8 Flash
Because the base post-splash theme is a dark theme, the window
defaults to light (white) status bar icons. When the app is in light
theme, the icons blend into the light background and become invisible.
Synchronize WindowInsetsControllerCompat's appearance flags with the
active theme so dark icons are used in light theme and light icons in
dark theme.
Assisted-by: Gemini 3.8 Flash
Add signature verification to release.sh using apksigner from the
latest Android SDK build-tools to ensure all built APKs match the
expected certificate fingerprint.
Assisted-by: Gemini 3.8 Flash
- Track initiallyChecked state in DenyAppState
- Use initiallyChecked in sort comparator to keep list position stable
- Keep initially checked items visible in filter when unselected
Assisted-by: Gemini 3.7 Flash
- Wrap TopAppBar and PrimaryTabRow in topBar Column with animated container
- Set TopAppBar and PrimaryTabRow containers to transparent to share surface
Assisted-by: Gemini 3.7 Flash
- Replace custom dividers with VerticalDivider / HorizontalDivider
- Use standard Material 3 search styling for DenyList
- Remove redundant button / FAB shape overrides and card clip modifiers
- Convert custom warning and notice boxes to Material 3 Card
- Align PrimaryTabRow to full width in LogScreen
Assisted-by: Gemini 3.7 Flash
Replace the custom floating navigation bar with official Material 3
NavigationBar and NavigationBarItem components, and remove unnecessary
bottom padding workarounds across all screens.
Assisted-by: Gemini 3.7 Flash
Override active fling inertia on touch down using
MutatePriority.UserInput and handle scroll events sequentially via a
conflated channel.
Assisted-by: Gemini 3.7 Flash
Replace the install bottom sheet with a full-screen Dialog to provide
more vertical space for release notes and installation methods.
- Remove the legacy multi-step wizard logic from InstallViewModel.
- Use styled Cards with SettingsSwitch for install options and
SettingsArrow for installation methods.
- Remove max height constraint on MarkdownText to allow release notes
to expand naturally with full-screen scrolling.
Assisted-by: Gemini 3.7 Flash
Disable platform default width on dialogs and apply standard horizontal
padding and max-width constraints for better readability.
Assisted-by: Gemini 3.7 Flash
Add a shared MagiskDialog component to unify styling, typography,
shape, and button layouts across all dialogs in the app module.
Assisted-by: Gemini 3.7 Flash
Add a HorizontalPager in LogScreen to support swiping horizontally
between the Superuser and Magisk log tabs instead of paging the outer
main navigation tabs.
Assisted-by: Gemini 3.7 Flash
When launching a flash intent using FLAG_ACTIVITY_CLEAR_TOP, Android
recreates MainActivity if singleTop or singleTask is not set, causing
the app to briefly display the home screen before showing the flash
screen.
Set MainActivity to singleTask, add FLAG_ACTIVITY_SINGLE_TOP to flash
intents, and default cold-start flash zip intents to the modules tab.
Assisted-by: Gemini 3.7 Flash
When Magisk is not installed:
- Display "Not Installed" in error color instead of "N/A"
- Use a prominent filled primary button for the Install action
- Dim the Magisk icon tint to outline color
Assisted-by: Gemini 3.7 Flash
Adjust the App card icon size to 48dp and the following spacer to 16dp
to match the Magisk card and align their titles horizontally.
Assisted-by: Gemini 3.7 Flash
Remove the oversized uninstall button from the home screen content and
place an uninstall action icon in the top app bar next to the reboot
button.
Assisted-by: Gemini 3.7 Flash
Widen the su request dialog card to fit screen width on phones while
capping at 560dp on larger screens. Move the package name to its own
row below the app icon and title to avoid clipping and allow it to
wrap onto multiple lines when necessary. Make the dialog content
vertically scrollable to ensure all actions are visible in landscape.
Assisted-by: Gemini 3.7 Flash