From a002967a9218d6eb821a3078b1ba4b1171aeace1 Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Mon, 7 Apr 2025 16:56:40 +0800 Subject: [PATCH] Refactor dialog implementation, replace ListDialog with AlertDialog to optimize user interaction experience. This will improve fixing KMI and restoring init_boot image style issues --- .../zako/sukisu/ui/screen/Install.kt | 97 +++++++++++++------ .../zako/sukisu/ui/screen/Settings.kt | 97 ++++++++++++++----- 2 files changed, 144 insertions(+), 50 deletions(-) diff --git a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Install.kt b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Install.kt index ce757db4..28e19c45 100644 --- a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Install.kt +++ b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Install.kt @@ -9,7 +9,7 @@ import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.StringRes import androidx.compose.foundation.LocalIndication -import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState @@ -29,11 +29,7 @@ import androidx.compose.ui.semantics.Role import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.documentfile.provider.DocumentFile -import com.maxkeppeker.sheets.core.models.base.Header -import com.maxkeppeker.sheets.core.models.base.rememberUseCaseState -import com.maxkeppeler.sheets.list.ListDialog import com.maxkeppeler.sheets.list.models.ListOption -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 @@ -43,6 +39,9 @@ import shirkneko.zako.sukisu.R import shirkneko.zako.sukisu.ui.component.DialogHandle import shirkneko.zako.sukisu.ui.component.rememberConfirmDialog import shirkneko.zako.sukisu.ui.component.rememberCustomDialog +import shirkneko.zako.sukisu.ui.theme.ThemeConfig +import shirkneko.zako.sukisu.ui.theme.getCardColors +import shirkneko.zako.sukisu.ui.theme.getCardElevation import shirkneko.zako.sukisu.ui.util.* import shirkneko.zako.sukisu.utils.AssetsUtil import java.io.File @@ -500,33 +499,77 @@ fun rememberSelectKmiDialog(onSelected: (String?) -> Unit): DialogHandle { val supportedKmi by produceState(initialValue = emptyList()) { value = getSupportedKmis() } - val options = supportedKmi.map { value -> + val listOptions = supportedKmi.map { value -> ListOption( - titleText = value + titleText = value, + subtitleText = null, + icon = null ) } - var selection by remember { mutableStateOf(null) } - Box( - modifier = Modifier.background(MaterialTheme.colorScheme.surface) - ) { - ListDialog( - state = rememberUseCaseState(visible = true, onFinishedRequest = { - onSelected(selection) - }, onCloseRequest = { - dismiss() - }), - header = Header.Default( - title = stringResource(R.string.select_kmi), - ), - selection = ListSelection.Single( - showRadioButtons = true, - options = options, - ) { _, option -> - selection = option.titleText - } - ) + var selection: String? = null + val cardColor = if (!ThemeConfig.useDynamicColor) { + ThemeConfig.currentTheme.ButtonContrast + } else { + MaterialTheme.colorScheme.secondaryContainer } + + AlertDialog( + onDismissRequest = { + dismiss() + }, + title = { + Text(text = stringResource(R.string.select_kmi)) + }, + text = { + Column { + listOptions.forEachIndexed { index, option -> + Row( + modifier = Modifier + .clickable { + selection = supportedKmi[index] + } + .padding(vertical = 8.dp) + ) { + Column { + Text(text = option.titleText) + option.subtitleText?.let { + Text( + text = it, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + } + } + } + }, + confirmButton = { + TextButton( + onClick = { + if (selection != null) { + onSelected(selection) + } + dismiss() + } + ) { + Text(text = stringResource(android.R.string.ok)) + } + }, + dismissButton = { + TextButton( + onClick = { + dismiss() + } + ) { + Text(text = stringResource(android.R.string.cancel)) + } + }, + containerColor = getCardColors(cardColor.copy(alpha = 0.9f)).containerColor.copy(alpha = 0.9f), + shape = MaterialTheme.shapes.medium, + tonalElevation = getCardElevation() + ) } } diff --git a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Settings.kt b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Settings.kt index c17482ef..77cdeef8 100644 --- a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Settings.kt +++ b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Settings.kt @@ -20,9 +20,11 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.Undo import androidx.compose.material.icons.filled.* +import androidx.compose.material3.AlertDialog import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.ListItem +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHost @@ -49,12 +51,9 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.core.content.FileProvider -import com.maxkeppeker.sheets.core.models.base.Header +import androidx.core.content.edit import com.maxkeppeker.sheets.core.models.base.IconSource -import com.maxkeppeker.sheets.core.models.base.rememberUseCaseState -import com.maxkeppeler.sheets.list.ListDialog import com.maxkeppeler.sheets.list.models.ListOption -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.AppProfileTemplateScreenDestination @@ -75,14 +74,14 @@ import shirkneko.zako.sukisu.ui.component.SwitchItem import shirkneko.zako.sukisu.ui.component.rememberConfirmDialog import shirkneko.zako.sukisu.ui.component.rememberCustomDialog import shirkneko.zako.sukisu.ui.component.rememberLoadingDialog +import shirkneko.zako.sukisu.ui.theme.CardConfig +import shirkneko.zako.sukisu.ui.theme.ThemeConfig +import shirkneko.zako.sukisu.ui.theme.getCardColors +import shirkneko.zako.sukisu.ui.theme.getCardElevation import shirkneko.zako.sukisu.ui.util.LocalSnackbarHost import shirkneko.zako.sukisu.ui.util.getBugreportFile import java.time.LocalDateTime import java.time.format.DateTimeFormatter -import androidx.compose.material.icons.filled.ExpandMore -import androidx.compose.material3.MaterialTheme -import shirkneko.zako.sukisu.ui.theme.CardConfig -import androidx.core.content.edit /** @@ -111,7 +110,6 @@ fun SettingScreen(navigator: DestinationsNavigator) { AboutDialog(it) } val loadingDialog = rememberLoadingDialog() - val shrinkDialog = rememberConfirmDialog() // endregion Column( @@ -451,20 +449,73 @@ fun rememberUninstallDialog(onSelected: (UninstallType) -> Unit): DialogHandle { } var selection = UninstallType.NONE - ListDialog(state = rememberUseCaseState(visible = true, onFinishedRequest = { - if (selection != UninstallType.NONE) { - onSelected(selection) - } - }, onCloseRequest = { - dismiss() - }), header = Header.Default( - title = stringResource(R.string.settings_uninstall), - ), selection = ListSelection.Single( - showRadioButtons = false, - options = listOptions, - ) { index, _ -> - selection = options[index] - }) + val cardColor = if (!ThemeConfig.useDynamicColor) { + ThemeConfig.currentTheme.ButtonContrast + } else { + MaterialTheme.colorScheme.secondaryContainer + } + + AlertDialog( + onDismissRequest = { + dismiss() + }, + title = { + Text(text = stringResource(R.string.settings_uninstall)) + }, + text = { + Column { + listOptions.forEachIndexed { index, option -> + Row( + modifier = Modifier + .clickable { + selection = options[index] + } + .padding(vertical = 8.dp) + ) { + Icon( + imageVector = options[index].icon, + contentDescription = null, + modifier = Modifier.padding(end = 8.dp) + ) + Column { + Text(text = option.titleText) + option.subtitleText?.let { + Text( + text = it, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + } + } + } + }, + confirmButton = { + androidx.compose.material3.TextButton( + onClick = { + if (selection != UninstallType.NONE) { + onSelected(selection) + } + dismiss() + } + ) { + Text(text = stringResource(android.R.string.ok)) + } + }, + dismissButton = { + androidx.compose.material3.TextButton( + onClick = { + dismiss() + } + ) { + Text(text = stringResource(android.R.string.cancel)) + } + }, + containerColor = getCardColors(cardColor.copy(alpha = 0.9f)).containerColor.copy(alpha = 0.9f), + shape = MaterialTheme.shapes.medium, + tonalElevation = getCardElevation() + ) } }