From 162b84661b3fd64c12e9c0fe4504ea15c2d55a9a Mon Sep 17 00:00:00 2001 From: LoveSy Date: Thu, 5 Mar 2026 16:45:02 +0800 Subject: [PATCH] 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 --- .../src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt | 2 +- .../main/java/com/topjohnwu/magisk/ui/flash/FlashScreen.kt | 6 ++++-- .../java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt | 2 -- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/apk/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt b/app/apk/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt index e803ebfe3..11e5564da 100644 --- a/app/apk/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt +++ b/app/apk/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt @@ -183,7 +183,7 @@ class MainActivity : AppCompatActivity(), SplashScreenHost { vm.startFlashing() } } - FlashScreen(vm, onBack = { navigator.pop() }) + FlashScreen(vm, action = key.action, onBack = { navigator.pop() }) } entry { key -> val vm: SuperuserViewModel = androidx.lifecycle.viewmodel.compose.viewModel( diff --git a/app/apk/src/main/java/com/topjohnwu/magisk/ui/flash/FlashScreen.kt b/app/apk/src/main/java/com/topjohnwu/magisk/ui/flash/FlashScreen.kt index 6eef50ce5..2c0d1d7cd 100644 --- a/app/apk/src/main/java/com/topjohnwu/magisk/ui/flash/FlashScreen.kt +++ b/app/apk/src/main/java/com/topjohnwu/magisk/ui/flash/FlashScreen.kt @@ -19,6 +19,7 @@ import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.ui.terminal.TerminalComposeView import top.yukonga.miuix.kmp.basic.Icon import top.yukonga.miuix.kmp.basic.IconButton @@ -32,10 +33,11 @@ import top.yukonga.miuix.kmp.theme.MiuixTheme import com.topjohnwu.magisk.core.R as CoreR @Composable -fun FlashScreen(viewModel: FlashViewModel, onBack: () -> Unit) { +fun FlashScreen(viewModel: FlashViewModel, action: String, onBack: () -> Unit) { val flashState by viewModel.flashState.collectAsState() val showReboot by viewModel.showReboot.collectAsState() val finished = flashState != FlashViewModel.State.FLASHING + val useTerminal = action == Const.Value.FLASH_ZIP val statusText = when (flashState) { FlashViewModel.State.FLASHING -> stringResource(CoreR.string.flashing) @@ -91,7 +93,7 @@ fun FlashScreen(viewModel: FlashViewModel, onBack: () -> Unit) { }, popupHost = { } ) { padding -> - if (viewModel.useTerminal) { + if (useTerminal) { val session by viewModel.termSession.collectAsState() TerminalComposeView( session = session, diff --git a/app/apk/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt b/app/apk/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt index 81122bfb0..6258c10db 100644 --- a/app/apk/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt +++ b/app/apk/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt @@ -58,8 +58,6 @@ class FlashViewModel : BaseViewModel() { private val emulatorReady = CompletableDeferred() val sessionCallback = TerminalSessionCallback() - val useTerminal get() = flashAction == Const.Value.FLASH_ZIP - fun setTerminalView(view: TerminalView) { sessionCallback.terminalView = view }