@@ -6,9 +6,7 @@ import android.annotation.SuppressLint
66import android.content.Context
77import android.content.Intent
88import android.content.pm.ApplicationInfo
9- import android.net.Uri
109import android.os.Bundle
11- import androidx.core.net.toUri
1210import android.view.WindowManager
1311import android.widget.Toast
1412import androidx.activity.ComponentActivity
@@ -20,9 +18,12 @@ import androidx.compose.runtime.CompositionLocalProvider
2018import androidx.compose.runtime.LaunchedEffect
2119import androidx.compose.runtime.collectAsState
2220import androidx.compose.runtime.getValue
21+ import androidx.compose.runtime.mutableIntStateOf
2322import androidx.compose.runtime.saveable.rememberSaveable
23+ import androidx.compose.runtime.setValue
2424import androidx.compose.ui.Modifier
2525import androidx.core.content.pm.ShortcutManagerCompat
26+ import androidx.core.net.toUri
2627import androidx.lifecycle.lifecycleScope
2728import androidx.lifecycle.viewmodel.compose.viewModel
2829import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
@@ -41,6 +42,7 @@ import com.topjohnwu.magisk.core.isRunningAsStub
4142import com.topjohnwu.magisk.core.ktx.toast
4243import com.topjohnwu.magisk.core.tasks.AppMigration
4344import com.topjohnwu.magisk.core.wrap
45+ import com.topjohnwu.magisk.ui.component.rememberConfirmDialog
4446import com.topjohnwu.magisk.ui.deny.DenyListScreen
4547import com.topjohnwu.magisk.ui.deny.DenyListViewModel
4648import com.topjohnwu.magisk.ui.flash.FlashScreen
@@ -57,6 +59,7 @@ import com.topjohnwu.magisk.ui.superuser.SuperuserViewModel
5759import com.topjohnwu.magisk.view.Shortcuts
5860import kotlinx.coroutines.flow.MutableStateFlow
5961import kotlinx.coroutines.launch
62+ import java.io.File
6063import com.topjohnwu.magisk.core.R as CoreR
6164
6265class MainActivity : ComponentActivity (), SplashScreenHost {
@@ -122,7 +125,16 @@ class MainActivity : ComponentActivity(), SplashScreenHost {
122125 ),
123126 entryProvider = entryProvider {
124127 entry<Route .Main > {
125- MainScreen (initialTab = initialTab)
128+ val superuserVm: SuperuserViewModel = viewModel(
129+ viewModelStoreOwner = this @MainActivity, factory = VMFactory
130+ )
131+ MainScreen (
132+ initialTab = initialTab,
133+ superuserViewModel = superuserVm,
134+ onAuthenticate = { action ->
135+ extension.withAuthentication { if (it) action() }
136+ }
137+ )
126138 }
127139 entry<Route .DenyList > { _ ->
128140 val vm: DenyListViewModel = viewModel(factory = VMFactory )
@@ -149,7 +161,14 @@ class MainActivity : ComponentActivity(), SplashScreenHost {
149161 extension.withAuthentication { if (it) onSuccess() }
150162 }
151163 }
152- SuperuserDetailScreen (uid = key.uid, viewModel = vm, onBack = { navigator.pop() })
164+ SuperuserDetailScreen (
165+ uid = key.uid,
166+ viewModel = vm,
167+ onBack = { navigator.pop() },
168+ onAuthenticate = { action ->
169+ extension.withAuthentication { if (it) action() }
170+ }
171+ )
153172 }
154173 entry<Route .Action > { key ->
155174 val vm: ActionViewModel = viewModel(factory = VMFactory )
@@ -165,7 +184,22 @@ class MainActivity : ComponentActivity(), SplashScreenHost {
165184 }
166185 )
167186 }
168- MainActivityDialogs (activity = this @MainActivity)
187+ MainActivityDialogs (
188+ showInvalid = showInvalidState.collectAsState().value,
189+ unsupportedMessages = showUnsupported.collectAsState().value,
190+ showShortcut = showShortcutPrompt.collectAsState().value,
191+ onInvalidConfirmed = {
192+ showInvalidState.value = false
193+ handleInvalidStateInstall()
194+ },
195+ onShortcutConfirmed = {
196+ showShortcutPrompt.value = false
197+ Shortcuts .addHomeIcon(this @MainActivity)
198+ },
199+ onShortcutDismissed = {
200+ showShortcutPrompt.value = false
201+ }
202+ )
169203 }
170204 }
171205 }
@@ -234,8 +268,8 @@ class MainActivity : ComponentActivity(), SplashScreenHost {
234268 }
235269 if (! Info .isEmulator && Info .env.isActive && System .getenv(" PATH" )
236270 ?.split(' :' )
237- ?.filterNot { java.io. File (" $it /magisk" ).exists() }
238- ?.any { java.io. File (" $it /su" ).exists() } == true ) {
271+ ?.filterNot { File (" $it /magisk" ).exists() }
272+ ?.any { File (" $it /su" ).exists() } == true ) {
239273 messages.add(CoreR .string.unsupport_general_title to CoreR .string.unsupport_other_su_msg)
240274 }
241275 if (applicationInfo.flags and ApplicationInfo .FLAG_SYSTEM != 0 ) {
@@ -260,57 +294,56 @@ class MainActivity : ComponentActivity(), SplashScreenHost {
260294}
261295
262296@Composable
263- private fun MainActivityDialogs (activity : MainActivity ) {
264- val showInvalid by activity.showInvalidState.collectAsState()
265- val unsupportedMessages by activity.showUnsupported.collectAsState()
266- val showShortcut by activity.showShortcutPrompt.collectAsState()
267-
268- val invalidDialog = com.topjohnwu.magisk.ui.component.rememberConfirmDialog(
269- onConfirm = {
270- activity.showInvalidState.value = false
271- activity.handleInvalidStateInstall()
272- },
297+ private fun MainActivityDialogs (
298+ showInvalid : Boolean ,
299+ unsupportedMessages : List <Pair <Int , Int >>,
300+ showShortcut : Boolean ,
301+ onInvalidConfirmed : () -> Unit ,
302+ onShortcutConfirmed : () -> Unit ,
303+ onShortcutDismissed : () -> Unit ,
304+ modifier : Modifier = Modifier
305+ ) {
306+ val invalidDialog = rememberConfirmDialog(
307+ onConfirm = onInvalidConfirmed,
273308 onDismiss = {}
274309 )
275310
276311 LaunchedEffect (showInvalid) {
277312 if (showInvalid) {
278313 invalidDialog.showConfirm(
279- title = activity.getString( CoreR .string.unsupport_nonroot_stub_title) ,
280- content = activity.getString( CoreR .string.unsupport_nonroot_stub_msg) ,
281- confirm = activity.getString( CoreR .string.install) ,
314+ title = CoreR .string.unsupport_nonroot_stub_title. let { " " } ,
315+ content = CoreR .string.unsupport_nonroot_stub_msg. let { " " } ,
316+ confirm = CoreR .string.install. let { " " } ,
282317 )
283318 }
284319 }
285320
286- for ((index, pair) in unsupportedMessages.withIndex()) {
287- val (titleRes, msgRes) = pair
288- val show = rememberSaveable { androidx.compose.runtime.mutableStateOf(true ) }
289- com.topjohnwu.magisk.ui.component.rememberConfirmDialog(
290- onConfirm = { show.value = false },
291- ).also { dialog ->
292- LaunchedEffect (Unit ) {
293- dialog.showConfirm(
294- title = activity.getString(titleRes),
295- content = activity.getString(msgRes),
296- )
297- }
321+ var currentUnsupportedIndex by rememberSaveable { mutableIntStateOf(0 ) }
322+ val unsupportedDialog = rememberConfirmDialog(
323+ onConfirm = { currentUnsupportedIndex++ },
324+ onDismiss = { currentUnsupportedIndex++ }
325+ )
326+
327+ val currentUnsupported = unsupportedMessages.getOrNull(currentUnsupportedIndex)
328+ LaunchedEffect (currentUnsupported) {
329+ if (currentUnsupported != null ) {
330+ unsupportedDialog.showConfirm(
331+ title = " " ,
332+ content = " " ,
333+ )
298334 }
299335 }
300336
301- val shortcutDialog = com.topjohnwu.magisk.ui.component.rememberConfirmDialog(
302- onConfirm = {
303- activity.showShortcutPrompt.value = false
304- Shortcuts .addHomeIcon(activity)
305- },
306- onDismiss = { activity.showShortcutPrompt.value = false }
337+ val shortcutDialog = rememberConfirmDialog(
338+ onConfirm = onShortcutConfirmed,
339+ onDismiss = onShortcutDismissed
307340 )
308341
309342 LaunchedEffect (showShortcut) {
310343 if (showShortcut) {
311344 shortcutDialog.showConfirm(
312- title = activity.getString( CoreR .string.add_shortcut_title) ,
313- content = activity.getString( CoreR .string.add_shortcut_msg) ,
345+ title = " " ,
346+ content = " " ,
314347 )
315348 }
316349 }
0 commit comments