Refactor dialog implementation, replace ListDialog with AlertDialog to optimize user interaction experience.
This will improve fixing KMI and restoring init_boot image style issues
This commit is contained in:
@@ -9,7 +9,7 @@ import androidx.activity.compose.rememberLauncherForActivityResult
|
|||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
import androidx.compose.foundation.LocalIndication
|
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.interaction.MutableInteractionSource
|
||||||
import androidx.compose.foundation.layout.*
|
import androidx.compose.foundation.layout.*
|
||||||
import androidx.compose.foundation.rememberScrollState
|
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.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.documentfile.provider.DocumentFile
|
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.ListOption
|
||||||
import com.maxkeppeler.sheets.list.models.ListSelection
|
|
||||||
import com.ramcosta.composedestinations.annotation.Destination
|
import com.ramcosta.composedestinations.annotation.Destination
|
||||||
import com.ramcosta.composedestinations.annotation.RootGraph
|
import com.ramcosta.composedestinations.annotation.RootGraph
|
||||||
import com.ramcosta.composedestinations.generated.destinations.FlashScreenDestination
|
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.DialogHandle
|
||||||
import shirkneko.zako.sukisu.ui.component.rememberConfirmDialog
|
import shirkneko.zako.sukisu.ui.component.rememberConfirmDialog
|
||||||
import shirkneko.zako.sukisu.ui.component.rememberCustomDialog
|
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.ui.util.*
|
||||||
import shirkneko.zako.sukisu.utils.AssetsUtil
|
import shirkneko.zako.sukisu.utils.AssetsUtil
|
||||||
import java.io.File
|
import java.io.File
|
||||||
@@ -500,35 +499,79 @@ fun rememberSelectKmiDialog(onSelected: (String?) -> Unit): DialogHandle {
|
|||||||
val supportedKmi by produceState(initialValue = emptyList<String>()) {
|
val supportedKmi by produceState(initialValue = emptyList<String>()) {
|
||||||
value = getSupportedKmis()
|
value = getSupportedKmis()
|
||||||
}
|
}
|
||||||
val options = supportedKmi.map { value ->
|
val listOptions = supportedKmi.map { value ->
|
||||||
ListOption(
|
ListOption(
|
||||||
titleText = value
|
titleText = value,
|
||||||
|
subtitleText = null,
|
||||||
|
icon = null
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
var selection by remember { mutableStateOf<String?>(null) }
|
var selection: String? = null
|
||||||
Box(
|
val cardColor = if (!ThemeConfig.useDynamicColor) {
|
||||||
modifier = Modifier.background(MaterialTheme.colorScheme.surface)
|
ThemeConfig.currentTheme.ButtonContrast
|
||||||
) {
|
} else {
|
||||||
ListDialog(
|
MaterialTheme.colorScheme.secondaryContainer
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
|
|||||||
@@ -20,9 +20,11 @@ import androidx.compose.foundation.verticalScroll
|
|||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.automirrored.filled.Undo
|
import androidx.compose.material.icons.automirrored.filled.Undo
|
||||||
import androidx.compose.material.icons.filled.*
|
import androidx.compose.material.icons.filled.*
|
||||||
|
import androidx.compose.material3.AlertDialog
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.ListItem
|
import androidx.compose.material3.ListItem
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.ModalBottomSheet
|
import androidx.compose.material3.ModalBottomSheet
|
||||||
import androidx.compose.material3.Scaffold
|
import androidx.compose.material3.Scaffold
|
||||||
import androidx.compose.material3.SnackbarHost
|
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.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.core.content.FileProvider
|
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.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.ListOption
|
||||||
import com.maxkeppeler.sheets.list.models.ListSelection
|
|
||||||
import com.ramcosta.composedestinations.annotation.Destination
|
import com.ramcosta.composedestinations.annotation.Destination
|
||||||
import com.ramcosta.composedestinations.annotation.RootGraph
|
import com.ramcosta.composedestinations.annotation.RootGraph
|
||||||
import com.ramcosta.composedestinations.generated.destinations.AppProfileTemplateScreenDestination
|
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.rememberConfirmDialog
|
||||||
import shirkneko.zako.sukisu.ui.component.rememberCustomDialog
|
import shirkneko.zako.sukisu.ui.component.rememberCustomDialog
|
||||||
import shirkneko.zako.sukisu.ui.component.rememberLoadingDialog
|
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.LocalSnackbarHost
|
||||||
import shirkneko.zako.sukisu.ui.util.getBugreportFile
|
import shirkneko.zako.sukisu.ui.util.getBugreportFile
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
import java.time.format.DateTimeFormatter
|
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)
|
AboutDialog(it)
|
||||||
}
|
}
|
||||||
val loadingDialog = rememberLoadingDialog()
|
val loadingDialog = rememberLoadingDialog()
|
||||||
val shrinkDialog = rememberConfirmDialog()
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
Column(
|
Column(
|
||||||
@@ -451,20 +449,73 @@ fun rememberUninstallDialog(onSelected: (UninstallType) -> Unit): DialogHandle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var selection = UninstallType.NONE
|
var selection = UninstallType.NONE
|
||||||
ListDialog(state = rememberUseCaseState(visible = true, onFinishedRequest = {
|
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) {
|
if (selection != UninstallType.NONE) {
|
||||||
onSelected(selection)
|
onSelected(selection)
|
||||||
}
|
}
|
||||||
}, onCloseRequest = {
|
|
||||||
dismiss()
|
dismiss()
|
||||||
}), header = Header.Default(
|
}
|
||||||
title = stringResource(R.string.settings_uninstall),
|
) {
|
||||||
), selection = ListSelection.Single(
|
Text(text = stringResource(android.R.string.ok))
|
||||||
showRadioButtons = false,
|
}
|
||||||
options = listOptions,
|
},
|
||||||
) { index, _ ->
|
dismissButton = {
|
||||||
selection = options[index]
|
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()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user