From 1ea219bddc52acc058dcc83f90df1d57328f5cdc Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Tue, 29 Apr 2025 18:07:29 +0800 Subject: [PATCH] Updated GKI installation selection style --- .../ultra/ui/component/SlotSelectionDialog.kt | 245 ++++++++++-------- .../src/main/res/values-zh-rCN/strings.xml | 1 + manager/app/src/main/res/values/strings.xml | 1 + 3 files changed, 144 insertions(+), 103 deletions(-) diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/component/SlotSelectionDialog.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/component/SlotSelectionDialog.kt index ff1afdb8..c9f75fde 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/component/SlotSelectionDialog.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/component/SlotSelectionDialog.kt @@ -1,9 +1,12 @@ package com.sukisu.ultra.ui.component import android.content.Context +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState import androidx.compose.material3.* -import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -11,10 +14,12 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.Dialog import com.sukisu.ultra.R import com.sukisu.ultra.ui.theme.ThemeConfig -import androidx.compose.foundation.shape.CornerSize +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.SdStorage +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.vector.ImageVector /** * 槽位选择对话框组件 @@ -42,38 +47,26 @@ fun SlotSelectionDialog( } if (show) { - val backgroundColor = if (!ThemeConfig.useDynamicColor) { - ThemeConfig.currentTheme.ButtonContrast.copy(alpha = 1.0f) + val cardColor = if (!ThemeConfig.useDynamicColor) { + ThemeConfig.currentTheme.ButtonContrast } else { - MaterialTheme.colorScheme.secondaryContainer.copy(alpha = 1.0f) + MaterialTheme.colorScheme.surfaceContainerHigh } - Dialog(onDismissRequest = onDismiss) { - Card( - shape = MaterialTheme.shapes.medium.copy( - topStart = CornerSize(16.dp), - topEnd = CornerSize(16.dp), - bottomEnd = CornerSize(16.dp), - bottomStart = CornerSize(16.dp) - ), - colors = CardDefaults.cardColors( - containerColor = backgroundColor - ), - elevation = CardDefaults.cardElevation(defaultElevation = 0.dp) - ) { + AlertDialog( + onDismissRequest = onDismiss, + title = { + Text( + text = stringResource(id = R.string.select_slot_title), + style = MaterialTheme.typography.headlineSmall, + color = MaterialTheme.colorScheme.onSurface + ) + }, + text = { Column( - modifier = Modifier - .padding(24.dp) - .fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally + modifier = Modifier.padding(vertical = 8.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) ) { - Text( - text = stringResource(id = R.string.select_slot_title), - style = MaterialTheme.typography.headlineSmall, - textAlign = TextAlign.Center, - modifier = Modifier.padding(bottom = 16.dp) - ) - if (errorMessage != null) { Text( text = "Error: $errorMessage", @@ -104,88 +97,134 @@ fun SlotSelectionDialog( Spacer(modifier = Modifier.height(24.dp)) + // Horizontal arrangement for slot options with highlighted current slot Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(6.dp) - ) { - val isDefaultSlotA = currentSlot == "_a" || currentSlot == "a" - Button( - onClick = { onSlotSelected("a") }, - modifier = Modifier.weight(1f), - colors = ButtonDefaults.buttonColors( - containerColor = if (isDefaultSlotA) - MaterialTheme.colorScheme.primary - else - MaterialTheme.colorScheme.primaryContainer, - contentColor = if (isDefaultSlotA) - MaterialTheme.colorScheme.onPrimary - else - MaterialTheme.colorScheme.onPrimaryContainer - ) - ) { - Text( - text = stringResource(id = R.string.slot_a), - style = MaterialTheme.typography.labelLarge - ) - } - - val isDefaultSlotB = currentSlot == "_b" || currentSlot == "b" - Button( - onClick = { onSlotSelected("b") }, - modifier = Modifier.weight(1f), - colors = ButtonDefaults.buttonColors( - containerColor = if (isDefaultSlotB) - MaterialTheme.colorScheme.secondary - else - MaterialTheme.colorScheme.secondaryContainer, - contentColor = if (isDefaultSlotB) - MaterialTheme.colorScheme.onSecondary - else - MaterialTheme.colorScheme.onSecondaryContainer - ) - ) { - Text( - text = stringResource(id = R.string.slot_b), - style = MaterialTheme.typography.labelLarge - ) - } - } - - Spacer(modifier = Modifier.height(24.dp)) - - HorizontalDivider( - modifier = Modifier.fillMaxWidth(), - thickness = 1.dp, - color = MaterialTheme.colorScheme.outline - ) - - Row( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier + .fillMaxWidth() + .horizontalScroll(rememberScrollState()), horizontalArrangement = Arrangement.SpaceBetween ) { - TextButton( - onClick = onDismiss, - modifier = Modifier.weight(1f) - ) { - Text(text = stringResource(id = android.R.string.cancel)) - } - TextButton( - onClick = { - currentSlot?.let { onSlotSelected(it) } - onDismiss() - }, - modifier = Modifier.weight(1f) - ) { - Text(text = stringResource(id = android.R.string.ok)) + val slotOptions = listOf( + ListOption( + titleText = stringResource(id = R.string.slot_a), + subtitleText = if (currentSlot == "a" || currentSlot == "_a") stringResource(id = R.string.currently_selected) else null, + icon = Icons.Filled.SdStorage + ), + ListOption( + titleText = stringResource(id = R.string.slot_b), + subtitleText = if (currentSlot == "b" || currentSlot == "_b") stringResource(id = R.string.currently_selected) else null, + icon = Icons.Filled.SdStorage + ) + ) + + slotOptions.forEachIndexed { index, option -> + Column( + modifier = Modifier + .weight(1f) + .padding(horizontal = 8.dp) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .clip(MaterialTheme.shapes.medium) + .background( + color = if (option.subtitleText != null) { + MaterialTheme.colorScheme.primary.copy(alpha = 0.9f) + } else { + MaterialTheme.colorScheme.primaryContainer.copy(alpha = 0.3f) + } + ) + .clickable { + onSlotSelected( + when (index) { + 0 -> "a" + else -> "b" + } + ) + } + .padding(vertical = 12.dp, horizontal = 16.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = option.icon, + contentDescription = null, + tint = if (option.subtitleText != null) { + MaterialTheme.colorScheme.onPrimary + } else { + MaterialTheme.colorScheme.primary + }, + modifier = Modifier + .padding(end = 16.dp) + .size(24.dp) + ) + Column( + modifier = Modifier.weight(1f) + ) { + Text( + text = option.titleText, + style = MaterialTheme.typography.titleMedium, + color = if (option.subtitleText != null) { + MaterialTheme.colorScheme.onPrimary + } else { + MaterialTheme.colorScheme.primary + } + ) + option.subtitleText?.let { + Text( + text = it, + style = MaterialTheme.typography.bodyMedium, + color = if (true) { + MaterialTheme.colorScheme.onPrimary.copy(alpha = 0.8f) + } else { + MaterialTheme.colorScheme.onSurfaceVariant + } + ) + } + } + } + } } } } - } - } + }, + confirmButton = { + TextButton( + onClick = { + currentSlot?.let { onSlotSelected(it) } + onDismiss() + } + ) { + Text( + text = stringResource(android.R.string.ok), + color = MaterialTheme.colorScheme.primary + ) + } + }, + dismissButton = { + TextButton( + onClick = onDismiss + ) { + Text( + text = stringResource(android.R.string.cancel), + color = MaterialTheme.colorScheme.primary + ) + } + }, + containerColor = cardColor, + shape = MaterialTheme.shapes.extraLarge, + tonalElevation = 4.dp + ) } } -// 获取当前槽位信息 +// Data class for list options +data class ListOption( + val titleText: String, + val subtitleText: String?, + val icon: ImageVector +) + +// Utility function to get current slot private fun getCurrentSlot(context: Context): String? { return runCommandGetOutput(true, "getprop ro.boot.slot_suffix")?.let { if (it.startsWith("_")) it.substring(1) else it 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 daa73d87..7c3e5e87 100644 --- a/manager/app/src/main/res/values-zh-rCN/strings.xml +++ b/manager/app/src/main/res/values-zh-rCN/strings.xml @@ -299,6 +299,7 @@ 配置 应用设置 工具 + 当前 清除 Root 权限应用 diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index 10c8b988..ab8aeb9d 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -303,6 +303,7 @@ Configure Application Settings Tools + Currently Removals Root Application of permissions