diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/Install.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/Install.kt index 3c1eceb3..c7965ac5 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/Install.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/Install.kt @@ -51,7 +51,6 @@ import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.produceState @@ -75,12 +74,10 @@ import com.maxkeppeler.sheets.list.models.ListSelection import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.generated.destinations.FlashScreenDestination +import com.ramcosta.composedestinations.generated.destinations.KernelFlashScreenDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator import com.sukisu.ultra.R -import com.sukisu.ultra.flash.HorizonKernelFlashProgress -import com.sukisu.ultra.flash.HorizonKernelState -import com.sukisu.ultra.flash.HorizonKernelWorker import com.sukisu.ultra.ui.component.DialogHandle import com.sukisu.ultra.ui.component.SlotSelectionDialog import com.sukisu.ultra.ui.component.rememberConfirmDialog @@ -110,16 +107,10 @@ fun InstallScreen(navigator: DestinationsNavigator) { var showRebootDialog by remember { mutableStateOf(false) } var showSlotSelectionDialog by remember { mutableStateOf(false) } var tempKernelUri by remember { mutableStateOf(null) } - val horizonKernelState = remember { HorizonKernelState() } - val flashState by horizonKernelState.state.collectAsState() - val summary = stringResource(R.string.horizon_kernel_summary) val kernelVersion = getKernelVersion() val isGKI = kernelVersion.isGKI() val isAbDevice = isAbDevice() - - val onFlashComplete = { - showRebootDialog = true - } + val summary = stringResource(R.string.horizon_kernel_summary) if (showRebootDialog) { RebootDialog( @@ -145,14 +136,12 @@ fun InstallScreen(navigator: DestinationsNavigator) { when (method) { is InstallMethod.HorizonKernel -> { method.uri?.let { uri -> - val worker = HorizonKernelWorker( - context = context, - state = horizonKernelState, - slot = method.slot + navigator.navigate( + KernelFlashScreenDestination( + kernelUri = uri, + selectedSlot = method.slot + ) ) - worker.uri = uri - worker.setOnFlashCompleteListener(onFlashComplete) - worker.start() } } else -> { @@ -253,18 +242,9 @@ fun InstallScreen(navigator: DestinationsNavigator) { } else { installMethod = method } - horizonKernelState.reset() } ) - AnimatedVisibility( - visible = flashState.isFlashing && installMethod is InstallMethod.HorizonKernel, - enter = fadeIn() + expandVertically(), - exit = fadeOut() + shrinkVertically() - ) { - HorizonKernelFlashProgress(flashState) - } - Column( modifier = Modifier .fillMaxWidth() @@ -325,7 +305,7 @@ fun InstallScreen(navigator: DestinationsNavigator) { Button( modifier = Modifier.fillMaxWidth(), - enabled = installMethod != null && !flashState.isFlashing, + enabled = installMethod != null, onClick = onClickNext, shape = MaterialTheme.shapes.medium, colors = ButtonDefaults.buttonColors( @@ -647,60 +627,60 @@ private fun SelectInstallMethod( ) ) { radioOptions.filterIsInstance().forEach { option -> - val interactionSource = remember { MutableInteractionSource() } - Surface( - color = if (option.javaClass == selectedOption?.javaClass) - MaterialTheme.colorScheme.secondaryContainer.copy(alpha = cardAlpha) - else - MaterialTheme.colorScheme.surfaceContainerHighest.copy(alpha = cardAlpha), - shape = MaterialTheme.shapes.medium, + val interactionSource = remember { MutableInteractionSource() } + Surface( + color = if (option.javaClass == selectedOption?.javaClass) + MaterialTheme.colorScheme.secondaryContainer.copy(alpha = cardAlpha) + else + MaterialTheme.colorScheme.surfaceContainerHighest.copy(alpha = cardAlpha), + shape = MaterialTheme.shapes.medium, + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 4.dp) + .clip(MaterialTheme.shapes.medium) + ) { + Row( + verticalAlignment = Alignment.CenterVertically, modifier = Modifier .fillMaxWidth() - .padding(vertical = 4.dp) - .clip(MaterialTheme.shapes.medium) - ) { - Row( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier - .fillMaxWidth() - .toggleable( - value = option.javaClass == selectedOption?.javaClass, - onValueChange = { onClick(option) }, - role = Role.RadioButton, - indication = LocalIndication.current, - interactionSource = interactionSource - ) - .padding(vertical = 8.dp, horizontal = 12.dp) - ) { - RadioButton( - selected = option.javaClass == selectedOption?.javaClass, - onClick = null, - interactionSource = interactionSource, - colors = RadioButtonDefaults.colors( - selectedColor = MaterialTheme.colorScheme.primary, - unselectedColor = MaterialTheme.colorScheme.onSurfaceVariant - ) + .toggleable( + value = option.javaClass == selectedOption?.javaClass, + onValueChange = { onClick(option) }, + role = Role.RadioButton, + indication = LocalIndication.current, + interactionSource = interactionSource ) - Column( - modifier = Modifier - .padding(start = 10.dp) - .weight(1f) - ) { + .padding(vertical = 8.dp, horizontal = 12.dp) + ) { + RadioButton( + selected = option.javaClass == selectedOption?.javaClass, + onClick = null, + interactionSource = interactionSource, + colors = RadioButtonDefaults.colors( + selectedColor = MaterialTheme.colorScheme.primary, + unselectedColor = MaterialTheme.colorScheme.onSurfaceVariant + ) + ) + Column( + modifier = Modifier + .padding(start = 10.dp) + .weight(1f) + ) { + Text( + text = stringResource(id = option.label), + style = MaterialTheme.typography.bodyLarge + ) + option.summary?.let { Text( - text = stringResource(id = option.label), - style = MaterialTheme.typography.bodyLarge + text = it, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant ) - option.summary?.let { - Text( - text = it, - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurfaceVariant - ) - } } } } } + } } } } diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/KernelFlash.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/KernelFlash.kt new file mode 100644 index 00000000..a8fc770a --- /dev/null +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/KernelFlash.kt @@ -0,0 +1,407 @@ +package com.sukisu.ultra.ui.screen + +import android.net.Uri +import android.os.Environment +import androidx.activity.compose.BackHandler +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.filled.CheckCircle +import androidx.compose.material.icons.filled.Error +import androidx.compose.material.icons.filled.Refresh +import androidx.compose.material.icons.filled.Save +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.navigation.DestinationsNavigator +import com.sukisu.ultra.R +import com.sukisu.ultra.flash.HorizonKernelState +import com.sukisu.ultra.flash.HorizonKernelWorker +import com.sukisu.ultra.ui.component.KeyEventBlocker +import com.sukisu.ultra.ui.util.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.File +import java.text.SimpleDateFormat +import java.util.* +import androidx.compose.ui.input.key.Key +import androidx.compose.ui.input.key.key +import com.sukisu.ultra.ui.theme.CardConfig + +private object KernelFlashStateHolder { + var currentState: HorizonKernelState? = null + var currentUri: Uri? = null + var currentSlot: String? = null + var isFlashing = false +} + +/** + * Kernel刷写界面 + */ +@OptIn(ExperimentalMaterial3Api::class) +@Destination +@Composable +fun KernelFlashScreen( + navigator: DestinationsNavigator, + kernelUri: Uri, + selectedSlot: String? = null +) { + val context = LocalContext.current + val scrollState = rememberScrollState() + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) + val snackBarHost = LocalSnackbarHost.current + val scope = rememberCoroutineScope() + var logText by rememberSaveable { mutableStateOf("") } + var showFloatAction by rememberSaveable { mutableStateOf(false) } + val logContent = rememberSaveable { StringBuilder() } + val horizonKernelState = remember { + if (KernelFlashStateHolder.currentState != null && + KernelFlashStateHolder.currentUri == kernelUri && + KernelFlashStateHolder.currentSlot == selectedSlot) { + KernelFlashStateHolder.currentState!! + } else { + HorizonKernelState().also { + KernelFlashStateHolder.currentState = it + KernelFlashStateHolder.currentUri = kernelUri + KernelFlashStateHolder.currentSlot = selectedSlot + KernelFlashStateHolder.isFlashing = false + } + } + } + + val flashState by horizonKernelState.state.collectAsState() + val logSavedString = stringResource(R.string.log_saved) + + val onFlashComplete = { + showFloatAction = true + KernelFlashStateHolder.isFlashing = false + } + + // 开始刷写 + LaunchedEffect(Unit) { + if (!KernelFlashStateHolder.isFlashing && !flashState.isCompleted && flashState.error.isEmpty()) { + withContext(Dispatchers.IO) { + KernelFlashStateHolder.isFlashing = true + val worker = HorizonKernelWorker( + context = context, + state = horizonKernelState, + slot = selectedSlot + ) + worker.uri = kernelUri + worker.setOnFlashCompleteListener(onFlashComplete) + worker.start() + + // 监听日志更新 + while (!flashState.isCompleted && flashState.error.isEmpty()) { + if (flashState.logs.isNotEmpty()) { + logText = flashState.logs.joinToString("\n") + logContent.clear() + logContent.append(logText) + } + kotlinx.coroutines.delay(100) + } + + if (flashState.error.isNotEmpty()) { + logText += "\n${flashState.error}\n" + logContent.append("\n${flashState.error}\n") + KernelFlashStateHolder.isFlashing = false + } else if (flashState.isCompleted) { + logText += "\n${context.getString(R.string.horizon_flash_complete)}\n\n\n" + logContent.append("\n${context.getString(R.string.horizon_flash_complete)}\n\n\n") + } + } + } else { + logText = flashState.logs.joinToString("\n") + if (flashState.error.isNotEmpty()) { + logText += "\n${flashState.error}\n" + } else if (flashState.isCompleted) { + logText += "\n${context.getString(R.string.horizon_flash_complete)}\n\n\n" + showFloatAction = true + } + } + } + + val onBack: () -> Unit = { + if (!flashState.isFlashing || flashState.isCompleted || flashState.error.isNotEmpty()) { + // 清理全局状态 + if (flashState.isCompleted || flashState.error.isNotEmpty()) { + KernelFlashStateHolder.currentState = null + KernelFlashStateHolder.currentUri = null + KernelFlashStateHolder.currentSlot = null + KernelFlashStateHolder.isFlashing = false + } + navigator.popBackStack() + } + } + + BackHandler(enabled = true) { + onBack() + } + + Scaffold( + topBar = { + TopBar( + flashState = flashState, + onBack = onBack, + onSave = { + scope.launch { + val format = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.getDefault()) + val date = format.format(Date()) + val file = File( + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), + "KernelSU_kernel_flash_log_${date}.log" + ) + file.writeText(logContent.toString()) + snackBarHost.showSnackbar(logSavedString.format(file.absolutePath)) + } + }, + scrollBehavior = scrollBehavior + ) + }, + floatingActionButton = { + if (showFloatAction) { + ExtendedFloatingActionButton( + onClick = { + scope.launch { + withContext(Dispatchers.IO) { + reboot() + } + } + }, + icon = { + Icon( + Icons.Filled.Refresh, + contentDescription = stringResource(id = R.string.reboot) + ) + }, + text = { + Text(text = stringResource(id = R.string.reboot)) + }, + containerColor = MaterialTheme.colorScheme.secondaryContainer, + contentColor = MaterialTheme.colorScheme.onSecondaryContainer, + expanded = true + ) + } + }, + snackbarHost = { SnackbarHost(hostState = snackBarHost) }, + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), + containerColor = MaterialTheme.colorScheme.background + ) { innerPadding -> + KeyEventBlocker { + it.key == Key.VolumeDown || it.key == Key.VolumeUp + } + + Column( + modifier = Modifier + .fillMaxSize() + .padding(innerPadding) + .nestedScroll(scrollBehavior.nestedScrollConnection), + ) { + FlashProgressIndicator(flashState) + Box( + modifier = Modifier + .fillMaxWidth() + .weight(1f) + .verticalScroll(scrollState) + ) { + LaunchedEffect(logText) { + scrollState.animateScrollTo(scrollState.maxValue) + } + Text( + modifier = Modifier.padding(16.dp), + text = logText, + style = MaterialTheme.typography.bodyMedium, + fontFamily = FontFamily.Monospace, + color = MaterialTheme.colorScheme.onSurface + ) + } + } + } +} + +@Composable +private fun FlashProgressIndicator(flashState: com.sukisu.ultra.flash.FlashState) { + val progressColor = when { + flashState.error.isNotEmpty() -> MaterialTheme.colorScheme.error + flashState.isCompleted -> MaterialTheme.colorScheme.tertiary + else -> MaterialTheme.colorScheme.primary + } + + val progress = animateFloatAsState( + targetValue = flashState.progress, + label = "FlashProgress" + ) + + Card( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + colors = CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.surfaceVariant + ) + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = when { + flashState.error.isNotEmpty() -> stringResource(R.string.flash_failed) + flashState.isCompleted -> stringResource(R.string.flash_success) + else -> stringResource(R.string.flashing) + }, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.Bold, + color = progressColor + ) + + when { + flashState.error.isNotEmpty() -> { + Icon( + imageVector = Icons.Default.Error, + contentDescription = null, + tint = MaterialTheme.colorScheme.error + ) + } + flashState.isCompleted -> { + Icon( + imageVector = Icons.Default.CheckCircle, + contentDescription = null, + tint = MaterialTheme.colorScheme.tertiary + ) + } + } + } + + Spacer(modifier = Modifier.height(8.dp)) + + if (flashState.currentStep.isNotEmpty()) { + Text( + text = flashState.currentStep, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + + Spacer(modifier = Modifier.height(8.dp)) + } + + LinearProgressIndicator( + progress = { progress.value }, + modifier = Modifier + .fillMaxWidth() + .height(8.dp), + color = progressColor, + trackColor = MaterialTheme.colorScheme.surfaceVariant + ) + + if (flashState.error.isNotEmpty()) { + Spacer(modifier = Modifier.height(8.dp)) + + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = Icons.Default.Error, + contentDescription = null, + tint = MaterialTheme.colorScheme.error, + modifier = Modifier.size(16.dp) + ) + } + + Spacer(modifier = Modifier.height(4.dp)) + + Text( + text = flashState.error, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.error, + modifier = Modifier + .fillMaxWidth() + .background( + MaterialTheme.colorScheme.errorContainer.copy(alpha = 0.3f), + shape = MaterialTheme.shapes.small + ) + .padding(8.dp) + ) + } + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TopBar( + flashState: com.sukisu.ultra.flash.FlashState, + onBack: () -> Unit, + onSave: () -> Unit = {}, + scrollBehavior: TopAppBarScrollBehavior? = null +) { + val statusColor = when { + flashState.error.isNotEmpty() -> MaterialTheme.colorScheme.error + flashState.isCompleted -> MaterialTheme.colorScheme.tertiary + else -> MaterialTheme.colorScheme.primary + } + + val cardColor = MaterialTheme.colorScheme.surfaceContainerLow + val cardAlpha = CardConfig.cardAlpha + + TopAppBar( + title = { + Text( + text = stringResource( + when { + flashState.error.isNotEmpty() -> R.string.flash_failed + flashState.isCompleted -> R.string.flash_success + else -> R.string.kernel_flashing + } + ), + style = MaterialTheme.typography.titleLarge, + color = statusColor + ) + }, + navigationIcon = { + IconButton(onClick = onBack) { + Icon( + imageVector = Icons.AutoMirrored.Filled.ArrowBack, + contentDescription = null, + tint = MaterialTheme.colorScheme.onSurface + ) + } + }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = cardColor.copy(alpha = cardAlpha), + scrolledContainerColor = cardColor.copy(alpha = cardAlpha) + ), + actions = { + IconButton(onClick = onSave) { + Icon( + imageVector = Icons.Filled.Save, + contentDescription = stringResource(id = R.string.save_log), + tint = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + }, + windowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), + scrollBehavior = scrollBehavior + ) +} \ No newline at end of file diff --git a/manager/app/src/main/res/values-ar/strings.xml b/manager/app/src/main/res/values-ar/strings.xml index 893ab35f..f4fe7082 100644 --- a/manager/app/src/main/res/values-ar/strings.xml +++ b/manager/app/src/main/res/values-ar/strings.xml @@ -298,7 +298,6 @@ فشل التركيب إصلاح/تثبيت LKM - GKI/non-GKI installation إصدار النواة:%1$s استخدام أداة التصحيح:%1$s تعيين diff --git a/manager/app/src/main/res/values-az/strings.xml b/manager/app/src/main/res/values-az/strings.xml index d124d3eb..c117e762 100644 --- a/manager/app/src/main/res/values-az/strings.xml +++ b/manager/app/src/main/res/values-az/strings.xml @@ -296,7 +296,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-bs/strings.xml b/manager/app/src/main/res/values-bs/strings.xml index 4921716c..b522fe47 100644 --- a/manager/app/src/main/res/values-bs/strings.xml +++ b/manager/app/src/main/res/values-bs/strings.xml @@ -296,7 +296,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-da/strings.xml b/manager/app/src/main/res/values-da/strings.xml index 129077cd..4118c302 100644 --- a/manager/app/src/main/res/values-da/strings.xml +++ b/manager/app/src/main/res/values-da/strings.xml @@ -296,7 +296,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-de/strings.xml b/manager/app/src/main/res/values-de/strings.xml index a9f91934..167636fe 100644 --- a/manager/app/src/main/res/values-de/strings.xml +++ b/manager/app/src/main/res/values-de/strings.xml @@ -298,7 +298,6 @@ Schreiben fehlgeschlagen LKM Reparatur/Installation - GKI/non-GKI installation Kernel Benutze das Patchwerkzeug:%1$s Konfigurieren diff --git a/manager/app/src/main/res/values-es/strings.xml b/manager/app/src/main/res/values-es/strings.xml index 5169efbd..75613bb3 100644 --- a/manager/app/src/main/res/values-es/strings.xml +++ b/manager/app/src/main/res/values-es/strings.xml @@ -296,7 +296,6 @@ Flash falló Reparación/instalación de LKM - GKI/non-GKI installation Versión del kernel Usando la herramienta de parches:%1$s Configurar diff --git a/manager/app/src/main/res/values-et/strings.xml b/manager/app/src/main/res/values-et/strings.xml index 4358c4db..d0def292 100644 --- a/manager/app/src/main/res/values-et/strings.xml +++ b/manager/app/src/main/res/values-et/strings.xml @@ -296,7 +296,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-fa/strings.xml b/manager/app/src/main/res/values-fa/strings.xml index 012ae0dc..a78a22b6 100644 --- a/manager/app/src/main/res/values-fa/strings.xml +++ b/manager/app/src/main/res/values-fa/strings.xml @@ -296,7 +296,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-fil/strings.xml b/manager/app/src/main/res/values-fil/strings.xml index eaa9c48a..5119cce1 100644 --- a/manager/app/src/main/res/values-fil/strings.xml +++ b/manager/app/src/main/res/values-fil/strings.xml @@ -296,7 +296,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-fr/strings.xml b/manager/app/src/main/res/values-fr/strings.xml index d11cbe77..35186d75 100644 --- a/manager/app/src/main/res/values-fr/strings.xml +++ b/manager/app/src/main/res/values-fr/strings.xml @@ -298,7 +298,6 @@ Échec du flash Réparation/installation LKM - GKI/non-GKI installation Version du noyau:%1$s Utilisation de l\'outil de correctifs:%1$s Configurer diff --git a/manager/app/src/main/res/values-hi/strings.xml b/manager/app/src/main/res/values-hi/strings.xml index f8ef3532..2a19833e 100644 --- a/manager/app/src/main/res/values-hi/strings.xml +++ b/manager/app/src/main/res/values-hi/strings.xml @@ -296,7 +296,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-hr/strings.xml b/manager/app/src/main/res/values-hr/strings.xml index 1a9da157..ab8fcfcb 100644 --- a/manager/app/src/main/res/values-hr/strings.xml +++ b/manager/app/src/main/res/values-hr/strings.xml @@ -296,7 +296,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-hu/strings.xml b/manager/app/src/main/res/values-hu/strings.xml index 6df568e5..6c220065 100644 --- a/manager/app/src/main/res/values-hu/strings.xml +++ b/manager/app/src/main/res/values-hu/strings.xml @@ -296,7 +296,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-it/strings.xml b/manager/app/src/main/res/values-it/strings.xml index 59f32972..eab3f20b 100644 --- a/manager/app/src/main/res/values-it/strings.xml +++ b/manager/app/src/main/res/values-it/strings.xml @@ -298,7 +298,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-ja/strings.xml b/manager/app/src/main/res/values-ja/strings.xml index 95073d84..f859d4e7 100644 --- a/manager/app/src/main/res/values-ja/strings.xml +++ b/manager/app/src/main/res/values-ja/strings.xml @@ -298,7 +298,6 @@ フラッシュに失敗しました LKM の修復またはインストール - GKI または 非 GKI のインストール カーネルのバージョン: %1$s パッチ適用ツールの使用: %1$s 設定 diff --git a/manager/app/src/main/res/values-kn/strings.xml b/manager/app/src/main/res/values-kn/strings.xml index 148ac7c6..1ac414fa 100644 --- a/manager/app/src/main/res/values-kn/strings.xml +++ b/manager/app/src/main/res/values-kn/strings.xml @@ -296,7 +296,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-ko/strings.xml b/manager/app/src/main/res/values-ko/strings.xml index 91010cd8..545f82b6 100644 --- a/manager/app/src/main/res/values-ko/strings.xml +++ b/manager/app/src/main/res/values-ko/strings.xml @@ -296,7 +296,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-lt/strings.xml b/manager/app/src/main/res/values-lt/strings.xml index 45a98f3e..0270209d 100644 --- a/manager/app/src/main/res/values-lt/strings.xml +++ b/manager/app/src/main/res/values-lt/strings.xml @@ -296,7 +296,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-lv/strings.xml b/manager/app/src/main/res/values-lv/strings.xml index 6758e6f6..1960c47b 100644 --- a/manager/app/src/main/res/values-lv/strings.xml +++ b/manager/app/src/main/res/values-lv/strings.xml @@ -298,7 +298,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-mr/strings.xml b/manager/app/src/main/res/values-mr/strings.xml index 8a77e5a0..73323e56 100644 --- a/manager/app/src/main/res/values-mr/strings.xml +++ b/manager/app/src/main/res/values-mr/strings.xml @@ -296,7 +296,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-ms/strings.xml b/manager/app/src/main/res/values-ms/strings.xml index 8872178a..54e0a9d0 100644 --- a/manager/app/src/main/res/values-ms/strings.xml +++ b/manager/app/src/main/res/values-ms/strings.xml @@ -296,7 +296,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-nl/strings.xml b/manager/app/src/main/res/values-nl/strings.xml index 751d7bf0..6791c3c4 100644 --- a/manager/app/src/main/res/values-nl/strings.xml +++ b/manager/app/src/main/res/values-nl/strings.xml @@ -298,7 +298,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-pl/strings.xml b/manager/app/src/main/res/values-pl/strings.xml index 5c5af2f2..10a880f4 100644 --- a/manager/app/src/main/res/values-pl/strings.xml +++ b/manager/app/src/main/res/values-pl/strings.xml @@ -298,7 +298,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-pt/strings.xml b/manager/app/src/main/res/values-pt/strings.xml index fc77d520..066ae6c4 100644 --- a/manager/app/src/main/res/values-pt/strings.xml +++ b/manager/app/src/main/res/values-pt/strings.xml @@ -296,7 +296,6 @@ Flash falhou LKM reparo/instalação - GKI/non-GKI installation Kernel Usando a ferramenta de correção:%1$s Configurar diff --git a/manager/app/src/main/res/values-ro/strings.xml b/manager/app/src/main/res/values-ro/strings.xml index e447df74..60ebd9bd 100644 --- a/manager/app/src/main/res/values-ro/strings.xml +++ b/manager/app/src/main/res/values-ro/strings.xml @@ -298,7 +298,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-ru/strings.xml b/manager/app/src/main/res/values-ru/strings.xml index f2833ee9..11b8eb43 100644 --- a/manager/app/src/main/res/values-ru/strings.xml +++ b/manager/app/src/main/res/values-ru/strings.xml @@ -298,7 +298,6 @@ Установка не выполнена Ремонт/установка LKM - GKI/non-GKI installation Ядро С помощью инструмента патрулирования:%1$s Настройка diff --git a/manager/app/src/main/res/values-sl/strings.xml b/manager/app/src/main/res/values-sl/strings.xml index 4ca2c92e..65fbf59f 100644 --- a/manager/app/src/main/res/values-sl/strings.xml +++ b/manager/app/src/main/res/values-sl/strings.xml @@ -296,7 +296,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-th/strings.xml b/manager/app/src/main/res/values-th/strings.xml index 088317b4..100d2da4 100644 --- a/manager/app/src/main/res/values-th/strings.xml +++ b/manager/app/src/main/res/values-th/strings.xml @@ -298,7 +298,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-tr/strings.xml b/manager/app/src/main/res/values-tr/strings.xml index 8f62dc57..4cc49794 100644 --- a/manager/app/src/main/res/values-tr/strings.xml +++ b/manager/app/src/main/res/values-tr/strings.xml @@ -296,7 +296,6 @@ Flash\'lama başarısız LKM onarımı/yükle - GKI/Non-GKI yükle Çekirdek sürümü:%1$s Kullanılan yama aracı:%1$s Yapılandır diff --git a/manager/app/src/main/res/values-uk/strings.xml b/manager/app/src/main/res/values-uk/strings.xml index f9a47f54..84cae523 100644 --- a/manager/app/src/main/res/values-uk/strings.xml +++ b/manager/app/src/main/res/values-uk/strings.xml @@ -298,7 +298,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-vi/strings.xml b/manager/app/src/main/res/values-vi/strings.xml index 5e153866..195e3f20 100644 --- a/manager/app/src/main/res/values-vi/strings.xml +++ b/manager/app/src/main/res/values-vi/strings.xml @@ -296,7 +296,6 @@ Flash thất bại LKM cài đặt - GKI/non-GKI cài đặt Phiên bản Kernel:%1$s Sử dụng công cụ vá lỗi:%1$s Cấu hình diff --git a/manager/app/src/main/res/values-zh-rCN/strings.xml b/manager/app/src/main/res/values-zh-rCN/strings.xml index 922e7a4d..cb2679bd 100644 --- a/manager/app/src/main/res/values-zh-rCN/strings.xml +++ b/manager/app/src/main/res/values-zh-rCN/strings.xml @@ -296,7 +296,7 @@ 刷写失败 LKM修补/安装 - GKI/non-GKI安装 + 刷写 AnyKernel3 内核版本:%1$s 使用修补工具:%1$s 配置 @@ -365,4 +365,5 @@ 正在安装模块 %1$d/%2$d %d 个模块安装失败 模块下载失败 + 内核刷写 diff --git a/manager/app/src/main/res/values-zh-rHK/strings.xml b/manager/app/src/main/res/values-zh-rHK/strings.xml index 99be592d..c5422b17 100644 --- a/manager/app/src/main/res/values-zh-rHK/strings.xml +++ b/manager/app/src/main/res/values-zh-rHK/strings.xml @@ -298,7 +298,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values-zh-rTW/strings.xml b/manager/app/src/main/res/values-zh-rTW/strings.xml index 37f54487..92022a63 100644 --- a/manager/app/src/main/res/values-zh-rTW/strings.xml +++ b/manager/app/src/main/res/values-zh-rTW/strings.xml @@ -296,7 +296,6 @@ Flash failed LKM repair/installation - GKI/non-GKI installation Kernel version:%1$s Using the patching tool:%1$s Configure diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index e6de5c2d..95419ef7 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -298,7 +298,7 @@ Flash failed LKM repair/installation - GKI/non-GKI installation + Flashing AnyKernel3 Kernel version:%1$s Using the patching tool:%1$s Configure @@ -367,4 +367,5 @@ Module being installed %1$d/%2$d %d Failed to install a new module Module download failed + Kernel Flashing