From 09c06922051f4e86c94f6e99d3f08e138f336f24 Mon Sep 17 00:00:00 2001 From: darken Date: Sat, 11 Apr 2026 14:46:45 +0200 Subject: [PATCH] refactor(overview): Thread isPro/onUpgrade into pod cards (groundwork) Groundwork for a future pro indicator on the overview card's ANC mode selector. Adds isPro + onUpgrade parameters to OverviewScreen, PodDeviceCard, DualPodsCard, SinglePodsCard (currently unused inside the cards, defaults keep existing previews working). Wraps AncModeSelector in a Box as a scaffold for an overlay. Bumps surfaceContainerLowDark to match surfaceContainerDark in all three theme palettes (Amber/Blue/Green) across standard/medium/high contrast. No user-facing change yet. --- .../capod/common/theming/CapodColorsAmber.kt | 6 +- .../capod/common/theming/CapodColorsBlue.kt | 6 +- .../capod/common/theming/CapodColorsGreen.kt | 6 +- .../capod/main/ui/overview/OverviewScreen.kt | 12 +++- .../main/ui/overview/cards/DualPodsCard.kt | 3 + .../ui/overview/cards/PodCardComponents.kt | 63 ++++++++++--------- .../main/ui/overview/cards/SinglePodsCard.kt | 2 + 7 files changed, 58 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/eu/darken/capod/common/theming/CapodColorsAmber.kt b/app/src/main/java/eu/darken/capod/common/theming/CapodColorsAmber.kt index daa2f962..fef6654f 100644 --- a/app/src/main/java/eu/darken/capod/common/theming/CapodColorsAmber.kt +++ b/app/src/main/java/eu/darken/capod/common/theming/CapodColorsAmber.kt @@ -72,7 +72,7 @@ object CapodColorsAmber { val surfaceDimDark = Color(0xFF181210) val surfaceBrightDark = Color(0xFF3F3835) val surfaceContainerLowestDark = Color(0xFF120D0B) - val surfaceContainerLowDark = Color(0xFF201A18) + val surfaceContainerLowDark = Color(0xFF251E1C) val surfaceContainerDark = Color(0xFF251E1C) val surfaceContainerHighDark = Color(0xFF2F2826) val surfaceContainerHighestDark = Color(0xFF3B3331) @@ -146,7 +146,7 @@ object CapodColorsAmber { val surfaceDimDarkMediumContrast = Color(0xFF181210) val surfaceBrightDarkMediumContrast = Color(0xFF3F3835) val surfaceContainerLowestDarkMediumContrast = Color(0xFF120D0B) - val surfaceContainerLowDarkMediumContrast = Color(0xFF201A18) + val surfaceContainerLowDarkMediumContrast = Color(0xFF251E1C) val surfaceContainerDarkMediumContrast = Color(0xFF251E1C) val surfaceContainerHighDarkMediumContrast = Color(0xFF2F2826) val surfaceContainerHighestDarkMediumContrast = Color(0xFF3B3331) @@ -220,7 +220,7 @@ object CapodColorsAmber { val surfaceDimDarkHighContrast = Color(0xFF181210) val surfaceBrightDarkHighContrast = Color(0xFF3F3835) val surfaceContainerLowestDarkHighContrast = Color(0xFF120D0B) - val surfaceContainerLowDarkHighContrast = Color(0xFF201A18) + val surfaceContainerLowDarkHighContrast = Color(0xFF251E1C) val surfaceContainerDarkHighContrast = Color(0xFF251E1C) val surfaceContainerHighDarkHighContrast = Color(0xFF2F2826) val surfaceContainerHighestDarkHighContrast = Color(0xFF3B3331) diff --git a/app/src/main/java/eu/darken/capod/common/theming/CapodColorsBlue.kt b/app/src/main/java/eu/darken/capod/common/theming/CapodColorsBlue.kt index d0e0f026..b64bb4bb 100644 --- a/app/src/main/java/eu/darken/capod/common/theming/CapodColorsBlue.kt +++ b/app/src/main/java/eu/darken/capod/common/theming/CapodColorsBlue.kt @@ -72,7 +72,7 @@ object CapodColorsBlue { val surfaceDimDark = Color(0xFF131316) val surfaceBrightDark = Color(0xFF39393C) val surfaceContainerLowestDark = Color(0xFF0D0E11) - val surfaceContainerLowDark = Color(0xFF1B1B1F) + val surfaceContainerLowDark = Color(0xFF1F1F23) val surfaceContainerDark = Color(0xFF1F1F23) val surfaceContainerHighDark = Color(0xFF292A2D) val surfaceContainerHighestDark = Color(0xFF343438) @@ -146,7 +146,7 @@ object CapodColorsBlue { val surfaceDimDarkMediumContrast = Color(0xFF131316) val surfaceBrightDarkMediumContrast = Color(0xFF39393C) val surfaceContainerLowestDarkMediumContrast = Color(0xFF0D0E11) - val surfaceContainerLowDarkMediumContrast = Color(0xFF1B1B1F) + val surfaceContainerLowDarkMediumContrast = Color(0xFF1F1F23) val surfaceContainerDarkMediumContrast = Color(0xFF1F1F23) val surfaceContainerHighDarkMediumContrast = Color(0xFF292A2D) val surfaceContainerHighestDarkMediumContrast = Color(0xFF343438) @@ -220,7 +220,7 @@ object CapodColorsBlue { val surfaceDimDarkHighContrast = Color(0xFF131316) val surfaceBrightDarkHighContrast = Color(0xFF39393C) val surfaceContainerLowestDarkHighContrast = Color(0xFF0D0E11) - val surfaceContainerLowDarkHighContrast = Color(0xFF1B1B1F) + val surfaceContainerLowDarkHighContrast = Color(0xFF1F1F23) val surfaceContainerDarkHighContrast = Color(0xFF1F1F23) val surfaceContainerHighDarkHighContrast = Color(0xFF292A2D) val surfaceContainerHighestDarkHighContrast = Color(0xFF343438) diff --git a/app/src/main/java/eu/darken/capod/common/theming/CapodColorsGreen.kt b/app/src/main/java/eu/darken/capod/common/theming/CapodColorsGreen.kt index e5c0518e..6396ea41 100644 --- a/app/src/main/java/eu/darken/capod/common/theming/CapodColorsGreen.kt +++ b/app/src/main/java/eu/darken/capod/common/theming/CapodColorsGreen.kt @@ -72,7 +72,7 @@ object CapodColorsGreen { val surfaceDimDark = Color(0xFF111411) val surfaceBrightDark = Color(0xFF373A37) val surfaceContainerLowestDark = Color(0xFF0C0F0C) - val surfaceContainerLowDark = Color(0xFF191C19) + val surfaceContainerLowDark = Color(0xFF1D201D) val surfaceContainerDark = Color(0xFF1D201D) val surfaceContainerHighDark = Color(0xFF282B28) val surfaceContainerHighestDark = Color(0xFF333532) @@ -146,7 +146,7 @@ object CapodColorsGreen { val surfaceDimDarkMediumContrast = Color(0xFF111411) val surfaceBrightDarkMediumContrast = Color(0xFF373A37) val surfaceContainerLowestDarkMediumContrast = Color(0xFF0C0F0C) - val surfaceContainerLowDarkMediumContrast = Color(0xFF191C19) + val surfaceContainerLowDarkMediumContrast = Color(0xFF1D201D) val surfaceContainerDarkMediumContrast = Color(0xFF1D201D) val surfaceContainerHighDarkMediumContrast = Color(0xFF282B28) val surfaceContainerHighestDarkMediumContrast = Color(0xFF333532) @@ -220,7 +220,7 @@ object CapodColorsGreen { val surfaceDimDarkHighContrast = Color(0xFF111411) val surfaceBrightDarkHighContrast = Color(0xFF373A37) val surfaceContainerLowestDarkHighContrast = Color(0xFF0C0F0C) - val surfaceContainerLowDarkHighContrast = Color(0xFF191C19) + val surfaceContainerLowDarkHighContrast = Color(0xFF1D201D) val surfaceContainerDarkHighContrast = Color(0xFF1D201D) val surfaceContainerHighDarkHighContrast = Color(0xFF282B28) val surfaceContainerHighestDarkHighContrast = Color(0xFF333532) diff --git a/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewScreen.kt b/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewScreen.kt index 4992d24e..49fe6c5f 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewScreen.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewScreen.kt @@ -230,9 +230,11 @@ fun OverviewScreen( ) { device -> PodDeviceCard( device = device, + isPro = state.upgradeInfo.isPro, showDebug = state.isDebugMode, now = state.now, onAncModeChange = { mode -> onAncModeChange(device, mode) }, + onUpgrade = onUpgrade, onDeviceSettings = { onDeviceSettings(device) }, ) } @@ -272,9 +274,11 @@ fun OverviewScreen( ) { device -> PodDeviceCard( device = device, + isPro = state.upgradeInfo.isPro, showDebug = state.isDebugMode, now = state.now, onAncModeChange = { mode -> onAncModeChange(device, mode) }, + onUpgrade = onUpgrade, onDeviceSettings = { onDeviceSettings(device) }, ) } @@ -288,20 +292,24 @@ fun OverviewScreen( @Composable private fun PodDeviceCard( device: PodDevice, + isPro: Boolean, showDebug: Boolean, now: Instant, onAncModeChange: (AapSetting.AncMode.Value) -> Unit, + onUpgrade: () -> Unit, onDeviceSettings: (() -> Unit)? = null, ) { when { device.hasDualPods -> DualPodsCard( - device = device, showDebug = showDebug, now = now, + device = device, isPro = isPro, showDebug = showDebug, now = now, onAncModeChange = onAncModeChange, + onUpgrade = onUpgrade, onDeviceSettings = onDeviceSettings, ) device.model != PodModel.UNKNOWN -> SinglePodsCard( - device = device, showDebug = showDebug, now = now, + device = device, isPro = isPro, showDebug = showDebug, now = now, onAncModeChange = onAncModeChange, + onUpgrade = onUpgrade, onDeviceSettings = onDeviceSettings, ) else -> UnknownPodDeviceCard(device = device, showDebug = showDebug) diff --git a/app/src/main/java/eu/darken/capod/main/ui/overview/cards/DualPodsCard.kt b/app/src/main/java/eu/darken/capod/main/ui/overview/cards/DualPodsCard.kt index 8f88f734..409d3c89 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/overview/cards/DualPodsCard.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/overview/cards/DualPodsCard.kt @@ -59,9 +59,11 @@ import java.time.Instant @Composable fun DualPodsCard( device: PodDevice, + isPro: Boolean = true, showDebug: Boolean, now: Instant, onAncModeChange: ((AapSetting.AncMode.Value) -> Unit)? = null, + onUpgrade: (() -> Unit)? = null, onDeviceSettings: (() -> Unit)? = null, ) { val context = LocalContext.current @@ -403,6 +405,7 @@ private fun DualPodsCardFullPreview() = PreviewWrapper { device = MockPodDataProvider.dualPodMonitoredWithAap(), showDebug = false, now = Instant.now(), + isPro = false, onDeviceSettings = {}, ) } diff --git a/app/src/main/java/eu/darken/capod/main/ui/overview/cards/PodCardComponents.kt b/app/src/main/java/eu/darken/capod/main/ui/overview/cards/PodCardComponents.kt index cab6f9ba..5bb4a23f 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/overview/cards/PodCardComponents.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/overview/cards/PodCardComponents.kt @@ -7,6 +7,7 @@ import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween import androidx.compose.foundation.Canvas import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -15,6 +16,7 @@ import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -30,6 +32,7 @@ import androidx.compose.material.icons.twotone.KeyboardVoice import androidx.compose.material.icons.twotone.LinkOff import androidx.compose.material.icons.twotone.Lock import androidx.compose.material.icons.twotone.SettingsInputAntenna +import androidx.compose.material.icons.twotone.Stars import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SegmentedButton @@ -318,42 +321,44 @@ fun DebugSection( @Composable fun AncModeSelector( + modifier: Modifier = Modifier, currentMode: AapSetting.AncMode.Value, supportedModes: List, onModeSelected: (AapSetting.AncMode.Value) -> Unit, pendingMode: AapSetting.AncMode.Value? = null, - modifier: Modifier = Modifier, enabled: Boolean = true, ) { val displayMode = pendingMode ?: currentMode - SingleChoiceSegmentedButtonRow(modifier = modifier.fillMaxWidth()) { - supportedModes.forEachIndexed { index, mode -> - SegmentedButton( - selected = mode == displayMode, - onClick = { onModeSelected(mode) }, - enabled = enabled, - shape = SegmentedButtonDefaults.itemShape(index, supportedModes.size), - colors = if (pendingMode != null && mode == displayMode) { - SegmentedButtonDefaults.colors( - activeContainerColor = MaterialTheme.colorScheme.secondaryContainer, - activeContentColor = MaterialTheme.colorScheme.onSecondaryContainer, - ) - } else { - SegmentedButtonDefaults.colors() - }, - label = { - Text( - text = when (mode) { - AapSetting.AncMode.Value.OFF -> stringResource(R.string.anc_mode_off) - AapSetting.AncMode.Value.ON -> stringResource(R.string.anc_mode_on) - AapSetting.AncMode.Value.TRANSPARENCY -> stringResource(R.string.anc_mode_transparency) - AapSetting.AncMode.Value.ADAPTIVE -> stringResource(R.string.anc_mode_adaptive) - }, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - }, - ) + Box(modifier = modifier.fillMaxWidth()) { + SingleChoiceSegmentedButtonRow(modifier = Modifier.fillMaxWidth()) { + supportedModes.forEachIndexed { index, mode -> + SegmentedButton( + selected = mode == displayMode, + onClick = { onModeSelected(mode) }, + enabled = enabled, + shape = SegmentedButtonDefaults.itemShape(index, supportedModes.size), + colors = if (pendingMode != null && mode == displayMode) { + SegmentedButtonDefaults.colors( + activeContainerColor = MaterialTheme.colorScheme.secondaryContainer, + activeContentColor = MaterialTheme.colorScheme.onSecondaryContainer, + ) + } else { + SegmentedButtonDefaults.colors() + }, + label = { + Text( + text = when (mode) { + AapSetting.AncMode.Value.OFF -> stringResource(R.string.anc_mode_off) + AapSetting.AncMode.Value.ON -> stringResource(R.string.anc_mode_on) + AapSetting.AncMode.Value.TRANSPARENCY -> stringResource(R.string.anc_mode_transparency) + AapSetting.AncMode.Value.ADAPTIVE -> stringResource(R.string.anc_mode_adaptive) + }, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + }, + ) + } } } } diff --git a/app/src/main/java/eu/darken/capod/main/ui/overview/cards/SinglePodsCard.kt b/app/src/main/java/eu/darken/capod/main/ui/overview/cards/SinglePodsCard.kt index fe74f599..66e793fc 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/overview/cards/SinglePodsCard.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/overview/cards/SinglePodsCard.kt @@ -55,9 +55,11 @@ import java.time.Instant @Composable fun SinglePodsCard( device: PodDevice, + isPro: Boolean = true, showDebug: Boolean, now: Instant, onAncModeChange: ((AapSetting.AncMode.Value) -> Unit)? = null, + onUpgrade: (() -> Unit)? = null, onDeviceSettings: (() -> Unit)? = null, ) { val context = LocalContext.current