feat(radar): fill radar in split-screen via measured window size

The previous compact-mode trigger used currentWindowAdaptiveInfo(),
which reports the full-screen size class in split-screen / multi-window,
so the radar never enlarged there. Measure the actual window bounds with
BoxWithConstraints: compact (radar weight 1f fills all space, pager fixed
132dp strip) when maxWidth < 600dp && maxHeight < 480dp.

build: release version 4.4.7-ba7opf.17.6 (529)
This commit is contained in:
atsunatsu committed 2026-09-27 20:13:13 +08:00
1 parent f1091acbbd
commit 800494b978
2 files changed
+30 -15

No files matched your search

@@ -30,12 +30,14 @@ import androidx.compose.animation.core.tween
import androidx.compose.foundation.border import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.HorizontalPager
@@ -74,8 +76,6 @@ import com.rtbishop.look4sat.core.presentation.TimerRow
import com.rtbishop.look4sat.core.presentation.TopBar import com.rtbishop.look4sat.core.presentation.TopBar
import com.rtbishop.look4sat.core.presentation.formatFrequency import com.rtbishop.look4sat.core.presentation.formatFrequency
import com.rtbishop.look4sat.core.presentation.getDefaultPass import com.rtbishop.look4sat.core.presentation.getDefaultPass
import com.rtbishop.look4sat.core.presentation.hasEnoughHeight
import com.rtbishop.look4sat.core.presentation.isVerticalLayout
import com.rtbishop.look4sat.core.presentation.layoutPadding import com.rtbishop.look4sat.core.presentation.layoutPadding
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
@@ -88,6 +88,9 @@ private enum class RadarPage(val title: String) {
Sstv("SSTV") Sstv("SSTV")
} }
/** Compact pager strip height in split-screen / small windows. */
private val COMPACT_PAGER_HEIGHT = 132.dp
@Composable @Composable
fun RadarDestination(navigateUp: () -> Unit) { fun RadarDestination(navigateUp: () -> Unit) {
val context = LocalContext.current val context = LocalContext.current
@@ -173,20 +176,26 @@ private fun RadarScreen(
time = it.time time = it.time
) )
} }
Column( BoxWithConstraints(
modifier = Modifier modifier = Modifier
.layoutPadding() .layoutPadding()
.padding(bottom = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding()) .padding(bottom = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding())
.keepScreenOn(), .keepScreenOn()
) {
// Measure the ACTUAL window constraints instead of the window size
// class: currentWindowAdaptiveInfo() often reports the full-screen
// size in split-screen / multi-window, so the compact branch never
// triggered there. maxHeight/maxWidth are the real window bounds.
val isVertical = maxWidth < 600.dp
// In split-screen / small windows the vertical space is scarce: let the
// radar card fill ALL remaining space so the square plot is as large as
// possible, and give the pager a compact fixed strip — its pages are all
// scrollable, so nothing gets clipped. Full-screen layouts keep the 1:1 split.
val compact = isVertical && maxHeight < 480.dp
Column(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.spacedBy(6.dp) verticalArrangement = Arrangement.spacedBy(6.dp)
) { ) {
val isVertical = isVerticalLayout()
// In split-screen / small windows the vertical space is scarce: give the
// radar card the priority share so the plot stays large (its Canvas is a
// square limited by the card's smaller dimension), and shrink the pager
// card — its pages are all scrollable, so nothing gets clipped.
val radarWeight = if (isVertical && !hasEnoughHeight()) 1.6f else 1f
val pagerWeight = if (isVertical && !hasEnoughHeight()) 0.6f else 1f
if (isVertical) { if (isVertical) {
TopBar { TopBar {
IconCard(action = navigateUp, resId = R.drawable.ic_back) IconCard(action = navigateUp, resId = R.drawable.ic_back)
@@ -203,8 +212,13 @@ private fun RadarScreen(
} }
} }
if (isVertical) { if (isVertical) {
RadarCard(uiState, trackB, trackBPosition, Modifier.weight(radarWeight)) if (compact) {
PagerCard(uiState, onAction, logViewModel, requestMicPermission, Modifier.weight(pagerWeight)) RadarCard(uiState, trackB, trackBPosition, Modifier.weight(1f))
PagerCard(uiState, onAction, logViewModel, requestMicPermission, Modifier.height(COMPACT_PAGER_HEIGHT))
} else {
RadarCard(uiState, trackB, trackBPosition, Modifier.weight(1f))
PagerCard(uiState, onAction, logViewModel, requestMicPermission, Modifier.weight(1f))
}
} else { } else {
Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) { Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) {
RadarCard(uiState, trackB, trackBPosition, Modifier.weight(1f)) RadarCard(uiState, trackB, trackBPosition, Modifier.weight(1f))
@@ -213,6 +227,7 @@ private fun RadarScreen(
} }
} }
} }
}
@Composable @Composable
private fun PagerCard( private fun PagerCard(
+2 -2
View File
@@ -1,8 +1,8 @@
[versions] [versions]
#noinspection UnusedVersionCatalogEntry #noinspection UnusedVersionCatalogEntry
appVersionCode = "527" appVersionCode = "529"
#noinspection UnusedVersionCatalogEntry #noinspection UnusedVersionCatalogEntry
appVersionName = "4.4.7-ba7opf.17.4" appVersionName = "4.4.7-ba7opf.17.6"
#noinspection UnusedVersionCatalogEntry #noinspection UnusedVersionCatalogEntry
compileSdk = "37" compileSdk = "37"
#noinspection UnusedVersionCatalogEntry #noinspection UnusedVersionCatalogEntry