diff --git a/core/presentation/src/main/res/values-b+zh+Hant/strings.xml b/core/presentation/src/main/res/values-b+zh+Hant/strings.xml index 9c2ab235..add9d318 100644 --- a/core/presentation/src/main/res/values-b+zh+Hant/strings.xml +++ b/core/presentation/src/main/res/values-b+zh+Hant/strings.xml @@ -92,6 +92,10 @@ 后退 + 使用大雷达 + 使用小雷达 + 大 + 小 通知 方位角 仰角 diff --git a/core/presentation/src/main/res/values-zh/strings.xml b/core/presentation/src/main/res/values-zh/strings.xml index 8cd61a33..686ca74d 100644 --- a/core/presentation/src/main/res/values-zh/strings.xml +++ b/core/presentation/src/main/res/values-zh/strings.xml @@ -82,6 +82,10 @@ 后退 + 使用大雷达 + 使用小雷达 + 大 + 小 通知 方位角 仰角 diff --git a/core/presentation/src/main/res/values/strings.xml b/core/presentation/src/main/res/values/strings.xml index 7c4e98d8..afa3d668 100644 --- a/core/presentation/src/main/res/values/strings.xml +++ b/core/presentation/src/main/res/values/strings.xml @@ -93,6 +93,10 @@ Back + Use large radar + Use small radar + L + S Notify Azimuth %.1f° diff --git a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarScreen.kt b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarScreen.kt index 5315c0ef..5ce9d186 100644 --- a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarScreen.kt +++ b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarScreen.kt @@ -56,12 +56,15 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.keepScreenOn import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Dp @@ -152,7 +155,21 @@ internal data class RadarFillSizes( val pagerOverlaid: Boolean ) -internal fun radarFillSizes(maxWidth: Dp, maxHeight: Dp): RadarFillSizes { +internal fun radarFillSizes( + maxWidth: Dp, + maxHeight: Dp, + useLargeRadar: Boolean = true +): RadarFillSizes { + if (!useLargeRadar) { + val radarSide = minOf(maxWidth, ((maxHeight - ROW_GAP) / 2).coerceAtLeast(0.dp)) + val pagerSpace = maxHeight - radarSide - ROW_GAP + return RadarFillSizes( + radarSide = radarSide, + pagerSpace = pagerSpace, + pagerOverlaid = pagerSpace < COMPACT_MIN_PAGER_HEIGHT + ) + } + // Preferred: keep a usable pager block under the radar square. That is only worth it while // the circle still reaches its full-screen share of the page width. val radarWithPager = minOf(maxWidth, maxHeight - COMPACT_MIN_PAGER_HEIGHT - ROW_GAP) @@ -266,6 +283,7 @@ private fun RadarScreen( time = it.time ) } + var useLargeRadar by rememberSaveable { mutableStateOf(true) } BoxWithConstraints( modifier = Modifier .layoutPadding() @@ -297,7 +315,19 @@ private fun RadarScreen( TimerRow(timeString = uiState.currentTime, isTimeAos = uiState.isTimeAos) IconCard(action = addToCalendar, resId = R.drawable.ic_calendar) } - TopBar { NextPassRow(pass = upcomingPass, isUtc = uiState.isUtc) } + TopBar { + NextPassRow( + pass = upcomingPass, + modifier = if (fillRadar) Modifier.weight(1f) else Modifier, + isUtc = uiState.isUtc + ) + if (fillRadar) { + RadarSizeToggle( + showingLargeRadar = useLargeRadar, + onToggle = { useLargeRadar = !useLargeRadar } + ) + } + } } else { TopBar { IconCard(action = navigateUp, resId = R.drawable.ic_back) @@ -316,6 +346,7 @@ private fun RadarScreen( logViewModel = logViewModel, requestMicPermission = requestMicPermission, onFixGrid = onFixGrid, + useLargeRadar = useLargeRadar, modifier = Modifier.weight(1f) ) } else { @@ -332,6 +363,29 @@ private fun RadarScreen( } } +@Composable +private fun RadarSizeToggle(showingLargeRadar: Boolean, onToggle: () -> Unit) { + val label = stringResource( + if (showingLargeRadar) R.string.radar_use_small else R.string.radar_use_large + ) + ElevatedCard( + modifier = Modifier + .size(48.dp) + .semantics { contentDescription = label }, + onClick = onToggle + ) { + Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + Text( + text = stringResource( + if (showingLargeRadar) R.string.radar_size_small_short + else R.string.radar_size_large_short + ), + fontSize = 16.sp + ) + } + } +} + /** * Radar area for split-screen / small windows. The radar takes the largest square the area * can hold so the circle spans the same share of the width it does full screen, and the @@ -347,10 +401,11 @@ private fun RadarFillArea( logViewModel: LogViewModel, requestMicPermission: () -> Unit, onFixGrid: (List) -> Unit, + useLargeRadar: Boolean, modifier: Modifier = Modifier ) { BoxWithConstraints(modifier = modifier.fillMaxSize()) { - val sizes = radarFillSizes(maxWidth, maxHeight) + val sizes = radarFillSizes(maxWidth, maxHeight, useLargeRadar) // Hoisted out of the nested Box scope: the BoxWithConstraints receiver is not // implicitly reachable inside it. val pagerPanelHeight = maxHeight * 0.72f