7767 Commits
Author SHA1 Message Date
topjohnwu 37063225d4 build: show progress when downloading ONDK
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
2026-09-05 08:17:11 +00:00
topjohnwu 173153fcc7 build: improve build.py and env.py scripts
Modernize build scripts and improve reliability across environments:
- Update required Java toolchain to JDK 25 across scripts and CI
- Propagate subprocess exit codes and report filesystem errors
- Fix argument parsing edge cases and dynamic linker path handling
- Anchor working directory and improve terminal output formatting

Assisted-by: Gemini 3.8 Flash
2026-09-05 08:17:11 +00:00
topjohnwu 96221b69fa Release Magisk v31.0
[skip ci]
v31.0
2026-09-04 09:46:09 -07:00
topjohnwu bc1128c4f2 Update release date 2026-09-04 09:45:37 -07:00
topjohnwu 584ba3227e Update cargo dependencies 2026-09-04 09:44:49 -07:00
topjohnwu da382dc771 Update AGP 2026-09-04 09:44:49 -07:00
topjohnwu cc08282b6d app: always use TerminalScreen in FlashScreen
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
2026-09-04 09:44:49 -07:00
topjohnwu b36c60abc1 app: prevent SuRequest dismiss on touch outside
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
2026-09-03 22:08:33 -07:00
topjohnwu 26dd8c1352 app: fix scrollbar drag and list synchronization
- 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
2026-09-03 21:36:21 -07:00
topjohnwu 4334c078c1 app: fix UI element shadow clipping
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
2026-09-03 17:51:10 -07:00
topjohnwu fed84885e3 app: fix touch effect and hitbox mismatches
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
2026-09-03 16:17:29 -07:00
topjohnwu aafda835f4 app: polish home screen actions and reboot menu
- 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
2026-09-03 15:44:44 -07:00
topjohnwu 7064cdf305 app: modernize settings layout and choice dialogs
- 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
2026-09-03 15:44:44 -07:00
topjohnwu 87a3ca3024 app: modernize logs screen cards and typography scale
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
2026-09-03 15:44:44 -07:00
topjohnwu 5127a6d782 app: modernize superuser policy items with M3 ListItem
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
2026-09-03 15:44:44 -07:00
topjohnwu c8c214a0ed app: normalize TopAppBar insets across screens
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
2026-09-03 15:44:44 -07:00
topjohnwu 482cde7aa4 app: use ShortNavigationBar and fix insets
- 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
2026-09-03 01:43:17 -07:00
topjohnwu c2f8da60f6 app: fix touch handling in SuRequest dialog
- 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
2026-09-03 00:22:42 -07:00
topjohnwu c603be1005 Fix wording in SuRequest dialog 2026-09-02 23:14:56 -07:00
topjohnwu b9ee06bc57 app: dynamically generate themes from seed color
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
2026-09-02 22:52:33 -07:00
topjohnwu 38cfe2f80e app: sync system bar icon colors with theme
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
2026-09-02 22:23:17 -07:00
topjohnwu 42272ccac7 scripts: improve release.sh build and upload flow
- Generate an ephemeral build config inheriting only signing properties
  so local developer settings in config.prop remain untouched
- Remove gsed requirement by making in-place edits POSIX-compliant
- Add ver_to_code and code_to_ver conversion functions
- Add pre-upload validation and safe git staging
- Add command usage handling

Assisted-by: Gemini 3.8 Flash
2026-09-02 21:03:19 -07:00
topjohnwu 4b0a2d5046 scripts: verify APK signatures in release.sh
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
2026-09-02 19:57:45 -07:00
topjohnwu 29af8001b6 Update v31.0 changes 2026-09-02 11:46:50 -07:00
topjohnwu df50d1fbff Remove PreviewActivity in release builds 2026-09-02 02:16:37 -07:00
topjohnwu 3c8b9a0e61 app: prevent jarring item jumps in denylist UI
- 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
2026-09-02 02:08:23 -07:00
topjohnwu c98966c802 app: unify LogScreen header scroll background
- 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
2026-09-02 02:08:23 -07:00
topjohnwu b7ec312380 app: improve Material 3 component conformance
- 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
2026-09-02 02:08:23 -07:00
topjohnwu bc3efc03bd app: migrate to Material 3 NavigationBar
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
2026-09-02 02:08:23 -07:00
topjohnwu 3612faf766 app: configure link color for MarkdownText
Explicitly set linkTextColor on the underlying TextView so Markdown
links adhere to the active Compose theme.

Assisted-by: Gemini 3.7 Flash
2026-09-01 23:04:00 -07:00
topjohnwu 81342a572f app: improve scrollbar drag handling and inertia
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
2026-09-01 23:04:00 -07:00
topjohnwu cbfd2a736f app: use full-screen dialog for install screen
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
2026-09-01 23:04:00 -07:00
topjohnwu eb1ae600e2 app: use MagiskDialog in SuRequestScreen
Refactor SuRequestScreen to use the shared MagiskDialog component,
matching standard dialog styling across the app.

Assisted-by: Gemini 3.7 Flash
2026-09-01 23:04:00 -07:00
topjohnwu b80d2b74e9 app: adjust MagiskDialog width and margins
Disable platform default width on dialogs and apply standard horizontal
padding and max-width constraints for better readability.

Assisted-by: Gemini 3.7 Flash
2026-09-01 23:04:00 -07:00
topjohnwu c6fddfbe25 app: consolidate dialogs into MagiskDialog
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
2026-09-01 23:04:00 -07:00
topjohnwu ec3b0b8c5f Never import android.R 2026-09-01 23:04:00 -07:00
topjohnwu d3d5698001 app: use pager for tabs in logs screen
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
2026-09-01 23:04:00 -07:00
vvb2060 4e44848a6e app: update zh-rCN translation 2026-09-01 14:56:44 -07:00
Neebe3289 93d2babf66 app: Update Indonesian translations
update and cleanup indentation space.

Change-Id: Ief761e87ae9367323f0ca6c150192817cff83c62
2026-09-01 14:56:22 -07:00
topjohnwu 8c4341e928 Prepare for v31.0 release 2026-08-31 23:46:36 -07:00
topjohnwu 7847ab6de8 app: fix navigation when flashing modules
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
2026-08-31 23:46:10 -07:00
topjohnwu 3e6e4326b1 app-legacy: add webview zygote to denylist
Port WebView Zygote denylist support to the legacy app module.

Assisted-by: Gemini 3.7 Flash
2026-08-31 19:29:38 -07:00
topjohnwu a5c8861629 Promote next-gen app to production, and demote existing app to legacy 2026-08-31 15:55:14 -07:00
topjohnwu 74df51fd1b app-ng: improve uninstalled state on home screen
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
2026-08-31 10:54:59 -07:00
topjohnwu e9fd6b58ab app-ng: align app card icon and title with magisk
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
2026-08-31 01:49:57 -07:00
topjohnwu 64be5dcc2e app-ng: move uninstall button to top app bar
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
2026-08-31 01:49:57 -07:00
topjohnwu 99039b7e6c app-ng: improve su request dialog layout
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
2026-08-31 01:49:57 -07:00
Wang Han 6833e56398 Don't kill webview zygote on denylist change
It won't restart and make webview unusable.
2026-08-30 20:52:34 +00:00
Wang Han b2d86c79c2 Add webview zygote as umount target
https://github.com/tiann/KernelSU/commit/4521784328352c54334beb29e05c74360b60d7cb
2026-08-30 02:59:46 -07:00
topjohnwu faa5f85b15 Fix legacy app launch 2026-08-29 23:34:16 -07:00